// SignContract will call this function at the right time. void OTLedger::UpdateContents() // Before transmission or serialization, this is where the ledger saves its contents { // Notice I use the PURPORTED Account ID and Server ID to create the output. That's because // I don't want to inadvertantly substitute the real ID for a bad one and then sign it. // So if there's a bad one in there when I read it, THAT's the one that I write as well! OTString strType, strLedgerAcctID(GetPurportedAccountID()), strLedgerAcctServerID(GetPurportedServerID()), strUserID(GetUserID()); switch (m_Type) { case OTLedger::message: strType.Set("message"); break; case OTLedger::inbox: strType.Set("inbox"); break; case OTLedger::outbox: strType.Set("outbox"); break; default: strType.Set("error-unknown"); break; } // I release this because I'm about to repopulate it. m_xmlUnsigned.Release(); // m_xmlUnsigned.Concatenate("<?xml version=\"%s\"?>\n\n", "1.0"); m_xmlUnsigned.Concatenate("<accountLedger version=\"%s\"\n type=\"%s\"\n accountID=\"%s\"\n userID=\"%s\"\n" "serverID=\"%s\" >\n\n", m_strVersion.Get(), strType.Get(), strLedgerAcctID.Get(), strUserID.Get(), strLedgerAcctServerID.Get()); // loop through the transactions and print them out here. OTTransaction * pTransaction = NULL; for (mapOfTransactions::iterator ii = m_mapTransactions.begin(); ii != m_mapTransactions.end(); ++ii) { if ((pTransaction = (*ii).second)) // if pointer not null { OTString strTransaction; pTransaction->SaveContract(strTransaction); OTASCIIArmor ascTransaction; ascTransaction.SetString(strTransaction, true); // linebreaks = true m_xmlUnsigned.Concatenate("<transaction>\n%s</transaction>\n\n", ascTransaction.Get()); } } m_xmlUnsigned.Concatenate("</accountLedger>\n"); }