MAINT-5871 FIXED Duplicate Calling Card created for each friend on login.

master
andreykproductengine 2015-11-27 19:57:41 +02:00
parent 1f17b5c8c3
commit 24e0751db2
2 changed files with 54 additions and 8 deletions

View File

@ -162,6 +162,7 @@ void LLInitialFriendCardsFetch::done()
// LLFriendCardsManager Constructor / Destructor
LLFriendCardsManager::LLFriendCardsManager()
: mState(EManagerState::INIT)
{
LLAvatarTracker::instance().addObserver(this);
}
@ -423,6 +424,7 @@ void LLFriendCardsManager::ensureFriendsFolderExists()
LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
if (friends_folder_ID.notNull())
{
mState = LOADING_FRIENDS_FOLDER;
fetchAndCheckFolderDescendents(friends_folder_ID,
boost::bind(&LLFriendCardsManager::ensureFriendsAllFolderExists, this));
}
@ -452,6 +454,7 @@ void LLFriendCardsManager::ensureFriendsAllFolderExists()
LLUUID friends_all_folder_ID = findFriendAllSubfolderUUIDImpl();
if (friends_all_folder_ID.notNull())
{
mState = LOADING_ALL_FOLDER;
fetchAndCheckFolderDescendents(friends_all_folder_ID,
boost::bind(&LLFriendCardsManager::syncFriendsFolder, this));
}
@ -506,6 +509,9 @@ void LLFriendCardsManager::syncFriendsFolder()
NULL);
}
// All folders created and updated.
mState = MANAGER_READY;
// 2. Add missing Friend Cards for friends
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
LL_INFOS() << "try to build friends, count: " << all_buddies.size() << LL_ENDL;
@ -540,6 +546,12 @@ void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
<< ", id: " << avatarID
<< LL_ENDL;
if (shouldBeAdded && !isManagerReady())
{
shouldBeAdded = false;
LL_DEBUGS() << "Calling cards manager not ready, state: " << getManagerState() << LL_ENDL;
}
if (shouldBeAdded && findFriendCardInventoryUUIDImpl(avatarID).notNull())
{
shouldBeAdded = false;
@ -583,13 +595,30 @@ void LLFriendCardsManager::onFriendListUpdate(U32 changed_mask)
switch(changed_mask) {
case LLFriendObserver::ADD:
{
const std::set<LLUUID>& changed_items = at.getChangedIDs();
std::set<LLUUID>::const_iterator id_it = changed_items.begin();
std::set<LLUUID>::const_iterator id_end = changed_items.end();
for (;id_it != id_end; ++id_it)
{
LLFriendCardsManager::instance().addFriendCardToInventory(*id_it);
}
LLFriendCardsManager& cards_manager = LLFriendCardsManager::instance();
if (cards_manager.isManagerReady())
{
// Try to add cards into inventory.
// If cards already exist they won't be created.
const std::set<LLUUID>& changed_items = at.getChangedIDs();
std::set<LLUUID>::const_iterator id_it = changed_items.begin();
std::set<LLUUID>::const_iterator id_end = changed_items.end();
for (; id_it != id_end; ++id_it)
{
cards_manager.addFriendCardToInventory(*id_it);
}
}
else
{
// User either removed calling cards' folders and manager is loading them
// or update came too early, before viewer had chance to load all folders.
// Either way don't process 'add' operation - manager will recreate all
// cards after fetching folders.
LL_INFOS_ONCE() << "Calling cards manager not ready, state: "
<< cards_manager.getManagerState()
<< ", postponing update."
<< LL_ENDL;
}
}
break;
case LLFriendObserver::REMOVE:

View File

@ -45,6 +45,14 @@ class LLFriendCardsManager
public:
typedef std::map<LLUUID, uuid_vec_t > folderid_buddies_map_t;
enum EManagerState
{
INIT = 1,
LOADING_FRIENDS_FOLDER,
LOADING_ALL_FOLDER,
MANAGER_READY
};
// LLFriendObserver implementation
void changed(U32 mask)
{
@ -71,7 +79,14 @@ public:
/**
* Checks is the specified category is a Friend folder or any its subfolder
*/
bool isAnyFriendCategory(const LLUUID& catID) const;
bool isAnyFriendCategory(const LLUUID& catID) const;
/**
* Indicates that all calling card related folders are created or loaded
*/
bool isManagerReady() const { return mState == MANAGER_READY; }
EManagerState getManagerState() const { return mState; }
/**
* Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" category
@ -144,6 +159,8 @@ private:
typedef std::set<LLUUID> avatar_uuid_set_t;
avatar_uuid_set_t mBuddyIDSet;
EManagerState mState;
};
#endif // LL_LLFRIENDCARD_H