mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-20 06:50:40 -04:00
fixed notifications for distant search results in channels
This commit is contained in:
parent
caf0bfc4e9
commit
595df99310
8 changed files with 103 additions and 92 deletions
|
@ -105,27 +105,15 @@ struct RsGxsChannelPost : RsSerializable
|
||||||
|
|
||||||
enum class RsChannelEventCode: uint8_t
|
enum class RsChannelEventCode: uint8_t
|
||||||
{
|
{
|
||||||
UNKNOWN = 0x00,
|
UNKNOWN = 0x00,
|
||||||
NEW_CHANNEL = 0x01, /// emitted when new channel is received
|
NEW_CHANNEL = 0x01, // emitted when new channel is received
|
||||||
|
UPDATED_CHANNEL = 0x02, // emitted when existing channel is updated
|
||||||
/// emitted when existing channel is updated
|
NEW_MESSAGE = 0x03, // new message reeived in a particular channel (group and msg id)
|
||||||
UPDATED_CHANNEL = 0x02,
|
UPDATED_MESSAGE = 0x04, // existing message has been updated in a particular channel
|
||||||
|
RECEIVED_PUBLISH_KEY = 0x05, // publish key for this channel has been received
|
||||||
/// new message reeived in a particular channel (group and msg id)
|
SUBSCRIBE_STATUS_CHANGED = 0x06, // subscription for channel mChannelGroupId changed.
|
||||||
NEW_MESSAGE = 0x03,
|
READ_STATUS_CHANGED = 0x07, // existing message has been read or set to unread
|
||||||
|
RECEIVED_DISTANT_SEARCH_RESULT = 0x08, // result for the given group id available for the given turtle request id
|
||||||
/// existing message has been updated in a particular channel
|
|
||||||
UPDATED_MESSAGE = 0x04,
|
|
||||||
|
|
||||||
/// publish key for this channel has been received
|
|
||||||
RECEIVED_PUBLISH_KEY = 0x05,
|
|
||||||
|
|
||||||
/// 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
|
struct RsGxsChannelEvent: RsEvent
|
||||||
|
@ -137,6 +125,7 @@ struct RsGxsChannelEvent: RsEvent
|
||||||
RsChannelEventCode mChannelEventCode;
|
RsChannelEventCode mChannelEventCode;
|
||||||
RsGxsGroupId mChannelGroupId;
|
RsGxsGroupId mChannelGroupId;
|
||||||
RsGxsMessageId mChannelMsgId;
|
RsGxsMessageId mChannelMsgId;
|
||||||
|
TurtleRequestId mDistantSearchRequestId;
|
||||||
|
|
||||||
///* @see RsEvent @see RsSerializable
|
///* @see RsEvent @see RsSerializable
|
||||||
void serial_process( RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) override
|
void serial_process( RsGenericSerializer::SerializeJob j,RsGenericSerializer::SerializeContext& ctx) override
|
||||||
|
@ -146,6 +135,7 @@ struct RsGxsChannelEvent: RsEvent
|
||||||
RS_SERIAL_PROCESS(mChannelEventCode);
|
RS_SERIAL_PROCESS(mChannelEventCode);
|
||||||
RS_SERIAL_PROCESS(mChannelGroupId);
|
RS_SERIAL_PROCESS(mChannelGroupId);
|
||||||
RS_SERIAL_PROCESS(mChannelMsgId);
|
RS_SERIAL_PROCESS(mChannelMsgId);
|
||||||
|
RS_SERIAL_PROCESS(mDistantSearchRequestId);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,14 @@ typedef std::map<RsGxsGrpMsgIdPair, std::vector<RsMsgMetaData> > GxsMsgRelatedMe
|
||||||
struct RsGxsNotify
|
struct RsGxsNotify
|
||||||
{
|
{
|
||||||
enum NotifyType
|
enum NotifyType
|
||||||
{ TYPE_PUBLISHED, TYPE_RECEIVED_NEW, TYPE_PROCESSED, TYPE_RECEIVED_PUBLISHKEY, TYPE_RECEIVED_DISTANT_SEARCH_RESULTS };
|
{
|
||||||
|
TYPE_UNKNOWN = 0x00,
|
||||||
|
TYPE_PUBLISHED = 0x01,
|
||||||
|
TYPE_RECEIVED_NEW = 0x02,
|
||||||
|
TYPE_PROCESSED = 0x03,
|
||||||
|
TYPE_RECEIVED_PUBLISHKEY = 0x04,
|
||||||
|
TYPE_RECEIVED_DISTANT_SEARCH_RESULTS = 0x05
|
||||||
|
};
|
||||||
|
|
||||||
virtual ~RsGxsNotify() {}
|
virtual ~RsGxsNotify() {}
|
||||||
virtual NotifyType getType() = 0;
|
virtual NotifyType getType() = 0;
|
||||||
|
|
|
@ -245,6 +245,7 @@ void p3GxsChannels::notifyChanges(std::vector<RsGxsNotify *> &changes)
|
||||||
for(it = changes.begin(); it != changes.end(); ++it)
|
for(it = changes.begin(); it != changes.end(); ++it)
|
||||||
{
|
{
|
||||||
RsGxsMsgChange *msgChange = dynamic_cast<RsGxsMsgChange *>(*it);
|
RsGxsMsgChange *msgChange = dynamic_cast<RsGxsMsgChange *>(*it);
|
||||||
|
|
||||||
if (msgChange)
|
if (msgChange)
|
||||||
{
|
{
|
||||||
if (msgChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW|| msgChange->getType() == RsGxsNotify::TYPE_PUBLISHED)
|
if (msgChange->getType() == RsGxsNotify::TYPE_RECEIVED_NEW|| msgChange->getType() == RsGxsNotify::TYPE_PUBLISHED)
|
||||||
|
@ -294,75 +295,84 @@ void p3GxsChannels::notifyChanges(std::vector<RsGxsNotify *> &changes)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
RsGxsGroupChange *grpChange = dynamic_cast<RsGxsGroupChange*>(*it);
|
||||||
|
|
||||||
|
if (grpChange && rsEvents)
|
||||||
{
|
{
|
||||||
if (rsEvents)
|
switch (grpChange->getType())
|
||||||
{
|
{
|
||||||
RsGxsGroupChange *grpChange = dynamic_cast<RsGxsGroupChange*>(*it);
|
default:
|
||||||
if (grpChange)
|
case RsGxsNotify::TYPE_PROCESSED: // happens when the group is subscribed
|
||||||
|
{
|
||||||
|
std::list<RsGxsGroupId> &grpList = grpChange->mGrpIdList;
|
||||||
|
std::list<RsGxsGroupId>::iterator git;
|
||||||
|
for (git = grpList.begin(); git != grpList.end(); ++git)
|
||||||
{
|
{
|
||||||
switch (grpChange->getType())
|
auto ev = std::make_shared<RsGxsChannelEvent>();
|
||||||
{
|
ev->mChannelGroupId = *git;
|
||||||
default:
|
ev->mChannelEventCode = RsChannelEventCode::SUBSCRIBE_STATUS_CHANGED;
|
||||||
case RsGxsNotify::TYPE_PROCESSED: // happens when the group is subscribed
|
rsEvents->postEvent(ev);
|
||||||
{
|
|
||||||
std::list<RsGxsGroupId> &grpList = grpChange->mGrpIdList;
|
|
||||||
std::list<RsGxsGroupId>::iterator git;
|
|
||||||
for (git = grpList.begin(); git != grpList.end(); ++git)
|
|
||||||
{
|
|
||||||
auto ev = std::make_shared<RsGxsChannelEvent>();
|
|
||||||
ev->mChannelGroupId = *git;
|
|
||||||
ev->mChannelEventCode = RsChannelEventCode::SUBSCRIBE_STATUS_CHANGED;
|
|
||||||
rsEvents->postEvent(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RsGxsNotify::TYPE_PUBLISHED:
|
|
||||||
case RsGxsNotify::TYPE_RECEIVED_NEW:
|
|
||||||
{
|
|
||||||
/* group received */
|
|
||||||
std::list<RsGxsGroupId> &grpList = grpChange->mGrpIdList;
|
|
||||||
std::list<RsGxsGroupId>::iterator git;
|
|
||||||
RS_STACK_MUTEX(mKnownChannelsMutex);
|
|
||||||
for (git = grpList.begin(); git != grpList.end(); ++git)
|
|
||||||
{
|
|
||||||
if(mKnownChannels.find(*git) == mKnownChannels.end())
|
|
||||||
{
|
|
||||||
mKnownChannels.insert(std::make_pair(*git,time(NULL))) ;
|
|
||||||
IndicateConfigChanged();
|
|
||||||
|
|
||||||
auto ev = std::make_shared<RsGxsChannelEvent>();
|
|
||||||
ev->mChannelGroupId = *git;
|
|
||||||
ev->mChannelEventCode = RsChannelEventCode::NEW_CHANNEL;
|
|
||||||
rsEvents->postEvent(ev);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
std::cerr << "(II) Not notifying already known channel " << *git << std::endl;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case RsGxsNotify::TYPE_RECEIVED_PUBLISHKEY:
|
|
||||||
{
|
|
||||||
/* group received */
|
|
||||||
std::list<RsGxsGroupId> &grpList = grpChange->mGrpIdList;
|
|
||||||
std::list<RsGxsGroupId>::iterator git;
|
|
||||||
for (git = grpList.begin(); git != grpList.end(); ++git)
|
|
||||||
{
|
|
||||||
auto ev = std::make_shared<RsGxsChannelEvent>();
|
|
||||||
ev->mChannelGroupId = *git;
|
|
||||||
ev->mChannelEventCode = RsChannelEventCode::RECEIVED_PUBLISH_KEY;
|
|
||||||
rsEvents->postEvent(ev);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RsGxsNotify::TYPE_PUBLISHED:
|
||||||
|
case RsGxsNotify::TYPE_RECEIVED_NEW:
|
||||||
|
{
|
||||||
|
/* group received */
|
||||||
|
std::list<RsGxsGroupId> &grpList = grpChange->mGrpIdList;
|
||||||
|
std::list<RsGxsGroupId>::iterator git;
|
||||||
|
RS_STACK_MUTEX(mKnownChannelsMutex);
|
||||||
|
for (git = grpList.begin(); git != grpList.end(); ++git)
|
||||||
|
{
|
||||||
|
if(mKnownChannels.find(*git) == mKnownChannels.end())
|
||||||
|
{
|
||||||
|
mKnownChannels.insert(std::make_pair(*git,time(NULL))) ;
|
||||||
|
IndicateConfigChanged();
|
||||||
|
|
||||||
|
auto ev = std::make_shared<RsGxsChannelEvent>();
|
||||||
|
ev->mChannelGroupId = *git;
|
||||||
|
ev->mChannelEventCode = RsChannelEventCode::NEW_CHANNEL;
|
||||||
|
rsEvents->postEvent(ev);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
std::cerr << "(II) Not notifying already known channel " << *git << std::endl;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case RsGxsNotify::TYPE_RECEIVED_PUBLISHKEY:
|
||||||
|
{
|
||||||
|
/* group received */
|
||||||
|
std::list<RsGxsGroupId> &grpList = grpChange->mGrpIdList;
|
||||||
|
std::list<RsGxsGroupId>::iterator git;
|
||||||
|
for (git = grpList.begin(); git != grpList.end(); ++git)
|
||||||
|
{
|
||||||
|
auto ev = std::make_shared<RsGxsChannelEvent>();
|
||||||
|
ev->mChannelGroupId = *git;
|
||||||
|
ev->mChannelEventCode = RsChannelEventCode::RECEIVED_PUBLISH_KEY;
|
||||||
|
|
||||||
|
rsEvents->postEvent(ev);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RsGxsDistantSearchResultChange *dsrChange = dynamic_cast<RsGxsDistantSearchResultChange*>(*it);
|
||||||
|
|
||||||
|
if(dsrChange && rsEvents)
|
||||||
|
{
|
||||||
|
auto ev = std::make_shared<RsGxsChannelEvent>();
|
||||||
|
ev->mChannelGroupId = dsrChange->mGroupId;
|
||||||
|
ev->mChannelEventCode = RsChannelEventCode::RECEIVED_DISTANT_SEARCH_RESULT;
|
||||||
|
ev->mDistantSearchRequestId = dsrChange->mRequestId;
|
||||||
|
|
||||||
|
rsEvents->postEvent(ev);
|
||||||
|
}
|
||||||
|
|
||||||
/* shouldn't need to worry about groups - as they need to be subscribed to */
|
/* shouldn't need to worry about groups - as they need to be subscribed to */
|
||||||
delete *it;
|
delete *it;
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,8 +155,6 @@ private:
|
||||||
|
|
||||||
void initUi();
|
void initUi();
|
||||||
|
|
||||||
void updateSearchResults();
|
|
||||||
|
|
||||||
void openGroupInNewTab(const RsGxsGroupId &groupId);
|
void openGroupInNewTab(const RsGxsGroupId &groupId);
|
||||||
void groupSubscribe(bool subscribe);
|
void groupSubscribe(bool subscribe);
|
||||||
|
|
||||||
|
@ -185,6 +183,8 @@ private:
|
||||||
// void loadGroupSummary_CurrentGroup(const uint32_t &token);
|
// void loadGroupSummary_CurrentGroup(const uint32_t &token);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void updateSearchResults();
|
||||||
|
|
||||||
bool mCountChildMsgs; // Count unread child messages?
|
bool mCountChildMsgs; // Count unread child messages?
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -42,11 +42,6 @@ void RsGxsUpdateBroadcastPage::setUpdateWhenInvisible(bool update)
|
||||||
mBase->setUpdateWhenInvisible(update);
|
mBase->setUpdateWhenInvisible(update);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::set<TurtleRequestId>& RsGxsUpdateBroadcastPage::getSearchResults()
|
|
||||||
{
|
|
||||||
return mBase->getSearchResults();
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::set<RsGxsGroupId> &RsGxsUpdateBroadcastPage::getGrpIdsMeta()
|
const std::set<RsGxsGroupId> &RsGxsUpdateBroadcastPage::getGrpIdsMeta()
|
||||||
{
|
{
|
||||||
return mBase->getGrpIdsMeta();
|
return mBase->getGrpIdsMeta();
|
||||||
|
|
|
@ -51,7 +51,8 @@ public:
|
||||||
const std::map<RsGxsGroupId, std::set<RsGxsMessageId> > &getMsgIds();
|
const std::map<RsGxsGroupId, std::set<RsGxsMessageId> > &getMsgIds();
|
||||||
const std::map<RsGxsGroupId, std::set<RsGxsMessageId> > &getMsgIdsMeta();
|
const std::map<RsGxsGroupId, std::set<RsGxsMessageId> > &getMsgIdsMeta();
|
||||||
void getAllMsgIds(std::map<RsGxsGroupId, std::set<RsGxsMessageId> > &msgIds);
|
void getAllMsgIds(std::map<RsGxsGroupId, std::set<RsGxsMessageId> > &msgIds);
|
||||||
const std::set<TurtleRequestId>& getSearchResults();
|
|
||||||
|
virtual const std::set<TurtleRequestId> getSearchResults() const { return std::set<TurtleRequestId>(); } // overload this for subclasses that provide distant search
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void showEvent(QShowEvent *event);
|
virtual void showEvent(QShowEvent *event);
|
||||||
|
|
|
@ -76,6 +76,11 @@ void GxsChannelDialog::handleEvent_main_thread(std::shared_ptr<const RsEvent> ev
|
||||||
updateMessageSummaryList(e->mChannelGroupId);
|
updateMessageSummaryList(e->mChannelGroupId);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RsChannelEventCode::RECEIVED_DISTANT_SEARCH_RESULT:
|
||||||
|
mSearchResults.insert(e->mDistantSearchRequestId);
|
||||||
|
updateSearchResults();
|
||||||
|
break;
|
||||||
|
|
||||||
case RsChannelEventCode::NEW_CHANNEL: // [[fallthrough]];
|
case RsChannelEventCode::NEW_CHANNEL: // [[fallthrough]];
|
||||||
case RsChannelEventCode::SUBSCRIBE_STATUS_CHANGED:
|
case RsChannelEventCode::SUBSCRIBE_STATUS_CHANGED:
|
||||||
updateDisplay(true);
|
updateDisplay(true);
|
||||||
|
|
|
@ -48,6 +48,7 @@ protected:
|
||||||
virtual QString getHelpString() const ;
|
virtual QString getHelpString() const ;
|
||||||
virtual void groupInfoToGroupItemInfo(const RsGroupMetaData &groupInfo, GroupItemInfo &groupItemInfo, const RsUserdata *userdata);
|
virtual void groupInfoToGroupItemInfo(const RsGroupMetaData &groupInfo, GroupItemInfo &groupItemInfo, const RsUserdata *userdata);
|
||||||
virtual bool getDistantSearchResults(TurtleRequestId id, std::map<RsGxsGroupId,RsGxsGroupSummary>& group_infos);
|
virtual bool getDistantSearchResults(TurtleRequestId id, std::map<RsGxsGroupId,RsGxsGroupSummary>& group_infos);
|
||||||
|
virtual const std::set<TurtleRequestId> getSearchResults() const override { return mSearchResults ; }
|
||||||
|
|
||||||
virtual TurtleRequestId distantSearch(const QString& search_string) ;
|
virtual TurtleRequestId distantSearch(const QString& search_string) ;
|
||||||
virtual void checkRequestGroup(const RsGxsGroupId& grpId) ;
|
virtual void checkRequestGroup(const RsGxsGroupId& grpId) ;
|
||||||
|
@ -76,6 +77,8 @@ private:
|
||||||
|
|
||||||
void handleEvent_main_thread(std::shared_ptr<const RsEvent> event);
|
void handleEvent_main_thread(std::shared_ptr<const RsEvent> event);
|
||||||
|
|
||||||
|
std::set<TurtleRequestId> mSearchResults;
|
||||||
|
|
||||||
RsEventsHandlerId_t mEventHandlerId;
|
RsEventsHandlerId_t mEventHandlerId;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue