diff --git a/libretroshare/src/services/p3channels.cc b/libretroshare/src/services/p3channels.cc index 9369ddb3b..e886563e0 100644 --- a/libretroshare/src/services/p3channels.cc +++ b/libretroshare/src/services/p3channels.cc @@ -547,7 +547,12 @@ bool p3Channels::channelSubscribe(std::string cId, bool subscribe) std::cerr << "p3Channels::channelSubscribe() " << cId << std::endl; #endif - return subscribeToGroup(cId, subscribe); + bool ok = subscribeToGroup(cId, subscribe); + + if(ok) + mChannelStatus[cId] = RS_CHAN_STATUS_AUTO_DL; + + return ok; } bool p3Channels::channelShareKeys(std::string chId, std::list& peers){ @@ -596,6 +601,35 @@ void p3Channels::getPubKeysAvailableGrpIds(std::list& grpIds) } +void p3Channels::channelSetAutoDl(const std::string& chId, bool autoDl) +{ + + RsStackMutex stack(distribMtx); + + if(autoDl) + mChannelStatus[chId] |= RS_CHAN_STATUS_AUTO_DL; + else + mChannelStatus[chId] = ~RS_CHAN_STATUS_AUTO_DL; + + return; +} + + +bool p3Channels::channelGetAutoDl(const std::string& chId, bool& autoDl) +{ + RsStackMutex stack(distribMtx); + + statMap::iterator it = mChannelStatus.find(chId); + + if(it != mChannelStatus.end()) + { + autoDl = mChannelStatus[chId] & RS_CHAN_STATUS_AUTO_DL; + return true; + } + + return false; +} + /***************************************************************************************/ /****************** Event Feedback (Overloaded form p3distrib) *************************/ /***************************************************************************************/ @@ -622,6 +656,29 @@ bool p3Channels::locked_eventDuplicateMsg(GroupInfo *grp, RsDistribMsg *msg, std return true; } + // check if msg has done download already + + chanStatMap::iterator cit = mMsgReadStatus.find(grpId); + statMap MsgMap; + statMap::iterator mit1, mit2; + + if(cit != mMsgReadStatus.end()){ + mit1 = cit->second.find(msgId); + + if(mit1 != cit->second.end()){ + if(mit1->second & CHANNEL_MSG_STATUS_DOWLOADED) + return false; + } + } + + mit2 = mChannelStatus.find(grpId); + + if(mit2 != mChannelStatus.end()) + { + if(!(mit2->second & RS_CHAN_STATUS_AUTO_DL)) + return false; + } + /* request the files * NB: This will result in duplicates. * it is upto ftserver/ftcontroller/ftextralist to handle this! @@ -661,7 +718,7 @@ bool p3Channels::locked_eventDuplicateMsg(GroupInfo *grp, RsDistribMsg *msg, std if(grp->flags & RS_DISTRIB_PRIVATE) - chanPrivate = true; + chanPrivate = true; } /* Iterate through files */ @@ -689,6 +746,7 @@ bool p3Channels::locked_eventDuplicateMsg(GroupInfo *grp, RsDistribMsg *msg, std RS_FILE_HINTS_NETWORK_WIDE; } + std::list srcIds; srcIds.push_back(id); @@ -709,6 +767,9 @@ bool p3Channels::locked_eventDuplicateMsg(GroupInfo *grp, RsDistribMsg *msg, std } + mit1->second |= (CHANNEL_MSG_STATUS_MASK & + CHANNEL_MSG_STATUS_DOWLOADED); + return true; } @@ -823,8 +884,7 @@ bool p3Channels::childLoadList(std::list& configSaves) { if(NULL != (drs = dynamic_cast(*it))) { - mReadStatus.push_back(drs); - saveList.push_back(drs); + processChanReadStatus(drs); } else { @@ -837,6 +897,29 @@ bool p3Channels::childLoadList(std::list& configSaves) return true; } +void p3Channels::processChanReadStatus(RsChannelReadStatus* drs) +{ + + + mReadStatus.push_back(drs); + std::string chId = drs->channelId; + + statMap::iterator sit = drs->msgReadStatus.find(chId); + + if(sit != drs->msgReadStatus.end()){ + mChannelStatus[chId] = sit->second; + drs->msgReadStatus.erase(sit); + } + + // first pull out the channel id status + + mMsgReadStatus[drs->channelId] = drs->msgReadStatus; + mReadStatus.push_back(drs); + + saveList.push_back(drs); + + +} std::list p3Channels::childSaveList() { return saveList; diff --git a/libretroshare/src/services/p3channels.h b/libretroshare/src/services/p3channels.h index e4d446385..dcbd7528e 100644 --- a/libretroshare/src/services/p3channels.h +++ b/libretroshare/src/services/p3channels.h @@ -33,6 +33,10 @@ #include "serialiser/rstlvtypes.h" #include "serialiser/rschannelitems.h" +#define RS_CHAN_STATUS_AUTO_DL 0x0004 + +typedef std::map statMap; +typedef std::map chanStatMap; //! Channels is a distributed 'feed' service /*! @@ -79,8 +83,8 @@ virtual bool channelRestoreKeys(std::string chId); virtual bool channelShareKeys(std::string chId, std::list& peers); virtual bool channelEditInfo(std::string chId, ChannelInfo &ci); virtual void getPubKeysAvailableGrpIds(std::list& grpIds); -//virtual void setPrivateChannelDir(const std::string dirName); - +virtual void channelSetAutoDl(const std::string& chId, bool autoDl); +virtual bool channelGetAutoDl(const std::string& chId, bool& autoDl); /***************************************************************************************/ /****************** Event Feedback (Overloaded form p3distrib) *************************/ @@ -107,11 +111,15 @@ virtual std::list childSaveList(); private: +void processChanReadStatus(RsChannelReadStatus* drs); + RsFiles *mRsFiles; std::string mChannelsDir; std::list saveList; std::list mReadStatus; + chanStatMap mMsgReadStatus; + statMap mChannelStatus; };