Protect name cache requests in contacts panel
parent
b8258885f6
commit
f554795cc5
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue