/// True/False, based on whether OTNumLists MATCH in COUNT and CONTENT (NOT ORDER.) /// bool OTNumList::Verify(const OTNumList & rhs) const { // Verify they have the same number of elements. // if (this->Count() != rhs.Count()) return false; // ------------------- // Verify each value on *this is also found on rhs. // FOR_EACH(std::set<int64_t>, m_setData) { const int64_t lValue = *it; // ---------- if (false == rhs.Verify(lValue)) return false; } return true; }
OTMessage * OTMessageOutbuffer::GetSentMessage(const int64_t & lRequestNum, const OTString & strServerID, const OTString & strNymID) { mapOfMessages::iterator it = m_mapMessages.begin(); for ( ; it != m_mapMessages.end(); ++it) { // ----------------------------- const int64_t & lTempReqNum = it->first; // ----------------------- if (lTempReqNum != lRequestNum) { continue; } // ----------------------- OTMessage * pMsg = it->second; OT_ASSERT(NULL != pMsg); // ----------------------------- // // If a server ID was passed in, but doesn't match the server ID on this message, // Then skip this one. (Same with the NymID.) if (!strServerID.Compare(pMsg->m_strServerID) || !strNymID. Compare(pMsg->m_strNymID)) { continue; } // -------- else { return pMsg; } } // ---------------------------------- // Didn't find it? Okay let's load it from local storage, if it's there... // OTString strFolder, strFile; strFolder.Format("%s%s%s%s%s%s%s", OTFolders::Nym().Get(), OTLog::PathSeparator(), strServerID.Get(), OTLog::PathSeparator(), "sent", /*todo hardcoding*/ OTLog::PathSeparator(), strNymID.Get()); strFile.Format("%lld.msg", lRequestNum); // ----------------------------------- // Check the existing list, if it exists. // OTNumList theNumList; std::string str_data_filename("sent.dat"); if (OTDB::Exists(strFolder.Get(), str_data_filename)) // todo hardcoding. { OTString strNumList(OTDB::QueryPlainString(strFolder.Get(), str_data_filename)); if (strNumList.Exists()) theNumList.Add(strNumList); if (theNumList.Verify(lRequestNum)) { // Even if the outgoing message was stored, we still act like it // "doesn't exist" if it doesn't appear on the official list. // The list is what matters -- the message is just the contents referenced // by that list. // ----------------------------------- OTMessage * pMsg = new OTMessage; OT_ASSERT(NULL != pMsg); OTCleanup<OTMessage> theMsgAngel(pMsg); if (OTDB::Exists(strFolder.Get(), strFile.Get()) && pMsg->LoadContract(strFolder.Get(), strFile.Get())) { // Since we had to load it from local storage, let's add it to // the list in RAM. // m_mapMessages.insert(std::pair<int64_t, OTMessage *>(lRequestNum, pMsg)); theMsgAngel.SetCleanupTargetPointer(NULL); return pMsg; } // ---------------------------------- } } // ---------------------------------- // STILL didn't find it? (Failure.) // return NULL; }