added notifications for identities

This commit is contained in:
csoler 2020-01-27 23:02:04 +01:00
parent 90bb6c0011
commit 424e7be52f
No known key found for this signature in database
GPG Key ID: 7BCA522266C0804C
7 changed files with 92 additions and 52 deletions

View File

@ -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
};

View File

@ -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
{

View File

@ -603,7 +603,6 @@ void p3IdService::notifyChanges(std::vector<RsGxsNotify *> &changes)
for(uint32_t i = 0;i<changes.size();++i)
{
RsGxsGroupChange *groupChange = dynamic_cast<RsGxsGroupChange *>(changes[i]);
RsGxsMsgChange *msgChange = dynamic_cast<RsGxsMsgChange *>(changes[i]);
if (msgChange && !msgChange->metaChange())
@ -614,8 +613,8 @@ void p3IdService::notifyChanges(std::vector<RsGxsNotify *> &changes)
#endif
std::map<RsGxsGroupId, std::set<RsGxsMessageId> > &msgChangeMap = msgChange->msgChangeMap;
std::map<RsGxsGroupId, std::set<RsGxsMessageId> >::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<RsGxsNotify *> &changes)
}
}
/* shouldn't need to worry about groups - as they need to be subscribed to */
RsGxsGroupChange *groupChange = dynamic_cast<RsGxsGroupChange *>(changes[i]);
if (groupChange && !groupChange->metaChange())
{
#ifdef DEBUG_IDS
@ -632,9 +632,8 @@ void p3IdService::notifyChanges(std::vector<RsGxsNotify *> &changes)
std::cerr << std::endl;
#endif
std::list<RsGxsGroupId> &groupList = groupChange->mGrpIdList;
std::list<RsGxsGroupId>::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,16 +648,24 @@ void p3IdService::notifyChanges(std::vector<RsGxsNotify *> &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<RsGxsIdentityEvent>();
ev->mIdentityId = *git;
ev->mIdentityEventCode = RsGxsIdentityEventCode::NEW_IDENTITY;
rsEvents->postEvent(ev);
}
break;
default:
break;
}
}
}
}
@ -1070,6 +1077,14 @@ bool p3IdService::deleteIdentity(RsGxsId& id)
return false;
}
if(rsEvents)
{
auto ev = std::make_shared<RsGxsIdentityEvent>();
ev->mIdentityId = grouId;
ev->mIdentityEventCode = RsGxsIdentityEventCode::DELETED_IDENTITY;
rsEvents->postEvent(ev);
}
return true;
}

View File

@ -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()

View File

@ -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);

View File

@ -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,9 @@ IdDialog::IdDialog(QWidget *parent) :
mIdQueue = NULL;
mEventHandlerId = 0;
rsEvents->registerEventsHandler(RsEventType::GXS_IDENTITY, [this](std::shared_ptr<const RsEvent> event) { RsQThreadUtils::postToObject( [=]() { handleEvent_main_thread(event); }, this ); }, mEventHandlerId );
// 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 +403,29 @@ IdDialog::IdDialog(QWidget *parent) :
tmer->start(10000) ; // update every 10 secs.
}
void IdDialog::handleEvent_main_thread(std::shared_ptr<const RsEvent> event)
{
if(event->mType != RsEventType::GXS_IDENTITY)
return;
const RsGxsIdentityEvent *e = dynamic_cast<const RsGxsIdentityEvent*>(event.get());
if(!e)
return;
switch(e->mIdentityEventCode)
{
case RsGxsIdentityEventCode::DELETED_IDENTITY:
case RsGxsIdentityEventCode::NEW_IDENTITY:
requestIdList();
getUserNotify()->updateIcon();
default:
break;
}
}
void IdDialog::clearPerson()
{
QFontMetricsF f(ui->avLabel_Person->font()) ;

View File

@ -158,6 +158,9 @@ private:
RsGxsGroupId mIdToNavigate;
int filter;
void handleEvent_main_thread(std::shared_ptr<const RsEvent> event);
RsEventsHandlerId_t mEventHandlerId;
/* UI - Designer */
Ui::IdDialog *ui;
};