From cf7a77e51250b66052799b4453f0be916afb3e8e Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 31 Mar 2020 20:21:16 +0200 Subject: [PATCH] finished converting GxsMessageFrameWidget to blocking API --- libretroshare/src/gxs/rsgxsdataaccess.cc | 6 +++-- libretroshare/src/retroshare/rsgxschannels.h | 23 ++++++++++++---- .../src/retroshare/rsgxsifacehelper.h | 12 ++++++--- libretroshare/src/retroshare/rsposted.h | 5 ++++ libretroshare/src/services/p3gxschannels.cc | 26 ++++++++++++++----- libretroshare/src/services/p3gxschannels.h | 11 +++++--- libretroshare/src/services/p3posted.cc | 14 ++++++++++ libretroshare/src/services/p3posted.h | 4 +++ .../src/gui/Posted/PostedListWidget.cpp | 9 ++----- .../src/gui/gxs/GxsMessageFramePostWidget.cpp | 6 +++++ .../src/gui/gxs/GxsMessageFramePostWidget.h | 2 ++ .../gui/gxschannels/GxsChannelPostsWidget.cpp | 18 ++++--------- .../gui/gxschannels/GxsChannelPostsWidget.h | 3 ++- 13 files changed, 98 insertions(+), 41 deletions(-) diff --git a/libretroshare/src/gxs/rsgxsdataaccess.cc b/libretroshare/src/gxs/rsgxsdataaccess.cc index 373d9a872..f8300b37e 100644 --- a/libretroshare/src/gxs/rsgxsdataaccess.cc +++ b/libretroshare/src/gxs/rsgxsdataaccess.cc @@ -217,7 +217,8 @@ bool RsGxsDataAccess::requestMsgInfo(uint32_t &token, uint32_t ansType, mmr->mMsgIds[*lit] = std::set(); req = mmr; - }else if(reqType & GXS_REQUEST_TYPE_MSG_DATA) + } + else if(reqType & GXS_REQUEST_TYPE_MSG_DATA) { MsgDataReq* mdr = new MsgDataReq(); @@ -225,7 +226,8 @@ bool RsGxsDataAccess::requestMsgInfo(uint32_t &token, uint32_t ansType, mdr->mMsgIds[*lit] = std::set(); req = mdr; - }else if(reqType & GXS_REQUEST_TYPE_MSG_IDS) + } + else if(reqType & GXS_REQUEST_TYPE_MSG_IDS) { MsgIdReq* mir = new MsgIdReq(); diff --git a/libretroshare/src/retroshare/rsgxschannels.h b/libretroshare/src/retroshare/rsgxschannels.h index a506e66e5..418afc670 100644 --- a/libretroshare/src/retroshare/rsgxschannels.h +++ b/libretroshare/src/retroshare/rsgxschannels.h @@ -323,7 +323,20 @@ public: std::vector& channelsInfo ) = 0; /** - * @brief Get channel contents + * @brief Get all channel messages and comments in a given channel + * @jsonapi{development} + * @param[in] channelId id of the channel of which the content is requested + * @param[out] posts storage for posts + * @param[out] comments storage for the comments + * @return false if something failed, true otherwhise + */ + virtual bool getChannelAllContent(const RsGxsGroupId& channelId, + std::vector& posts, + std::vector& comments ) = 0; + + /** + * @brief Get channel messages and comments corresponding to the given message ID list. If the list is empty, nothing is returned. Since + * comments are themselves messages, it is possible to get comments only by only supplying their message IDs. * @jsonapi{development} * @param[in] channelId id of the channel of which the content is requested * @param[in] contentsIds ids of requested contents @@ -331,10 +344,10 @@ public: * @param[out] comments storage for the comments * @return false if something failed, true otherwhise */ - virtual bool getChannelContent( const RsGxsGroupId& channelId, - const std::set& contentsIds, - std::vector& posts, - std::vector& comments ) = 0; + virtual bool getChannelContent(const RsGxsGroupId& channelId, + const std::set& contentIds, + std::vector& posts, + std::vector& comments ) = 0; /** * @brief Get channel content summaries diff --git a/libretroshare/src/retroshare/rsgxsifacehelper.h b/libretroshare/src/retroshare/rsgxsifacehelper.h index 01716c35c..d735fa8c2 100644 --- a/libretroshare/src/retroshare/rsgxsifacehelper.h +++ b/libretroshare/src/retroshare/rsgxsifacehelper.h @@ -40,8 +40,11 @@ * are necessary, so at this point this workaround seems acceptable. */ +#define DEBUG_GXSIFACEHELPER 1 + enum class TokenRequestType: uint8_t { + UNDEFINED = 0x00, GROUP_INFO = 0x01, POSTS = 0x02, ALL_POSTS = 0x03, @@ -284,7 +287,8 @@ public: if(mTokenService.requestMsgInfo(token, 0, opts, msgIds)) { RS_STACK_MUTEX(mMtx); - mActiveTokens[token]= msgIds.empty()?(TokenRequestType::ALL_POSTS):(TokenRequestType::POSTS); + + mActiveTokens[token]= (msgIds.size()==1 && msgIds.begin()->second.size()==0) ?(TokenRequestType::ALL_POSTS):(TokenRequestType::POSTS); locked_dumpTokens(); return true; } @@ -459,15 +463,15 @@ private: uint32_t count[7] = {0}; - std::cerr << "Service 0x0" << std::hex << service_id + std::cerr << "Service " << std::hex << service_id << std::dec << " (" << rsServiceControl->getServiceName(RsServiceInfo::RsServiceInfoUIn16ToFullServiceId(service_id)) - << ") this=0x" << (void*)this << ") Active tokens (per type): " ; + << ") this=" << std::hex << (void*)this << std::dec << ") Active tokens (per type): " ; for(auto& it: mActiveTokens) // let's count how many token of each type we've got. ++count[static_cast(it.second)]; for(uint32_t i=0;i<7;++i) - std::cerr /* << i << ":" */ << count[i] << " "; + std::cerr << std::dec /* << i << ":" */ << count[i] << " "; std::cerr << std::endl; } }; diff --git a/libretroshare/src/retroshare/rsposted.h b/libretroshare/src/retroshare/rsposted.h index c2a069002..347419082 100644 --- a/libretroshare/src/retroshare/rsposted.h +++ b/libretroshare/src/retroshare/rsposted.h @@ -150,6 +150,11 @@ public: virtual bool getBoardsSummaries(std::list& groupInfo) =0; + virtual bool getBoardAllContent( + const RsGxsGroupId& boardId, + std::vector& posts, + std::vector& comments ) = 0; + virtual bool getBoardContent( const RsGxsGroupId& boardId, const std::set& contentsIds, diff --git a/libretroshare/src/services/p3gxschannels.cc b/libretroshare/src/services/p3gxschannels.cc index 93c85d8d0..931098059 100644 --- a/libretroshare/src/services/p3gxschannels.cc +++ b/libretroshare/src/services/p3gxschannels.cc @@ -1083,20 +1083,34 @@ bool p3GxsChannels::getContentSummaries( return res; } +bool p3GxsChannels::getChannelAllContent( const RsGxsGroupId& channelId, + std::vector& posts, + std::vector& comments ) +{ + uint32_t token; + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA; + + if( !requestMsgInfo(token, opts,std::list({channelId})) || waitToken(token) != RsTokenService::COMPLETE ) + return false; + + return getPostData(token, posts, comments); +} + bool p3GxsChannels::getChannelContent( const RsGxsGroupId& channelId, - const std::set& contentsIds, - std::vector& posts, - std::vector& comments ) + const std::set& contentIds, + std::vector& posts, + std::vector& comments ) { uint32_t token; RsTokReqOptions opts; opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA; GxsMsgReq msgIds; - msgIds[channelId] = contentsIds; + msgIds[channelId] = contentIds; - if( !requestMsgInfo(token, opts, msgIds) || - waitToken(token) != RsTokenService::COMPLETE ) return false; + if( !requestMsgInfo(token, opts, msgIds) || waitToken(token) != RsTokenService::COMPLETE ) + return false; return getPostData(token, posts, comments); } diff --git a/libretroshare/src/services/p3gxschannels.h b/libretroshare/src/services/p3gxschannels.h index 81eb75f5f..e529c227b 100644 --- a/libretroshare/src/services/p3gxschannels.h +++ b/libretroshare/src/services/p3gxschannels.h @@ -185,9 +185,14 @@ virtual bool ExtraFileRemove(const RsFileHash &hash); const std::list& chanIds, std::vector& channelsInfo ) override; - /// Implementation of @see RsGxsChannels::getChannelContent - bool getChannelContent( const RsGxsGroupId& channelId, - const std::set& contentsIds, + /// Implementation of @see RsGxsChannels::getChannelAllMessages + bool getChannelAllContent(const RsGxsGroupId& channelId, + std::vector& posts, + std::vector& comments ) override; + + /// Implementation of @see RsGxsChannels::getChannelMessages + bool getChannelContent(const RsGxsGroupId& channelId, + const std::set& contentIds, std::vector& posts, std::vector& comments ) override; diff --git a/libretroshare/src/services/p3posted.cc b/libretroshare/src/services/p3posted.cc index 8ecad994f..299a990b1 100644 --- a/libretroshare/src/services/p3posted.cc +++ b/libretroshare/src/services/p3posted.cc @@ -322,6 +322,20 @@ bool p3Posted::getBoardsInfo( return getGroupData(token, groupsInfo) && !groupsInfo.empty(); } +bool p3Posted::getBoardAllContent( const RsGxsGroupId& groupId, + std::vector& posts, + std::vector& comments ) +{ + uint32_t token; + RsTokReqOptions opts; + opts.mReqType = GXS_REQUEST_TYPE_MSG_DATA; + + if( !requestMsgInfo(token, opts, std::list({groupId})) || waitToken(token) != RsTokenService::COMPLETE ) + return false; + + return getPostData(token, posts, comments); +} + bool p3Posted::getBoardContent( const RsGxsGroupId& groupId, const std::set& contentsIds, std::vector& posts, diff --git a/libretroshare/src/services/p3posted.h b/libretroshare/src/services/p3posted.h index 5fe5b0718..3cc016ee7 100644 --- a/libretroshare/src/services/p3posted.h +++ b/libretroshare/src/services/p3posted.h @@ -61,6 +61,10 @@ virtual void receiveHelperChanges(std::vector& changes) bool getBoardsInfo(const std::list& boardsIds, std::vector& groupsInfo ) override; + bool getBoardAllContent(const RsGxsGroupId& groupId, + std::vector& posts, + std::vector& comments ) override; + bool getBoardContent(const RsGxsGroupId& groupId, const std::set& contentsIds, std::vector& posts, diff --git a/retroshare-gui/src/gui/Posted/PostedListWidget.cpp b/retroshare-gui/src/gui/Posted/PostedListWidget.cpp index b8d214eb5..babf214e3 100644 --- a/retroshare-gui/src/gui/Posted/PostedListWidget.cpp +++ b/retroshare-gui/src/gui/Posted/PostedListWidget.cpp @@ -888,6 +888,7 @@ void PostedListWidget::shallowClearPosts() bool PostedListWidget::insertGroupData(const RsGxsGenericGroupData *data) { insertPostedDetails(*dynamic_cast(data)); + return true; } void PostedListWidget::insertAllPostedPosts(const std::vector& posts, GxsMessageFramePostThread */*thread*/) @@ -1048,7 +1049,7 @@ void PostedListWidget::getAllMsgData(std::vector& psts) std::vector posts; std::vector comments; - rsPosted->getBoardContent( groupId(),std::set(),posts,comments ); + rsPosted->getBoardAllContent( groupId(),posts,comments ); psts.clear(); @@ -1073,10 +1074,7 @@ void PostedListWidget::insertPosts(const std::vector& post std::vector cposts; for(auto post: posts) // This is not so nice but we have somehow to convert to RsGxsChannelPost at some timer, and the cposts list is being modified in the insert method. - { cposts.push_back(*dynamic_cast(post)); - delete post; - } insertPostedPosts(cposts); } @@ -1086,10 +1084,7 @@ void PostedListWidget::insertAllPosts(const std::vector& p std::vector cposts; for(auto post: posts) // This is not so nice but we have somehow to convert to RsGxsChannelPost at some timer, and the cposts list is being modified in the insert method. - { cposts.push_back(*dynamic_cast(post)); - delete post; - } insertAllPostedPosts(cposts, NULL); } diff --git a/retroshare-gui/src/gui/gxs/GxsMessageFramePostWidget.cpp b/retroshare-gui/src/gui/gxs/GxsMessageFramePostWidget.cpp index 587e607f9..48324ca5e 100644 --- a/retroshare-gui/src/gui/gxs/GxsMessageFramePostWidget.cpp +++ b/retroshare-gui/src/gui/gxs/GxsMessageFramePostWidget.cpp @@ -510,6 +510,12 @@ void GxsMessageFramePostWidget::loadPosts(const std::set& msgIds mNavigatePendingMsgId.clear(); } + + // don't forget to delete posts. + + for(auto& post:posts) + delete post; + }, this ); }); } diff --git a/retroshare-gui/src/gui/gxs/GxsMessageFramePostWidget.h b/retroshare-gui/src/gui/gxs/GxsMessageFramePostWidget.h index e43edcfa8..f1d4e74e7 100644 --- a/retroshare-gui/src/gui/gxs/GxsMessageFramePostWidget.h +++ b/retroshare-gui/src/gui/gxs/GxsMessageFramePostWidget.h @@ -81,6 +81,8 @@ protected: //void requestPosts(const std::set &msgIds); //void loadPosts(const uint32_t &token); #endif + // In the following 3 methods, the memory ownership is kept by GxsMessageFramePostWidget + virtual bool insertGroupData(const RsGxsGenericGroupData *data) =0; virtual void insertPosts(const std::vector& posts) =0; virtual void insertAllPosts(const std::vector& posts, GxsMessageFramePostThread *thread) =0; diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.cpp b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.cpp index b21ad2d2c..2be59d364 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.cpp +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.cpp @@ -148,7 +148,7 @@ void GxsChannelPostsWidget::handleEvent_main_thread(std::shared_ptrmChannelGroupId == mChannelGroupId) + if(e->mChannelGroupId == groupId()) updateDisplay(true); break; default: @@ -737,7 +737,6 @@ void GxsChannelPostsWidget::toggleAutoDownload() bool GxsChannelPostsWidget::insertGroupData(const RsGxsGenericGroupData *data) { insertChannelDetails(*dynamic_cast(data)); - mChannelGroupId = data->mMeta.mGroupId; return true; } @@ -757,7 +756,7 @@ void GxsChannelPostsWidget::getMsgData(const std::set& msgIds,st std::vector posts; std::vector comments; - rsGxsChannels->getChannelContent( mChannelGroupId,msgIds,posts,comments ); + rsGxsChannels->getChannelContent( groupId(),msgIds,posts,comments ); psts.clear(); @@ -770,7 +769,7 @@ void GxsChannelPostsWidget::getAllMsgData(std::vector& pst std::vector posts; std::vector comments; - rsGxsChannels->getChannelContent( mChannelGroupId,std::set(),posts,comments ); + rsGxsChannels->getChannelAllContent( groupId(),posts,comments ); psts.clear(); @@ -795,7 +794,6 @@ bool GxsChannelPostsWidget::getGroupData(RsGxsGenericGroupData *& data) { insertChannelDetails(distant_group); data = new RsGxsChannelGroup(distant_group); - mChannelGroupId = distant_group.mMeta.mGroupId; return true ; } } @@ -808,10 +806,7 @@ void GxsChannelPostsWidget::insertAllPosts(const std::vector cposts; for(auto post: posts) // This is not so nice but we have somehow to convert to RsGxsChannelPost at some timer, and the cposts list is being modified in the insert method. - { - cposts.push_back(*dynamic_cast(post)); - delete post; - } + cposts.push_back(*static_cast(post)); insertChannelPosts(cposts, thread, false); } @@ -820,10 +815,7 @@ void GxsChannelPostsWidget::insertPosts(const std::vector& std::vector cposts; for(auto post: posts) // This is not so nice but we have somehow to convert to RsGxsChannelPost at some timer, and the cposts list is being modified in the insert method. - { - cposts.push_back(*dynamic_cast(post)); - delete post; - } + cposts.push_back(*static_cast(post)); insertChannelPosts(cposts, NULL, true); } diff --git a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.h b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.h index 1b93f1531..03ba86a99 100644 --- a/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.h +++ b/retroshare-gui/src/gui/gxschannels/GxsChannelPostsWidget.h @@ -66,8 +66,10 @@ protected: /* GxsMessageFramePostWidget */ virtual void groupNameChanged(const QString &name); virtual bool insertGroupData(const RsGxsGenericGroupData *data) override; +#ifdef TO_REMOVE virtual void insertAllPosts(const uint32_t &token, GxsMessageFramePostThread *thread); virtual void insertPosts(const uint32_t &token); +#endif virtual void clearPosts(); virtual bool useThread() { return mUseThread; } virtual void fillThreadCreatePost(const QVariant &post, bool related, int current, int count); @@ -109,7 +111,6 @@ private: QAction *mAutoDownloadAction; bool mUseThread; - RsGxsGroupId mChannelGroupId; RsEventsHandlerId_t mEventHandlerId ; /* UI - from Designer */