diff --git a/libretroshare/src/services/p3msgservice.cc b/libretroshare/src/services/p3msgservice.cc index ef26c1926..f9c0137ce 100644 --- a/libretroshare/src/services/p3msgservice.cc +++ b/libretroshare/src/services/p3msgservice.cc @@ -54,7 +54,7 @@ const int msgservicezone = 54319; p3MsgService::p3MsgService(p3ConnectMgr *cm) - :p3Service(RS_SERVICE_TYPE_MSG), pqiConfig(CONFIG_TYPE_MSGS), + :p3Service(RS_SERVICE_TYPE_MSG), p3Config(CONFIG_TYPE_MSGS), mConnMgr(cm), msgChanged(1), mMsgUniqueId(1) { addSerialType(new RsMsgSerialiser()); @@ -267,61 +267,45 @@ int p3MsgService::checkOutgoingMessages() -bool p3MsgService::saveConfiguration() +std::list p3MsgService::saveList(bool& cleanup) { - pqioutput(PQL_DEBUG_BASIC, msgservicezone, - "p3MsgService::save_config()"); - /* now we create a pqiarchive, and stream all the msgs into it - */ - - std::string msgfile = Filename(); - std::string msgfiletmp = Filename()+".tmp"; - - if (RsDirUtil::createBackup (msgfile) == false) { - getPqiNotify()->AddSysMessage(0, RS_SYS_WARNING, "File backup error", "Error while backing up file " + msgfile); - // no error ? - } - - RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/ - - RsSerialiser *rss = new RsSerialiser(); - rss->addSerialType(new RsMsgSerialiser(true)); // create serialiser for configuration - - BinFileInterface *out = new BinFileInterface(msgfiletmp.c_str(), BIN_FLAGS_WRITEABLE | BIN_FLAGS_HASH_DATA); - pqiarchive *pa_out = new pqiarchive(rss, out, BIN_FLAGS_WRITEABLE | BIN_FLAGS_NO_DELETE); - bool written = true; + std::list itemList; std::map::iterator mit; - for(mit = imsg.begin(); mit != imsg.end(); mit++) - written = written && pa_out -> SendItem(mit->second) ; - - for(mit = msgOutgoing.begin(); mit != msgOutgoing.end(); mit++) - written = written && pa_out -> SendItem(mit->second) ; - std::map::iterator mit2; std::map::iterator mit3; + cleanup = false; + + mMsgMtx.lock(); + + for(mit = imsg.begin(); mit != imsg.end(); mit++) + itemList.push_back(mit->second); + + for(mit = msgOutgoing.begin(); mit != msgOutgoing.end(); mit++) + itemList.push_back(mit->second) ; for(mit2 = mTags.begin(); mit2 != mTags.end(); mit2++) - written = written && pa_out -> SendItem(mit2->second); + itemList.push_back(mit2->second); for(mit3 = mMsgTags.begin(); mit3 != mMsgTags.end(); mit3++) - written = written && pa_out -> SendItem(mit3->second); + itemList.push_back(mit3->second); - setHash(out->gethash()); - delete pa_out; + return itemList; +} - if(!written) - return false ; +void p3MsgService::saveDone() +{ + // unlocks mutex which has been locked by savelist + mMsgMtx.unlock(); +} - if(!RsDirUtil::renameFile(msgfiletmp,msgfile)) - { - getPqiNotify()->AddSysMessage(0, RS_SYS_WARNING, "File rename error", "Error while renaming file " + msgfile) ; - return false ; - } - - return true; +RsSerialiser* p3MsgService::setupSerialiser() +{ + RsSerialiser *rss = new RsSerialiser ; + rss->addSerialType(new RsMsgSerialiser(true)); + return rss; } // build list of standard tag types @@ -365,29 +349,22 @@ void p3MsgService::initStandardTagTypes() } } -bool p3MsgService::loadConfiguration(std::string &loadHash) +bool p3MsgService::loadList(std::list load) { - std::string msgfile = Filename(); - RsSerialiser *rss = new RsSerialiser(); - rss->addSerialType(new RsMsgSerialiser(true)); // create serialiser for configuration - - BinFileInterface *in = new BinFileInterface(msgfile.c_str(), BIN_FLAGS_READABLE | BIN_FLAGS_HASH_DATA); - pqiarchive *pa_in = new pqiarchive(rss, in, BIN_FLAGS_READABLE); - - - RsItem *item; RsMsgItem *mitem; RsMsgTagType* mtt; RsMsgTags* mti; - std::list items; + std::list items; + std::list::iterator it; // load items and calculate next unique msgId - while((item = pa_in -> GetItem())) + for(it = load.begin(); it != load.end(); it++) { - if (NULL != (mitem = dynamic_cast(item))) + + if (NULL != (mitem = dynamic_cast(*it))) { /* STORE MsgID */ if (mitem->msgId >= mMsgUniqueId) { @@ -395,25 +372,21 @@ bool p3MsgService::loadConfiguration(std::string &loadHash) } items.push_back(mitem); } - else if(NULL != (mtt = dynamic_cast(item))) + else if(NULL != (mtt = dynamic_cast(*it))) { mTags.insert(std::pair(mtt->tagId, mtt)); } - else if(NULL != (mti = dynamic_cast(item))) + else if(NULL != (mti = dynamic_cast(*it))) { mMsgTags.insert(std::pair(mti->msgId, mti)); } - else - { - delete item; - } } // sort items into lists - std::list::iterator it; - for (it = items.begin(); it != items.end(); it++) + std::list::iterator msgIt; + for (msgIt = items.begin(); msgIt != items.end(); msgIt++) { - mitem = *it; + mitem = *msgIt; /* STORE MsgID */ if (mitem->msgId == 0) { @@ -441,43 +414,6 @@ bool p3MsgService::loadConfiguration(std::string &loadHash) } } - std::string hashin = in->gethash(); - - delete pa_in; - - if (hashin != loadHash) - { - /* big error message! */ - std::cerr << "p3MsgService::loadConfiguration() FAILED! Msgs Tampered" << std::endl; - std::string msgfileold = msgfile + ".failed"; - - rename(msgfile.c_str(), msgfileold.c_str()); - - std::cerr << "Moving Old file to: " << msgfileold << std::endl; - std::cerr << "removing dodgey msgs" << std::endl; - - RsStackMutex stack(mMsgMtx); /********** STACK LOCKED MTX ******/ - - - std::map::iterator mit; - for(mit = imsg.begin(); mit != imsg.end(); mit++) - { - delete (mit->second); - } - imsg.clear(); - - for(mit = msgOutgoing.begin(); mit != msgOutgoing.end(); mit++) - { - delete (mit->second); - } - msgOutgoing.clear(); - setHash(""); - return false; - - } - - setHash(hashin); - /* Initialize standard tag types */ initStandardTagTypes(); diff --git a/libretroshare/src/services/p3msgservice.h b/libretroshare/src/services/p3msgservice.h index 138cb3c25..c00e5690a 100644 --- a/libretroshare/src/services/p3msgservice.h +++ b/libretroshare/src/services/p3msgservice.h @@ -45,7 +45,7 @@ class p3ConnectMgr; -class p3MsgService: public p3Service, public pqiConfig, public pqiMonitor +class p3MsgService: public p3Service, public p3Config, public pqiMonitor { public: p3MsgService(p3ConnectMgr *cm); @@ -84,10 +84,12 @@ void loadWelcomeMsg(); /* startup message */ int tick(); int status(); - /*** Overloaded from pqiConfig ****/ -virtual bool loadConfiguration(std::string &loadHash); -virtual bool saveConfiguration(); - /*** Overloaded from pqiConfig ****/ + /*** Overloaded from p3Config ****/ +virtual RsSerialiser *setupSerialiser(); +virtual std::list saveList(bool& cleanup); +virtual bool loadList(std::list load); +virtual void saveDone(); + /*** Overloaded from p3Config ****/ /*** Overloaded from pqiMonitor ***/ virtual void statusChange(const std::list &plist);