fixed bug in GxsIdLabel due to not removign existing jobs for a given widget before setting it to a new ID

This commit is contained in:
csoler 2016-04-11 23:30:42 -04:00
parent 6b2de05e89
commit 8f9028dc52
2 changed files with 49 additions and 25 deletions

View File

@ -69,6 +69,7 @@ GxsIdDetails::GxsIdDetails()
{
mCheckTimerId = 0;
mProcessDisableCount = 0;
mPendingDataIterator = mPendingData.end() ;
connect(this, SIGNAL(startTimerFromThread()), this, SLOT(doStartTimer()));
}
@ -106,16 +107,16 @@ void GxsIdDetails::objectDestroyed(QObject *object)
/* Object is about to be destroyed, remove it from pending list */
QList<CallbackData>::iterator dataIt;
for (dataIt = mPendingData.begin(); dataIt != mPendingData.end(); ) {
CallbackData &pendingData = *dataIt;
if (pendingData.mObject == object) {
dataIt = mPendingData.erase(dataIt);
continue;
}
++dataIt;
}
QMap<QObject*,CallbackData>::iterator it = mPendingData.find(object) ;
if(it != mPendingData.end())
{
if(it == mPendingDataIterator)
mPendingDataIterator = mPendingData.erase(it) ;
else
mPendingData.erase(it) ;
}
}
void GxsIdDetails::connectObject_locked(QObject *object, bool doConnect)
@ -125,13 +126,9 @@ void GxsIdDetails::connectObject_locked(QObject *object, bool doConnect)
}
/* Search Object in pending list */
QList<CallbackData>::iterator dataIt;
for (dataIt = mPendingData.begin(); dataIt != mPendingData.end(); ++dataIt) {
if (dataIt->mObject == object) {
/* Object still/already in pending list */
return;
}
}
if(mPendingData.find(object) != mPendingData.end())
return ;
if (doConnect) {
connect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)));
@ -155,12 +152,16 @@ void GxsIdDetails::timerEvent(QTimerEvent *event)
if (!mPendingData.empty()) {
/* Check pending id's */
int processed = qMin(MAX_PROCESS_COUNT_PER_TIMER, mPendingData.size());
while (!mPendingData.isEmpty()) {
if (processed-- <= 0) {
break;
}
if(mPendingDataIterator == mPendingData.end())
mPendingDataIterator = mPendingData.begin() ;
CallbackData &pendingData = mPendingData.front();
CallbackData &pendingData = *mPendingDataIterator;
RsIdentityDetails details;
if (rsIdentity->getIdDetails(pendingData.mId, details)) {
@ -168,7 +169,8 @@ void GxsIdDetails::timerEvent(QTimerEvent *event)
pendingData.mCallback(GXS_ID_DETAILS_TYPE_DONE, details, pendingData.mObject, pendingData.mData);
QObject *object = pendingData.mObject;
mPendingData.pop_front();
mPendingDataIterator = mPendingData.erase(mPendingDataIterator);
connectObject_locked(object, false);
continue;
@ -180,13 +182,16 @@ void GxsIdDetails::timerEvent(QTimerEvent *event)
pendingData.mCallback(GXS_ID_DETAILS_TYPE_FAILED, details, pendingData.mObject, pendingData.mData);
QObject *object = pendingData.mObject;
mPendingData.pop_front();
mPendingDataIterator = mPendingData.erase(mPendingDataIterator);
connectObject_locked(object, false);
continue;
}
mPendingData.move(0, mPendingData.size() - 1);
++mPendingDataIterator ;
//mPendingData.move(0, mPendingData.size() - 1);
}
}
}
@ -246,6 +251,22 @@ bool GxsIdDetails::process(const RsGxsId &id, GxsIdDetailsCallbackFunction callb
return true;
}
// remove any existing call for this object. This is needed for when the same widget is used to display IDs that vary in time.
{
QMutexLocker lock(&mInstance->mMutex);
// check if a pending request is not already on its way. If so, replace it.
QMap<QObject*,CallbackData>::iterator it = mInstance->mPendingData.find(object) ;
if(it != mInstance->mPendingData.end())
{
mInstance->connectObject_locked(object, false);
mInstance->mPendingData.erase(it) ;
}
/* Connect signal "destroy" */
}
/* Try to get the information */
// the idea behind this was, to call the callback directly when the identity is already loaded in librs
// without one timer tick, but it causes the use of Pixmap in avatars within a threat that is different than
@ -277,10 +298,12 @@ bool GxsIdDetails::process(const RsGxsId &id, GxsIdDetailsCallbackFunction callb
{
QMutexLocker lock(&mInstance->mMutex);
// check if a pending request is not already on its way. If so, replace it.
mInstance->mPendingData[object] = pendingData;
/* Connect signal "destroy" */
mInstance->connectObject_locked(object, true);
mInstance->mPendingData.push_back(pendingData);
}
/* Start timer */

View File

@ -132,7 +132,8 @@ protected:
static GxsIdDetails *mInstance;
/* Pending data */
QList<CallbackData> mPendingData;
QMap<QObject*,CallbackData> mPendingData;
QMap<QObject*,CallbackData>::iterator mPendingDataIterator;
int mCheckTimerId;
int mProcessDisableCount;