From 227e7121cc50d7a777a82b2cf8786b74373907d2 Mon Sep 17 00:00:00 2001 From: thunder2 Date: Fri, 26 Jun 2015 11:44:45 +0000 Subject: [PATCH] Added disable/enable of GxsIdDetails process. Disabled GxsIdDetails process when filling gxs id's in forums. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@8556 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- retroshare-gui/src/gui/gxs/GxsIdDetails.cpp | 84 ++++++++++++------- retroshare-gui/src/gui/gxs/GxsIdDetails.h | 3 +- .../gui/gxsforums/GxsForumThreadWidget.cpp | 40 +++++---- 3 files changed, 82 insertions(+), 45 deletions(-) diff --git a/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp b/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp index 3b97e2620..cfc7eba1d 100644 --- a/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp +++ b/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp @@ -47,8 +47,9 @@ #define IMAGE_DEV_PATCHER ":/images/tags/dev-patcher.png" #define IMAGE_DEV_DEVELOPER ":/images/tags/developer.png" -#define TIMER_INTERVAL 1000 -#define MAX_ATTEMPTS 10 +#define TIMER_INTERVAL 500 +#define MAX_ATTEMPTS 10 +#define MAX_PROCESS_COUNT_PER_TIMER 50 const int kRecognTagClass_DEVELOPMENT = 1; @@ -65,6 +66,7 @@ GxsIdDetails::GxsIdDetails() : QObject() { mCheckTimerId = 0; + mProcessDisableCount = 0; connect(this, SIGNAL(startTimerFromThread()), this, SLOT(doStartTimer())); } @@ -147,37 +149,43 @@ void GxsIdDetails::timerEvent(QTimerEvent *event) if (rsIdentity) { QMutexLocker lock(&mMutex); - if (!mPendingData.empty()) { - /* Check pending id's */ - QList::iterator dataIt; - for (dataIt = mPendingData.begin(); dataIt != mPendingData.end(); ) { - CallbackData &pendingData = *dataIt; + if (mProcessDisableCount == 0) { + if (!mPendingData.empty()) { + /* Check pending id's */ + int processed = qMin(MAX_PROCESS_COUNT_PER_TIMER, mPendingData.size()); + while (!mPendingData.isEmpty()) { + if (processed-- <= 0) { + break; + } - RsIdentityDetails details; - if (rsIdentity->getIdDetails(pendingData.mId, details)) { - /* Got details */ - pendingData.mCallback(GXS_ID_DETAILS_TYPE_DONE, details, pendingData.mObject, pendingData.mData); + CallbackData &pendingData = mPendingData.front(); - QObject *object = pendingData.mObject; - dataIt = mPendingData.erase(dataIt); - connectObject_locked(object, false); + RsIdentityDetails details; + if (rsIdentity->getIdDetails(pendingData.mId, details)) { + /* Got details */ + pendingData.mCallback(GXS_ID_DETAILS_TYPE_DONE, details, pendingData.mObject, pendingData.mData); - continue; + QObject *object = pendingData.mObject; + mPendingData.pop_front(); + connectObject_locked(object, false); + + continue; + } + + if (++pendingData.mAttempt > MAX_ATTEMPTS) { + /* Max attempts reached, stop trying */ + details.mId = pendingData.mId; + pendingData.mCallback(GXS_ID_DETAILS_TYPE_FAILED, details, pendingData.mObject, pendingData.mData); + + QObject *object = pendingData.mObject; + mPendingData.pop_front(); + connectObject_locked(object, false); + + continue; + } + + mPendingData.move(0, mPendingData.size() - 1); } - - if (++pendingData.mAttempt > MAX_ATTEMPTS) { - /* Max attempts reached, stop trying */ - details.mId = pendingData.mId; - pendingData.mCallback(GXS_ID_DETAILS_TYPE_FAILED, details, pendingData.mObject, pendingData.mData); - - QObject *object = pendingData.mObject; - dataIt = mPendingData.erase(dataIt); - connectObject_locked(object, false); - - continue; - } - - ++dataIt; } } } @@ -206,6 +214,24 @@ void GxsIdDetails::doStartTimer() mCheckTimerId = startTimer(TIMER_INTERVAL); } +void GxsIdDetails::enableProcess(bool enable) +{ + if (!mInstance) { + return; + } + + QMutexLocker lock(&mInstance->mMutex); + + if (enable) { + --mInstance->mProcessDisableCount; + if (mInstance->mProcessDisableCount < 0) { + mInstance->mProcessDisableCount = 0; + } + } else { + ++mInstance->mProcessDisableCount; + } +} + bool GxsIdDetails::process(const RsGxsId &id, GxsIdDetailsCallbackFunction callback, QObject *object, const QVariant &data) { if (!callback) { diff --git a/retroshare-gui/src/gui/gxs/GxsIdDetails.h b/retroshare-gui/src/gui/gxs/GxsIdDetails.h index 1a36934c9..06747e71e 100644 --- a/retroshare-gui/src/gui/gxs/GxsIdDetails.h +++ b/retroshare-gui/src/gui/gxs/GxsIdDetails.h @@ -81,6 +81,7 @@ public: static QImage makeDefaultIcon(const RsGxsId& id); /* Processing */ + static void enableProcess(bool enable); static bool process(const RsGxsId &id, GxsIdDetailsCallbackFunction callback, QObject *object, const QVariant &data = QVariant()); signals: @@ -131,7 +132,7 @@ protected: /* Pending data */ QList mPendingData; int mCheckTimerId; - std::map image_cache ; + int mProcessDisableCount; /* Thread safe */ QMutex mMutex; diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index f9daae558..2beabbcd1 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -770,6 +770,8 @@ void GxsForumThreadWidget::fillThreadFinished() mStateHelper->setActive(mTokenTypeInsertThreads, true); ui->threadTreeWidget->setSortingEnabled(false); + GxsIdDetails::enableProcess(false); + /* add all messages in! */ if (mLastViewType != thread->mViewType || mLastForumID != groupId()) { ui->threadTreeWidget->clear(); @@ -786,6 +788,27 @@ void GxsForumThreadWidget::fillThreadFinished() cleanupItems(thread->mItems); } + /* Move value from ROLE_THREAD_AUTHOR to GxsIdRSTreeWidgetItem::setId */ + QTreeWidgetItemIterator itemIterator(ui->threadTreeWidget); + QTreeWidgetItem *item = NULL; + while ((item = *itemIterator) != NULL) { + ++itemIterator; + + QString gxsId = item->data(COLUMN_THREAD_DATA, ROLE_THREAD_AUTHOR).toString(); + if (gxsId.isEmpty()) { + continue; + } + + item->setData(COLUMN_THREAD_DATA, ROLE_THREAD_AUTHOR, QVariant()); + + GxsIdRSTreeWidgetItem *gxsIdItem = dynamic_cast(item); + if (gxsIdItem) { + gxsIdItem->setId(RsGxsId(gxsId.toStdString()), COLUMN_THREAD_AUTHOR, false); + } + } + + GxsIdDetails::enableProcess(true); + ui->threadTreeWidget->setSortingEnabled(true); if (thread->mFocusMsgId.empty() == false) { @@ -880,7 +903,7 @@ QTreeWidgetItem *GxsForumThreadWidget::convertMsgToThreadWidget(const RsGxsForum item->setText(COLUMN_THREAD_DATE, text); item->setData(COLUMN_THREAD_DATE, ROLE_THREAD_SORT, sort); - item->setId(msg.mMeta.mAuthorId, COLUMN_THREAD_AUTHOR, false); + // Set later with GxsIdRSTreeWidgetItem::setId item->setData(COLUMN_THREAD_DATA, ROLE_THREAD_AUTHOR, QString::fromStdString(msg.mMeta.mAuthorId.toStdString())); //#TODO #if 0 @@ -1035,20 +1058,7 @@ static void copyItem(QTreeWidgetItem *item, const QTreeWidgetItem *newItem) { int i; for (i = 0; i < COLUMN_THREAD_COUNT; ++i) { - if (i == COLUMN_THREAD_AUTHOR) { - QString authorId = newItem->data(COLUMN_THREAD_DATA, ROLE_THREAD_AUTHOR).toString(); - if (authorId != item->data(COLUMN_THREAD_DATA, ROLE_THREAD_AUTHOR).toString()) { - /* Author has changed? */ - GxsIdRSTreeWidgetItem *gxsIdItem = dynamic_cast(item); - if (gxsIdItem) { - /* Set new gxs id */ - gxsIdItem->setId(RsGxsId(authorId.toStdString()), i, false); - } else { - /* Copy text */ - item->setText(i, newItem->text(i)); - } - } - } else { + if (i != COLUMN_THREAD_AUTHOR) { /* Copy text */ item->setText(i, newItem->text(i)); }