diff --git a/libretroshare/src/chat/p3chatservice.cc b/libretroshare/src/chat/p3chatservice.cc index 2f5df22fe..28ade2674 100644 --- a/libretroshare/src/chat/p3chatservice.cc +++ b/libretroshare/src/chat/p3chatservice.cc @@ -156,9 +156,17 @@ class p3ChatService::AvatarInfo void init(const unsigned char *jpeg_data,int size) { - _image_size = size ; - _image_data = (unsigned char*)rs_malloc(size) ; - memcpy(_image_data,jpeg_data,size) ; + if(size == 0) + { + _image_size = 0; + _image_data = nullptr; + } + else + { + _image_size = size ; + _image_data = (unsigned char*)rs_malloc(size) ; + memcpy(_image_data,jpeg_data,size) ; + } } AvatarInfo(const unsigned char *jpeg_data,int size) { diff --git a/libretroshare/src/file_sharing/directory_updater.cc b/libretroshare/src/file_sharing/directory_updater.cc index 254c9ebe3..406c44024 100644 --- a/libretroshare/src/file_sharing/directory_updater.cc +++ b/libretroshare/src/file_sharing/directory_updater.cc @@ -107,10 +107,13 @@ void LocalDirectoryUpdater::threadTick() } } -void LocalDirectoryUpdater::forceUpdate() +void LocalDirectoryUpdater::forceUpdate(bool add_safe_delay) { mForceUpdate = true ; - mLastSweepTime = 0 ; + mLastSweepTime = rstime_t(time(NULL)) - rstime_t(mDelayBetweenDirectoryUpdates) ; + + if(add_safe_delay) + mLastSweepTime += rstime_t(MIN_TIME_AFTER_LAST_MODIFICATION); if(mHashCache != NULL && mHashCache->hashingProcessPaused()) mHashCache->togglePauseHashingProcess(); @@ -363,7 +366,7 @@ void LocalDirectoryUpdater::setFollowSymLinks(bool b) mFollowSymLinks = b ; - forceUpdate(); + forceUpdate(false); } bool LocalDirectoryUpdater::followSymLinks() const diff --git a/libretroshare/src/file_sharing/directory_updater.h b/libretroshare/src/file_sharing/directory_updater.h index 4b95daabe..b7d72b3a9 100644 --- a/libretroshare/src/file_sharing/directory_updater.h +++ b/libretroshare/src/file_sharing/directory_updater.h @@ -35,7 +35,7 @@ public: LocalDirectoryUpdater(HashStorage *hash_cache,LocalDirectoryStorage *lds) ; virtual ~LocalDirectoryUpdater() {} - void forceUpdate(); + void forceUpdate(bool add_safe_delay); bool inDirectoryCheck() const ; void togglePauseHashingProcess(); bool hashingProcessPaused(); diff --git a/libretroshare/src/file_sharing/file_sharing_defaults.h b/libretroshare/src/file_sharing/file_sharing_defaults.h index 75f19075a..92ff43947 100644 --- a/libretroshare/src/file_sharing/file_sharing_defaults.h +++ b/libretroshare/src/file_sharing/file_sharing_defaults.h @@ -48,7 +48,7 @@ static const std::string LOCAL_SHARED_DIRS_FILE_NAME = "local_dir_hierarchy.bin" static const uint32_t MIN_INTERVAL_BETWEEN_HASH_CACHE_SAVE = 20 ; // never save hash cache more often than every 20 secs. static const uint32_t MIN_INTERVAL_BETWEEN_REMOTE_DIRECTORY_SAVE = 23 ; // never save remote directories more often than this -static const uint32_t MIN_TIME_AFTER_LAST_MODIFICATION = 20 ; // never hash a file that is just being modified, otherwise we end up with a corrupted hash +static const uint32_t MIN_TIME_AFTER_LAST_MODIFICATION = 10 ; // never hash a file that is just being modified, otherwise we end up with a corrupted hash static const uint32_t MAX_DIR_SYNC_RESPONSE_DATA_SIZE = 20000 ; // Maximum RsItem data size in bytes for serialised directory transmission static const uint32_t DEFAULT_HASH_STORAGE_DURATION_DAYS = 30 ; // remember deleted/inaccessible files for 30 days diff --git a/libretroshare/src/file_sharing/p3filelists.cc b/libretroshare/src/file_sharing/p3filelists.cc index e4ea57dc7..c7db78b0f 100644 --- a/libretroshare/src/file_sharing/p3filelists.cc +++ b/libretroshare/src/file_sharing/p3filelists.cc @@ -114,7 +114,7 @@ void p3FileDatabase::setSharedDirectories(const std::list& shared RS_STACK_MUTEX(mFLSMtx) ; mLocalSharedDirs->setSharedDirectoryList(shared_dirs) ; - mLocalDirWatcher->forceUpdate(); + mLocalDirWatcher->forceUpdate(false); } @@ -1231,9 +1231,9 @@ uint32_t p3FileDatabase::getType(void *ref,FileSearchFlags flags) const } } -void p3FileDatabase::forceDirectoryCheck() // Force re-sweep the directories and see what's changed +void p3FileDatabase::forceDirectoryCheck(bool add_safe_delay) // Force re-sweep the directories and see what's changed { - mLocalDirWatcher->forceUpdate(); + mLocalDirWatcher->forceUpdate(add_safe_delay); } void p3FileDatabase::togglePauseHashingProcess() { diff --git a/libretroshare/src/file_sharing/p3filelists.h b/libretroshare/src/file_sharing/p3filelists.h index 7ddc6d282..41e8cbeaf 100644 --- a/libretroshare/src/file_sharing/p3filelists.h +++ b/libretroshare/src/file_sharing/p3filelists.h @@ -168,7 +168,7 @@ class p3FileDatabase: public p3Service, public p3Config, public ftSearch //, pub // interfact for directory parsing - void forceDirectoryCheck(); // Force re-sweep the directories and see what's changed + void forceDirectoryCheck(bool add_safe_delay); // Force re-sweep the directories and see what's changed bool inDirectoryCheck(); void togglePauseHashingProcess(); bool hashingProcessPaused(); diff --git a/libretroshare/src/ft/ftcontroller.cc b/libretroshare/src/ft/ftcontroller.cc index d682caba7..45fc70845 100644 --- a/libretroshare/src/ft/ftcontroller.cc +++ b/libretroshare/src/ft/ftcontroller.cc @@ -821,7 +821,7 @@ bool ftController::completeFile(const RsFileHash& hash) RsServer::notify()->notifyDownloadComplete(hash.toStdString()); RsServer::notify()->notifyDownloadCompleteCount(completeCount); - rsFiles->ForceDirectoryCheck() ; + rsFiles->ForceDirectoryCheck(true) ; IndicateConfigChanged(); /* completed transfer -> save */ return true; diff --git a/libretroshare/src/ft/ftserver.cc b/libretroshare/src/ft/ftserver.cc index 293da6d51..256543da6 100644 --- a/libretroshare/src/ft/ftserver.cc +++ b/libretroshare/src/ft/ftserver.cc @@ -791,9 +791,9 @@ void ftServer::updateSinceGroupPermissionsChanged() { mFileDatabase->forceSyncWithPeers(); } -void ftServer::ForceDirectoryCheck() +void ftServer::ForceDirectoryCheck(bool add_safe_delay) { - mFileDatabase->forceDirectoryCheck(); + mFileDatabase->forceDirectoryCheck(add_safe_delay); return; } diff --git a/libretroshare/src/ft/ftserver.h b/libretroshare/src/ft/ftserver.h index 0cc88d6aa..6f719c04e 100644 --- a/libretroshare/src/ft/ftserver.h +++ b/libretroshare/src/ft/ftserver.h @@ -275,7 +275,7 @@ public: * Utility Functions ***/ virtual bool ConvertSharedFilePath(std::string path, std::string &fullpath); - virtual void ForceDirectoryCheck(); + virtual void ForceDirectoryCheck(bool add_safe_delay); virtual void updateSinceGroupPermissionsChanged() ; virtual bool InDirectoryCheck(); virtual bool copyFile(const std::string& source, const std::string& dest); diff --git a/libretroshare/src/gxstrans/p3gxstrans.cc b/libretroshare/src/gxstrans/p3gxstrans.cc index d6d6069b4..44ecccbd1 100644 --- a/libretroshare/src/gxstrans/p3gxstrans.cc +++ b/libretroshare/src/gxstrans/p3gxstrans.cc @@ -656,8 +656,7 @@ void p3GxsTrans::notifyChanges(std::vector& changes) #ifdef DEBUG_GXSTRANS std::cout << "p3GxsTrans::notifyChanges(...)" << std::endl; #endif - for( std::vector::const_iterator it = changes.begin(); - it != changes.end(); ++it ) + for( auto it = changes.begin(); it != changes.end(); ++it ) { RsGxsGroupChange* grpChange = dynamic_cast(*it); RsGxsMsgChange* msgChange = dynamic_cast(*it); @@ -697,8 +696,8 @@ void p3GxsTrans::notifyChanges(std::vector& changes) } #endif } + delete *it; } - RsGxsIfaceHelper::receiveChanges(changes); } uint32_t p3GxsTrans::AuthenPolicy() diff --git a/libretroshare/src/retroshare/rsevents.h b/libretroshare/src/retroshare/rsevents.h index 7d6d24505..d89846e1a 100644 --- a/libretroshare/src/retroshare/rsevents.h +++ b/libretroshare/src/retroshare/rsevents.h @@ -85,6 +85,9 @@ enum class RsEventType : uint32_t /// @see RsGxsPostedEvent GXS_POSTED = 11, + /// @see RsGxsPostedEvent + GXS_IDENTITY = 12, + MAX /// Used to detect invalid event type passed }; diff --git a/libretroshare/src/retroshare/rsfiles.h b/libretroshare/src/retroshare/rsfiles.h index daa83d3bc..e0793d8b7 100644 --- a/libretroshare/src/retroshare/rsfiles.h +++ b/libretroshare/src/retroshare/rsfiles.h @@ -591,9 +591,10 @@ public: /** * @brief Force shared directories check + * @param[in] add_safe_delay Schedule the check 20 seconds from now, to ensure to capture files written just now. * @jsonapi{development} */ - virtual void ForceDirectoryCheck() = 0; + virtual void ForceDirectoryCheck(bool add_safe_delay=false) = 0; virtual void updateSinceGroupPermissionsChanged() = 0; virtual bool InDirectoryCheck() = 0; diff --git a/libretroshare/src/retroshare/rsgxschannels.h b/libretroshare/src/retroshare/rsgxschannels.h index 8e6939672..9fa2f8638 100644 --- a/libretroshare/src/retroshare/rsgxschannels.h +++ b/libretroshare/src/retroshare/rsgxschannels.h @@ -122,6 +122,10 @@ enum class RsChannelEventCode: uint8_t /// subscription for channel mChannelGroupId changed. SUBSCRIBE_STATUS_CHANGED = 0x06, + + /// existing message has been read or set to unread + READ_STATUS_CHANGED = 0x07, + }; struct RsGxsChannelEvent: RsEvent diff --git a/libretroshare/src/retroshare/rsgxscircles.h b/libretroshare/src/retroshare/rsgxscircles.h index 5ef69fda8..ed38f5c2d 100644 --- a/libretroshare/src/retroshare/rsgxscircles.h +++ b/libretroshare/src/retroshare/rsgxscircles.h @@ -182,9 +182,11 @@ enum class RsGxsCircleEventCode: uint8_t /// mCircleId contains the circle id and mGxsId is the id of the new member CIRCLE_MEMBERSHIP_JOIN = 0x04, - /** mCircleId contains the circle id and mGxsId is the id that was revoqued - * by admin */ + /** mCircleId contains the circle id and mGxsId is the id that was revoqued * by admin */ CIRCLE_MEMBERSHIP_REVOQUED= 0x05, + + /** mCircleId contains the circle id */ + NEW_CIRCLE = 0x06, }; struct RsGxsCircleEvent: RsEvent diff --git a/libretroshare/src/retroshare/rsgxsforums.h b/libretroshare/src/retroshare/rsgxsforums.h index 1ce658ab3..becddb329 100644 --- a/libretroshare/src/retroshare/rsgxsforums.h +++ b/libretroshare/src/retroshare/rsgxsforums.h @@ -110,15 +110,10 @@ enum class RsForumEventCode: uint8_t UNKNOWN = 0x00, NEW_FORUM = 0x01, /// emitted when new forum is received UPDATED_FORUM = 0x02, /// emitted when existing forum is updated - - /// new message reeived in a particular forum - NEW_MESSAGE = 0x03, - - /// existing message has been updated in a particular forum - UPDATED_MESSAGE = 0x04, - - /// forum was subscribed or unsubscribed - SUBSCRIBE_STATUS_CHANGED = 0x05, + NEW_MESSAGE = 0x03, /// new message reeived in a particular forum + UPDATED_MESSAGE = 0x04, /// existing message has been updated in a particular forum + SUBSCRIBE_STATUS_CHANGED = 0x05, /// forum was subscribed or unsubscribed + READ_STATUS_CHANGED = 0x06, /// msg was read or marked unread }; struct RsGxsForumEvent: RsEvent diff --git a/libretroshare/src/retroshare/rsidentity.h b/libretroshare/src/retroshare/rsidentity.h index 67844cde0..2874ccc91 100644 --- a/libretroshare/src/retroshare/rsidentity.h +++ b/libretroshare/src/retroshare/rsidentity.h @@ -304,6 +304,32 @@ private: RsIdentityUsage(); }; +enum class RsGxsIdentityEventCode: uint8_t +{ + UNKNOWN = 0x00, + NEW_IDENTITY = 0x01, + DELETED_IDENTITY = 0x02, +}; + +struct RsGxsIdentityEvent: public RsEvent +{ + RsGxsIdentityEvent() + : RsEvent(RsEventType::GXS_IDENTITY), + mIdentityEventCode(RsGxsIdentityEventCode::UNKNOWN) {} + + RsGxsIdentityEventCode mIdentityEventCode; + RsGxsGroupId mIdentityId; + + ///* @see RsEvent @see RsSerializable + void serial_process( RsGenericSerializer::SerializeJob j, RsGenericSerializer::SerializeContext& ctx ) override + { + RsEvent::serial_process(j, ctx); + RS_SERIAL_PROCESS(mIdentityEventCode); + RS_SERIAL_PROCESS(mIdentityId); + } + + ~RsGxsIdentityEvent() override = default; +}; struct RsIdentityDetails : RsSerializable { diff --git a/libretroshare/src/retroshare/rsposted.h b/libretroshare/src/retroshare/rsposted.h index 211f67bb1..a1dbdf83c 100644 --- a/libretroshare/src/retroshare/rsposted.h +++ b/libretroshare/src/retroshare/rsposted.h @@ -70,9 +70,13 @@ std::ostream &operator<<(std::ostream &out, const RsPostedPost &post); enum class RsPostedEventCode: uint8_t { - UNKNOWN = 0x00, - NEW_POSTED_GROUP = 0x01, - NEW_MESSAGE = 0x02 + UNKNOWN = 0x00, + NEW_POSTED_GROUP = 0x01, + NEW_MESSAGE = 0x02, + SUBSCRIBE_STATUS_CHANGED = 0x03, + UPDATED_POSTED_GROUP = 0x04, + UPDATED_MESSAGE = 0x05, + READ_STATUS_CHANGED = 0x06, }; diff --git a/libretroshare/src/services/p3gxschannels.cc b/libretroshare/src/services/p3gxschannels.cc index 800c148f4..0ccdafc03 100644 --- a/libretroshare/src/services/p3gxschannels.cc +++ b/libretroshare/src/services/p3gxschannels.cc @@ -364,13 +364,11 @@ void p3GxsChannels::notifyChanges(std::vector &changes) } /* shouldn't need to worry about groups - as they need to be subscribed to */ + delete *it; } if(!unprocessedGroups.empty()) request_SpecificSubscribedGroups(unprocessedGroups); - - // the call below deletes changes and its content. - RsGxsIfaceHelper::receiveChanges(changes); } void p3GxsChannels::service_tick() @@ -1764,8 +1762,17 @@ void p3GxsChannels::setMessageReadStatus( uint32_t& token, if (read) status = 0; setMsgStatusFlags(token, msgId, status, mask); -} + if (rsEvents) + { + auto ev = std::make_shared(); + + ev->mChannelMsgId = msgId.second; + ev->mChannelGroupId = msgId.first; + ev->mChannelEventCode = RsChannelEventCode::READ_STATUS_CHANGED; + rsEvents->postEvent(ev); + } +} /********************************************************************************************/ /********************************************************************************************/ diff --git a/libretroshare/src/services/p3gxscircles.cc b/libretroshare/src/services/p3gxscircles.cc index b5b7ae9ad..cb3b4a3ff 100644 --- a/libretroshare/src/services/p3gxscircles.cc +++ b/libretroshare/src/services/p3gxscircles.cc @@ -477,8 +477,8 @@ void p3GxsCircles::notifyChanges(std::vector &changes) #endif p3Notify *notify = RsServer::notify(); - std::vector::iterator it; - for(it = changes.begin(); it != changes.end(); ++it) + + for(auto it = changes.begin(); it != changes.end(); ++it) { RsGxsGroupChange *groupChange = dynamic_cast(*it); RsGxsMsgChange *msgChange = dynamic_cast(*it); @@ -602,11 +602,26 @@ void p3GxsCircles::notifyChanges(std::vector &changes) } #endif + + if(rsEvents && (c->getType() == RsGxsNotify::TYPE_RECEIVED_NEW|| c->getType() == RsGxsNotify::TYPE_PUBLISHED) ) + { + auto ev = std::make_shared(); + ev->mCircleId = RsGxsCircleId(*git); + ev->mCircleEventType = RsGxsCircleEventCode::NEW_CIRCLE; + rsEvents->postEvent(ev); + } + + // reset circle from cache since the number of invitee may have changed. + { + RsStackMutex stack(mCircleMtx); /********** STACK LOCKED MTX ******/ + mCircleCache.erase(RsGxsCircleId(*git)); + } + } } + delete *it; } - RsGxsIfaceHelper::receiveChanges(changes); // this clear up the vector and delete its elements } /********************************************************************************/ diff --git a/libretroshare/src/services/p3gxsforums.cc b/libretroshare/src/services/p3gxsforums.cc index 6ef0dae34..b8c414df0 100644 --- a/libretroshare/src/services/p3gxsforums.cc +++ b/libretroshare/src/services/p3gxsforums.cc @@ -315,9 +315,9 @@ void p3GxsForums::notifyChanges(std::vector &changes) } /* shouldn't need to worry about groups - as they need to be subscribed to */ - } - RsGxsIfaceHelper::receiveChanges(changes); + delete *it; + } } void p3GxsForums::service_tick() @@ -861,12 +861,19 @@ void p3GxsForums::setMessageReadStatus(uint32_t& token, const RsGxsGrpMsgIdPair& uint32_t mask = GXS_SERV::GXS_MSG_STATUS_GUI_NEW | GXS_SERV::GXS_MSG_STATUS_GUI_UNREAD; uint32_t status = GXS_SERV::GXS_MSG_STATUS_GUI_UNREAD; if (read) - { status = 0; - } setMsgStatusFlags(token, msgId, status, mask); + if (rsEvents) + { + auto ev = std::make_shared(); + + ev->mForumMsgId = msgId.second; + ev->mForumGroupId = msgId.first; + ev->mForumEventCode = RsForumEventCode::READ_STATUS_CHANGED; + rsEvents->postEvent(ev); + } } /********************************************************************************************/ diff --git a/libretroshare/src/services/p3idservice.cc b/libretroshare/src/services/p3idservice.cc index 85de0abcb..861c5c224 100644 --- a/libretroshare/src/services/p3idservice.cc +++ b/libretroshare/src/services/p3idservice.cc @@ -603,7 +603,6 @@ void p3IdService::notifyChanges(std::vector &changes) for(uint32_t i = 0;i(changes[i]); RsGxsMsgChange *msgChange = dynamic_cast(changes[i]); if (msgChange && !msgChange->metaChange()) @@ -614,8 +613,8 @@ void p3IdService::notifyChanges(std::vector &changes) #endif std::map > &msgChangeMap = msgChange->msgChangeMap; - std::map >::iterator mit; - for(mit = msgChangeMap.begin(); mit != msgChangeMap.end(); ++mit) + + for(auto mit = msgChangeMap.begin(); mit != msgChangeMap.end(); ++mit) { #ifdef DEBUG_IDS std::cerr << "p3IdService::notifyChanges() Msgs for Group: " << mit->first; @@ -624,7 +623,8 @@ void p3IdService::notifyChanges(std::vector &changes) } } - /* shouldn't need to worry about groups - as they need to be subscribed to */ + RsGxsGroupChange *groupChange = dynamic_cast(changes[i]); + if (groupChange && !groupChange->metaChange()) { #ifdef DEBUG_IDS @@ -632,9 +632,8 @@ void p3IdService::notifyChanges(std::vector &changes) std::cerr << std::endl; #endif std::list &groupList = groupChange->mGrpIdList; - std::list::iterator git; - for(git = groupList.begin(); git != groupList.end();) + for(auto git = groupList.begin(); git != groupList.end();++git) { #ifdef DEBUG_IDS std::cerr << "p3IdService::notifyChanges() Auto Subscribe to Incoming Groups: " << *git; @@ -649,21 +648,29 @@ void p3IdService::notifyChanges(std::vector &changes) timeStampKey(RsGxsId(*git),RsIdentityUsage(serviceType(),RsIdentityUsage::IDENTITY_DATA_UPDATE)) ; - ++git; - } - else - git = groupList.erase(git) ; - } + // notify that a new identity is received, if needed - if(groupList.empty()) - { - delete changes[i] ; - changes[i] = NULL ; + switch(groupChange->getType()) + { + case RsGxsNotify::TYPE_PUBLISHED: + case RsGxsNotify::TYPE_RECEIVED_NEW: + { + auto ev = std::make_shared(); + ev->mIdentityId = *git; + ev->mIdentityEventCode = RsGxsIdentityEventCode::NEW_IDENTITY; + rsEvents->postEvent(ev); + } + break; + + default: + break; + } + } } } - } - RsGxsIfaceHelper::receiveChanges(changes); + delete changes[i]; + } } /********************************************************************************/ @@ -1070,6 +1077,14 @@ bool p3IdService::deleteIdentity(RsGxsId& id) return false; } + if(rsEvents) + { + auto ev = std::make_shared(); + ev->mIdentityId = grouId; + ev->mIdentityEventCode = RsGxsIdentityEventCode::DELETED_IDENTITY; + rsEvents->postEvent(ev); + } + return true; } diff --git a/libretroshare/src/services/p3postbase.cc b/libretroshare/src/services/p3postbase.cc index 12799c4f7..309c3ee16 100644 --- a/libretroshare/src/services/p3postbase.cc +++ b/libretroshare/src/services/p3postbase.cc @@ -87,12 +87,10 @@ void p3PostBase::notifyChanges(std::vector &changes) std::cerr << std::endl; #endif - std::vector::iterator it; - - for(it = changes.begin(); it != changes.end(); ++it) + for(auto it = changes.begin(); it != changes.end(); ++it) { - RsGxsGroupChange *groupChange = dynamic_cast(*it); RsGxsMsgChange *msgChange = dynamic_cast(*it); + if (msgChange) { #ifdef POSTBASE_DEBUG @@ -124,34 +122,58 @@ void p3PostBase::notifyChanges(std::vector &changes) } } + RsGxsGroupChange *grpChange = dynamic_cast(*it); + /* pass on Group Changes to GUI */ - if (groupChange) + if (grpChange && rsEvents) { #ifdef POSTBASE_DEBUG std::cerr << "p3PostBase::notifyChanges() Found Group Change Notification"; std::cerr << std::endl; #endif - std::list &groupList = groupChange->mGrpIdList; - - for(auto git = groupList.begin(); git != groupList.end(); ++git) + switch(grpChange->getType()) + { + default: + case RsGxsNotify::TYPE_PROCESSED: // happens when the group is subscribed { -#ifdef POSTBASE_DEBUG - std::cerr << "p3PostBase::notifyChanges() Incoming Group: " << *git; - std::cerr << std::endl; -#endif - - if (rsEvents && groupChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW) + std::list &grpList = grpChange->mGrpIdList; + std::list::iterator git; + for (git = grpList.begin(); git != grpList.end(); ++git) { + auto ev = std::make_shared(); + ev->mPostedGroupId = *git; + ev->mPostedEventCode = RsPostedEventCode::SUBSCRIBE_STATUS_CHANGED; + rsEvents->postEvent(ev); + } + + } + break; + + case RsGxsNotify::TYPE_PUBLISHED: + case RsGxsNotify::TYPE_RECEIVED_NEW: + { + /* group received */ + const std::list& grpList = grpChange->mGrpIdList; + + for (auto git = grpList.begin(); git != grpList.end(); ++git) + { +#ifdef POSTBASE_DEBUG + std::cerr << "p3PostBase::notifyChanges() Incoming Group: " << *git; + std::cerr << std::endl; +#endif auto ev = std::make_shared(); ev->mPostedGroupId = *git; ev->mPostedEventCode = RsPostedEventCode::NEW_POSTED_GROUP; rsEvents->postEvent(ev); } - } + } + break; + } } + + delete *it; } - receiveHelperChanges(changes); #ifdef POSTBASE_DEBUG std::cerr << "p3PostBase::notifyChanges() -> receiveChanges()"; @@ -183,6 +205,15 @@ void p3PostBase::setMessageReadStatus(uint32_t& token, const RsGxsGrpMsgIdPair& setMsgStatusFlags(token, msgId, status, mask); + if (rsEvents) + { + auto ev = std::make_shared(); + + ev->mPostedMsgId = msgId.second; + ev->mPostedGroupId = msgId.first; + ev->mPostedEventCode = RsPostedEventCode::READ_STATUS_CHANGED; + rsEvents->postEvent(ev); + } } diff --git a/plugins/FeedReader/gui/FeedReaderDialog.cpp b/plugins/FeedReader/gui/FeedReaderDialog.cpp index ca86715e2..5a00cdd6d 100644 --- a/plugins/FeedReader/gui/FeedReaderDialog.cpp +++ b/plugins/FeedReader/gui/FeedReaderDialog.cpp @@ -133,7 +133,7 @@ FeedReaderDialog::~FeedReaderDialog() } } -UserNotify *FeedReaderDialog::getUserNotify(QObject *parent) +UserNotify *FeedReaderDialog::createUserNotify(QObject *parent) { return new FeedReaderUserNotify(this, mFeedReader, mNotify, parent); } diff --git a/plugins/FeedReader/gui/FeedReaderDialog.h b/plugins/FeedReader/gui/FeedReaderDialog.h index 80b6d25a3..a064df811 100644 --- a/plugins/FeedReader/gui/FeedReaderDialog.h +++ b/plugins/FeedReader/gui/FeedReaderDialog.h @@ -42,11 +42,10 @@ public: FeedReaderDialog(RsFeedReader *feedReader, FeedReaderNotify *notify, QWidget *parent = 0); ~FeedReaderDialog(); - virtual UserNotify *getUserNotify(QObject *parent); - static QIcon iconFromFeed(const FeedInfo &feedInfo); protected: + virtual UserNotify *createUserNotify(QObject *parent) override; virtual void showEvent(QShowEvent *event); bool eventFilter(QObject *obj, QEvent *ev); diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.cpp b/retroshare-gui/src/gui/ChatLobbyWidget.cpp index 1c5201343..b139d0113 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.cpp +++ b/retroshare-gui/src/gui/ChatLobbyWidget.cpp @@ -226,12 +226,11 @@ ChatLobbyWidget::~ChatLobbyWidget() } } -UserNotify *ChatLobbyWidget::getUserNotify(QObject *parent) +UserNotify *ChatLobbyWidget::createUserNotify(QObject *parent) { - if (!myChatLobbyUserNotify){ - myChatLobbyUserNotify = new ChatLobbyUserNotify(parent); - connect(myChatLobbyUserNotify, SIGNAL(countChanged(ChatLobbyId, unsigned int)), this, SLOT(updateNotify(ChatLobbyId, unsigned int))); - } + myChatLobbyUserNotify = new ChatLobbyUserNotify(parent); + connect(myChatLobbyUserNotify, SIGNAL(countChanged(ChatLobbyId, unsigned int)), this, SLOT(updateNotify(ChatLobbyId, unsigned int))); + return myChatLobbyUserNotify; } diff --git a/retroshare-gui/src/gui/ChatLobbyWidget.h b/retroshare-gui/src/gui/ChatLobbyWidget.h index 39422ec6a..8c6f07081 100644 --- a/retroshare-gui/src/gui/ChatLobbyWidget.h +++ b/retroshare-gui/src/gui/ChatLobbyWidget.h @@ -63,7 +63,7 @@ public: virtual QString pageName() const { return tr("Chats") ; } //MainPage virtual QString helpText() const { return ""; } //MainPage - virtual UserNotify *getUserNotify(QObject *parent); //MainPage + virtual UserNotify *createUserNotify(QObject *parent) override; //MainPage virtual void updateDisplay(); @@ -137,7 +137,7 @@ private: QAction* showTopicAct; int getNumColVisible(); - ChatLobbyUserNotify* myChatLobbyUserNotify; + ChatLobbyUserNotify* myChatLobbyUserNotify; // local copy that avoids dynamic casts QAbstractButton* myInviteYesButton; GxsIdChooser* myInviteIdChooser; diff --git a/retroshare-gui/src/gui/Circles/CirclesDialog.cpp b/retroshare-gui/src/gui/Circles/CirclesDialog.cpp index 8be03e718..64dff16df 100644 --- a/retroshare-gui/src/gui/Circles/CirclesDialog.cpp +++ b/retroshare-gui/src/gui/Circles/CirclesDialog.cpp @@ -62,9 +62,6 @@ CirclesDialog::CirclesDialog(QWidget *parent) mStateHelper->addWidget(CIRCLESDIALOG_GROUPMETA, ui.pushButton_editCircle); mStateHelper->addWidget(CIRCLESDIALOG_GROUPMETA, ui.treeWidget_membership, UISTATE_ACTIVE_ENABLED); -// mStateHelper->addWidget(CIRCLESDIALOG_GROUPMETA, ui.treeWidget_friends, UISTATE_ACTIVE_ENABLED); -// mStateHelper->addWidget(CIRCLESDIALOG_GROUPMETA, ui.treeWidget_category, UISTATE_ACTIVE_ENABLED); - mStateHelper->setWidgetEnabled(ui.pushButton_editCircle, false); /* Connect signals */ @@ -74,19 +71,13 @@ CirclesDialog::CirclesDialog(QWidget *parent) connect(ui.todoPushButton, SIGNAL(clicked()), this, SLOT(todo())); connect(ui.treeWidget_membership, SIGNAL(itemSelectionChanged()), this, SLOT(circle_selected())); -// connect(ui.treeWidget_friends, SIGNAL(itemSelectionChanged()), this, SLOT(friend_selected())); -// connect(ui.treeWidget_category, SIGNAL(itemSelectionChanged()), this, SLOT(category_selected())); /* Setup TokenQueue */ mCircleQueue = new TokenQueue(rsGxsCircles->getTokenService(), this); /* Set header resize modes and initial section sizes */ - QHeaderView * membership_header = ui.treeWidget_membership->header () ; - membership_header->resizeSection ( CIRCLEGROUP_CIRCLE_COL_GROUPNAME, 200 ); - -// QHeaderView * friends_header = ui.treeWidget_friends->header () ; -// friends_header->resizeSection ( CIRCLEGROUP_FRIEND_COL_NAME, 200 ); - + QHeaderView * membership_header = ui.treeWidget_membership->header () ; + membership_header->resizeSection ( CIRCLEGROUP_CIRCLE_COL_GROUPNAME, 200 ); } CirclesDialog::~CirclesDialog() diff --git a/retroshare-gui/src/gui/Circles/CirclesDialog.h b/retroshare-gui/src/gui/Circles/CirclesDialog.h index 7c96febad..ecaff3f29 100644 --- a/retroshare-gui/src/gui/Circles/CirclesDialog.h +++ b/retroshare-gui/src/gui/Circles/CirclesDialog.h @@ -58,35 +58,9 @@ private slots: void friend_selected(); void category_selected(); -#if 0 - void OpenOrShowAddPageDialog(); - void OpenOrShowAddGroupDialog(); - void OpenOrShowEditDialog(); - void OpenOrShowRepublishDialog(); - - void groupTreeChanged(); - - void newGroup(); - void showGroupDetails(); - void editGroupDetails(); - - void insertWikiGroups(); -#endif - private: void reloadAll(); -#if 0 - voidclearWikiPage(); - void clearGroupTree(); - - void updateWikiPage(const RsWikiSnapshot &page); - - bool getSelectedPage(std::string &groupId, std::string &pageId, std::string &origPageId); - std::string getSelectedPage(); - std::string getSelectedGroup(); -#endif - void requestGroupMeta(); void loadGroupMeta(const uint32_t &token); diff --git a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp index 15b57e6d8..855d74ecb 100644 --- a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp +++ b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.cpp @@ -1114,7 +1114,7 @@ void TransfersDialog::activatePage(TransfersDialog::Page page) } } -UserNotify *TransfersDialog::getUserNotify(QObject *parent) +UserNotify *TransfersDialog::createUserNotify(QObject *parent) { return new TransferUserNotify(parent); } diff --git a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.h b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.h index eb39df9b9..83da19c5c 100644 --- a/retroshare-gui/src/gui/FileTransfer/TransfersDialog.h +++ b/retroshare-gui/src/gui/FileTransfer/TransfersDialog.h @@ -67,7 +67,7 @@ public: virtual QString pageName() const { return tr("Files") ; } //MainPage virtual QString helpText() const { return ""; } //MainPage - virtual UserNotify *getUserNotify(QObject *parent); + virtual UserNotify *createUserNotify(QObject *parent) override; void activatePage(TransfersDialog::Page page) ; diff --git a/retroshare-gui/src/gui/FriendsDialog.cpp b/retroshare-gui/src/gui/FriendsDialog.cpp index 152d3a96d..660f13fa7 100644 --- a/retroshare-gui/src/gui/FriendsDialog.cpp +++ b/retroshare-gui/src/gui/FriendsDialog.cpp @@ -163,7 +163,7 @@ void FriendsDialog::activatePage(FriendsDialog::Page page) } } -UserNotify *FriendsDialog::getUserNotify(QObject *parent) +UserNotify *FriendsDialog::createUserNotify(QObject *parent) { return new ChatUserNotify(parent); } diff --git a/retroshare-gui/src/gui/FriendsDialog.h b/retroshare-gui/src/gui/FriendsDialog.h index 6eb9cdf7a..bd8979224 100644 --- a/retroshare-gui/src/gui/FriendsDialog.h +++ b/retroshare-gui/src/gui/FriendsDialog.h @@ -55,7 +55,7 @@ public: virtual QString pageName() const { return tr("Network") ; } //MainPage virtual QString helpText() const { return ""; } //MainPage - virtual UserNotify *getUserNotify(QObject *parent); + virtual UserNotify *createUserNotify(QObject *parent) override; static bool isGroupChatActive(); static void groupChatActivate(); diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 5d8c45804..ffb29664a 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -35,10 +35,12 @@ #include "gui/chat/ChatDialog.h" #include "gui/Circles/CreateCircleDialog.h" #include "gui/common/UIStateHelper.h" +#include "gui/common/UserNotify.h" #include "gui/gxs/GxsIdDetails.h" #include "gui/gxs/RsGxsUpdateBroadcastBase.h" #include "gui/msgs/MessageComposer.h" #include "gui/settings/rsharesettings.h" +#include "util/qtthreadsutils.h" #include "retroshare-gui/RsAutoUpdatePage.h" #include "util/misc.h" #include "util/QtVersion.h" @@ -148,6 +150,12 @@ IdDialog::IdDialog(QWidget *parent) : mIdQueue = NULL; + mEventHandlerId_identity = 0; + rsEvents->registerEventsHandler(RsEventType::GXS_IDENTITY, [this](std::shared_ptr event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId_identity ); + + mEventHandlerId_circles = 0; + rsEvents->registerEventsHandler(RsEventType::GXS_CIRCLES, [this](std::shared_ptr event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId_circles ); + // This is used to grab the broadcast of changes from p3GxsCircles, which is discarded by the current dialog, since it expects data for p3Identity only. mCirclesBroadcastBase = new RsGxsUpdateBroadcastBase(rsGxsCircles, this); connect(mCirclesBroadcastBase, SIGNAL(fillDisplay(bool)), this, SLOT(updateCirclesDisplay(bool))); @@ -398,6 +406,49 @@ IdDialog::IdDialog(QWidget *parent) : tmer->start(10000) ; // update every 10 secs. } +void IdDialog::handleEvent_main_thread(std::shared_ptr event) +{ + if(event->mType == RsEventType::GXS_IDENTITY) + { + const RsGxsIdentityEvent *e = dynamic_cast(event.get()); + + if(!e) + return; + + switch(e->mIdentityEventCode) + { + case RsGxsIdentityEventCode::DELETED_IDENTITY: + case RsGxsIdentityEventCode::NEW_IDENTITY: + + requestIdList(); + default: + break; + } + } + else if(event->mType == RsEventType::GXS_CIRCLES) + { + const RsGxsCircleEvent *e = dynamic_cast(event.get()); + + if(!e) + return; + + switch(e->mCircleEventType) + { + case RsGxsCircleEventCode::NEW_CIRCLE: + case RsGxsCircleEventCode::CIRCLE_MEMBERSHIP_REQUEST: + case RsGxsCircleEventCode::CIRCLE_MEMBERSHIP_INVITE: + case RsGxsCircleEventCode::CIRCLE_MEMBERSHIP_LEAVE: + case RsGxsCircleEventCode::CIRCLE_MEMBERSHIP_JOIN: + case RsGxsCircleEventCode::CIRCLE_MEMBERSHIP_REVOQUED: + + requestCircleGroupMeta(); + default: + break; + } + + } +} + void IdDialog::clearPerson() { QFontMetricsF f(ui->avLabel_Person->font()) ; @@ -701,7 +752,7 @@ void IdDialog::loadCircleGroupMeta(const uint32_t &token) for(std::map::const_iterator it(details.mSubscriptionFlags.begin());it!=details.mSubscriptionFlags.end();++it) { #ifdef ID_DEBUG - std::cerr << " ID " << *it << ": " ; + std::cerr << " ID " << it->first << ": " ; #endif bool is_own_id = rsIdentity->isOwnId(it->first) ; bool invited ( it->second & GXS_EXTERNAL_CIRCLE_FLAGS_IN_ADMIN_LIST ); @@ -2095,7 +2146,7 @@ void IdDialog::modifyReputation() rsReputations->setOwnOpinion(id,op); #ifdef ID_DEBUG - std::cerr << "IdDialog::modifyReputation() ID: " << id << " Mod: " << op; + std::cerr << "IdDialog::modifyReputation() ID: " << id << " Mod: " << static_cast(op); std::cerr << std::endl; #endif diff --git a/retroshare-gui/src/gui/Identity/IdDialog.h b/retroshare-gui/src/gui/Identity/IdDialog.h index 30f2d0641..e4c73229d 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.h +++ b/retroshare-gui/src/gui/Identity/IdDialog.h @@ -158,6 +158,10 @@ private: RsGxsGroupId mIdToNavigate; int filter; + void handleEvent_main_thread(std::shared_ptr event); + RsEventsHandlerId_t mEventHandlerId_identity; + RsEventsHandlerId_t mEventHandlerId_circles; + /* UI - Designer */ Ui::IdDialog *ui; }; diff --git a/retroshare-gui/src/gui/MainPage.cpp b/retroshare-gui/src/gui/MainPage.cpp index 087655572..545f1270e 100644 --- a/retroshare-gui/src/gui/MainPage.cpp +++ b/retroshare-gui/src/gui/MainPage.cpp @@ -31,6 +31,15 @@ MainPage::MainPage(QWidget *parent , Qt::WindowFlags flags ) : QWidget(parent, f mIcon = QIcon(); mName = ""; mHelp = ""; + mUserNotify = nullptr; +} + +UserNotify *MainPage::getUserNotify() +{ + if(!mUserNotify) + mUserNotify = createUserNotify(this); + + return mUserNotify; } void MainPage::registerHelpButton(QToolButton *button, const QString& help_html_text, const QString &code_name) diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 6ec0c22f7..63a563dc4 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -469,7 +469,7 @@ void MainWindow::initStackedPage() //List All notify before Setting was created QList > >::iterator notifyIt; for (notifyIt = notify.begin(); notifyIt != notify.end(); ++notifyIt) { - UserNotify *userNotify = notifyIt->first->getUserNotify(this); + UserNotify *userNotify = notifyIt->first->getUserNotify(); if (userNotify) { userNotify->initialize(ui->toolBarPage, notifyIt->second.first, notifyIt->second.second); connect(userNotify, SIGNAL(countChanged()), this, SLOT(updateTrayCombine())); diff --git a/retroshare-gui/src/gui/NewsFeed.cpp b/retroshare-gui/src/gui/NewsFeed.cpp index c64c758ea..2f70340be 100644 --- a/retroshare-gui/src/gui/NewsFeed.cpp +++ b/retroshare-gui/src/gui/NewsFeed.cpp @@ -141,7 +141,7 @@ NewsFeed::~NewsFeed() } } -UserNotify *NewsFeed::getUserNotify(QObject *parent) +UserNotify *NewsFeed::createUserNotify(QObject *parent) { return new NewsFeedUserNotify(this, parent); } diff --git a/retroshare-gui/src/gui/NewsFeed.h b/retroshare-gui/src/gui/NewsFeed.h index ec9aabcb5..9f43c0df8 100644 --- a/retroshare-gui/src/gui/NewsFeed.h +++ b/retroshare-gui/src/gui/NewsFeed.h @@ -70,7 +70,7 @@ public: virtual QString pageName() const { return tr("Log") ; } //MainPage virtual QString helpText() const { return ""; } //MainPage - virtual UserNotify *getUserNotify(QObject *parent); + virtual UserNotify *createUserNotify(QObject *parent) override; /* FeedHolder Functions (for FeedItem functionality) */ virtual QScrollArea *getScrollArea(); diff --git a/retroshare-gui/src/gui/Posted/PostedDialog.cpp b/retroshare-gui/src/gui/Posted/PostedDialog.cpp index edf09ff20..5e743b957 100644 --- a/retroshare-gui/src/gui/Posted/PostedDialog.cpp +++ b/retroshare-gui/src/gui/Posted/PostedDialog.cpp @@ -26,6 +26,7 @@ #include "gui/gxs/GxsGroupShareKey.h" #include "gui/settings/rsharesettings.h" #include "gui/common/GroupTreeWidget.h" +#include "util/qtthreadsutils.h" #include @@ -43,13 +44,48 @@ public: PostedDialog::PostedDialog(QWidget *parent) : GxsGroupFrameDialog(rsPosted, parent) { + mEventHandlerId = 0; + // Needs to be asynced because this function is likely to be called by another thread! + + rsEvents->registerEventsHandler(RsEventType::GXS_POSTED, [this](std::shared_ptr event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId ); } +void PostedDialog::handleEvent_main_thread(std::shared_ptr event) +{ + if(event->mType == RsEventType::GXS_POSTED) + { + const RsGxsPostedEvent *e = dynamic_cast(event.get()); + if(!e) return; + + switch(e->mPostedEventCode) + { + case RsPostedEventCode::NEW_MESSAGE: + updateMessageSummaryList(e->mPostedGroupId); + break; + + case RsPostedEventCode::UPDATED_MESSAGE: // [[fallthrough]]; + updateDisplay(false); + break; + + case RsPostedEventCode::READ_STATUS_CHANGED: // [[fallthrough]]; + updateMessageSummaryList(e->mPostedGroupId); + break; + + case RsPostedEventCode::NEW_POSTED_GROUP: // [[fallthrough]]; + case RsPostedEventCode::SUBSCRIBE_STATUS_CHANGED: // [[fallthrough]]; + updateDisplay(true); + break; + default: break; + } + } +} + + PostedDialog::~PostedDialog() { } -UserNotify *PostedDialog::getUserNotify(QObject *parent) +UserNotify *PostedDialog::createUserNotify(QObject *parent) { return new PostedUserNotify(rsPosted, parent); } diff --git a/retroshare-gui/src/gui/Posted/PostedDialog.h b/retroshare-gui/src/gui/Posted/PostedDialog.h index e3f681aa8..7f23ee24f 100644 --- a/retroshare-gui/src/gui/Posted/PostedDialog.h +++ b/retroshare-gui/src/gui/Posted/PostedDialog.h @@ -40,9 +40,8 @@ public: virtual QString pageName() const { return tr("Links") ; } //MainPage virtual QString helpText() const { return ""; } //MainPage - virtual UserNotify *getUserNotify(QObject *parent); - protected: + virtual UserNotify *createUserNotify(QObject *parent) override; virtual QString getHelpString() const ; virtual RetroShareLink::enumType getLinkType() { return RetroShareLink::TYPE_POSTED; } virtual GroupFrameSettings::Type groupFrameSettingsType() { return GroupFrameSettings::Posted; } @@ -61,6 +60,9 @@ private: virtual QWidget *createCommentHeaderWidget(const RsGxsGroupId &grpId, const RsGxsMessageId &msgId); virtual uint32_t requestGroupSummaryType() { return GXS_REQUEST_TYPE_GROUP_DATA; } // request complete group data virtual void loadGroupSummaryToken(const uint32_t &token, std::list &groupInfo, RsUserdata* &userdata); + + void handleEvent_main_thread(std::shared_ptr event); + RsEventsHandlerId_t mEventHandlerId; }; #endif diff --git a/retroshare-gui/src/gui/Posted/PostedListWidget.cpp b/retroshare-gui/src/gui/Posted/PostedListWidget.cpp index 9c86a2f9a..1373c6d9b 100644 --- a/retroshare-gui/src/gui/Posted/PostedListWidget.cpp +++ b/retroshare-gui/src/gui/Posted/PostedListWidget.cpp @@ -23,6 +23,7 @@ #include "PostedListWidget.h" #include "ui_PostedListWidget.h" +#include "util/qtthreadsutils.h" #include "gui/gxs/GxsIdDetails.h" #include "PostedCreatePostDialog.h" #include "PostedItem.h" @@ -94,7 +95,6 @@ PostedListWidget::PostedListWidget(const RsGxsGroupId &postedId, QWidget *parent /* Initialize GUI */ setGroupId(postedId); } - PostedListWidget::~PostedListWidget() { // save settings diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp index a3984ae53..d2aa30ce3 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp +++ b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.cpp @@ -32,6 +32,7 @@ #include "gui/common/RSTreeWidget.h" #include "gui/notifyqt.h" #include "gui/common/UIStateHelper.h" +#include "gui/common/UserNotify.h" #include "GxsCommentDialog.h" //#define DEBUG_GROUPFRAMEDIALOG @@ -1173,6 +1174,8 @@ void GxsGroupFrameDialog::loadGroupStatistics(const uint32_t &token) } ui->groupTreeWidget->setUnreadCount(item, mCountChildMsgs ? (stats.mNumThreadMsgsUnread + stats.mNumChildMsgsUnread) : stats.mNumThreadMsgsUnread); + + getUserNotify()->updateIcon(); } /*********************** **** **** **** ***********************/ diff --git a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.h b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.h index 4e77ccb44..cc1fa7843 100644 --- a/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.h +++ b/retroshare-gui/src/gui/gxs/GxsGroupFrameDialog.h @@ -96,6 +96,8 @@ protected: virtual void groupInfoToGroupItemInfo(const RsGroupMetaData &groupInfo, GroupItemInfo &groupItemInfo, const RsUserdata *userdata); virtual void checkRequestGroup(const RsGxsGroupId& /* grpId */) {} // overload this one in order to retrieve full group data when the group is browsed + void updateMessageSummaryList(RsGxsGroupId groupId); + private slots: void todo(); @@ -153,7 +155,6 @@ private: void initUi(); - void updateMessageSummaryList(RsGxsGroupId groupId); void updateSearchResults(); void openGroupInNewTab(const RsGxsGroupId &groupId); diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp index 2e1b6dc7e..f031772b3 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.cpp @@ -64,8 +64,23 @@ void GxsChannelDialog::handleEvent_main_thread(std::shared_ptr ev switch(e->mChannelEventCode) { - case RsChannelEventCode::SUBSCRIBE_STATUS_CHANGED: updateDisplay(true); + case RsChannelEventCode::NEW_MESSAGE: + updateMessageSummaryList(e->mChannelGroupId); break; + + case RsChannelEventCode::UPDATED_MESSAGE: // [[fallthrough]]; + updateDisplay(false); + break; + + case RsChannelEventCode::READ_STATUS_CHANGED: + updateMessageSummaryList(e->mChannelGroupId); + break; + + case RsChannelEventCode::NEW_CHANNEL: // [[fallthrough]]; + case RsChannelEventCode::SUBSCRIBE_STATUS_CHANGED: + updateDisplay(true); + break; + default: break; } @@ -92,7 +107,7 @@ QString GxsChannelDialog::getHelpString() const return hlp_str ; } -UserNotify *GxsChannelDialog::getUserNotify(QObject *parent) +UserNotify *GxsChannelDialog::createUserNotify(QObject *parent) { return new GxsChannelUserNotify(rsGxsChannels, parent); } diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.h b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.h index 5d80be518..4c9c6eb95 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.h +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelDialog.h @@ -39,8 +39,6 @@ public: virtual QString pageName() const { return tr("Channels") ; } //MainPage virtual QString helpText() const { return ""; } //MainPage - virtual UserNotify *getUserNotify(QObject *parent); - void shareOnChannel(const RsGxsGroupId& channel_id, const QList& file_link) ; protected: @@ -54,6 +52,7 @@ protected: virtual TurtleRequestId distantSearch(const QString& search_string) ; virtual void checkRequestGroup(const RsGxsGroupId& grpId) ; + virtual UserNotify *createUserNotify(QObject *parent) override; private slots: void toggleAutoDownload(); void setDefaultDirectory(); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumsDialog.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumsDialog.cpp index 2282db1bb..7d5889e4d 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsDialog.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsDialog.cpp @@ -59,7 +59,21 @@ void GxsForumsDialog::handleEvent_main_thread(std::shared_ptr eve switch(e->mForumEventCode) { - case RsForumEventCode::SUBSCRIBE_STATUS_CHANGED: updateDisplay(true); + case RsForumEventCode::NEW_MESSAGE: + updateMessageSummaryList(e->mForumGroupId); + break; + + case RsForumEventCode::UPDATED_MESSAGE: // [[fallthrough]]; + updateDisplay(false); + break; + + case RsForumEventCode::READ_STATUS_CHANGED: + updateMessageSummaryList(e->mForumGroupId); + break; + + case RsForumEventCode::NEW_FORUM: // [[fallthrough]]; + case RsForumEventCode::SUBSCRIBE_STATUS_CHANGED: + updateDisplay(true); break; default: break; @@ -102,7 +116,7 @@ void GxsForumsDialog::shareInMessage(const RsGxsGroupId& forum_id,const QListshow(); } -UserNotify *GxsForumsDialog::getUserNotify(QObject *parent) +UserNotify *GxsForumsDialog::createUserNotify(QObject *parent) { return new GxsForumUserNotify(rsGxsForums, parent); } diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumsDialog.h b/retroshare-gui/src/gui/gxsforums/GxsForumsDialog.h index 6a21c8de9..9b6da9d00 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumsDialog.h +++ b/retroshare-gui/src/gui/gxsforums/GxsForumsDialog.h @@ -37,11 +37,11 @@ public: virtual QString pageName() const { return tr("Forums") ; } //MainPage virtual QString helpText() const { return ""; } //MainPage - virtual UserNotify *getUserNotify(QObject *parent); - void shareInMessage(const RsGxsGroupId& forum_id, const QList& file_link) ; protected: + virtual UserNotify *createUserNotify(QObject *parent) override; + virtual QString getHelpString() const ; virtual RetroShareLink::enumType getLinkType() { return RetroShareLink::TYPE_FORUM; } virtual GroupFrameSettings::Type groupFrameSettingsType() { return GroupFrameSettings::Forum; } diff --git a/retroshare-gui/src/gui/msgs/MessagesDialog.cpp b/retroshare-gui/src/gui/msgs/MessagesDialog.cpp index fca0e8cbf..62a027a51 100644 --- a/retroshare-gui/src/gui/msgs/MessagesDialog.cpp +++ b/retroshare-gui/src/gui/msgs/MessagesDialog.cpp @@ -325,7 +325,7 @@ MessagesDialog::~MessagesDialog() processSettings(false); } -UserNotify *MessagesDialog::getUserNotify(QObject *parent) +UserNotify *MessagesDialog::createUserNotify(QObject *parent) { return new MessageUserNotify(parent); } diff --git a/retroshare-gui/src/gui/msgs/MessagesDialog.h b/retroshare-gui/src/gui/msgs/MessagesDialog.h index 1671df268..a8115d466 100644 --- a/retroshare-gui/src/gui/msgs/MessagesDialog.h +++ b/retroshare-gui/src/gui/msgs/MessagesDialog.h @@ -50,8 +50,6 @@ public: virtual QString pageName() const { return tr("Mail") ; } //MainPage virtual QString helpText() const { return ""; } //MainPage - virtual UserNotify *getUserNotify(QObject *parent); - // replaced by shortcut // virtual void keyPressEvent(QKeyEvent *) ; @@ -64,6 +62,7 @@ signals: void messagesLoaded(); protected: + virtual UserNotify *createUserNotify(QObject *parent) override; bool eventFilter(QObject *obj, QEvent *ev); int getSelectedMessages(QList& mid); diff --git a/retroshare-gui/src/retroshare-gui/mainpage.h b/retroshare-gui/src/retroshare-gui/mainpage.h index dc1853556..c96706e7e 100644 --- a/retroshare-gui/src/retroshare-gui/mainpage.h +++ b/retroshare-gui/src/retroshare-gui/mainpage.h @@ -55,14 +55,19 @@ public: void setHelpText(QString help) { mHelp = help; } virtual void retranslateUi() {} - virtual UserNotify *getUserNotify(QObject */*parent*/) { return NULL; } + + // Override this if needed. + virtual UserNotify *createUserNotify(QObject */*parent*/) { return NULL; } // Call this to add some help info to the page. The way the info is // shown is handled by showHelp() below; // void registerHelpButton(QToolButton *button, const QString& help_html_text, const QString &code_name) ; + UserNotify *getUserNotify() ; + protected: + virtual void showEvent(QShowEvent *); private: @@ -71,6 +76,8 @@ private: QString mName; QString mHelp; QString mHelpCodeName; + + UserNotify *mUserNotify; }; #endif