Protect name cache requests in contacts panel

Ansariel 2014-09-04 13:18:10 +02:00
parent b8258885f6
commit f554795cc5
2 changed files with 52 additions and 7 deletions

View File

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

View File

@ -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<LLUUID, LLAvatarNameCache::callback_connection_t> avatar_name_cb_t;
avatar_name_cb_t mAvatarNameCacheConnections;
void disconnectAvatarNameCacheConnection(const LLUUID& request_id);
};
#endif // FS_FLOATERCONTACTS_H