diff --git a/indra/newview/chatbar_as_cmdline.cpp b/indra/newview/chatbar_as_cmdline.cpp index 3ce1c3e413..9429097a79 100644 --- a/indra/newview/chatbar_as_cmdline.cpp +++ b/indra/newview/chatbar_as_cmdline.cpp @@ -526,6 +526,16 @@ void invrepair() gInventory.collectDescendents(gInventory.getRootFolderID(), cats, items, FALSE); } +void key_to_name_callback(const LLUUID& id, const LLAvatarName& av_name) +{ + std::string name = av_name.getCompleteName(); + if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, id)) + { + name = RlvStrings::getAnonym(name); + } + report_to_nearby_chat(llformat("%s: (%s)", id.asString().c_str(), name.c_str())); +} + bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_gesture) { static LLCachedControl sFSCmdLine(gSavedSettings, "FSCmdLine"); @@ -701,13 +711,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge LLUUID target_key; if (i >> target_key) { - std::string object_name; - gCacheName->getFullName(target_key, object_name); - if (!RlvActions::canShowName(RlvActions::SNC_DEFAULT, target_key)) - { - object_name = RlvStrings::getAnonym(object_name); - } - report_to_nearby_chat(llformat("%s: (%s)", target_key.asString().c_str(), object_name.c_str())); + LLAvatarNameCache::get(target_key, boost::bind(&key_to_name_callback, _1, _2)); } return false; } diff --git a/indra/newview/daeexport.cpp b/indra/newview/daeexport.cpp index c9f3a9f7f3..cdcd04b137 100644 --- a/indra/newview/daeexport.cpp +++ b/indra/newview/daeexport.cpp @@ -743,9 +743,7 @@ bool DAESaver::saveDAE(std::string filename) up_axis->setCharData("Z_UP"); // File creator - std::string author = "Unknown"; - if (gCacheName) - gCacheName->getFullName(gAgentID, author); + std::string author = gAgentUsername; daeElement* contributor = asset->add("contributor"); contributor->add("author")->setCharData(author); diff --git a/indra/newview/fsareasearch.cpp b/indra/newview/fsareasearch.cpp index 4833a5d7b9..d1b0e1752e 100644 --- a/indra/newview/fsareasearch.cpp +++ b/indra/newview/fsareasearch.cpp @@ -29,6 +29,7 @@ #include "fsareasearch.h" +#include "llavatarnamecache.h" #include "llscrolllistctrl.h" #include "lllineeditor.h" #include "lltextbox.h" @@ -1076,17 +1077,41 @@ void FSAreaSearch::updateObjectCosts(const LLUUID& object_id, F32 object_cost, F void FSAreaSearch::getNameFromUUID(LLUUID& id, std::string& name, BOOL group, bool& name_requested) { - BOOL is_group; - - if(!gCacheName->getIfThere(id, name, is_group)) + if (group) { - if(std::find(mNamesRequested.begin(), mNamesRequested.end(), id) == mNamesRequested.end()) + BOOL is_group; + if(!gCacheName->getIfThere(id, name, is_group)) { - mNamesRequested.push_back(id); - gCacheName->get(id, group, boost::bind(&FSAreaSearch::callbackLoadFullName, this, _1, _2)); + if(std::find(mNamesRequested.begin(), mNamesRequested.end(), id) == mNamesRequested.end()) + { + mNamesRequested.push_back(id); + gCacheName->get(id, group, boost::bind(&FSAreaSearch::callbackLoadFullName, this, _1, _2)); + } + name_requested = true; } - name_requested = true; } + else + { + LLAvatarName av_name; + if (LLAvatarNameCache::get(id, &av_name)) + { + name = av_name.getUserName(); + } + else + { + if(std::find(mNamesRequested.begin(), mNamesRequested.end(), id) == mNamesRequested.end()) + { + mNamesRequested.push_back(id); + LLAvatarNameCache::get(id, boost::bind(&FSAreaSearch::avatarNameCacheCallback, this, _1, _2)); + } + name_requested = true; + } + } +} + +void FSAreaSearch::avatarNameCacheCallback(const LLUUID& id, const LLAvatarName& av_name) +{ + callbackLoadFullName(id, av_name.getUserName()); } void FSAreaSearch::callbackLoadFullName(const LLUUID& id, const std::string& full_name) diff --git a/indra/newview/fsareasearch.h b/indra/newview/fsareasearch.h index d308f26ab6..98fe81808e 100644 --- a/indra/newview/fsareasearch.h +++ b/indra/newview/fsareasearch.h @@ -37,6 +37,7 @@ #include #include "llscrolllistcolumn.h" +class LLAvatarName; class LLTextBox; class LLViewerRegion; class LLCheckBoxCtrl; @@ -112,6 +113,7 @@ public: virtual void draw(); virtual void onOpen(const LLSD& key); + void avatarNameCacheCallback(const LLUUID& id, const LLAvatarName& av_name); void callbackLoadFullName(const LLUUID& id, const std::string& full_name); void processObjectProperties(LLMessageSystem* msg); void updateObjectCosts(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost); diff --git a/indra/newview/fschathistory.cpp b/indra/newview/fschathistory.cpp index 1e832201b3..c74c2371d7 100644 --- a/indra/newview/fschathistory.cpp +++ b/indra/newview/fschathistory.cpp @@ -306,9 +306,9 @@ public: void mute(const LLUUID& participant_id, U32 flags) { BOOL is_muted = LLMuteList::getInstance()->isMuted(participant_id, flags); - std::string name; - gCacheName->getFullName(participant_id, name); - LLMute mute(participant_id, name, LLMute::AGENT); + LLAvatarName av_name; + LLAvatarNameCache::get(participant_id, &av_name); + LLMute mute(participant_id, av_name.getUserName(), LLMute::AGENT); if (!is_muted) { diff --git a/indra/newview/fsdata.cpp b/indra/newview/fsdata.cpp index 1359a794ec..0468d08681 100644 --- a/indra/newview/fsdata.cpp +++ b/indra/newview/fsdata.cpp @@ -86,6 +86,18 @@ FSData::FSData() : mFSDataURL = mBaseURL + "/" + "data.xml"; } +FSData::~FSData() +{ + for (avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.begin(); it != mAvatarNameCacheConnections.end(); ++it) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + } + mAvatarNameCacheConnections.clear(); +} + void FSData::processResponder(const LLSD& content, const std::string& url, bool save_to_file, const LLDate& last_modified) { if (url == mFSDataURL) @@ -783,6 +795,21 @@ bool FSData::isAgentFlag(const LLUUID& agent_id, flags_t flag) return (iter->second & flag); } +void FSData::onNameCache(const LLUUID& av_id, const LLAvatarName& av_name) +{ + avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(av_id); + if (it != mAvatarNameCacheConnections.end()) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + mAvatarNameCacheConnections.erase(it); + } + LLMute mute(av_id, av_name.getUserName(), LLMute::EXTERNAL); + LLMuteList::getInstance()->add(mute); +} + // this is called in two different places due to can recieved .xml before gCacheName is created and vice versa. void FSData::addAgents() { @@ -796,10 +823,18 @@ void FSData::addAgents() if (iter->second & NO_SPAM) { LLUUID id = iter->first; - std::string name; - gCacheName->getFullName(id, name); - LLMute mute(id, name, LLMute::EXTERNAL); - LLMuteList::getInstance()->add(mute); + avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(id); + if (it != mAvatarNameCacheConnections.end()) + { + if (it->second.connected()) + { + it->second.disconnect(); + } + mAvatarNameCacheConnections.erase(it); + } + + LLAvatarNameCache::callback_connection_t cb = LLAvatarNameCache::get(id, boost::bind(&FSData::onNameCache, this, _1, _2)); + mAvatarNameCacheConnections.insert(std::make_pair(id, cb)); } } } diff --git a/indra/newview/fsdata.h b/indra/newview/fsdata.h index 16bb3dbf32..45c13ebca1 100644 --- a/indra/newview/fsdata.h +++ b/indra/newview/fsdata.h @@ -30,12 +30,14 @@ #include "llinstantmessage.h" #include "llsingleton.h" +#include "llavatarnamecache.h" class FSData : public LLSingleton { LOG_CLASS(FSData); LLSINGLETON(FSData); + virtual ~FSData(); public: @@ -90,6 +92,7 @@ private: void processData(const LLSD& fs_data); void processClientTags(const LLSD& tags); void updateClientTagsLocal(); + void onNameCache(const LLUUID& av_id, const LLAvatarName& av_name); std::map mSupportAgents; std::map mBlockedVersions; @@ -114,6 +117,9 @@ private: bool mLegacySearch; bool mFSDataDone; bool mAgentsDone; + + typedef std::map avatar_name_cache_connection_map_t; + avatar_name_cache_connection_map_t mAvatarNameCacheConnections; }; #endif // FS_DATA_H diff --git a/indra/newview/fsfloaterexport.cpp b/indra/newview/fsfloaterexport.cpp index 7ba7f6c62e..d5bca1e9a5 100644 --- a/indra/newview/fsfloaterexport.cpp +++ b/indra/newview/fsfloaterexport.cpp @@ -299,9 +299,8 @@ bool FSFloaterObjectExport::exportSelection() mAssetRequests.clear(); mTextureChecked.clear(); - std::string author = "Unknown"; - if (gCacheName) - gCacheName->getFullName(gAgentID, author); + std::string author = gAgentUsername; + time_t rawtime; time(&rawtime); struct tm* utc_time = gmtime(&rawtime); diff --git a/indra/newview/fsfloaternearbychat.cpp b/indra/newview/fsfloaternearbychat.cpp index b8572105c3..3d49ae820c 100644 --- a/indra/newview/fsfloaternearbychat.cpp +++ b/indra/newview/fsfloaternearbychat.cpp @@ -564,8 +564,8 @@ void FSFloaterNearbyChat::loadHistory() } std::string legacy_name = gCacheName->buildLegacyName(from); - gCacheName->getUUID(legacy_name, from_id); - } + from_id = LLAvatarNameCache::findIdByName(legacy_name); + } LLChat chat; chat.mFromName = from; diff --git a/indra/newview/fsnearbychathub.cpp b/indra/newview/fsnearbychathub.cpp index eeb1177ffb..6bfbc2c722 100644 --- a/indra/newview/fsnearbychathub.cpp +++ b/indra/newview/fsnearbychathub.cpp @@ -35,6 +35,7 @@ #include "fsnearbychatcontrol.h" #include "llagent.h" // gAgent #include "llanimationstates.h" // ANIM_AGENT_WHISPER, ANIM_AGENT_TALK, ANIM_AGENT_SHOUT +#include "llavatarnamecache.h" #include "llchatentry.h" #include "llcommandhandler.h" #include "llgesturemgr.h" @@ -752,8 +753,10 @@ void FSNearbyChat::handleChatBarKeystroke(LLUICtrl* source, S32 channel /* = 0 * // Look for a match while (iter != avatar_ids.end() && !found) { - if (gCacheName->getFullName(*iter++, name)) + LLAvatarName av_name; + if (LLAvatarNameCache::get(*iter++, &av_name)) { + name = av_name.getUserName(); if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) { name = RlvStrings::getAnonym(name); @@ -778,8 +781,10 @@ void FSNearbyChat::handleChatBarKeystroke(LLUICtrl* source, S32 channel /* = 0 * // Look for a match while (iter != avatar_ids.end() && !found) { - if (gCacheName->getFullName(*iter++, name)) + LLAvatarName av_name; + if (LLAvatarNameCache::get(*iter++, &av_name)) { + name = av_name.getUserName(); if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) { name = RlvStrings::getAnonym(name); @@ -794,7 +799,16 @@ void FSNearbyChat::handleChatBarKeystroke(LLUICtrl* source, S32 channel /* = 0 * if (found) { std::string first_name, last_name; - gCacheName->getFirstLastName(*(iter - 1), first_name, last_name); + LLAvatarName av_name; + LLAvatarNameCache::get(*(iter - 1), &av_name); + std::string username = av_name.getLegacyName(); + size_t delim_pos = username.find(' '); + first_name = username.substr(0, delim_pos); + if (delim_pos + 1 < username.length()) + { + last_name = username.substr(delim_pos + 1, std::string::npos); + } + std::string rest_of_match; std::string replaced_text; if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES)) diff --git a/indra/newview/fspanelprofile.cpp b/indra/newview/fspanelprofile.cpp index f388ed32a4..cda2b4e05d 100644 --- a/indra/newview/fspanelprofile.cpp +++ b/indra/newview/fspanelprofile.cpp @@ -589,8 +589,9 @@ void FSPanelProfileSecondLife::unfreeze() void FSPanelProfileSecondLife::csr() { - std::string name; - gCacheName->getFullName(getAvatarId(), name); + LLAvatarName av_name; + LLAvatarNameCache::get(getAvatarId(), &av_name); + std::string name = av_name.getUserName(); LLAvatarActions::csr(getAvatarId(), name); } diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp index 066651bf09..abd025ddbf 100644 --- a/indra/newview/llfloaterbump.cpp +++ b/indra/newview/llfloaterbump.cpp @@ -43,6 +43,7 @@ #include "llviewermenu.h" #include "llviewerobjectlist.h" +#include "llavatarnamecache.h" #include "fsradar.h" #include "fsscrolllistctrl.h" #include "llclipboard.h" @@ -417,8 +418,9 @@ bool FSBumpListMenu::onContextMenuItemEnable(const LLSD& userdata) { if (!gMeanCollisionList.empty() && mUUIDs.size() == 1) { - std::string name; - gCacheName->getFullName(mUUIDs.front(), name); + LLAvatarName av_name; + LLAvatarNameCache::get(mUUIDs.front(), &av_name); + std::string name = av_name.getUserName(); return LLMuteList::getInstance()->isMuted(mUUIDs.front(), name); } else diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index 22e8bbf828..c8a32f83c3 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -50,6 +50,7 @@ // Undo CHUI-90 and make avatar inspector useful again #include "llagentdata.h" +#include "llavatarnamecache.h" #include "llcallingcard.h" #include "llfloaterreporter.h" #include "llfloaterworldmap.h" @@ -798,8 +799,9 @@ void LLInspectAvatar::onClickKick() void LLInspectAvatar::onClickCSR() { - std::string name; - gCacheName->getFullName(mAvatarID, name); + LLAvatarName av_name; + LLAvatarNameCache::get(mAvatarID, &av_name); + std::string name = av_name.getUserName(); LLAvatarActions::csr(mAvatarID, name); closeFloater(); } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index f59c52817f..94c6e2b063 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -7997,8 +7997,12 @@ std::string LLInvFVBridge::getSearchableCreator( void ) const std::string strCreator; if(pItem) { - if( gCacheName->getFullName( pItem->getCreatorUUID(), strCreator ) ) + LLAvatarName av_name; + if (LLAvatarNameCache::get(pItem->getCreatorUUID(), &av_name)) + { + strCreator = av_name.getUserName(); LLStringUtil::toUpper( strCreator ); + } } return strCreator; diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index b3f6f86220..965592252c 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -78,6 +78,10 @@ void LLSpeaker::lookupName() { if (mDisplayName.empty()) { + // Crash fix on login + if(!gCacheName) + return; + // LLAvatarNameCache::get(mID, boost::bind(&LLSpeaker::onNameCache, this, _1, _2)); // todo: can be group??? } }