From c2373fb5a6b08b2c32e5f93fa67b25f669e8b47f Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 11 Feb 2010 16:39:15 -0800 Subject: Created stub LLAvatarNameCache for display name lookup, as well as LLAvatarName base data object. Reviewed with Kelly. --- indra/llmessage/llavatarnamecache.cpp | 99 +++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 indra/llmessage/llavatarnamecache.cpp (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp new file mode 100644 index 0000000000..d837019e11 --- /dev/null +++ b/indra/llmessage/llavatarnamecache.cpp @@ -0,0 +1,99 @@ +/** + * @file llavatarnamecache.cpp + * @brief Provides lookup of avatar SLIDs ("bobsmith123") and display names + * ("James Cook") from avatar UUIDs. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab. Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ +#include "linden_common.h" + +#include "llavatarnamecache.h" + +#include "llcachename.h" // until we get our own web service + +#include // tolower() + +static std::string slid_from_full_name(const std::string& full_name) +{ + std::string id = full_name; + std::string::size_type end = id.length(); + for (std::string::size_type i = 0; i < end; ++i) + { + if (id[i] == ' ') + id[i] = '.'; + else + id[i] = tolower(id[i]); + } + return id; +} + +void LLAvatarNameCache::initClass() +{ +} + +void LLAvatarNameCache::cleanupClass() +{ +} + +void LLAvatarNameCache::importFile(std::istream& istr) +{ +} + +void LLAvatarNameCache::exportFile(std::ostream& ostr) +{ +} + +void LLAvatarNameCache::idle() +{ +} + +bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) +{ + std::string full_name; + bool found = gCacheName->getFullName(agent_id, full_name); + if (found) + { + av_name->mSLID = slid_from_full_name(full_name); + + std::string display_name; + if (gCacheName->getDisplayName(agent_id, display_name)) + { + av_name->mDisplayName = display_name; + } + else + { + // ...no explicit display name, use legacy name + av_name->mDisplayName = full_name; + } + } + return found; +} + +void LLAvatarNameCache::get(const LLUUID& agent_id, name_cache_callback_t callback) +{ +} -- cgit v1.2.3 From 4c4ba930029c34c6810c7e229b186e89b458053a Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 11 Feb 2010 16:44:42 -0800 Subject: Removed temporary LLCacheName::getDisplayName code --- indra/llmessage/llavatarnamecache.cpp | 60 +++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index d837019e11..16bfa37b0e 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -52,6 +52,62 @@ static std::string slid_from_full_name(const std::string& full_name) return id; } +static std::map sDisplayNames; + +// JAMESDEBUG HACK temporary IDEVO code +static std::string get_display_name(const LLUUID& id) +{ + if (sDisplayNames.empty()) + { + LLUUID id; + const unsigned char miyazaki_hayao_san[] + = { 0xE5, 0xAE, 0xAE, 0xE5, 0xB4, 0x8E, + 0xE9, 0xA7, 0xBF, + 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x93, '\0' }; + id.set("27888d5f-4ddb-4df3-ad36-a1483ce0b3d9"); // miyazaki23 + sDisplayNames[id] = (const char*)miyazaki_hayao_san; + + id.set("3e5bf676-3577-c9ee-9fac-10df430015a1"); // Jim Linden + sDisplayNames[id] = "Jim Jenkins"; + + const unsigned char jose_sanchez[] = + { 'J','o','s',0xC3,0xA9,' ','S','a','n','c','h','e','z', '\0' }; + id.set("a2e76fcd-9360-4f6d-a924-938f923df11a"); // James Linden + sDisplayNames[id] = (const char*)jose_sanchez; + + id.set("a23fff6c-80ae-4997-9253-48272fd01d3c"); // bobsmith123 + sDisplayNames[id] = (const char*)jose_sanchez; + + id.set("3f7ced39-5e38-4fdd-90f2-423560b1e6e2"); // Hamilton Linden + sDisplayNames[id] = "Hamilton Hitchings"; + + id.set("537da1e1-a89f-4f9b-9056-b1f0757ccdd0"); // Rome Linden + sDisplayNames[id] = "Rome Portlock"; + + id.set("244195d6-c9b7-4fd6-9229-c3a8b2e60e81"); // M Linden + sDisplayNames[id] = "Mark Kingdon"; + + id.set("49856302-98d4-4e32-b5e9-035e5b4e83a4"); // T Linden + sDisplayNames[id] = "Tom Hale"; + + id.set("e6ed7825-708f-4c6b-b6a7-f3fe921a9176"); // Callen Linden + sDisplayNames[id] = "Christina Allen"; + + id.set("a7f0ac18-205f-41d2-b5b4-f75f096ae511"); // Crimp Linden + sDisplayNames[id] = "Chris Rimple"; + } + + std::map::iterator it = sDisplayNames.find(id); + if (it != sDisplayNames.end()) + { + return it->second; + } + else + { + return std::string(); + } +} + void LLAvatarNameCache::initClass() { } @@ -80,8 +136,8 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) { av_name->mSLID = slid_from_full_name(full_name); - std::string display_name; - if (gCacheName->getDisplayName(agent_id, display_name)) + std::string display_name = get_display_name(agent_id); + if (!display_name.empty()) { av_name->mDisplayName = display_name; } -- cgit v1.2.3 From c16591c046fa76fc5d13387efa3bcaec3422e593 Mon Sep 17 00:00:00 2001 From: James Cook Date: Fri, 12 Feb 2010 16:12:12 -0800 Subject: Per-avatar customizable icons next to name links in text Changed LLUrlEntryAgent callbacks to handle both link label and icon Eliminated legacy LLNameCache file loading Reviewed with Kelly --- indra/llmessage/llavatarnamecache.cpp | 147 ++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 70 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 16bfa37b0e..610bc58057 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -38,6 +38,11 @@ #include // tolower() +namespace LLAvatarNameCache +{ + std::map sCache; +} + static std::string slid_from_full_name(const std::string& full_name) { std::string id = full_name; @@ -52,64 +57,67 @@ static std::string slid_from_full_name(const std::string& full_name) return id; } -static std::map sDisplayNames; - -// JAMESDEBUG HACK temporary IDEVO code -static std::string get_display_name(const LLUUID& id) -{ - if (sDisplayNames.empty()) - { - LLUUID id; - const unsigned char miyazaki_hayao_san[] - = { 0xE5, 0xAE, 0xAE, 0xE5, 0xB4, 0x8E, - 0xE9, 0xA7, 0xBF, - 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x93, '\0' }; - id.set("27888d5f-4ddb-4df3-ad36-a1483ce0b3d9"); // miyazaki23 - sDisplayNames[id] = (const char*)miyazaki_hayao_san; - - id.set("3e5bf676-3577-c9ee-9fac-10df430015a1"); // Jim Linden - sDisplayNames[id] = "Jim Jenkins"; - - const unsigned char jose_sanchez[] = - { 'J','o','s',0xC3,0xA9,' ','S','a','n','c','h','e','z', '\0' }; - id.set("a2e76fcd-9360-4f6d-a924-938f923df11a"); // James Linden - sDisplayNames[id] = (const char*)jose_sanchez; - - id.set("a23fff6c-80ae-4997-9253-48272fd01d3c"); // bobsmith123 - sDisplayNames[id] = (const char*)jose_sanchez; - - id.set("3f7ced39-5e38-4fdd-90f2-423560b1e6e2"); // Hamilton Linden - sDisplayNames[id] = "Hamilton Hitchings"; - - id.set("537da1e1-a89f-4f9b-9056-b1f0757ccdd0"); // Rome Linden - sDisplayNames[id] = "Rome Portlock"; - - id.set("244195d6-c9b7-4fd6-9229-c3a8b2e60e81"); // M Linden - sDisplayNames[id] = "Mark Kingdon"; - - id.set("49856302-98d4-4e32-b5e9-035e5b4e83a4"); // T Linden - sDisplayNames[id] = "Tom Hale"; - - id.set("e6ed7825-708f-4c6b-b6a7-f3fe921a9176"); // Callen Linden - sDisplayNames[id] = "Christina Allen"; - - id.set("a7f0ac18-205f-41d2-b5b4-f75f096ae511"); // Crimp Linden - sDisplayNames[id] = "Chris Rimple"; - } - - std::map::iterator it = sDisplayNames.find(id); - if (it != sDisplayNames.end()) - { - return it->second; - } - else - { - return std::string(); - } -} - void LLAvatarNameCache::initClass() { + // HACK - prepopulate the cache + LLAvatarName name; + LLUUID id; + + name.mSLID = "miyazaki23"; + const unsigned char miyazaki_hayao_san[] + = { 0xE5, 0xAE, 0xAE, 0xE5, 0xB4, 0x8E, + 0xE9, 0xA7, 0xBF, + 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x93, '\0' }; + name.mDisplayName = (const char*)miyazaki_hayao_san; + name.mBadge = "Person_Check"; + sCache[LLUUID("27888d5f-4ddb-4df3-ad36-a1483ce0b3d9")] = name; + + name.mSLID = "jim.linden"; + name.mDisplayName = "Jim Jenkins"; + name.mBadge = "Person_Star"; + sCache[LLUUID("3e5bf676-3577-c9ee-9fac-10df430015a1")] = name; + + name.mSLID = "james.linden"; + const unsigned char jose_sanchez[] = + { 'J','o','s',0xC3,0xA9,' ','S','a','n','c','h','e','z', '\0' }; + name.mDisplayName = (const char*)jose_sanchez; + name.mBadge = "35f217a3-f618-49cf-bbca-c86d486551a9"; // IMG_SHOT + sCache[LLUUID("a2e76fcd-9360-4f6d-a924-938f923df11a")] = name; + + name.mSLID = "bobsmith123"; + name.mDisplayName = (const char*)jose_sanchez; + name.mBadge = ""; + sCache[LLUUID("a23fff6c-80ae-4997-9253-48272fd01d3c")] = name; + + name.mSLID = "hamilton.linden"; + name.mDisplayName = "Hamilton Hitchings"; + name.mBadge = "Person_Star"; + sCache[LLUUID("3f7ced39-5e38-4fdd-90f2-423560b1e6e2")] = name; + + name.mSLID = "rome.linden"; + name.mDisplayName = "Rome Portlock"; + name.mBadge = "Person_Star"; + sCache[LLUUID("537da1e1-a89f-4f9b-9056-b1f0757ccdd0")] = name; + + name.mSLID = "m.linden"; + name.mDisplayName = "Mark Kingdon"; + name.mBadge = "Person_Star"; + sCache[LLUUID("244195d6-c9b7-4fd6-9229-c3a8b2e60e81")] = name; + + name.mSLID = "t.linden"; + name.mDisplayName = "Tom Hale"; + name.mBadge = "Person_Star"; + sCache[LLUUID("49856302-98d4-4e32-b5e9-035e5b4e83a4")] = name; + + name.mSLID = "callen.linden"; + name.mDisplayName = "Christina Allen"; + name.mBadge = "Person_Star"; + sCache[LLUUID("e6ed7825-708f-4c6b-b6a7-f3fe921a9176")] = name; + + name.mSLID = "crimp.linden"; + name.mDisplayName = "Chris Rimple"; + name.mBadge = "Person_Star"; + sCache[LLUUID("a7f0ac18-205f-41d2-b5b4-f75f096ae511")] = name; } void LLAvatarNameCache::cleanupClass() @@ -130,24 +138,23 @@ void LLAvatarNameCache::idle() bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) { + std::map::iterator it = sCache.find(agent_id); + if (it != sCache.end()) + { + *av_name = it->second; + return true; + } + std::string full_name; - bool found = gCacheName->getFullName(agent_id, full_name); - if (found) + if (gCacheName->getFullName(agent_id, full_name)) { av_name->mSLID = slid_from_full_name(full_name); - - std::string display_name = get_display_name(agent_id); - if (!display_name.empty()) - { - av_name->mDisplayName = display_name; - } - else - { - // ...no explicit display name, use legacy name - av_name->mDisplayName = full_name; - } + av_name->mDisplayName = full_name; + av_name->mBadge = "Generic_Person"; + return true; } - return found; + + return false; } void LLAvatarNameCache::get(const LLUUID& agent_id, name_cache_callback_t callback) -- cgit v1.2.3 From 65d388d162dc14f5b8b3e0bfff1ae1125736f564 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 16 Feb 2010 11:58:21 -0800 Subject: Fix display of SLID-only accounts - prototype display name code was putting duplicate name in parentheses. --- indra/llmessage/llavatarnamecache.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 610bc58057..6dac25cd63 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -145,14 +145,15 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) return true; } - std::string full_name; - if (gCacheName->getFullName(agent_id, full_name)) - { - av_name->mSLID = slid_from_full_name(full_name); - av_name->mDisplayName = full_name; - av_name->mBadge = "Generic_Person"; - return true; - } + // JAMESDEBUG Enable when we turn on display names. + //std::string full_name; + //if (gCacheName->getFullName(agent_id, full_name)) + //{ + // av_name->mSLID = slid_from_full_name(full_name); + // av_name->mDisplayName = full_name; + // av_name->mBadge = "Generic_Person"; + // return true; + //} return false; } -- cgit v1.2.3 From a7041d0a442df98e5a1c938ce9b096f7279b96f7 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 16 Feb 2010 12:07:02 -0800 Subject: Fix Linux build warning/error for unused function --- indra/llmessage/llavatarnamecache.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 6dac25cd63..dbcb0d0c03 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -43,19 +43,20 @@ namespace LLAvatarNameCache std::map sCache; } -static std::string slid_from_full_name(const std::string& full_name) -{ - std::string id = full_name; - std::string::size_type end = id.length(); - for (std::string::size_type i = 0; i < end; ++i) - { - if (id[i] == ' ') - id[i] = '.'; - else - id[i] = tolower(id[i]); - } - return id; -} +// JAMESDEBUG re-enable when display names are turned on +//static std::string slid_from_full_name(const std::string& full_name) +//{ +// std::string id = full_name; +// std::string::size_type end = id.length(); +// for (std::string::size_type i = 0; i < end; ++i) +// { +// if (id[i] == ' ') +// id[i] = '.'; +// else +// id[i] = tolower(id[i]); +// } +// return id; +//} void LLAvatarNameCache::initClass() { -- cgit v1.2.3 From 55bfb4435e1a2ffc34578bf30877eb24a5edaa29 Mon Sep 17 00:00:00 2001 From: James Cook Date: Wed, 17 Feb 2010 16:55:58 -0800 Subject: Look up display names via a web service Also removed unused LLComboBox globals to reduce llappviewer.cpp include file burden. Review pending --- indra/llmessage/llavatarnamecache.cpp | 212 ++++++++++++++++++++++++++++------ 1 file changed, 175 insertions(+), 37 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index dbcb0d0c03..a7ed20ac9b 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -35,15 +35,92 @@ #include "llavatarnamecache.h" #include "llcachename.h" // until we get our own web service +#include "llframetimer.h" +#include "llhttpclient.h" +#include "llsdserialize.h" // JAMESDEBUG #include // tolower() +#include namespace LLAvatarNameCache { - std::map sCache; + // base URL for name lookup service + std::string sNameServiceURL; + + // accumulated agent IDs for next query against service + typedef std::set ask_queue_t; + ask_queue_t sAskQueue; + + // agent IDs that have been requested, but with no reply + // maps agent ID to frame time request was made + typedef std::map pending_queue_t; + pending_queue_t sPendingQueue; + + // names we know about + typedef std::map cache_t; + cache_t sCache; + + // only need per-frame timing resolution + LLFrameTimer sRequestTimer; + + bool isRequestPending(const LLUUID& agent_id); } -// JAMESDEBUG re-enable when display names are turned on +class LLAvatarNameResponder : public LLHTTPClient::Responder +{ +public: + /*virtual*/ void result(const LLSD& content); + /*virtual*/ void error(U32 status, const std::string& reason); +}; + +void LLAvatarNameResponder::result(const LLSD& content) +{ + //std::ostringstream debug; + //LLSDSerialize::toPrettyXML(content, debug); + //llinfos << "JAMESDEBUG " << debug.str() << llendl; + + U32 now = (U32)LLFrameTimer::getTotalSeconds(); + LLSD::array_const_iterator it = content.beginArray(); + for ( ; it != content.endArray(); ++it) + { + const LLSD& row = *it; + + LLAvatarName av_name; + av_name.mSLID = row["slid"]; + av_name.mDisplayName = row["display_name"]; + av_name.mLastUpdate = now; + + // HACK for pretty stars + if (row["last_name"].asString() == "Linden") + { + av_name.mBadge = "Person_Star"; + } + + // Some avatars don't have explicit display names set + if (av_name.mDisplayName.empty()) + { + // make up a display name + std::string first_name = row["first_name"]; + std::string last_name = row["last_name"]; + av_name.mDisplayName = + LLCacheName::buildFullName(first_name, last_name); + } + + LLUUID agent_id = row["agent_id"]; + LLAvatarNameCache::sCache[agent_id] = av_name; + + LLAvatarNameCache::sPendingQueue.erase(agent_id); + + llinfos << "JAMESDEBUG fetched " << av_name.mDisplayName << llendl; + } +} + +void LLAvatarNameResponder::error(U32 status, const std::string& reason) +{ + llinfos << "JAMESDEBUG error " << status << " " << reason << llendl; +} + +// JAMESDEBUG re-enable when display names are turned on??? //static std::string slid_from_full_name(const std::string& full_name) //{ // std::string id = full_name; @@ -73,11 +150,6 @@ void LLAvatarNameCache::initClass() name.mBadge = "Person_Check"; sCache[LLUUID("27888d5f-4ddb-4df3-ad36-a1483ce0b3d9")] = name; - name.mSLID = "jim.linden"; - name.mDisplayName = "Jim Jenkins"; - name.mBadge = "Person_Star"; - sCache[LLUUID("3e5bf676-3577-c9ee-9fac-10df430015a1")] = name; - name.mSLID = "james.linden"; const unsigned char jose_sanchez[] = { 'J','o','s',0xC3,0xA9,' ','S','a','n','c','h','e','z', '\0' }; @@ -90,35 +162,41 @@ void LLAvatarNameCache::initClass() name.mBadge = ""; sCache[LLUUID("a23fff6c-80ae-4997-9253-48272fd01d3c")] = name; - name.mSLID = "hamilton.linden"; - name.mDisplayName = "Hamilton Hitchings"; - name.mBadge = "Person_Star"; - sCache[LLUUID("3f7ced39-5e38-4fdd-90f2-423560b1e6e2")] = name; - - name.mSLID = "rome.linden"; - name.mDisplayName = "Rome Portlock"; - name.mBadge = "Person_Star"; - sCache[LLUUID("537da1e1-a89f-4f9b-9056-b1f0757ccdd0")] = name; - - name.mSLID = "m.linden"; - name.mDisplayName = "Mark Kingdon"; - name.mBadge = "Person_Star"; - sCache[LLUUID("244195d6-c9b7-4fd6-9229-c3a8b2e60e81")] = name; - - name.mSLID = "t.linden"; - name.mDisplayName = "Tom Hale"; - name.mBadge = "Person_Star"; - sCache[LLUUID("49856302-98d4-4e32-b5e9-035e5b4e83a4")] = name; - - name.mSLID = "callen.linden"; - name.mDisplayName = "Christina Allen"; - name.mBadge = "Person_Star"; - sCache[LLUUID("e6ed7825-708f-4c6b-b6a7-f3fe921a9176")] = name; - - name.mSLID = "crimp.linden"; - name.mDisplayName = "Chris Rimple"; - name.mBadge = "Person_Star"; - sCache[LLUUID("a7f0ac18-205f-41d2-b5b4-f75f096ae511")] = name; + // These are served by the web service now + //name.mSLID = "jim.linden"; + //name.mDisplayName = "Jim Jenkins"; + //name.mBadge = "Person_Star"; + //sCache[LLUUID("3e5bf676-3577-c9ee-9fac-10df430015a1")] = name; + + //name.mSLID = "hamilton.linden"; + //name.mDisplayName = "Hamilton Hitchings"; + //name.mBadge = "Person_Star"; + //sCache[LLUUID("3f7ced39-5e38-4fdd-90f2-423560b1e6e2")] = name; + + //name.mSLID = "rome.linden"; + //name.mDisplayName = "Rome Portlock"; + //name.mBadge = "Person_Star"; + //sCache[LLUUID("537da1e1-a89f-4f9b-9056-b1f0757ccdd0")] = name; + + //name.mSLID = "m.linden"; + //name.mDisplayName = "Mark Kingdon"; + //name.mBadge = "Person_Star"; + //sCache[LLUUID("244195d6-c9b7-4fd6-9229-c3a8b2e60e81")] = name; + + //name.mSLID = "t.linden"; + //name.mDisplayName = "Tom Hale"; + //name.mBadge = "Person_Star"; + //sCache[LLUUID("49856302-98d4-4e32-b5e9-035e5b4e83a4")] = name; + + //name.mSLID = "callen.linden"; + //name.mDisplayName = "Christina Allen"; + //name.mBadge = "Person_Star"; + //sCache[LLUUID("e6ed7825-708f-4c6b-b6a7-f3fe921a9176")] = name; + + //name.mSLID = "crimp.linden"; + //name.mDisplayName = "Chris Rimple"; + //name.mBadge = "Person_Star"; + //sCache[LLUUID("a7f0ac18-205f-41d2-b5b4-f75f096ae511")] = name; } void LLAvatarNameCache::cleanupClass() @@ -135,6 +213,57 @@ void LLAvatarNameCache::exportFile(std::ostream& ostr) void LLAvatarNameCache::idle() { + const F32 SECS_BETWEEN_REQUESTS = 0.5f; // JAMESDEBUG set to 0.1? + if (sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS)) + { + return; + } + + if (sAskQueue.empty()) + { + return; + } + + LLSD body; + body["agent_ids"] = LLSD::emptyArray(); + LLSD& agent_ids = body["agent_ids"]; + + ask_queue_t::const_iterator it = sAskQueue.begin(); + for ( ; it != sAskQueue.end(); ++it) + { + agent_ids.append( LLSD( *it ) ); + } + + //std::ostringstream debug; + //LLSDSerialize::toPrettyXML(body, debug); + //LL_INFOS("JAMESDEBUG") << debug.str() << LL_ENDL; + + // *TODO: configure the base URL for this + std::string url = "http://pdp15.lindenlab.com:8050/my-service/agent/display-names/"; + LLHTTPClient::post(url, body, new LLAvatarNameResponder()); + + // Move requests from Ask queue to Pending queue + U32 now = (U32)LLFrameTimer::getTotalSeconds(); + for (it = sAskQueue.begin(); it != sAskQueue.end(); ++it) + { + sPendingQueue[*it] = now; + } + sAskQueue.clear(); +} + +bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id) +{ + const U32 PENDING_TIMEOUT_SECS = 5 * 60; + U32 now = (U32)LLFrameTimer::getTotalSeconds(); + U32 expire_time = now - PENDING_TIMEOUT_SECS; + + pending_queue_t::const_iterator it = sPendingQueue.find(agent_id); + if (it != sPendingQueue.end()) + { + bool expired = (it->second < expire_time); + return !expired; + } + return false; } bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) @@ -146,7 +275,7 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) return true; } - // JAMESDEBUG Enable when we turn on display names. + // JAMESDEBUG Enable when we turn on display names??? //std::string full_name; //if (gCacheName->getFullName(agent_id, full_name)) //{ @@ -156,6 +285,15 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) // return true; //} + if (!isRequestPending(agent_id)) + { + std::pair found = sAskQueue.insert(agent_id); + if (found.second) + { + LL_INFOS("JAMESDEBUG") << "added to ask queue " << agent_id << LL_ENDL; + } + } + return false; } -- cgit v1.2.3 From 9cb30255b6b8827410a32c6bee1c22b8011de60e Mon Sep 17 00:00:00 2001 From: James Cook Date: Wed, 17 Feb 2010 20:49:44 -0800 Subject: Fix Mac/Linux build Dang finicky LLSD map dereferences --- indra/llmessage/llavatarnamecache.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index a7ed20ac9b..0d6981a9d9 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -86,8 +86,8 @@ void LLAvatarNameResponder::result(const LLSD& content) const LLSD& row = *it; LLAvatarName av_name; - av_name.mSLID = row["slid"]; - av_name.mDisplayName = row["display_name"]; + av_name.mSLID = row["slid"].asString(); + av_name.mDisplayName = row["display_name"].asString(); av_name.mLastUpdate = now; // HACK for pretty stars @@ -100,13 +100,13 @@ void LLAvatarNameResponder::result(const LLSD& content) if (av_name.mDisplayName.empty()) { // make up a display name - std::string first_name = row["first_name"]; - std::string last_name = row["last_name"]; + std::string first_name = row["first_name"].asString(); + std::string last_name = row["last_name"].asString(); av_name.mDisplayName = LLCacheName::buildFullName(first_name, last_name); } - LLUUID agent_id = row["agent_id"]; + LLUUID agent_id = row["agent_id"].asUUID(); LLAvatarNameCache::sCache[agent_id] = av_name; LLAvatarNameCache::sPendingQueue.erase(agent_id); -- cgit v1.2.3 From ee81adb01b8619302898471fdbba5c93f716d10b Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 18 Feb 2010 18:46:41 -0800 Subject: Preference to set what fields name tags display, and first attempt at "use display names" menu item which doesn't work yet --- indra/llmessage/llavatarnamecache.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 0d6981a9d9..0941dff0fa 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -44,8 +44,7 @@ namespace LLAvatarNameCache { - // base URL for name lookup service - std::string sNameServiceURL; + bool sUseDisplayNames = false; // accumulated agent IDs for next query against service typedef std::set ask_queue_t; @@ -300,3 +299,15 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) void LLAvatarNameCache::get(const LLUUID& agent_id, name_cache_callback_t callback) { } + +void LLAvatarNameCache::toggleDisplayNames() +{ + sUseDisplayNames = !sUseDisplayNames; + // flush our cache + sCache.clear(); +} + +bool LLAvatarNameCache::useDisplayNames() +{ + return sUseDisplayNames; +} -- cgit v1.2.3 From fe1dc7dc7e8386a673ff11b1afac93affd14d875 Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 18 Feb 2010 18:47:25 -0800 Subject: Default using display names to on for now until I can fix the code to turn them off --- indra/llmessage/llavatarnamecache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 0941dff0fa..b991638f75 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -44,7 +44,7 @@ namespace LLAvatarNameCache { - bool sUseDisplayNames = false; + bool sUseDisplayNames = true; // accumulated agent IDs for next query against service typedef std::set ask_queue_t; -- cgit v1.2.3 From af8f8b4770eb45b4238d98ddd574ba726470f797 Mon Sep 17 00:00:00 2001 From: James Cook Date: Fri, 19 Feb 2010 11:11:45 -0800 Subject: Improved support for toggling display names on/off Stop pre-populated name cache because we have a web service now for lookup Added mIsLegacy to LLAvatarName so we can colorize those name tags differently --- indra/llmessage/llavatarnamecache.cpp | 68 ++++------------------------------- 1 file changed, 7 insertions(+), 61 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index b991638f75..cd05a80bc1 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -44,7 +44,7 @@ namespace LLAvatarNameCache { - bool sUseDisplayNames = true; + bool sUseDisplayNames = false; // accumulated agent IDs for next query against service typedef std::set ask_queue_t; @@ -103,6 +103,7 @@ void LLAvatarNameResponder::result(const LLSD& content) std::string last_name = row["last_name"].asString(); av_name.mDisplayName = LLCacheName::buildFullName(first_name, last_name); + av_name.mIsLegacy = true; } LLUUID agent_id = row["agent_id"].asUUID(); @@ -136,66 +137,6 @@ void LLAvatarNameResponder::error(U32 status, const std::string& reason) void LLAvatarNameCache::initClass() { - // HACK - prepopulate the cache - LLAvatarName name; - LLUUID id; - - name.mSLID = "miyazaki23"; - const unsigned char miyazaki_hayao_san[] - = { 0xE5, 0xAE, 0xAE, 0xE5, 0xB4, 0x8E, - 0xE9, 0xA7, 0xBF, - 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x93, '\0' }; - name.mDisplayName = (const char*)miyazaki_hayao_san; - name.mBadge = "Person_Check"; - sCache[LLUUID("27888d5f-4ddb-4df3-ad36-a1483ce0b3d9")] = name; - - name.mSLID = "james.linden"; - const unsigned char jose_sanchez[] = - { 'J','o','s',0xC3,0xA9,' ','S','a','n','c','h','e','z', '\0' }; - name.mDisplayName = (const char*)jose_sanchez; - name.mBadge = "35f217a3-f618-49cf-bbca-c86d486551a9"; // IMG_SHOT - sCache[LLUUID("a2e76fcd-9360-4f6d-a924-938f923df11a")] = name; - - name.mSLID = "bobsmith123"; - name.mDisplayName = (const char*)jose_sanchez; - name.mBadge = ""; - sCache[LLUUID("a23fff6c-80ae-4997-9253-48272fd01d3c")] = name; - - // These are served by the web service now - //name.mSLID = "jim.linden"; - //name.mDisplayName = "Jim Jenkins"; - //name.mBadge = "Person_Star"; - //sCache[LLUUID("3e5bf676-3577-c9ee-9fac-10df430015a1")] = name; - - //name.mSLID = "hamilton.linden"; - //name.mDisplayName = "Hamilton Hitchings"; - //name.mBadge = "Person_Star"; - //sCache[LLUUID("3f7ced39-5e38-4fdd-90f2-423560b1e6e2")] = name; - - //name.mSLID = "rome.linden"; - //name.mDisplayName = "Rome Portlock"; - //name.mBadge = "Person_Star"; - //sCache[LLUUID("537da1e1-a89f-4f9b-9056-b1f0757ccdd0")] = name; - - //name.mSLID = "m.linden"; - //name.mDisplayName = "Mark Kingdon"; - //name.mBadge = "Person_Star"; - //sCache[LLUUID("244195d6-c9b7-4fd6-9229-c3a8b2e60e81")] = name; - - //name.mSLID = "t.linden"; - //name.mDisplayName = "Tom Hale"; - //name.mBadge = "Person_Star"; - //sCache[LLUUID("49856302-98d4-4e32-b5e9-035e5b4e83a4")] = name; - - //name.mSLID = "callen.linden"; - //name.mDisplayName = "Christina Allen"; - //name.mBadge = "Person_Star"; - //sCache[LLUUID("e6ed7825-708f-4c6b-b6a7-f3fe921a9176")] = name; - - //name.mSLID = "crimp.linden"; - //name.mDisplayName = "Chris Rimple"; - //name.mBadge = "Person_Star"; - //sCache[LLUUID("a7f0ac18-205f-41d2-b5b4-f75f096ae511")] = name; } void LLAvatarNameCache::cleanupClass() @@ -305,6 +246,11 @@ void LLAvatarNameCache::toggleDisplayNames() sUseDisplayNames = !sUseDisplayNames; // flush our cache sCache.clear(); + // force re-lookups + if (gCacheName) + { + gCacheName->clear(); + } } bool LLAvatarNameCache::useDisplayNames() -- cgit v1.2.3 From 3791745054546dbebb3373371aaf7a0ddad608a3 Mon Sep 17 00:00:00 2001 From: James Cook Date: Mon, 22 Feb 2010 16:41:56 -0800 Subject: Simple button to change your display name Talks to web service so other people can see the change, but for now they need to relog or toggle display names on/off to clear their cache. --- indra/llmessage/llavatarnamecache.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index cd05a80bc1..37b7a48244 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -241,6 +241,39 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, name_cache_callback_t callba { } +class LLSetNameResponder : public LLHTTPClient::Responder +{ +public: + LLUUID mAgentID; + + LLSetNameResponder(const LLUUID& agent_id) : mAgentID(agent_id) { } + + /*virtual*/ void result(const LLSD& content) + { + // force re-fetch + LLAvatarNameCache::sCache.erase(mAgentID); + llinfos << "JAMESDEBUG set names worked" << llendl; + } + + /*virtual*/ void error(U32 status, const std::string& reason) + { + llinfos << "JAMESDEBUG set names failed " << status + << " reason " << reason << llendl; + } +}; + +void LLAvatarNameCache::setDisplayName(const LLUUID& agent_id, const std::string& display_name) +{ + LLSD body; + body["display_name"] = display_name; + + // *TODO: configure the base URL for this + std::string url = "http://pdp15.lindenlab.com:8050/my-service/agent/"; + url += agent_id.asString(); + url += "/set-display-name/"; + LLHTTPClient::post(url, body, new LLSetNameResponder(agent_id)); +} + void LLAvatarNameCache::toggleDisplayNames() { sUseDisplayNames = !sUseDisplayNames; -- cgit v1.2.3 From 087736c1522f111bc6a4d4937db8541031ef4014 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 23 Feb 2010 16:33:26 -0800 Subject: Decreased delay between name lookup requests for slightly faster lookup times --- indra/llmessage/llavatarnamecache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 37b7a48244..162829da06 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -153,7 +153,7 @@ void LLAvatarNameCache::exportFile(std::ostream& ostr) void LLAvatarNameCache::idle() { - const F32 SECS_BETWEEN_REQUESTS = 0.5f; // JAMESDEBUG set to 0.1? + const F32 SECS_BETWEEN_REQUESTS = 0.2f; // JAMESDEBUG set to 0.1? if (sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS)) { return; -- cgit v1.2.3 From 4fafec91fb9e687861c520da0a520354a98bd522 Mon Sep 17 00:00:00 2001 From: James Cook Date: Wed, 24 Feb 2010 11:03:27 -0800 Subject: Add asynchronous display name lookup with callback --- indra/llmessage/llavatarnamecache.cpp | 137 ++++++++++++++++++++++------------ 1 file changed, 91 insertions(+), 46 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 162829da06..50bdc1e063 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -55,6 +55,13 @@ namespace LLAvatarNameCache typedef std::map pending_queue_t; pending_queue_t sPendingQueue; + // Callbacks to fire when we received a name. + // May have multiple callbacks for a single ID, which are + // represented as multiple slots bound to the signal. + // Avoid copying signals via pointers. + typedef std::map signal_map_t; + signal_map_t sSignalMap; + // names we know about typedef std::map cache_t; cache_t sCache; @@ -63,6 +70,7 @@ namespace LLAvatarNameCache LLFrameTimer sRequestTimer; bool isRequestPending(const LLUUID& agent_id); + void processResult(const LLSD& row); } class LLAvatarNameResponder : public LLHTTPClient::Responder @@ -78,40 +86,11 @@ void LLAvatarNameResponder::result(const LLSD& content) //LLSDSerialize::toPrettyXML(content, debug); //llinfos << "JAMESDEBUG " << debug.str() << llendl; - U32 now = (U32)LLFrameTimer::getTotalSeconds(); LLSD::array_const_iterator it = content.beginArray(); for ( ; it != content.endArray(); ++it) { const LLSD& row = *it; - - LLAvatarName av_name; - av_name.mSLID = row["slid"].asString(); - av_name.mDisplayName = row["display_name"].asString(); - av_name.mLastUpdate = now; - - // HACK for pretty stars - if (row["last_name"].asString() == "Linden") - { - av_name.mBadge = "Person_Star"; - } - - // Some avatars don't have explicit display names set - if (av_name.mDisplayName.empty()) - { - // make up a display name - std::string first_name = row["first_name"].asString(); - std::string last_name = row["last_name"].asString(); - av_name.mDisplayName = - LLCacheName::buildFullName(first_name, last_name); - av_name.mIsLegacy = true; - } - - LLUUID agent_id = row["agent_id"].asUUID(); - LLAvatarNameCache::sCache[agent_id] = av_name; - - LLAvatarNameCache::sPendingQueue.erase(agent_id); - - llinfos << "JAMESDEBUG fetched " << av_name.mDisplayName << llendl; + LLAvatarNameCache::processResult(row); } } @@ -120,6 +99,55 @@ void LLAvatarNameResponder::error(U32 status, const std::string& reason) llinfos << "JAMESDEBUG error " << status << " " << reason << llendl; } +void LLAvatarNameCache::processResult(const LLSD& row) +{ + U32 now = (U32)LLFrameTimer::getTotalSeconds(); + + LLAvatarName av_name; + av_name.mSLID = row["slid"].asString(); + av_name.mDisplayName = row["display_name"].asString(); + av_name.mLastUpdate = now; + + // HACK for pretty stars + if (row["last_name"].asString() == "Linden") + { + av_name.mBadge = "Person_Star"; + } + + // Some avatars don't have explicit display names set + if (av_name.mDisplayName.empty()) + { + // make up a display name + std::string first_name = row["first_name"].asString(); + std::string last_name = row["last_name"].asString(); + av_name.mDisplayName = + LLCacheName::buildFullName(first_name, last_name); + av_name.mIsLegacy = true; + } + + // add to cache + LLUUID agent_id = row["agent_id"].asUUID(); + sCache[agent_id] = av_name; + + sPendingQueue.erase(agent_id); + + // signal everyone waiting on this name + signal_map_t::iterator sig_it = sSignalMap.find(agent_id); + if (sig_it != sSignalMap.end()) + { + llinfos << "JAMESDEBUG firing signal" << llendl; + callback_signal_t* signal = sig_it->second; + (*signal)(agent_id, av_name); + + sSignalMap.erase(agent_id); + + delete signal; + signal = NULL; + } + + llinfos << "JAMESDEBUG fetched " << av_name.mDisplayName << llendl; +} + // JAMESDEBUG re-enable when display names are turned on??? //static std::string slid_from_full_name(const std::string& full_name) //{ @@ -215,30 +243,47 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) return true; } - // JAMESDEBUG Enable when we turn on display names??? - //std::string full_name; - //if (gCacheName->getFullName(agent_id, full_name)) - //{ - // av_name->mSLID = slid_from_full_name(full_name); - // av_name->mDisplayName = full_name; - // av_name->mBadge = "Generic_Person"; - // return true; - //} - if (!isRequestPending(agent_id)) { - std::pair found = sAskQueue.insert(agent_id); - if (found.second) - { - LL_INFOS("JAMESDEBUG") << "added to ask queue " << agent_id << LL_ENDL; - } + sAskQueue.insert(agent_id); } return false; } -void LLAvatarNameCache::get(const LLUUID& agent_id, name_cache_callback_t callback) +void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) { + std::map::iterator it = sCache.find(agent_id); + if (it != sCache.end()) + { + // ...name already exists in cache, fire callback now + callback_signal_t signal; + signal.connect(slot); + signal(agent_id, it->second); + return; + } + + // schedule a request + if (!isRequestPending(agent_id)) + { + sAskQueue.insert(agent_id); + } + + // always store additional callback, even if request is pending + signal_map_t::iterator sig_it = sSignalMap.find(agent_id); + if (sig_it == sSignalMap.end()) + { + // ...new callback for this id + callback_signal_t* signal = new callback_signal_t(); + signal->connect(slot); + sSignalMap[agent_id] = signal; + } + else + { + // ...existing callback, bind additional slot + callback_signal_t* signal = sig_it->second; + signal->connect(slot); + } } class LLSetNameResponder : public LLHTTPClient::Responder -- cgit v1.2.3 From 649bdf412f4cead9721b5393d3929b6fbd6df272 Mon Sep 17 00:00:00 2001 From: James Cook Date: Wed, 24 Feb 2010 11:58:48 -0800 Subject: Clean up code after review with Roxie --- indra/llmessage/llavatarnamecache.cpp | 71 +++++++++++------------------------ 1 file changed, 22 insertions(+), 49 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 50bdc1e063..1a456e15be 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -34,18 +34,21 @@ #include "llavatarnamecache.h" -#include "llcachename.h" // until we get our own web service +#include "llcachename.h" // *TODO: remove #include "llframetimer.h" #include "llhttpclient.h" -#include "llsdserialize.h" // JAMESDEBUG -#include // tolower() +#include #include namespace LLAvatarNameCache { bool sUseDisplayNames = false; + // *TODO: configure the base URL for this in viewer with data + // from login.cgi + std::string sNameServiceBaseURL = "http://pdp15.lindenlab.com:8050/my-service/"; + // accumulated agent IDs for next query against service typedef std::set ask_queue_t; ask_queue_t sAskQueue; @@ -70,36 +73,29 @@ namespace LLAvatarNameCache LLFrameTimer sRequestTimer; bool isRequestPending(const LLUUID& agent_id); - void processResult(const LLSD& row); + void processNameFromService(const LLSD& row); } class LLAvatarNameResponder : public LLHTTPClient::Responder { public: - /*virtual*/ void result(const LLSD& content); - /*virtual*/ void error(U32 status, const std::string& reason); -}; - -void LLAvatarNameResponder::result(const LLSD& content) -{ - //std::ostringstream debug; - //LLSDSerialize::toPrettyXML(content, debug); - //llinfos << "JAMESDEBUG " << debug.str() << llendl; - - LLSD::array_const_iterator it = content.beginArray(); - for ( ; it != content.endArray(); ++it) + /*virtual*/ void result(const LLSD& content) { - const LLSD& row = *it; - LLAvatarNameCache::processResult(row); + LLSD::array_const_iterator it = content.beginArray(); + for ( ; it != content.endArray(); ++it) + { + const LLSD& row = *it; + LLAvatarNameCache::processNameFromService(row); + } } -} -void LLAvatarNameResponder::error(U32 status, const std::string& reason) -{ - llinfos << "JAMESDEBUG error " << status << " " << reason << llendl; -} + /*virtual*/ void error(U32 status, const std::string& reason) + { + llinfos << "JAMESDEBUG error " << status << " " << reason << llendl; + } +}; -void LLAvatarNameCache::processResult(const LLSD& row) +void LLAvatarNameCache::processNameFromService(const LLSD& row) { U32 now = (U32)LLFrameTimer::getTotalSeconds(); @@ -135,7 +131,6 @@ void LLAvatarNameCache::processResult(const LLSD& row) signal_map_t::iterator sig_it = sSignalMap.find(agent_id); if (sig_it != sSignalMap.end()) { - llinfos << "JAMESDEBUG firing signal" << llendl; callback_signal_t* signal = sig_it->second; (*signal)(agent_id, av_name); @@ -144,25 +139,8 @@ void LLAvatarNameCache::processResult(const LLSD& row) delete signal; signal = NULL; } - - llinfos << "JAMESDEBUG fetched " << av_name.mDisplayName << llendl; } -// JAMESDEBUG re-enable when display names are turned on??? -//static std::string slid_from_full_name(const std::string& full_name) -//{ -// std::string id = full_name; -// std::string::size_type end = id.length(); -// for (std::string::size_type i = 0; i < end; ++i) -// { -// if (id[i] == ' ') -// id[i] = '.'; -// else -// id[i] = tolower(id[i]); -// } -// return id; -//} - void LLAvatarNameCache::initClass() { } @@ -202,12 +180,8 @@ void LLAvatarNameCache::idle() agent_ids.append( LLSD( *it ) ); } - //std::ostringstream debug; - //LLSDSerialize::toPrettyXML(body, debug); - //LL_INFOS("JAMESDEBUG") << debug.str() << LL_ENDL; - // *TODO: configure the base URL for this - std::string url = "http://pdp15.lindenlab.com:8050/my-service/agent/display-names/"; + std::string url = sNameServiceBaseURL + "agent/display-names/"; LLHTTPClient::post(url, body, new LLAvatarNameResponder()); // Move requests from Ask queue to Pending queue @@ -297,7 +271,6 @@ public: { // force re-fetch LLAvatarNameCache::sCache.erase(mAgentID); - llinfos << "JAMESDEBUG set names worked" << llendl; } /*virtual*/ void error(U32 status, const std::string& reason) @@ -313,7 +286,7 @@ void LLAvatarNameCache::setDisplayName(const LLUUID& agent_id, const std::string body["display_name"] = display_name; // *TODO: configure the base URL for this - std::string url = "http://pdp15.lindenlab.com:8050/my-service/agent/"; + std::string url = sNameServiceBaseURL + "agent/"; url += agent_id.asString(); url += "/set-display-name/"; LLHTTPClient::post(url, body, new LLSetNameResponder(agent_id)); -- cgit v1.2.3 From f3e0e9a5264a80d146a1d4d77fd9c4f5d3070278 Mon Sep 17 00:00:00 2001 From: James Cook Date: Wed, 24 Feb 2010 14:31:46 -0800 Subject: Hack to refresh name tags when I change my display name. Also fixes a crash when turning on display names. --- indra/llmessage/llavatarnamecache.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 1a456e15be..5384e1f067 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -308,3 +308,8 @@ bool LLAvatarNameCache::useDisplayNames() { return sUseDisplayNames; } + +void LLAvatarNameCache::erase(const LLUUID& agent_id) +{ + sCache.erase(agent_id); +} -- cgit v1.2.3 From 1f340919533db8c49755002311b72483057a56c9 Mon Sep 17 00:00:00 2001 From: James Cook Date: Mon, 8 Mar 2010 16:41:08 -0800 Subject: Removed custom star badges for Lindens. Plan is to use avatar profile pictures for these. --- indra/llmessage/llavatarnamecache.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 5384e1f067..5f9e600d47 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -105,10 +105,10 @@ void LLAvatarNameCache::processNameFromService(const LLSD& row) av_name.mLastUpdate = now; // HACK for pretty stars - if (row["last_name"].asString() == "Linden") - { - av_name.mBadge = "Person_Star"; - } + //if (row["last_name"].asString() == "Linden") + //{ + // av_name.mBadge = "Person_Star"; + //} // Some avatars don't have explicit display names set if (av_name.mDisplayName.empty()) -- cgit v1.2.3 From 60aa61e1cc5d3c42f54368a2b0b9eccfe5d315ff Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 9 Mar 2010 12:23:43 -0800 Subject: Default display names to on for demo --- indra/llmessage/llavatarnamecache.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 5f9e600d47..eae4f62f26 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -43,7 +43,9 @@ namespace LLAvatarNameCache { - bool sUseDisplayNames = false; + // *TODO: Defaulted to true for demo, probably want false for initial + // release and turn it on based on data from login.cgi + bool sUseDisplayNames = true; // *TODO: configure the base URL for this in viewer with data // from login.cgi -- cgit v1.2.3 From 421fe9efa709db0fd870f4bfbdc61d4716767fe5 Mon Sep 17 00:00:00 2001 From: James Cook Date: Wed, 10 Mar 2010 17:12:00 -0800 Subject: Freshly created SLID-only account now shows white tag, not yellow --- indra/llmessage/llavatarnamecache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index eae4f62f26..d7284c41a7 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -120,7 +120,7 @@ void LLAvatarNameCache::processNameFromService(const LLSD& row) std::string last_name = row["last_name"].asString(); av_name.mDisplayName = LLCacheName::buildFullName(first_name, last_name); - av_name.mIsLegacy = true; + av_name.mIsLegacy = (last_name != "Resident"); } // add to cache -- cgit v1.2.3 From 639b234762133e4d09d6d7b1bac9d25c5a681926 Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 18 Mar 2010 17:19:57 -0700 Subject: Partial support for Set Name returning error msg from service --- indra/llmessage/llavatarnamecache.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index d7284c41a7..d49f1d3de5 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -37,6 +37,7 @@ #include "llcachename.h" // *TODO: remove #include "llframetimer.h" #include "llhttpclient.h" +#include "llsd.h" #include #include @@ -266,23 +267,36 @@ class LLSetNameResponder : public LLHTTPClient::Responder { public: LLUUID mAgentID; + LLAvatarNameCache::set_name_signal_t mSignal; - LLSetNameResponder(const LLUUID& agent_id) : mAgentID(agent_id) { } + LLSetNameResponder(const LLUUID& agent_id, + const LLAvatarNameCache::set_name_slot_t& slot) + : mAgentID(agent_id), + mSignal() + { + mSignal.connect(slot); + } /*virtual*/ void result(const LLSD& content) { // force re-fetch LLAvatarNameCache::sCache.erase(mAgentID); + + mSignal(true, "", content); } /*virtual*/ void error(U32 status, const std::string& reason) { llinfos << "JAMESDEBUG set names failed " << status << " reason " << reason << llendl; + + mSignal(false, reason, LLSD()); } }; -void LLAvatarNameCache::setDisplayName(const LLUUID& agent_id, const std::string& display_name) +void LLAvatarNameCache::setDisplayName(const LLUUID& agent_id, + const std::string& display_name, + const set_name_slot_t& slot) { LLSD body; body["display_name"] = display_name; @@ -291,7 +305,7 @@ void LLAvatarNameCache::setDisplayName(const LLUUID& agent_id, const std::string std::string url = sNameServiceBaseURL + "agent/"; url += agent_id.asString(); url += "/set-display-name/"; - LLHTTPClient::post(url, body, new LLSetNameResponder(agent_id)); + LLHTTPClient::post(url, body, new LLSetNameResponder(agent_id, slot)); } void LLAvatarNameCache::toggleDisplayNames() -- cgit v1.2.3 From 0b36c4181203e37d6fc3e59817d5b5abd2d7611e Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 8 Apr 2010 15:43:00 -0700 Subject: DEV-47529 Add expiration to display name cache for viewer Also synchronize LLAvatarNameCache with server version TODO: Get expiration time from web service --- indra/llmessage/llavatarnamecache.cpp | 80 +++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 18 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index d49f1d3de5..047e4fbfd9 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -48,9 +48,11 @@ namespace LLAvatarNameCache // release and turn it on based on data from login.cgi bool sUseDisplayNames = true; - // *TODO: configure the base URL for this in viewer with data + // Base lookup URL for name service. + // On simulator, loaded from indra.xml + // On viewer, sent down from login.cgi // from login.cgi - std::string sNameServiceBaseURL = "http://pdp15.lindenlab.com:8050/my-service/"; + std::string sNameServiceURL; // accumulated agent IDs for next query against service typedef std::set ask_queue_t; @@ -72,11 +74,18 @@ namespace LLAvatarNameCache typedef std::map cache_t; cache_t sCache; + // Send bulk lookup requests a few times a second at most // only need per-frame timing resolution LLFrameTimer sRequestTimer; + // Periodically clean out expired entries from the cache + LLFrameTimer sEraseExpiredTimer; + + void processNameFromService(const LLSD& row, U32 expires); bool isRequestPending(const LLUUID& agent_id); - void processNameFromService(const LLSD& row); + + // Erase expired names from cache + void eraseExpired(); } class LLAvatarNameResponder : public LLHTTPClient::Responder @@ -84,28 +93,32 @@ class LLAvatarNameResponder : public LLHTTPClient::Responder public: /*virtual*/ void result(const LLSD& content) { + // JAMESDEBUG TODO: get expiration from header + const U32 DEFAULT_EXPIRATION = 6 * 60 * 60; // 6 hours + U32 now = (U32)LLFrameTimer::getTotalSeconds(); + U32 expires = now + DEFAULT_EXPIRATION; + LLSD::array_const_iterator it = content.beginArray(); for ( ; it != content.endArray(); ++it) { const LLSD& row = *it; - LLAvatarNameCache::processNameFromService(row); + LLAvatarNameCache::processNameFromService(row, expires); } } /*virtual*/ void error(U32 status, const std::string& reason) { - llinfos << "JAMESDEBUG error " << status << " " << reason << llendl; + llinfos << "LLAvatarNameResponder error " << status << " " << reason << llendl; } }; -void LLAvatarNameCache::processNameFromService(const LLSD& row) +// "expires" is seconds-from-epoch +void LLAvatarNameCache::processNameFromService(const LLSD& row, U32 expires) { - U32 now = (U32)LLFrameTimer::getTotalSeconds(); - LLAvatarName av_name; av_name.mSLID = row["slid"].asString(); av_name.mDisplayName = row["display_name"].asString(); - av_name.mLastUpdate = now; + av_name.mExpires = expires; // HACK for pretty stars //if (row["last_name"].asString() == "Linden") @@ -144,8 +157,9 @@ void LLAvatarNameCache::processNameFromService(const LLSD& row) } } -void LLAvatarNameCache::initClass() +void LLAvatarNameCache::initClass(const std::string& name_service_url) { + setNameServiceURL(name_service_url); } void LLAvatarNameCache::cleanupClass() @@ -160,14 +174,28 @@ void LLAvatarNameCache::exportFile(std::ostream& ostr) { } +void LLAvatarNameCache::setNameServiceURL(const std::string& name_service_url) +{ + sNameServiceURL = name_service_url; +} + void LLAvatarNameCache::idle() { - const F32 SECS_BETWEEN_REQUESTS = 0.2f; // JAMESDEBUG set to 0.1? - if (sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS)) + // 100 ms is the threshold for "user speed" operations, so we can + // stall for about that long to batch up requests. + const F32 SECS_BETWEEN_REQUESTS = 0.1f; + if (!sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS)) { return; } + // Must be large relative to above + const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds + if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT)) + { + eraseExpired(); + } + if (sAskQueue.empty()) { return; @@ -183,8 +211,8 @@ void LLAvatarNameCache::idle() agent_ids.append( LLSD( *it ) ); } - // *TODO: configure the base URL for this - std::string url = sNameServiceBaseURL + "agent/display-names/"; + // *TODO: update for People API url formats + std::string url = sNameServiceURL + "agent/display-names/"; LLHTTPClient::post(url, body, new LLAvatarNameResponder()); // Move requests from Ask queue to Pending queue @@ -205,12 +233,28 @@ bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id) pending_queue_t::const_iterator it = sPendingQueue.find(agent_id); if (it != sPendingQueue.end()) { - bool expired = (it->second < expire_time); - return !expired; + bool request_expired = (it->second < expire_time); + return !request_expired; } return false; } +void LLAvatarNameCache::eraseExpired() +{ + U32 now = (U32)LLFrameTimer::getTotalSeconds(); + cache_t::iterator it = sCache.begin(); + while (it != sCache.end()) + { + cache_t::iterator cur = it; + ++it; + const LLAvatarName& av_name = cur->second; + if (av_name.mExpires < now) + { + sCache.erase(cur); + } + } +} + bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) { std::map::iterator it = sCache.find(agent_id); @@ -287,7 +331,7 @@ public: /*virtual*/ void error(U32 status, const std::string& reason) { - llinfos << "JAMESDEBUG set names failed " << status + llinfos << "LLSetNameResponder failed " << status << " reason " << reason << llendl; mSignal(false, reason, LLSD()); @@ -302,7 +346,7 @@ void LLAvatarNameCache::setDisplayName(const LLUUID& agent_id, body["display_name"] = display_name; // *TODO: configure the base URL for this - std::string url = sNameServiceBaseURL + "agent/"; + std::string url = sNameServiceURL + "agent/"; url += agent_id.asString(); url += "/set-display-name/"; LLHTTPClient::post(url, body, new LLSetNameResponder(agent_id, slot)); -- cgit v1.2.3 From 65e565e0e1d7b964048a32a92f59a5dd8f74bb0c Mon Sep 17 00:00:00 2001 From: James Cook Date: Mon, 12 Apr 2010 16:36:12 -0700 Subject: DEV-47529 Convert viewer to use final People API lookup URL format Reviewed with Simon --- indra/llmessage/llavatarnamecache.cpp | 139 +++++++++++++++++++++++++++------- 1 file changed, 111 insertions(+), 28 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 047e4fbfd9..ee57279e1f 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -52,6 +52,7 @@ namespace LLAvatarNameCache // On simulator, loaded from indra.xml // On viewer, sent down from login.cgi // from login.cgi + // Includes the trailing slash, like "http://pdp60.lindenlab.com:8000/" std::string sNameServiceURL; // accumulated agent IDs for next query against service @@ -82,12 +83,48 @@ namespace LLAvatarNameCache LLFrameTimer sEraseExpiredTimer; void processNameFromService(const LLSD& row, U32 expires); + void requestNames(); bool isRequestPending(const LLUUID& agent_id); // Erase expired names from cache void eraseExpired(); } +/* Sample response: + + + + agents + + + sl_id + mickbot390.llqabot + display_name + MickBot390 LLQABot + id + 0012809d-7d2d-4c24-9609-af1230a37715 + is_display_name_default + false + seconds_until_display_name_update + + + + sl_id + sardonyx.linden + display_name + Bjork Gudmundsdottir + id + 3941037e-78ab-45f0-b421-bd6e77c1804d + is_display_name_default + true + seconds_until_display_name_update + 46925 + + + + +*/ + class LLAvatarNameResponder : public LLHTTPClient::Responder { public: @@ -98,11 +135,12 @@ public: U32 now = (U32)LLFrameTimer::getTotalSeconds(); U32 expires = now + DEFAULT_EXPIRATION; - LLSD::array_const_iterator it = content.beginArray(); - for ( ; it != content.endArray(); ++it) + LLSD agents = content["agents"]; + LLSD::array_const_iterator it = agents.beginArray(); + for ( ; it != agents.endArray(); ++it) { - const LLSD& row = *it; - LLAvatarNameCache::processNameFromService(row, expires); + const LLSD& entry = *it; + LLAvatarNameCache::processNameFromService(entry, expires); } } @@ -116,8 +154,9 @@ public: void LLAvatarNameCache::processNameFromService(const LLSD& row, U32 expires) { LLAvatarName av_name; - av_name.mSLID = row["slid"].asString(); + av_name.mSLID = row["sl_id"].asString(); av_name.mDisplayName = row["display_name"].asString(); + //av_name.mIsDisplayNameDefault = row["is_display_name_default"].asBoolean(); av_name.mExpires = expires; // HACK for pretty stars @@ -129,16 +168,28 @@ void LLAvatarNameCache::processNameFromService(const LLSD& row, U32 expires) // Some avatars don't have explicit display names set if (av_name.mDisplayName.empty()) { - // make up a display name - std::string first_name = row["first_name"].asString(); - std::string last_name = row["last_name"].asString(); - av_name.mDisplayName = - LLCacheName::buildFullName(first_name, last_name); - av_name.mIsLegacy = (last_name != "Resident"); + av_name.mDisplayName = av_name.mSLID; } + // HACK: Legacy users have '.' in their SLID + // JAMESDEBUG TODO: change to using is_display_name_default once that works + std::string mangled_name = av_name.mDisplayName; + for (U32 i = 0; i < mangled_name.size(); i++) + { + char c = mangled_name[i]; + if (c == ' ') + { + mangled_name[i] = '.'; + } + else + { + mangled_name[i] = tolower(c); + } + } + av_name.mIsDisplayNameDefault = (mangled_name == av_name.mSLID); + // add to cache - LLUUID agent_id = row["agent_id"].asUUID(); + LLUUID agent_id = row["id"].asUUID(); sCache[agent_id] = av_name; sPendingQueue.erase(agent_id); @@ -157,6 +208,49 @@ void LLAvatarNameCache::processNameFromService(const LLSD& row, U32 expires) } } +void LLAvatarNameCache::requestNames() +{ + // URL format is like: + // http://pdp60.lindenlab.com:8000/agents/?ids=3941037e-78ab-45f0-b421-bd6e77c1804d&ids=0012809d-7d2d-4c24-9609-af1230a37715&ids=0019aaba-24af-4f0a-aa72-6457953cf7f0 + // + // Apache can handle URLs of 4096 chars, but let's be conservative + const U32 NAME_URL_MAX = 4096; + const U32 NAME_URL_SEND_THRESHOLD = 3000; + std::string url; + url.reserve(NAME_URL_MAX); + + ask_queue_t::const_iterator it = sAskQueue.begin(); + for ( ; it != sAskQueue.end(); ++it) + { + if (url.empty()) + { + // ...starting new request + url += sNameServiceURL; + url += "agents/?ids="; + } + else + { + // ...continuing existing request + url += "&ids="; + } + url += it->asString(); + + if (url.size() > NAME_URL_SEND_THRESHOLD) + { + //llinfos << "requestNames " << url << llendl; + LLHTTPClient::get(url, new LLAvatarNameResponder()); + url.clear(); + } + } + + if (!url.empty()) + { + //llinfos << "requestNames " << url << llendl; + LLHTTPClient::get(url, new LLAvatarNameResponder()); + url.clear(); + } +} + void LLAvatarNameCache::initClass(const std::string& name_service_url) { setNameServiceURL(name_service_url); @@ -201,23 +295,12 @@ void LLAvatarNameCache::idle() return; } - LLSD body; - body["agent_ids"] = LLSD::emptyArray(); - LLSD& agent_ids = body["agent_ids"]; - - ask_queue_t::const_iterator it = sAskQueue.begin(); - for ( ; it != sAskQueue.end(); ++it) - { - agent_ids.append( LLSD( *it ) ); - } - - // *TODO: update for People API url formats - std::string url = sNameServiceURL + "agent/display-names/"; - LLHTTPClient::post(url, body, new LLAvatarNameResponder()); + requestNames(); // Move requests from Ask queue to Pending queue U32 now = (U32)LLFrameTimer::getTotalSeconds(); - for (it = sAskQueue.begin(); it != sAskQueue.end(); ++it) + ask_queue_t::const_iterator it = sAskQueue.begin(); + for ( ; it != sAskQueue.end(); ++it) { sPendingQueue[*it] = now; } @@ -307,6 +390,7 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) } } +// JAMESDEBUG TODO: Eliminate and only route changes through simulator class LLSetNameResponder : public LLHTTPClient::Responder { public: @@ -338,6 +422,7 @@ public: } }; +// JAMESDEBUG TODO: Eliminate and only route changes through simulator void LLAvatarNameCache::setDisplayName(const LLUUID& agent_id, const std::string& display_name, const set_name_slot_t& slot) @@ -345,10 +430,8 @@ void LLAvatarNameCache::setDisplayName(const LLUUID& agent_id, LLSD body; body["display_name"] = display_name; - // *TODO: configure the base URL for this std::string url = sNameServiceURL + "agent/"; url += agent_id.asString(); - url += "/set-display-name/"; LLHTTPClient::post(url, body, new LLSetNameResponder(agent_id, slot)); } -- cgit v1.2.3 From e390e4f2b5a1e8a938e7d66842bc6c29cfd19436 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 13 Apr 2010 11:54:06 -0700 Subject: DEV-47529 Display name expiration time sent from web service --- indra/llmessage/llavatarnamecache.cpp | 82 ++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 40 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index ee57279e1f..1fc6aa4cbd 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -82,7 +82,7 @@ namespace LLAvatarNameCache // Periodically clean out expired entries from the cache LLFrameTimer sEraseExpiredTimer; - void processNameFromService(const LLSD& row, U32 expires); + void processNameFromService(const LLSD& row); void requestNames(); bool isRequestPending(const LLUUID& agent_id); @@ -91,37 +91,41 @@ namespace LLAvatarNameCache } /* Sample response: - - - - agents - - - sl_id - mickbot390.llqabot - display_name - MickBot390 LLQABot - id - 0012809d-7d2d-4c24-9609-af1230a37715 - is_display_name_default - false - seconds_until_display_name_update - - - - sl_id - sardonyx.linden - display_name - Bjork Gudmundsdottir - id - 3941037e-78ab-45f0-b421-bd6e77c1804d - is_display_name_default - true - seconds_until_display_name_update - 46925 - - - + + + + agents + + + seconds_until_display_name_update + + display_name + MickBot390 LLQABot + seconds_until_display_name_expires + + sl_id + mickbot390.llqabot + id + 0012809d-7d2d-4c24-9609-af1230a37715 + is_display_name_default + false + + + seconds_until_display_name_update + + display_name + Bjork Gudmundsdottir + seconds_until_display_name_expires + 3600 + sl_id + sardonyx.linden + id + 3941037e-78ab-45f0-b421-bd6e77c1804d + is_display_name_default + true + + + */ @@ -130,17 +134,12 @@ class LLAvatarNameResponder : public LLHTTPClient::Responder public: /*virtual*/ void result(const LLSD& content) { - // JAMESDEBUG TODO: get expiration from header - const U32 DEFAULT_EXPIRATION = 6 * 60 * 60; // 6 hours - U32 now = (U32)LLFrameTimer::getTotalSeconds(); - U32 expires = now + DEFAULT_EXPIRATION; - LLSD agents = content["agents"]; LLSD::array_const_iterator it = agents.beginArray(); for ( ; it != agents.endArray(); ++it) { const LLSD& entry = *it; - LLAvatarNameCache::processNameFromService(entry, expires); + LLAvatarNameCache::processNameFromService(entry); } } @@ -151,13 +150,16 @@ public: }; // "expires" is seconds-from-epoch -void LLAvatarNameCache::processNameFromService(const LLSD& row, U32 expires) +void LLAvatarNameCache::processNameFromService(const LLSD& row) { LLAvatarName av_name; av_name.mSLID = row["sl_id"].asString(); av_name.mDisplayName = row["display_name"].asString(); //av_name.mIsDisplayNameDefault = row["is_display_name_default"].asBoolean(); - av_name.mExpires = expires; + + U32 now = (U32)LLFrameTimer::getTotalSeconds(); + S32 seconds_until_expires = row["seconds_until_display_name_expires"].asInteger(); + av_name.mExpires = now + seconds_until_expires; // HACK for pretty stars //if (row["last_name"].asString() == "Linden") -- cgit v1.2.3 From 80916b3f9597557811addc377d7b7b8c4b56c277 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 13 Apr 2010 12:05:12 -0700 Subject: Fix line endings --- indra/llmessage/llavatarnamecache.cpp | 70 +++++++++++++++++------------------ 1 file changed, 35 insertions(+), 35 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 1fc6aa4cbd..bb1f6fdb3a 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -91,41 +91,41 @@ namespace LLAvatarNameCache } /* Sample response: - - - - agents - - - seconds_until_display_name_update - - display_name - MickBot390 LLQABot - seconds_until_display_name_expires - - sl_id - mickbot390.llqabot - id - 0012809d-7d2d-4c24-9609-af1230a37715 - is_display_name_default - false - - - seconds_until_display_name_update - - display_name - Bjork Gudmundsdottir - seconds_until_display_name_expires - 3600 - sl_id - sardonyx.linden - id - 3941037e-78ab-45f0-b421-bd6e77c1804d - is_display_name_default - true - - - + + + + agents + + + seconds_until_display_name_update + + display_name + MickBot390 LLQABot + seconds_until_display_name_expires + + sl_id + mickbot390.llqabot + id + 0012809d-7d2d-4c24-9609-af1230a37715 + is_display_name_default + false + + + seconds_until_display_name_update + + display_name + Bjork Gudmundsdottir + seconds_until_display_name_expires + 3600 + sl_id + sardonyx.linden + id + 3941037e-78ab-45f0-b421-bd6e77c1804d + is_display_name_default + true + + + */ -- cgit v1.2.3 From 4218819951a5caa1499e79d8bd4f1bf08fe3b3cc Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 15 Apr 2010 16:22:15 -0700 Subject: DEV-47529 Viewer looks up display names via a sim cap Squire asked me to route display name lookups via a simulator capability using HTTP GET. This buys us authentication until the data services team can implement a public-facing authenticating web service for People API. --- indra/llmessage/llavatarnamecache.cpp | 87 ++++++----------------------------- 1 file changed, 15 insertions(+), 72 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index bb1f6fdb3a..8268624b84 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -50,10 +50,9 @@ namespace LLAvatarNameCache // Base lookup URL for name service. // On simulator, loaded from indra.xml - // On viewer, sent down from login.cgi - // from login.cgi - // Includes the trailing slash, like "http://pdp60.lindenlab.com:8000/" - std::string sNameServiceURL; + // On viewer, usually a simulator capability (at People API team's request) + // Includes the trailing slash, like "http://pdp60.lindenlab.com:8000/agents/" + std::string sNameLookupURL; // accumulated agent IDs for next query against service typedef std::set ask_queue_t; @@ -155,7 +154,7 @@ void LLAvatarNameCache::processNameFromService(const LLSD& row) LLAvatarName av_name; av_name.mSLID = row["sl_id"].asString(); av_name.mDisplayName = row["display_name"].asString(); - //av_name.mIsDisplayNameDefault = row["is_display_name_default"].asBoolean(); + av_name.mIsDisplayNameDefault = row["is_display_name_default"].asBoolean(); U32 now = (U32)LLFrameTimer::getTotalSeconds(); S32 seconds_until_expires = row["seconds_until_display_name_expires"].asInteger(); @@ -173,23 +172,6 @@ void LLAvatarNameCache::processNameFromService(const LLSD& row) av_name.mDisplayName = av_name.mSLID; } - // HACK: Legacy users have '.' in their SLID - // JAMESDEBUG TODO: change to using is_display_name_default once that works - std::string mangled_name = av_name.mDisplayName; - for (U32 i = 0; i < mangled_name.size(); i++) - { - char c = mangled_name[i]; - if (c == ' ') - { - mangled_name[i] = '.'; - } - else - { - mangled_name[i] = tolower(c); - } - } - av_name.mIsDisplayNameDefault = (mangled_name == av_name.mSLID); - // add to cache LLUUID agent_id = row["id"].asUUID(); sCache[agent_id] = av_name; @@ -227,8 +209,8 @@ void LLAvatarNameCache::requestNames() if (url.empty()) { // ...starting new request - url += sNameServiceURL; - url += "agents/?ids="; + url += sNameLookupURL; + url += "?ids="; } else { @@ -253,9 +235,8 @@ void LLAvatarNameCache::requestNames() } } -void LLAvatarNameCache::initClass(const std::string& name_service_url) +void LLAvatarNameCache::initClass() { - setNameServiceURL(name_service_url); } void LLAvatarNameCache::cleanupClass() @@ -270,9 +251,9 @@ void LLAvatarNameCache::exportFile(std::ostream& ostr) { } -void LLAvatarNameCache::setNameServiceURL(const std::string& name_service_url) +void LLAvatarNameCache::setNameLookupURL(const std::string& name_lookup_url) { - sNameServiceURL = name_service_url; + sNameLookupURL = name_lookup_url; } void LLAvatarNameCache::idle() @@ -292,6 +273,12 @@ void LLAvatarNameCache::idle() eraseExpired(); } + if (sNameLookupURL.empty()) + { + // ...viewer has not yet received capability from region + return; + } + if (sAskQueue.empty()) { return; @@ -392,50 +379,6 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) } } -// JAMESDEBUG TODO: Eliminate and only route changes through simulator -class LLSetNameResponder : public LLHTTPClient::Responder -{ -public: - LLUUID mAgentID; - LLAvatarNameCache::set_name_signal_t mSignal; - - LLSetNameResponder(const LLUUID& agent_id, - const LLAvatarNameCache::set_name_slot_t& slot) - : mAgentID(agent_id), - mSignal() - { - mSignal.connect(slot); - } - - /*virtual*/ void result(const LLSD& content) - { - // force re-fetch - LLAvatarNameCache::sCache.erase(mAgentID); - - mSignal(true, "", content); - } - - /*virtual*/ void error(U32 status, const std::string& reason) - { - llinfos << "LLSetNameResponder failed " << status - << " reason " << reason << llendl; - - mSignal(false, reason, LLSD()); - } -}; - -// JAMESDEBUG TODO: Eliminate and only route changes through simulator -void LLAvatarNameCache::setDisplayName(const LLUUID& agent_id, - const std::string& display_name, - const set_name_slot_t& slot) -{ - LLSD body; - body["display_name"] = display_name; - - std::string url = sNameServiceURL + "agent/"; - url += agent_id.asString(); - LLHTTPClient::post(url, body, new LLSetNameResponder(agent_id, slot)); -} void LLAvatarNameCache::toggleDisplayNames() { -- cgit v1.2.3 From 69de1f4eb7cdd063bbdd7b4019a6a9799fc5dc5f Mon Sep 17 00:00:00 2001 From: James Cook Date: Fri, 16 Apr 2010 19:06:17 -0700 Subject: Accept expires timestamp as UTC datetime in LLSD --- indra/llmessage/llavatarnamecache.cpp | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 8268624b84..2c143266fe 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -60,7 +60,7 @@ namespace LLAvatarNameCache // agent IDs that have been requested, but with no reply // maps agent ID to frame time request was made - typedef std::map pending_queue_t; + typedef std::map pending_queue_t; pending_queue_t sPendingQueue; // Callbacks to fire when we received a name. @@ -96,12 +96,12 @@ namespace LLAvatarNameCache agents - seconds_until_display_name_update - + display_name_next_update + 2010-04-16T21:34:02+00:00Z + display_name_expires + 2010-04-16T21:32:26.142178+00:00Z display_name MickBot390 LLQABot - seconds_until_display_name_expires - sl_id mickbot390.llqabot id @@ -110,12 +110,12 @@ namespace LLAvatarNameCache false - seconds_until_display_name_update - + display_name_next_update + 2010-04-16T21:34:02+00:00Z + display_name_expires + 2010-04-16T21:32:26.142178+00:00Z display_name Bjork Gudmundsdottir - seconds_until_display_name_expires - 3600 sl_id sardonyx.linden id @@ -155,10 +155,9 @@ void LLAvatarNameCache::processNameFromService(const LLSD& row) av_name.mSLID = row["sl_id"].asString(); av_name.mDisplayName = row["display_name"].asString(); av_name.mIsDisplayNameDefault = row["is_display_name_default"].asBoolean(); + av_name.mExpires = row["display_name_expires"].asReal(); - U32 now = (U32)LLFrameTimer::getTotalSeconds(); - S32 seconds_until_expires = row["seconds_until_display_name_expires"].asInteger(); - av_name.mExpires = now + seconds_until_expires; + llinfos << "JAMESDEBUG expires " << av_name.mExpires << " now " << LLFrameTimer::getTotalSeconds() << llendl; // HACK for pretty stars //if (row["last_name"].asString() == "Linden") @@ -287,7 +286,7 @@ void LLAvatarNameCache::idle() requestNames(); // Move requests from Ask queue to Pending queue - U32 now = (U32)LLFrameTimer::getTotalSeconds(); + F64 now = LLFrameTimer::getTotalSeconds(); ask_queue_t::const_iterator it = sAskQueue.begin(); for ( ; it != sAskQueue.end(); ++it) { @@ -298,9 +297,9 @@ void LLAvatarNameCache::idle() bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id) { - const U32 PENDING_TIMEOUT_SECS = 5 * 60; - U32 now = (U32)LLFrameTimer::getTotalSeconds(); - U32 expire_time = now - PENDING_TIMEOUT_SECS; + const F64 PENDING_TIMEOUT_SECS = 5.0 * 60.0; + F64 now = LLFrameTimer::getTotalSeconds(); + F64 expire_time = now - PENDING_TIMEOUT_SECS; pending_queue_t::const_iterator it = sPendingQueue.find(agent_id); if (it != sPendingQueue.end()) @@ -313,7 +312,7 @@ bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id) void LLAvatarNameCache::eraseExpired() { - U32 now = (U32)LLFrameTimer::getTotalSeconds(); + F64 now = LLFrameTimer::getTotalSeconds(); cache_t::iterator it = sCache.begin(); while (it != sCache.end()) { -- cgit v1.2.3 From fec933822888fd542c70fe11b5dcae02c0dc7523 Mon Sep 17 00:00:00 2001 From: James Cook Date: Fri, 16 Apr 2010 19:08:35 -0700 Subject: Fix line endings --- indra/llmessage/llavatarnamecache.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 2c143266fe..62c2df90a9 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -96,9 +96,9 @@ namespace LLAvatarNameCache agents - display_name_next_update - 2010-04-16T21:34:02+00:00Z - display_name_expires + display_name_next_update + 2010-04-16T21:34:02+00:00Z + display_name_expires 2010-04-16T21:32:26.142178+00:00Z display_name MickBot390 LLQABot @@ -110,9 +110,9 @@ namespace LLAvatarNameCache false - display_name_next_update - 2010-04-16T21:34:02+00:00Z - display_name_expires + display_name_next_update + 2010-04-16T21:34:02+00:00Z + display_name_expires 2010-04-16T21:32:26.142178+00:00Z display_name Bjork Gudmundsdottir -- cgit v1.2.3 From d373dc8782e7085e313b3637c168c87c2b5a71ed Mon Sep 17 00:00:00 2001 From: James Cook Date: Mon, 19 Apr 2010 17:09:37 -0700 Subject: Viewer asks login.cgi if the grid supports display names If not, turns off display names. Cleaned up name cache reset code. Alphabetized login auth param requests for easier merges going forward. --- indra/llmessage/llavatarnamecache.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 62c2df90a9..69770c1f2a 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -34,7 +34,6 @@ #include "llavatarnamecache.h" -#include "llcachename.h" // *TODO: remove #include "llframetimer.h" #include "llhttpclient.h" #include "llsd.h" @@ -379,15 +378,13 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) } -void LLAvatarNameCache::toggleDisplayNames() +void LLAvatarNameCache::setUseDisplayNames(bool use) { - sUseDisplayNames = !sUseDisplayNames; - // flush our cache - sCache.clear(); - // force re-lookups - if (gCacheName) + if (use != sUseDisplayNames) { - gCacheName->clear(); + sUseDisplayNames = use; + // flush our cache + sCache.clear(); } } -- cgit v1.2.3 From 022a598694cd37bebff3322054324c7d27afd5ff Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 20 Apr 2010 17:05:49 -0700 Subject: Viewer caches avatar display names between sessions Reviewed with Simon --- indra/llmessage/llavatarnamecache.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 69770c1f2a..d10958d09d 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -37,6 +37,7 @@ #include "llframetimer.h" #include "llhttpclient.h" #include "llsd.h" +#include "llsdserialize.h" #include #include @@ -243,10 +244,43 @@ void LLAvatarNameCache::cleanupClass() void LLAvatarNameCache::importFile(std::istream& istr) { + LLSD data; + S32 parse_count = LLSDSerialize::fromXMLDocument(data, istr); + if (parse_count < 1) return; + + // by convention LLSD storage is a map + // we only store one entry in the map + LLSD agents = data["agents"]; + + LLUUID agent_id; + LLAvatarName av_name; + LLSD::map_const_iterator it = agents.beginMap(); + for ( ; it != agents.endMap(); ++it) + { + agent_id.set(it->first); + av_name.fromLLSD( it->second ); + sCache[agent_id] = av_name; + } + // entries may have expired since we last ran the viewer, just + // clean them out now + eraseExpired(); + llinfos << "loaded " << sCache.size() << llendl; } void LLAvatarNameCache::exportFile(std::ostream& ostr) { + LLSD agents; + cache_t::const_iterator it = sCache.begin(); + for ( ; it != sCache.end(); ++it) + { + const LLUUID& agent_id = it->first; + const LLAvatarName& av_name = it->second; + // key must be a string + agents[agent_id.asString()] = av_name.asLLSD(); + } + LLSD data; + data["agents"] = agents; + LLSDSerialize::toPrettyXML(data, ostr); } void LLAvatarNameCache::setNameLookupURL(const std::string& name_lookup_url) -- cgit v1.2.3 From 61d79980d888a7bbac96df9955582f835b169a97 Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 22 Apr 2010 10:24:17 -0700 Subject: Starting to implement running switch and 503 error handling --- indra/llmessage/llavatarnamecache.cpp | 39 ++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index d10958d09d..6455286770 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -44,9 +44,12 @@ namespace LLAvatarNameCache { - // *TODO: Defaulted to true for demo, probably want false for initial - // release and turn it on based on data from login.cgi + // Will be turned on and off based on service availability, sometimes + // in the middle of a session. bool sUseDisplayNames = true; + + // While false, buffer requests for later. Used during viewer startup. + bool sRunning = false; // Base lookup URL for name service. // On simulator, loaded from indra.xml @@ -130,7 +133,16 @@ namespace LLAvatarNameCache class LLAvatarNameResponder : public LLHTTPClient::Responder { +private: + // need to store agent ids that are part of this request in case of + // an error, so we can flag them as unavailable + std::vector mAgentIDs; + public: + LLAvatarNameResponder(const std::vector& agent_ids) + : mAgentIDs(agent_ids) + { } + /*virtual*/ void result(const LLSD& content) { LLSD agents = content["agents"]; @@ -202,6 +214,9 @@ void LLAvatarNameCache::requestNames() std::string url; url.reserve(NAME_URL_MAX); + std::vector agent_ids; + agent_ids.reserve(128); + ask_queue_t::const_iterator it = sAskQueue.begin(); for ( ; it != sAskQueue.end(); ++it) { @@ -217,25 +232,29 @@ void LLAvatarNameCache::requestNames() url += "&ids="; } url += it->asString(); + agent_ids.push_back(*it); if (url.size() > NAME_URL_SEND_THRESHOLD) { //llinfos << "requestNames " << url << llendl; - LLHTTPClient::get(url, new LLAvatarNameResponder()); + LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids)); url.clear(); + agent_ids.clear(); } } if (!url.empty()) { //llinfos << "requestNames " << url << llendl; - LLHTTPClient::get(url, new LLAvatarNameResponder()); + LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids)); url.clear(); + agent_ids.clear(); } } -void LLAvatarNameCache::initClass() +void LLAvatarNameCache::initClass(bool running) { + sRunning = running; } void LLAvatarNameCache::cleanupClass() @@ -288,8 +307,18 @@ void LLAvatarNameCache::setNameLookupURL(const std::string& name_lookup_url) sNameLookupURL = name_lookup_url; } +void LLAvatarNameCache::setRunning(bool running) +{ + sRunning = running; +} + void LLAvatarNameCache::idle() { + if (!sRunning) + { + return; + } + // 100 ms is the threshold for "user speed" operations, so we can // stall for about that long to batch up requests. const F32 SECS_BETWEEN_REQUESTS = 0.1f; -- cgit v1.2.3 From 98f5fc5ff006a82cacde47de0cbb564b6e703597 Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 22 Apr 2010 14:13:45 -0700 Subject: DEV-47529 Turn off display names if no capability from simulator, and Display name update broadcasts entire new name record to nearby viewers Display name update directly inserts new name into sim cache indra.xml has display_names_enabled setting to control cap Synchronized viewer and server versions of avatar name cache Reviewed with Ambroff --- indra/llmessage/llavatarnamecache.cpp | 53 ++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 23 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 6455286770..72498111fd 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -48,9 +48,6 @@ namespace LLAvatarNameCache // in the middle of a session. bool sUseDisplayNames = true; - // While false, buffer requests for later. Used during viewer startup. - bool sRunning = false; - // Base lookup URL for name service. // On simulator, loaded from indra.xml // On viewer, usually a simulator capability (at People API team's request) @@ -85,7 +82,8 @@ namespace LLAvatarNameCache LLFrameTimer sEraseExpiredTimer; void processNameFromService(const LLSD& row); - void requestNames(); + void requestNamesViaCapability(); + void requestNamesViaLegacy(); bool isRequestPending(const LLUUID& agent_id); // Erase expired names from cache @@ -203,7 +201,7 @@ void LLAvatarNameCache::processNameFromService(const LLSD& row) } } -void LLAvatarNameCache::requestNames() +void LLAvatarNameCache::requestNamesViaCapability() { // URL format is like: // http://pdp60.lindenlab.com:8000/agents/?ids=3941037e-78ab-45f0-b421-bd6e77c1804d&ids=0012809d-7d2d-4c24-9609-af1230a37715&ids=0019aaba-24af-4f0a-aa72-6457953cf7f0 @@ -252,9 +250,13 @@ void LLAvatarNameCache::requestNames() } } -void LLAvatarNameCache::initClass(bool running) +void LLAvatarNameCache::requestNamesViaLegacy() +{ + // JAMESDEBUG TODO +} + +void LLAvatarNameCache::initClass() { - sRunning = running; } void LLAvatarNameCache::cleanupClass() @@ -307,18 +309,8 @@ void LLAvatarNameCache::setNameLookupURL(const std::string& name_lookup_url) sNameLookupURL = name_lookup_url; } -void LLAvatarNameCache::setRunning(bool running) -{ - sRunning = running; -} - void LLAvatarNameCache::idle() { - if (!sRunning) - { - return; - } - // 100 ms is the threshold for "user speed" operations, so we can // stall for about that long to batch up requests. const F32 SECS_BETWEEN_REQUESTS = 0.1f; @@ -334,18 +326,21 @@ void LLAvatarNameCache::idle() eraseExpired(); } - if (sNameLookupURL.empty()) + if (sAskQueue.empty()) { - // ...viewer has not yet received capability from region return; } - if (sAskQueue.empty()) + if (!sNameLookupURL.empty()) { - return; + requestNamesViaCapability(); + } + else + { + // ...fall back to legacy name cache system + requestNamesViaLegacy(); + llwarns << "JAMESDEBUG legacy lookup call" << llendl; } - - requestNames(); // Move requests from Ask queue to Pending queue F64 now = LLFrameTimer::getTotalSeconds(); @@ -460,3 +455,15 @@ void LLAvatarNameCache::erase(const LLUUID& agent_id) { sCache.erase(agent_id); } + +void LLAvatarNameCache::fetch(const LLUUID& agent_id) +{ + // re-request, even if request is already pending + sAskQueue.insert(agent_id); +} + +void LLAvatarNameCache::insert(const LLUUID& agent_id, const LLAvatarName& av_name) +{ + // *TODO: update timestamp if zero? + sCache[agent_id] = av_name; +} -- cgit v1.2.3 From c1ff7147974a031643776d8ea950f1bc1466737c Mon Sep 17 00:00:00 2001 From: James Cook Date: Fri, 23 Apr 2010 15:11:33 -0700 Subject: DEV-47529 Name cache can handle People API 503 service unavailable It caches a dummy name "???" for a while and retries - soon for 503, longer delay for other errors. Reviewed with Simon. --- indra/llmessage/llavatarnamecache.cpp | 116 ++++++++++++++++++++++++++-------- 1 file changed, 89 insertions(+), 27 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 72498111fd..eabd311bb0 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -81,7 +81,9 @@ namespace LLAvatarNameCache // Periodically clean out expired entries from the cache LLFrameTimer sEraseExpiredTimer; - void processNameFromService(const LLSD& row); + // Handle name response off network + void processName(const LLUUID& agent_id, const LLAvatarName& av_name); + void requestNamesViaCapability(); void requestNamesViaLegacy(); bool isRequestPending(const LLUUID& agent_id); @@ -147,42 +149,102 @@ public: LLSD::array_const_iterator it = agents.beginArray(); for ( ; it != agents.endArray(); ++it) { - const LLSD& entry = *it; - LLAvatarNameCache::processNameFromService(entry); + const LLSD& row = *it; + LLUUID agent_id = row["id"].asUUID(); + + LLAvatarName av_name; + av_name.fromLLSD(row); + + // Some avatars don't have explicit display names set + if (av_name.mDisplayName.empty()) + { + av_name.mDisplayName = av_name.mSLID; + } + + LLAvatarNameCache::processName(agent_id, av_name); } } - /*virtual*/ void error(U32 status, const std::string& reason) + // This is called for both successful and failed requests, and is + // called _after_ result() above. + /*virtual*/ void completedHeader(U32 status, const std::string& reason, + const LLSD& headers) { - llinfos << "LLAvatarNameResponder error " << status << " " << reason << llendl; + // Only care about headers when there is an error + if (isGoodStatus(status)) return; + + // We're going to construct a dummy record and cache it for a while, + // either briefly for a 503 Service Unavailable, or longer for other + // errors. + F64 retry_timestamp = errorRetryTimestamp(status, headers); + + // *NOTE: "??" starts trigraphs in C/C++, escape the question marks. + const std::string DUMMY_NAME("\?\?\?"); + LLAvatarName av_name; + av_name.mSLID = DUMMY_NAME; + av_name.mDisplayName = DUMMY_NAME; + av_name.mIsDisplayNameDefault = false; + av_name.mExpires = retry_timestamp; + + // Add dummy records for all agent IDs in this request + std::vector::const_iterator it = mAgentIDs.begin(); + for ( ; it != mAgentIDs.end(); ++it) + { + const LLUUID& agent_id = *it; + LLAvatarNameCache::processName(agent_id, av_name); + } } -}; - -// "expires" is seconds-from-epoch -void LLAvatarNameCache::processNameFromService(const LLSD& row) -{ - LLAvatarName av_name; - av_name.mSLID = row["sl_id"].asString(); - av_name.mDisplayName = row["display_name"].asString(); - av_name.mIsDisplayNameDefault = row["is_display_name_default"].asBoolean(); - av_name.mExpires = row["display_name_expires"].asReal(); - llinfos << "JAMESDEBUG expires " << av_name.mExpires << " now " << LLFrameTimer::getTotalSeconds() << llendl; + // Return time to retry a request that generated an error, based on + // error type and headers. Return value is seconds-since-epoch. + F64 errorRetryTimestamp(S32 status, const LLSD& headers) + { + LLSD expires = headers["expires"]; + if (expires.isDefined()) + { + LLDate expires_date = expires.asDate(); + return expires_date.secondsSinceEpoch(); + } - // HACK for pretty stars - //if (row["last_name"].asString() == "Linden") - //{ - // av_name.mBadge = "Person_Star"; - //} + LLSD retry_after = headers["retry-after"]; + if (retry_after.isDefined()) + { + // does the header use the delta-seconds type? + S32 delta_seconds = retry_after.asInteger(); + if (delta_seconds > 0) + { + // ...valid delta-seconds + F64 now = LLFrameTimer::getTotalSeconds(); + return now + F64(delta_seconds); + } + else + { + // ...it's a date + LLDate expires_date = retry_after.asDate(); + return expires_date.secondsSinceEpoch(); + } + } - // Some avatars don't have explicit display names set - if (av_name.mDisplayName.empty()) - { - av_name.mDisplayName = av_name.mSLID; + // No information in header, make a guess + F64 now = LLFrameTimer::getTotalSeconds(); + if (status == 503) + { + // ...service unavailable, retry soon + const F64 SERVICE_UNAVAILABLE_DELAY = 600.0; // 10 min + return now + SERVICE_UNAVAILABLE_DELAY; + } + else + { + // ...other unexpected error + const F64 DEFAULT_DELAY = 3600.0; // 1 hour + return now + DEFAULT_DELAY; + } } +}; - // add to cache - LLUUID agent_id = row["id"].asUUID(); +void LLAvatarNameCache::processName(const LLUUID& agent_id, + const LLAvatarName& av_name) +{ sCache[agent_id] = av_name; sPendingQueue.erase(agent_id); -- cgit v1.2.3 From e4f2887983dc6f473c6657b8b653437557c638fa Mon Sep 17 00:00:00 2001 From: James Cook Date: Mon, 26 Apr 2010 14:19:58 -0700 Subject: Don't save dummy records (from 503 errors) to disk cache --- indra/llmessage/llavatarnamecache.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index eabd311bb0..5acecd1dcb 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -184,6 +184,7 @@ public: av_name.mSLID = DUMMY_NAME; av_name.mDisplayName = DUMMY_NAME; av_name.mIsDisplayNameDefault = false; + av_name.mIsDummy = true; av_name.mExpires = retry_timestamp; // Add dummy records for all agent IDs in this request @@ -358,8 +359,11 @@ void LLAvatarNameCache::exportFile(std::ostream& ostr) { const LLUUID& agent_id = it->first; const LLAvatarName& av_name = it->second; - // key must be a string - agents[agent_id.asString()] = av_name.asLLSD(); + if (!av_name.mIsDummy) + { + // key must be a string + agents[agent_id.asString()] = av_name.asLLSD(); + } } LLSD data; data["agents"] = agents; -- cgit v1.2.3 From 56f5a6909d8a665531e3f6ede380cad57e313728 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 27 Apr 2010 13:54:40 -0700 Subject: Menu item to disable display names for testing works again Start up cache in not-running state on viewer. Set cache running when idle() is called. Explicitly refresh name tags when toggled. Reviewed with Simon --- indra/llmessage/llavatarnamecache.cpp | 50 ++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 15 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 5acecd1dcb..85775f19da 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -44,9 +44,13 @@ namespace LLAvatarNameCache { - // Will be turned on and off based on service availability, sometimes - // in the middle of a session. + // Manual override for display names - can disable even if the region + // supports it. bool sUseDisplayNames = true; + + // Cache starts in a paused state until we can determine if the + // current region supports display names. + bool sRunning = false; // Base lookup URL for name service. // On simulator, loaded from indra.xml @@ -318,8 +322,9 @@ void LLAvatarNameCache::requestNamesViaLegacy() // JAMESDEBUG TODO } -void LLAvatarNameCache::initClass() +void LLAvatarNameCache::initClass(bool running) { + sRunning = running; } void LLAvatarNameCache::cleanupClass() @@ -375,8 +380,16 @@ void LLAvatarNameCache::setNameLookupURL(const std::string& name_lookup_url) sNameLookupURL = name_lookup_url; } +bool LLAvatarNameCache::hasNameLookupURL() +{ + return !sNameLookupURL.empty(); +} + void LLAvatarNameCache::idle() { + // By convention, start running at first idle() call + sRunning = true; + // 100 ms is the threshold for "user speed" operations, so we can // stall for about that long to batch up requests. const F32 SECS_BETWEEN_REQUESTS = 0.1f; @@ -405,7 +418,6 @@ void LLAvatarNameCache::idle() { // ...fall back to legacy name cache system requestNamesViaLegacy(); - llwarns << "JAMESDEBUG legacy lookup call" << llendl; } // Move requests from Ask queue to Pending queue @@ -451,11 +463,15 @@ void LLAvatarNameCache::eraseExpired() bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) { - std::map::iterator it = sCache.find(agent_id); - if (it != sCache.end()) + if (sRunning) { - *av_name = it->second; - return true; + // ...only do immediate lookups when cache is running + std::map::iterator it = sCache.find(agent_id); + if (it != sCache.end()) + { + *av_name = it->second; + return true; + } } if (!isRequestPending(agent_id)) @@ -468,14 +484,18 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) { - std::map::iterator it = sCache.find(agent_id); - if (it != sCache.end()) + if (sRunning) { - // ...name already exists in cache, fire callback now - callback_signal_t signal; - signal.connect(slot); - signal(agent_id, it->second); - return; + // ...only do immediate lookups when cache is running + std::map::iterator it = sCache.find(agent_id); + if (it != sCache.end()) + { + // ...name already exists in cache, fire callback now + callback_signal_t signal; + signal.connect(slot); + signal(agent_id, it->second); + return; + } } // schedule a request -- cgit v1.2.3 From 18106568b2f4d1f3d8dc019975ec38d650b5a1ec Mon Sep 17 00:00:00 2001 From: James Cook Date: Wed, 28 Apr 2010 11:00:11 -0700 Subject: DEV-49489 Fall back to legacy names if display names unavailable Also made new names system wrap the old one to simplify call sites in the viewer --- indra/llmessage/llavatarnamecache.cpp | 177 ++++++++++++++++++++++++++++------ 1 file changed, 146 insertions(+), 31 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 85775f19da..919159b4ba 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -34,6 +34,7 @@ #include "llavatarnamecache.h" +#include "llcachename.h" // we wrap this system #include "llframetimer.h" #include "llhttpclient.h" #include "llsd.h" @@ -85,11 +86,36 @@ namespace LLAvatarNameCache // Periodically clean out expired entries from the cache LLFrameTimer sEraseExpiredTimer; - // Handle name response off network - void processName(const LLUUID& agent_id, const LLAvatarName& av_name); + //----------------------------------------------------------------------- + // Internal methods + //----------------------------------------------------------------------- + + // Handle name response off network. + // Optionally skip adding to cache, used when this is a fallback to the + // legacy name system. + void processName(const LLUUID& agent_id, + const LLAvatarName& av_name, + bool add_to_cache); void requestNamesViaCapability(); + + // Legacy name system callback + void legacyNameCallback(const LLUUID& agent_id, + const std::string& full_name, + bool is_group); + void requestNamesViaLegacy(); + + // Fill in an LLAvatarName with the legacy name data + void buildLegacyName(const std::string& full_name, + LLAvatarName* av_name); + + // Do a single callback to a given slot + void fireSignal(const LLUUID& agent_id, + const callback_slot_t& slot, + const LLAvatarName& av_name); + + // Is a request in-flight over the network? bool isRequestPending(const LLUUID& agent_id); // Erase expired names from cache @@ -165,7 +191,8 @@ public: av_name.mDisplayName = av_name.mSLID; } - LLAvatarNameCache::processName(agent_id, av_name); + // cache it and fire signals + LLAvatarNameCache::processName(agent_id, av_name, true); } } @@ -196,7 +223,8 @@ public: for ( ; it != mAgentIDs.end(); ++it) { const LLUUID& agent_id = *it; - LLAvatarNameCache::processName(agent_id, av_name); + // cache it and fire signals + LLAvatarNameCache::processName(agent_id, av_name, true); } } @@ -248,9 +276,13 @@ public: }; void LLAvatarNameCache::processName(const LLUUID& agent_id, - const LLAvatarName& av_name) + const LLAvatarName& av_name, + bool add_to_cache) { - sCache[agent_id] = av_name; + if (add_to_cache) + { + sCache[agent_id] = av_name; + } sPendingQueue.erase(agent_id); @@ -270,6 +302,8 @@ void LLAvatarNameCache::processName(const LLUUID& agent_id, void LLAvatarNameCache::requestNamesViaCapability() { + F64 now = LLFrameTimer::getTotalSeconds(); + // URL format is like: // http://pdp60.lindenlab.com:8000/agents/?ids=3941037e-78ab-45f0-b421-bd6e77c1804d&ids=0012809d-7d2d-4c24-9609-af1230a37715&ids=0019aaba-24af-4f0a-aa72-6457953cf7f0 // @@ -285,6 +319,8 @@ void LLAvatarNameCache::requestNamesViaCapability() ask_queue_t::const_iterator it = sAskQueue.begin(); for ( ; it != sAskQueue.end(); ++it) { + const LLUUID& agent_id = *it; + if (url.empty()) { // ...starting new request @@ -296,8 +332,11 @@ void LLAvatarNameCache::requestNamesViaCapability() // ...continuing existing request url += "&ids="; } - url += it->asString(); - agent_ids.push_back(*it); + url += agent_id.asString(); + agent_ids.push_back(agent_id); + + // mark request as pending + sPendingQueue[agent_id] = now; if (url.size() > NAME_URL_SEND_THRESHOLD) { @@ -315,11 +354,47 @@ void LLAvatarNameCache::requestNamesViaCapability() url.clear(); agent_ids.clear(); } + + // We've moved all asks to the pending request queue + sAskQueue.clear(); +} + +void LLAvatarNameCache::legacyNameCallback(const LLUUID& agent_id, + const std::string& full_name, + bool is_group) +{ + // Construct a dummy record for this name. By convention, SLID is blank + // Never expires, but not written to disk, so lasts until end of session. + LLAvatarName av_name; + buildLegacyName(full_name, &av_name); + + // Don't add to cache, the data already exists in the legacy name system + // cache and we don't want or need duplicate storage, because keeping the + // two copies in sync is complex. + processName(agent_id, av_name, false); } void LLAvatarNameCache::requestNamesViaLegacy() { - // JAMESDEBUG TODO + F64 now = LLFrameTimer::getTotalSeconds(); + std::string full_name; + ask_queue_t::const_iterator it = sAskQueue.begin(); + for (; it != sAskQueue.end(); ++it) + { + const LLUUID& agent_id = *it; + + // Mark as pending first, just in case the callback is immediately + // invoked below. This should never happen in practice. + sPendingQueue[agent_id] = now; + + gCacheName->get(agent_id, false, + boost::bind(&LLAvatarNameCache::legacyNameCallback, + _1, _2, _3)); + } + + // We've either answered immediately or moved all asks to the + // pending queue + sAskQueue.clear(); } void LLAvatarNameCache::initClass(bool running) @@ -410,7 +485,7 @@ void LLAvatarNameCache::idle() return; } - if (!sNameLookupURL.empty()) + if (useDisplayNames()) { requestNamesViaCapability(); } @@ -419,15 +494,6 @@ void LLAvatarNameCache::idle() // ...fall back to legacy name cache system requestNamesViaLegacy(); } - - // Move requests from Ask queue to Pending queue - F64 now = LLFrameTimer::getTotalSeconds(); - ask_queue_t::const_iterator it = sAskQueue.begin(); - for ( ; it != sAskQueue.end(); ++it) - { - sPendingQueue[*it] = now; - } - sAskQueue.clear(); } bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id) @@ -461,16 +527,41 @@ void LLAvatarNameCache::eraseExpired() } } +void LLAvatarNameCache::buildLegacyName(const std::string& full_name, + LLAvatarName* av_name) +{ + llassert(av_name); + av_name->mSLID = ""; + av_name->mDisplayName = full_name; + av_name->mIsDisplayNameDefault = true; + av_name->mIsDummy = true; + av_name->mExpires = F64_MAX; +} + bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) { if (sRunning) { // ...only do immediate lookups when cache is running - std::map::iterator it = sCache.find(agent_id); - if (it != sCache.end()) + if (useDisplayNames()) + { + // ...use display names cache + std::map::iterator it = sCache.find(agent_id); + if (it != sCache.end()) + { + *av_name = it->second; + return true; + } + } + else { - *av_name = it->second; - return true; + // ...use legacy names cache + std::string full_name; + if (gCacheName->getFullName(agent_id, full_name)) + { + buildLegacyName(full_name, av_name); + return true; + } } } @@ -482,19 +573,42 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) return false; } +void LLAvatarNameCache::fireSignal(const LLUUID& agent_id, + const callback_slot_t& slot, + const LLAvatarName& av_name) +{ + callback_signal_t signal; + signal.connect(slot); + signal(agent_id, av_name); +} + void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) { if (sRunning) { // ...only do immediate lookups when cache is running - std::map::iterator it = sCache.find(agent_id); - if (it != sCache.end()) + if (useDisplayNames()) { - // ...name already exists in cache, fire callback now - callback_signal_t signal; - signal.connect(slot); - signal(agent_id, it->second); - return; + // ...use new cache + std::map::iterator it = sCache.find(agent_id); + if (it != sCache.end()) + { + // ...name already exists in cache, fire callback now + fireSignal(agent_id, slot, it->second); + return; + } + } + else + { + // ...use old name system + std::string full_name; + if (gCacheName->getFullName(agent_id, full_name)) + { + LLAvatarName av_name; + buildLegacyName(full_name, &av_name); + fireSignal(agent_id, slot, av_name); + return; + } } } @@ -534,7 +648,8 @@ void LLAvatarNameCache::setUseDisplayNames(bool use) bool LLAvatarNameCache::useDisplayNames() { - return sUseDisplayNames; + // Must be both manually set on and able to look up names. + return sUseDisplayNames && !sNameLookupURL.empty(); } void LLAvatarNameCache::erase(const LLUUID& agent_id) -- cgit v1.2.3 From 5838494c504257e6fff9ea39c309fd4162dfdf60 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 4 May 2010 16:20:02 -0700 Subject: DEV-49633 WIP, Display name cache uses "Expires" headers for timeouts --- indra/llmessage/llavatarnamecache.cpp | 56 +++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 12 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 919159b4ba..560d0f48cf 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -167,14 +167,38 @@ private: // need to store agent ids that are part of this request in case of // an error, so we can flag them as unavailable std::vector mAgentIDs; + + // Need the headers to look up Expires: and Retry-After: + LLSD mHeaders; public: LLAvatarNameResponder(const std::vector& agent_ids) - : mAgentIDs(agent_ids) + : mAgentIDs(agent_ids), + mHeaders() { } + /*virtual*/ void completedHeader(U32 status, const std::string& reason, + const LLSD& headers) + { + mHeaders = headers; + } + /*virtual*/ void result(const LLSD& content) { + const F64 DEFAULT_EXPIRES = 24.0 * 60.0 * 60.0; + F64 now = LLFrameTimer::getTotalSeconds(); + + // With no expiration info, default to a day + F64 expires = now + DEFAULT_EXPIRES; + + // Allow the header to override the default + LLSD expires_header = mHeaders["expires"]; + if (expires_header.isDefined()) + { + LLDate expires_date = expires_header.asDate(); + expires = expires_date.secondsSinceEpoch(); + } + LLSD agents = content["agents"]; LLSD::array_const_iterator it = agents.beginArray(); for ( ; it != agents.endArray(); ++it) @@ -185,6 +209,20 @@ public: LLAvatarName av_name; av_name.fromLLSD(row); + // *TODO: Remove this once People API starts passing "Expires:" + // headers. + // Prefer per-row data for expiration times + LLSD expires_row = row["display_name_expires"]; + if (expires_row.isDefined()) + { + LLDate expires_date = expires_row.asDate(); + av_name.mExpires = expires_date.secondsSinceEpoch(); + } + else + { + av_name.mExpires = expires; + } + // Some avatars don't have explicit display names set if (av_name.mDisplayName.empty()) { @@ -196,18 +234,12 @@ public: } } - // This is called for both successful and failed requests, and is - // called _after_ result() above. - /*virtual*/ void completedHeader(U32 status, const std::string& reason, - const LLSD& headers) + /*virtual*/ void error(U32 status, const std::string& reason) { - // Only care about headers when there is an error - if (isGoodStatus(status)) return; - // We're going to construct a dummy record and cache it for a while, // either briefly for a 503 Service Unavailable, or longer for other // errors. - F64 retry_timestamp = errorRetryTimestamp(status, headers); + F64 retry_timestamp = errorRetryTimestamp(status); // *NOTE: "??" starts trigraphs in C/C++, escape the question marks. const std::string DUMMY_NAME("\?\?\?"); @@ -230,16 +262,16 @@ public: // Return time to retry a request that generated an error, based on // error type and headers. Return value is seconds-since-epoch. - F64 errorRetryTimestamp(S32 status, const LLSD& headers) + F64 errorRetryTimestamp(S32 status) { - LLSD expires = headers["expires"]; + LLSD expires = mHeaders["expires"]; if (expires.isDefined()) { LLDate expires_date = expires.asDate(); return expires_date.secondsSinceEpoch(); } - LLSD retry_after = headers["retry-after"]; + LLSD retry_after = mHeaders["retry-after"]; if (retry_after.isDefined()) { // does the header use the delta-seconds type? -- cgit v1.2.3 From c0257c7fff8dacc83e69d39afcf522b09bdf28e9 Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 6 May 2010 16:29:51 -0700 Subject: DEV-49633 fixed, use Cache-Control max-age for display name expiration We have no C++ libraries for parsing RFC 1123 dates, so parsing "Expires" headers is risky. max-age delta-seconds is easier to parse and equivalent for this use. Also added unit tests for max-age parsing. Pair-programmed with Huseby. --- indra/llmessage/llavatarnamecache.cpp | 113 ++++++++++++++++++++++++++-------- 1 file changed, 87 insertions(+), 26 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 560d0f48cf..701f3931d0 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -40,6 +40,8 @@ #include "llsd.h" #include "llsdserialize.h" +#include + #include #include @@ -185,19 +187,8 @@ public: /*virtual*/ void result(const LLSD& content) { - const F64 DEFAULT_EXPIRES = 24.0 * 60.0 * 60.0; - F64 now = LLFrameTimer::getTotalSeconds(); - - // With no expiration info, default to a day - F64 expires = now + DEFAULT_EXPIRES; - - // Allow the header to override the default - LLSD expires_header = mHeaders["expires"]; - if (expires_header.isDefined()) - { - LLDate expires_date = expires_header.asDate(); - expires = expires_date.secondsSinceEpoch(); - } + // Pull expiration out of headers if available + F64 expires = LLAvatarNameCache::nameExpirationFromHeaders(mHeaders); LLSD agents = content["agents"]; LLSD::array_const_iterator it = agents.beginArray(); @@ -209,19 +200,8 @@ public: LLAvatarName av_name; av_name.fromLLSD(row); - // *TODO: Remove this once People API starts passing "Expires:" - // headers. - // Prefer per-row data for expiration times - LLSD expires_row = row["display_name_expires"]; - if (expires_row.isDefined()) - { - LLDate expires_date = expires_row.asDate(); - av_name.mExpires = expires_date.secondsSinceEpoch(); - } - else - { - av_name.mExpires = expires; - } + // Use expiration time from header + av_name.mExpires = expires; // Some avatars don't have explicit display names set if (av_name.mDisplayName.empty()) @@ -700,3 +680,84 @@ void LLAvatarNameCache::insert(const LLUUID& agent_id, const LLAvatarName& av_na // *TODO: update timestamp if zero? sCache[agent_id] = av_name; } + +F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers) +{ + // With no expiration info, default to a day + const F64 DEFAULT_EXPIRES = 24.0 * 60.0 * 60.0; + F64 now = LLFrameTimer::getTotalSeconds(); + F64 expires = now + DEFAULT_EXPIRES; + + // Allow the header to override the default + LLSD cache_control_header = headers["cache-control"]; + if (cache_control_header.isDefined()) + { + S32 max_age = 0; + std::string cache_control = cache_control_header.asString(); + if (max_age_from_cache_control(cache_control, &max_age)) + { + expires = now + (F64)max_age; + } + } + return expires; +} + +static const std::string MAX_AGE("max-age"); +static const boost::char_separator EQUALS_SEPARATOR("="); +static const boost::char_separator COMMA_SEPARATOR(","); + +bool max_age_from_cache_control(const std::string& cache_control, S32 *max_age) +{ + // Split the string on "," to get a list of directives + typedef boost::tokenizer > tokenizer; + tokenizer directives(cache_control, COMMA_SEPARATOR); + + tokenizer::iterator token_it = directives.begin(); + for ( ; token_it != directives.end(); ++token_it) + { + // Tokens may have leading or trailing whitespace + std::string token = *token_it; + LLStringUtil::trim(token); + + if (token.compare(0, MAX_AGE.size(), MAX_AGE) == 0) + { + // ...this token starts with max-age, so let's chop it up by "=" + tokenizer subtokens(token, EQUALS_SEPARATOR); + tokenizer::iterator subtoken_it = subtokens.begin(); + + // Must have a token + if (subtoken_it == subtokens.end()) return false; + std::string subtoken = *subtoken_it; + + // Must exactly equal "max-age" + LLStringUtil::trim(subtoken); + if (subtoken != MAX_AGE) return false; + + // Must have another token + ++subtoken_it; + if (subtoken_it == subtokens.end()) return false; + subtoken = *subtoken_it; + + // Must be a valid integer + // *NOTE: atoi() returns 0 for invalid values, so we have to + // check the string first. + // *TODO: Do servers ever send "0000" for zero? We don't handle it + LLStringUtil::trim(subtoken); + if (subtoken == "0") + { + *max_age = 0; + return true; + } + S32 val = atoi( subtoken.c_str() ); + if (val > 0 && val < S32_MAX) + { + *max_age = val; + return true; + } + return false; + } + } + return false; +} + + -- cgit v1.2.3 From fa03333d5893f16318a33e9edfae782ca0125768 Mon Sep 17 00:00:00 2001 From: James Cook Date: Fri, 7 May 2010 10:41:02 -0700 Subject: DEV-49633 Prefer Retry-After for error handling backoff Also, we can't parse Expires dates, so use Cache-Control max-age. Reviewed with Huseby. --- indra/llmessage/llavatarnamecache.cpp | 52 +++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 21 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 701f3931d0..fdbc28656e 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -122,6 +122,8 @@ namespace LLAvatarNameCache // Erase expired names from cache void eraseExpired(); + + bool expirationFromCacheControl(LLSD headers, F64 *expires); } /* Sample response: @@ -244,34 +246,29 @@ public: // error type and headers. Return value is seconds-since-epoch. F64 errorRetryTimestamp(S32 status) { - LLSD expires = mHeaders["expires"]; - if (expires.isDefined()) - { - LLDate expires_date = expires.asDate(); - return expires_date.secondsSinceEpoch(); - } + F64 now = LLFrameTimer::getTotalSeconds(); + // Retry-After takes priority LLSD retry_after = mHeaders["retry-after"]; if (retry_after.isDefined()) { - // does the header use the delta-seconds type? + // We only support the delta-seconds type S32 delta_seconds = retry_after.asInteger(); if (delta_seconds > 0) { // ...valid delta-seconds - F64 now = LLFrameTimer::getTotalSeconds(); return now + F64(delta_seconds); } - else - { - // ...it's a date - LLDate expires_date = retry_after.asDate(); - return expires_date.secondsSinceEpoch(); - } + } + + // If no Retry-After, look for Cache-Control max-age + F64 expires = 0.0; + if (LLAvatarNameCache::expirationFromCacheControl(mHeaders, &expires)) + { + return expires; } // No information in header, make a guess - F64 now = LLFrameTimer::getTotalSeconds(); if (status == 503) { // ...service unavailable, retry soon @@ -683,11 +680,22 @@ void LLAvatarNameCache::insert(const LLUUID& agent_id, const LLAvatarName& av_na F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers) { - // With no expiration info, default to a day - const F64 DEFAULT_EXPIRES = 24.0 * 60.0 * 60.0; - F64 now = LLFrameTimer::getTotalSeconds(); - F64 expires = now + DEFAULT_EXPIRES; + F64 expires = 0.0; + if (expirationFromCacheControl(headers, &expires)) + { + return expires; + } + else + { + // With no expiration info, default to a day + const F64 DEFAULT_EXPIRES = 24.0 * 60.0 * 60.0; + F64 now = LLFrameTimer::getTotalSeconds(); + return now + DEFAULT_EXPIRES; + } +} +bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires) +{ // Allow the header to override the default LLSD cache_control_header = headers["cache-control"]; if (cache_control_header.isDefined()) @@ -696,10 +704,12 @@ F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers) std::string cache_control = cache_control_header.asString(); if (max_age_from_cache_control(cache_control, &max_age)) { - expires = now + (F64)max_age; + F64 now = LLFrameTimer::getTotalSeconds(); + *expires = now + (F64)max_age; + return true; } } - return expires; + return false; } static const std::string MAX_AGE("max-age"); -- cgit v1.2.3 From 2af4875309450fa3d3e266426ada12330489a8c9 Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Thu, 13 May 2010 17:26:06 -0700 Subject: DEV-50013 Friends in sidebar now correctly displaying names reviewed by James --- indra/llmessage/llavatarnamecache.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index fdbc28656e..2fc92ff36f 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -214,6 +214,27 @@ public: // cache it and fire signals LLAvatarNameCache::processName(agent_id, av_name, true); } + + // Same logic as error response case + LLSD unresolved_agents = content["bad_ids"]; + if (unresolved_agents.size() > 0) + { + const std::string DUMMY_NAME("\?\?\?"); + LLAvatarName av_name; + av_name.mSLID = DUMMY_NAME; + av_name.mDisplayName = DUMMY_NAME; + av_name.mIsDisplayNameDefault = false; + av_name.mIsDummy = true; + av_name.mExpires = expires; + + it = unresolved_agents.beginArray(); + for ( ; it != unresolved_agents.endArray(); ++it) + { + const LLUUID& agent_id = *it; + // cache it and fire signals + LLAvatarNameCache::processName(agent_id, av_name, true); + } + } } /*virtual*/ void error(U32 status, const std::string& reason) -- cgit v1.2.3 From f4148502e484d516b42c4a88603eee6889d45697 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 18 May 2010 16:00:45 -0700 Subject: Rename mSLID to mUsername to match the name of the field in the UI Product made a late-breaking request to change the name of this field. The wire protocol for People API has not yet changed. --- indra/llmessage/llavatarnamecache.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 2fc92ff36f..4b41c7e5b1 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -208,7 +208,7 @@ public: // Some avatars don't have explicit display names set if (av_name.mDisplayName.empty()) { - av_name.mDisplayName = av_name.mSLID; + av_name.mDisplayName = av_name.mUsername; } // cache it and fire signals @@ -221,7 +221,7 @@ public: { const std::string DUMMY_NAME("\?\?\?"); LLAvatarName av_name; - av_name.mSLID = DUMMY_NAME; + av_name.mUsername = DUMMY_NAME; av_name.mDisplayName = DUMMY_NAME; av_name.mIsDisplayNameDefault = false; av_name.mIsDummy = true; @@ -247,7 +247,7 @@ public: // *NOTE: "??" starts trigraphs in C/C++, escape the question marks. const std::string DUMMY_NAME("\?\?\?"); LLAvatarName av_name; - av_name.mSLID = DUMMY_NAME; + av_name.mUsername = DUMMY_NAME; av_name.mDisplayName = DUMMY_NAME; av_name.mIsDisplayNameDefault = false; av_name.mIsDummy = true; @@ -561,7 +561,7 @@ void LLAvatarNameCache::buildLegacyName(const std::string& full_name, LLAvatarName* av_name) { llassert(av_name); - av_name->mSLID = ""; + av_name->mUsername = ""; av_name->mDisplayName = full_name; av_name->mIsDisplayNameDefault = true; av_name->mIsDummy = true; -- cgit v1.2.3 From b944a4792762bf61b7837a29c8580c9823c9670b Mon Sep 17 00:00:00 2001 From: James Cook Date: Fri, 28 May 2010 09:59:47 -0700 Subject: DEV-50013 Script memory floater uses usernames --- indra/llmessage/llavatarnamecache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 4b41c7e5b1..0c577053a3 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -417,7 +417,7 @@ void LLAvatarNameCache::requestNamesViaLegacy() // invoked below. This should never happen in practice. sPendingQueue[agent_id] = now; - gCacheName->get(agent_id, false, + gCacheName->get(agent_id, false, // legacy compatibility boost::bind(&LLAvatarNameCache::legacyNameCallback, _1, _2, _3)); } -- cgit v1.2.3 From 88b9808de6bf576807435c4c74126bcda523d0b8 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 1 Jun 2010 11:06:16 -0700 Subject: DEV-50013 Don't add delays to batch up name requests In practice, bulk name requests are all added in a single frame, triggered for example by opening a group membership dialog. There's no point to waiting to batch up more requests, and this slows down the usual single-name lookup. Reviewed with Simon. --- indra/llmessage/llavatarnamecache.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 0c577053a3..912f34fcae 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -495,13 +495,14 @@ void LLAvatarNameCache::idle() // By convention, start running at first idle() call sRunning = true; + // *TODO: Possibly re-enabled this based on People API load measurements // 100 ms is the threshold for "user speed" operations, so we can // stall for about that long to batch up requests. - const F32 SECS_BETWEEN_REQUESTS = 0.1f; - if (!sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS)) - { - return; - } + //const F32 SECS_BETWEEN_REQUESTS = 0.1f; + //if (!sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS)) + //{ + // return; + //} // Must be large relative to above const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds -- cgit v1.2.3 From c7d49b4cb22ceac5778a8e178aa6ce62fa42c72e Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Wed, 4 Aug 2010 17:11:01 -0700 Subject: DEV-52354 Username shown in local chat if idle for over 90 seconds reviewd by richard --- indra/llmessage/llavatarnamecache.cpp | 36 +++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 912f34fcae..803d1e268d 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -86,7 +86,7 @@ namespace LLAvatarNameCache LLFrameTimer sRequestTimer; // Periodically clean out expired entries from the cache - LLFrameTimer sEraseExpiredTimer; + //LLFrameTimer sEraseExpiredTimer; //----------------------------------------------------------------------- // Internal methods @@ -505,11 +505,16 @@ void LLAvatarNameCache::idle() //} // Must be large relative to above - const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds - if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT)) - { - eraseExpired(); - } + + // No longer deleting expired entries, just re-requesting in the get + // this way first synchronous get call on an expired entry won't return + // legacy name. LF + + //const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds + //if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT)) + //{ + // eraseExpired(); + //} if (sAskQueue.empty()) { @@ -581,7 +586,12 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) if (it != sCache.end()) { *av_name = it->second; - return true; + + // re-request name if entry is expired, otherwise return + if (av_name->mExpires > LLFrameTimer::getTotalSeconds()) + { + return true; + } } } else @@ -624,9 +634,15 @@ void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) std::map::iterator it = sCache.find(agent_id); if (it != sCache.end()) { - // ...name already exists in cache, fire callback now - fireSignal(agent_id, slot, it->second); - return; + const LLAvatarName& av_name = it->second; + + if (av_name.mExpires > LLFrameTimer::getTotalSeconds()) + { + // ...name already exists in cache, fire callback now + fireSignal(agent_id, slot, av_name); + + return; + } } } else -- cgit v1.2.3 From c39d74ac985e789eef8ee988cf8ba80fb2402683 Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Thu, 19 Aug 2010 14:23:14 -0700 Subject: synchronous llavatarcachename::get calls now return true even if entry is expired --- indra/llmessage/llavatarnamecache.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 803d1e268d..0571973c23 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -574,6 +574,8 @@ void LLAvatarNameCache::buildLegacyName(const std::string& full_name, av_name->mExpires = F64_MAX; } +// fills in av_name if it has it in the cache, even if expired (can check expiry time) +// returns bool specifying if av_name was filled, false otherwise bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) { if (sRunning) @@ -587,11 +589,16 @@ bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) { *av_name = it->second; - // re-request name if entry is expired, otherwise return - if (av_name->mExpires > LLFrameTimer::getTotalSeconds()) + // re-request name if entry is expired + if (av_name->mExpires < LLFrameTimer::getTotalSeconds()) { - return true; + if (!isRequestPending(agent_id)) + { + sAskQueue.insert(agent_id); + } } + + return true; } } else @@ -725,8 +732,8 @@ F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers) } else { - // With no expiration info, default to a day - const F64 DEFAULT_EXPIRES = 24.0 * 60.0 * 60.0; + // With no expiration info, default to an hour + const F64 DEFAULT_EXPIRES = 60.0 * 60.0; F64 now = LLFrameTimer::getTotalSeconds(); return now + DEFAULT_EXPIRES; } -- cgit v1.2.3 From e45b3c6884bc7d9bc457b9633932c8aad5a28430 Mon Sep 17 00:00:00 2001 From: Aimee Linden Date: Sat, 4 Sep 2010 19:35:27 +0100 Subject: Correct license on newly exported files to LGPL. --- indra/llmessage/llavatarnamecache.cpp | 36 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 21 deletions(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 0571973c23..8158c17974 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -3,31 +3,25 @@ * @brief Provides lookup of avatar SLIDs ("bobsmith123") and display names * ("James Cook") from avatar UUIDs. * - * $LicenseInfo:firstyear=2010&license=viewergpl$ - * - * Copyright (c) 2010, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ #include "linden_common.h" -- cgit v1.2.3 From a923da7fc78b44cd5368d26652b0204322f064a4 Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Mon, 13 Sep 2010 14:59:31 -0700 Subject: DEV-52931 Toggling "View Display Names" doesn't take effect right away in the Friends list --- indra/llmessage/llavatarnamecache.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'indra/llmessage/llavatarnamecache.cpp') diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 8158c17974..2f2d9099a3 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -41,6 +41,8 @@ namespace LLAvatarNameCache { + use_display_name_signal_t mUseDisplayNamesSignal; + // Manual override for display names - can disable even if the region // supports it. bool sUseDisplayNames = true; @@ -691,6 +693,8 @@ void LLAvatarNameCache::setUseDisplayNames(bool use) sUseDisplayNames = use; // flush our cache sCache.clear(); + + mUseDisplayNamesSignal(); } } @@ -751,6 +755,13 @@ bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires) return false; } + +void LLAvatarNameCache::addUseDisplayNamesCallback(const use_display_name_signal_t::slot_type& cb) +{ + mUseDisplayNamesSignal.connect(cb); +} + + static const std::string MAX_AGE("max-age"); static const boost::char_separator EQUALS_SEPARATOR("="); static const boost::char_separator COMMA_SEPARATOR(","); @@ -809,4 +820,3 @@ bool max_age_from_cache_control(const std::string& cache_control, S32 *max_age) return false; } - -- cgit v1.2.3