From d57f933109ff36439733428fd6110db6ce89b15a Mon Sep 17 00:00:00 2001 From: csoler Date: Fri, 16 Feb 2018 23:51:43 +0100 Subject: [PATCH] added load/save of known channels to avoid re-displaying it in the NewsFeed after then have been deleted. --- libretroshare/src/rsitems/rsserviceids.h | 3 +- libretroshare/src/rsserver/rsinit.cc | 1 + libretroshare/src/services/p3gxschannels.cc | 88 ++++++++++++++++++++- libretroshare/src/services/p3gxschannels.h | 8 +- libretroshare/src/services/p3gxsforums.cc | 5 -- libretroshare/src/services/p3gxsforums.h | 6 +- 6 files changed, 97 insertions(+), 14 deletions(-) diff --git a/libretroshare/src/rsitems/rsserviceids.h b/libretroshare/src/rsitems/rsserviceids.h index 1394ce03b..557bc54d7 100644 --- a/libretroshare/src/rsitems/rsserviceids.h +++ b/libretroshare/src/rsitems/rsserviceids.h @@ -84,7 +84,8 @@ const uint16_t RS_SERVICE_GXS_TYPE_REPUTATION = 0x0219; const uint16_t RS_SERVICE_TYPE_GXS_RECOGN = 0x0220; const uint16_t RS_SERVICE_TYPE_GXS_TRANS = 0x0230; -const uint16_t RS_SERVICE_GXS_TYPE_FORUMS_CONFIG = 0x0315; +const uint16_t RS_SERVICE_GXS_TYPE_FORUMS_CONFIG = 0x0315; +const uint16_t RS_SERVICE_GXS_TYPE_CHANNELS_CONFIG = 0x0317; // Experimental Services. /* DSDV Testing at the moment - Service Only */ diff --git a/libretroshare/src/rsserver/rsinit.cc b/libretroshare/src/rsserver/rsinit.cc index 4e960554d..0d9300202 100644 --- a/libretroshare/src/rsserver/rsinit.cc +++ b/libretroshare/src/rsserver/rsinit.cc @@ -1651,6 +1651,7 @@ int RsServer::StartupRetroShare() mConfigMgr->addConfiguration("gxsforums.cfg", gxsforums_ns); mConfigMgr->addConfiguration("gxsforums_srv.cfg", mGxsForums); mConfigMgr->addConfiguration("gxschannels.cfg", gxschannels_ns); + mConfigMgr->addConfiguration("gxschannels_srv.cfg", mGxsChannels); mConfigMgr->addConfiguration("gxscircles.cfg", gxscircles_ns); mConfigMgr->addConfiguration("posted.cfg", posted_ns); #ifdef RS_USE_WIKI diff --git a/libretroshare/src/services/p3gxschannels.cc b/libretroshare/src/services/p3gxschannels.cc index 6805bb0ab..8e2a303f0 100644 --- a/libretroshare/src/services/p3gxschannels.cc +++ b/libretroshare/src/services/p3gxschannels.cc @@ -120,6 +120,92 @@ uint32_t p3GxsChannels::channelsAuthenPolicy() return policy; } +static const uint32_t GXS_CHANNELS_CONFIG_MAX_TIME_NOTIFY_STORAGE = 86400*30*2 ; // ignore notifications for 2 months +static const uint8_t GXS_CHANNELS_CONFIG_SUBTYPE_NOTIFY_RECORD = 0x01 ; + +struct RsGxsForumNotifyRecordsItem: public RsItem +{ + + RsGxsForumNotifyRecordsItem() + : RsItem(RS_PKT_VERSION_SERVICE,RS_SERVICE_GXS_TYPE_CHANNELS_CONFIG,GXS_CHANNELS_CONFIG_SUBTYPE_NOTIFY_RECORD) + {} + + virtual ~RsGxsForumNotifyRecordsItem() {} + + void serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) + { + RS_REGISTER_SERIAL_MEMBER(records); + } + void clear() {} + + std::map records; +}; + +class GxsChannelsConfigSerializer : public RsServiceSerializer +{ +public: + GxsChannelsConfigSerializer() : RsServiceSerializer(RS_SERVICE_TYPE_GXS_TRANS) {} + virtual ~GxsChannelsConfigSerializer() {} + + RsItem* create_item(uint16_t service_id, uint8_t item_sub_id) const + { + if(service_id != RS_SERVICE_GXS_TYPE_CHANNELS_CONFIG) + return NULL; + + switch(item_sub_id) + { + case GXS_CHANNELS_CONFIG_SUBTYPE_NOTIFY_RECORD: return new RsGxsForumNotifyRecordsItem(); + default: + return NULL; + } + } +}; + +bool p3GxsChannels::saveList(bool &cleanup, std::list&saveList) +{ + cleanup = true ; + + RsGxsForumNotifyRecordsItem *item = new RsGxsForumNotifyRecordsItem ; + + item->records = mKnownChannels ; + + saveList.push_back(item) ; + return true; +} + +bool p3GxsChannels::loadList(std::list& loadList) +{ + while(!loadList.empty()) + { + RsItem *item = loadList.front(); + loadList.pop_front(); + + time_t now = time(NULL); + + RsGxsForumNotifyRecordsItem *fnr = dynamic_cast(item) ; + + if(fnr != NULL) + { + mKnownChannels.clear(); + + for(auto it(fnr->records.begin());it!=fnr->records.end();++it) + if( it->second + GXS_CHANNELS_CONFIG_MAX_TIME_NOTIFY_STORAGE < now) + mKnownChannels.insert(*it) ; + } + + delete item ; + } + return true; +} + +RsSerialiser* p3GxsChannels::setupSerialiser() +{ + RsSerialiser* rss = new RsSerialiser; + rss->addSerialType(new GxsChannelsConfigSerializer()); + + return rss; +} + /** Overloaded to cache new groups **/ RsGenExchange::ServiceCreate_Return p3GxsChannels::service_CreateGroup(RsGxsGrpItem* grpItem, RsTlvSecurityKeySet& /* keySet */) @@ -223,7 +309,7 @@ void p3GxsChannels::notifyChanges(std::vector &changes) if(mKnownChannels.find(*git) == mKnownChannels.end()) { notify->AddFeedItem(RS_FEED_ITEM_CHANNEL_NEW, git->toStdString()); - mKnownChannels.insert(*git) ; + mKnownChannels.insert(std::make_pair(*git,time(NULL))) ; } else std::cerr << "(II) Not notifying already known channel " << *git << std::endl; diff --git a/libretroshare/src/services/p3gxschannels.h b/libretroshare/src/services/p3gxschannels.h index db73448cd..4eb5f5fba 100644 --- a/libretroshare/src/services/p3gxschannels.h +++ b/libretroshare/src/services/p3gxschannels.h @@ -55,7 +55,7 @@ class SSGxsChannelGroup class p3GxsChannels: public RsGenExchange, public RsGxsChannels, - public GxsTokenQueue, + public GxsTokenQueue, public p3Config, public RsTickEvent /* only needed for testing - remove after */ { public: @@ -68,6 +68,10 @@ virtual void service_tick(); protected: + virtual RsSerialiser* setupSerialiser(); // @see p3Config::setupSerialiser() + virtual bool saveList(bool &cleanup, std::list&saveList); // @see p3Config::saveList(bool &cleanup, std::list&) + virtual bool loadList(std::list& loadList); // @see p3Config::loadList(std::list&) + // Overloaded to cache new groups. virtual RsGenExchange::ServiceCreate_Return service_CreateGroup(RsGxsGrpItem* grpItem, RsTlvSecurityKeySet& keySet); @@ -218,7 +222,7 @@ bool generateGroup(uint32_t &token, std::string groupName); RsGxsMessageId mGenThreadId; p3GxsCommentService *mCommentService; - std::set mKnownChannels; + std::map mKnownChannels; }; #endif diff --git a/libretroshare/src/services/p3gxsforums.cc b/libretroshare/src/services/p3gxsforums.cc index f10892de3..d2eff2ac7 100644 --- a/libretroshare/src/services/p3gxsforums.cc +++ b/libretroshare/src/services/p3gxsforums.cc @@ -269,9 +269,7 @@ void p3GxsForums::notifyChanges(std::vector &changes) void p3GxsForums::service_tick() { dummy_tick(); -#ifdef TO_REMOVE RsTickEvent::tick_events(); -#endif return; } @@ -653,7 +651,6 @@ bool p3GxsForums::generateGroup(uint32_t &token, std::string groupName) } -#ifdef TO_REMOVE // Overloaded from RsTickEvent for Event callbacks. void p3GxsForums::handle_event(uint32_t event_type, const std::string &/*elabel*/) { @@ -674,5 +671,3 @@ void p3GxsForums::handle_event(uint32_t event_type, const std::string &/*elabel* break; } } -#endif - diff --git a/libretroshare/src/services/p3gxsforums.h b/libretroshare/src/services/p3gxsforums.h index daa58c18e..a4e0ebf47 100644 --- a/libretroshare/src/services/p3gxsforums.h +++ b/libretroshare/src/services/p3gxsforums.h @@ -39,10 +39,8 @@ * */ -class p3GxsForums: public RsGenExchange, public RsGxsForums, public p3Config -#ifdef TO_REMOVE +class p3GxsForums: public RsGenExchange, public RsGxsForums, public p3Config, public RsTickEvent /* only needed for testing - remove after */ -#endif { public: @@ -57,10 +55,8 @@ virtual void service_tick(); virtual void notifyChanges(std::vector& changes); -#ifdef TO_REMOVE // Overloaded from RsTickEvent. virtual void handle_event(uint32_t event_type, const std::string &elabel); -#endif virtual RsSerialiser* setupSerialiser(); // @see p3Config::setupSerialiser() virtual bool saveList(bool &cleanup, std::list&saveList); // @see p3Config::saveList(bool &cleanup, std::list&)