From f554795cc576a1527ea2e7a0626c8f4bd08e3fdc Mon Sep 17 00:00:00 2001 From: Ansariel Date: Thu, 4 Sep 2014 13:18:10 +0200 Subject: [PATCH] Protect name cache requests in contacts panel --- indra/newview/fsfloatercontacts.cpp | 49 ++++++++++++++++++++++++++--- indra/newview/fsfloatercontacts.h | 10 ++++-- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/indra/newview/fsfloatercontacts.cpp b/indra/newview/fsfloatercontacts.cpp index fe8ae7cc0d..a878d80f9c 100644 --- a/indra/newview/fsfloatercontacts.cpp +++ b/indra/newview/fsfloatercontacts.cpp @@ -35,7 +35,6 @@ #include "fsfloaterimcontainer.h" #include "llagent.h" #include "llavataractions.h" -#include "llavatarnamecache.h" #include "llcallingcard.h" // for LLAvatarTracker #include "llfloateravatarpicker.h" #include "llfloatergroupinvite.h" @@ -109,6 +108,15 @@ FSFloaterContacts::~FSFloaterContacts() { mRlvBehaviorCallbackConnection.disconnect(); } + + for (avatar_name_cb_t::iterator it = mAvatarNameCacheConnections.begin(); it != mAvatarNameCacheConnections.end(); ++it) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + } + mAvatarNameCacheConnections.clear(); } BOOL FSFloaterContacts::postBuild() @@ -593,7 +601,9 @@ void FSFloaterContacts::addFriend(const LLUUID& agent_id) if (!LLAvatarNameCache::get(agent_id, &av_name)) { const LLRelationship* info = LLAvatarTracker::instance().getBuddyInfo(agent_id); - LLAvatarNameCache::get(agent_id, boost::bind(&FSFloaterContacts::updateFriendItem, this, agent_id, info)); + LLUUID request_id = LLUUID::generateNewID(); + LLAvatarNameCache::callback_connection_t conn = LLAvatarNameCache::get(agent_id, boost::bind(&FSFloaterContacts::updateFriendItem, this, agent_id, info, request_id)); + mAvatarNameCacheConnections[request_id] = conn; } LLSD element; @@ -700,7 +710,9 @@ void FSFloaterContacts::updateFriendItem(const LLUUID& agent_id, const LLRelatio LLAvatarName av_name; if (!LLAvatarNameCache::get(agent_id, &av_name)) { - LLAvatarNameCache::get(agent_id, boost::bind(&FSFloaterContacts::updateFriendItem, this, agent_id, info)); + LLUUID request_id = LLUUID::generateNewID(); + LLAvatarNameCache::callback_connection_t conn = LLAvatarNameCache::get(agent_id, boost::bind(&FSFloaterContacts::updateFriendItem, this, agent_id, info, request_id)); + mAvatarNameCacheConnections[request_id] = conn; } // Name of the status icon to use @@ -738,6 +750,12 @@ void FSFloaterContacts::updateFriendItem(const LLUUID& agent_id, const LLRelatio itemp->setEnabled(TRUE); } +void FSFloaterContacts::updateFriendItem(const LLUUID& agent_id, const LLRelationship* relationship, const LLUUID& request_id) +{ + disconnectAvatarNameCacheConnection(request_id); + updateFriendItem(agent_id, relationship); +} + void FSFloaterContacts::refreshRightsChangeList() { uuid_vec_t friends; @@ -1178,7 +1196,9 @@ void FSFloaterContacts::onDisplayNameChanged() } else { - LLAvatarNameCache::get((*it)->getUUID(), boost::bind(&FSFloaterContacts::setDirtyNames, this)); + LLUUID request_id = LLUUID::generateNewID(); + LLAvatarNameCache::callback_connection_t conn = LLAvatarNameCache::get((*it)->getUUID(), boost::bind(&FSFloaterContacts::setDirtyNames, this, request_id)); + mAvatarNameCacheConnections[request_id] = conn; } } mFriendsList->setNeedsSort(); @@ -1202,4 +1222,25 @@ std::string FSFloaterContacts::getFullName(const LLAvatarName& av_name) return llformat("%s (%s)", av_name.getUserNameForDisplay().c_str(), av_name.getDisplayName().c_str()); } } + +void FSFloaterContacts::setDirtyNames(const LLUUID& request_id) +{ + disconnectAvatarNameCacheConnection(request_id); + mDirtyNames = true; +} + +void FSFloaterContacts::disconnectAvatarNameCacheConnection(const LLUUID& request_id) +{ + avatar_name_cb_t::iterator found = mAvatarNameCacheConnections.find(request_id); + if (found != mAvatarNameCacheConnections.end()) + { + LLAvatarNameCache::callback_connection_t& conn = found->second; + if (conn.connected()) + { + conn.disconnect(); + } + mAvatarNameCacheConnections.erase(found); + } +} + // EOF diff --git a/indra/newview/fsfloatercontacts.h b/indra/newview/fsfloatercontacts.h index ba43ea18f1..a923367a79 100644 --- a/indra/newview/fsfloatercontacts.h +++ b/indra/newview/fsfloatercontacts.h @@ -29,13 +29,13 @@ #ifndef FS_FLOATERCONTACTS_H #define FS_FLOATERCONTACTS_H +#include "llavatarnamecache.h" #include "llfloater.h" #include "llscrolllistcolumn.h" #include "rlvhandler.h" class FSContactsFriendsCtrl; class LLAvatarList; -class LLAvatarName; class LLAvatarTracker; class LLFriendObserver; class LLScrollListCtrl; @@ -103,6 +103,7 @@ private: void applyRightsToFriends(); void addFriend(const LLUUID& agent_id); void updateFriendItem(const LLUUID& agent_id, const LLRelationship* relationship); + void updateFriendItem(const LLUUID& agent_id, const LLRelationship* relationship, const LLUUID& request_id); typedef enum { @@ -160,8 +161,11 @@ private: std::string getFullName(const LLAvatarName& av_name); - void setDirtyNames() { mDirtyNames = true; } + void setDirtyNames(const LLUUID& request_id); + + typedef std::map avatar_name_cb_t; + avatar_name_cb_t mAvatarNameCacheConnections; + void disconnectAvatarNameCacheConnection(const LLUUID& request_id); }; - #endif // FS_FLOATERCONTACTS_H