From d2f9e34598621f1dabad15025417efd6b81dddf0 Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 23 Mar 2010 11:41:33 -0700 Subject: Part DEV-47695 route display name changes via sim for rebroadcast to nearby avatars for name tag updates and to update cached display name for LSL nonblocking functions --- indra/newview/llviewerregion.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview/llviewerregion.cpp') diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index ce627494c8..8f43b6bcf7 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1495,6 +1495,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("SendUserReport"); capabilityNames.append("SendUserReportWithScreenshot"); capabilityNames.append("ServerReleaseNotes"); + capabilityNames.append("SetDisplayName"); capabilityNames.append("StartGroupProposal"); capabilityNames.append("TextureStats"); capabilityNames.append("UntrustedSimulatorMessage"); -- cgit v1.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 ++++++----------------------------- indra/llmessage/llavatarnamecache.h | 19 ++------ indra/newview/llstartup.cpp | 3 +- indra/newview/llviewerregion.cpp | 16 +++++++ 4 files changed, 35 insertions(+), 90 deletions(-) (limited to 'indra/newview/llviewerregion.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() { diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h index a4e101899a..111e56433b 100644 --- a/indra/llmessage/llavatarnamecache.h +++ b/indra/llmessage/llavatarnamecache.h @@ -42,13 +42,14 @@ class LLUUID; namespace LLAvatarNameCache { - void initClass(const std::string& name_service_url); + void initClass(); void cleanupClass(); void importFile(std::istream& istr); void exportFile(std::ostream& ostr); - void setNameServiceURL(const std::string& name_service_url); + // On the viewer, usually a simulator capabilitity + void setNameLookupURL(const std::string& name_lookup_url); // Periodically makes a batch request for display names not already in // cache. Call once per frame. @@ -68,20 +69,6 @@ namespace LLAvatarNameCache // If name information is in cache, callback will be called immediately. void get(const LLUUID& agent_id, callback_slot_t slot); - // JAMESDEBUG TODO: remove code to set display name, handle in - // application layer because it's different for client and server - - // Callback types for setDisplayName() below - typedef boost::signals2::signal< - void (bool success, const std::string& reason, const LLSD& content)> - set_name_signal_t; - typedef set_name_signal_t::slot_type set_name_slot_t; - - // Sends an update to the server to change a display name - // and calls back the application layer when done - void setDisplayName(const LLUUID& agent_id, const std::string& display_name, - const set_name_slot_t& slot); - // HACK: turn display names on and off void toggleDisplayNames(); bool useDisplayNames(); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 8f5ad63cc3..18792950eb 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2772,8 +2772,7 @@ void LLStartUp::initNameCache() // Load stored cache if possible LLAppViewer::instance()->loadNameCache(); - // JAMESDEBUG TODO: won't need service url here, will use capability - LLAvatarNameCache::initClass("http://pdp60.lindenlab.com:8000/"); + LLAvatarNameCache::initClass(); } void LLStartUp::cleanupNameCache() diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 8f43b6bcf7..2b907ee24a 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -34,7 +34,9 @@ #include "llviewerregion.h" +// linden libraries #include "indra_constants.h" +#include "llavatarnamecache.h" // name lookup cap url #include "llfloaterreg.h" #include "llmath.h" #include "llhttpclient.h" @@ -173,6 +175,19 @@ public: mRegion->showReleaseNotes(); } } + + // Avatar name lookup library needs to know who to ask + std::string name_lookup_url = mRegion->getCapability("GetDisplayNames"); + // capabilities require URLs with slashes before query params, like: + // https://:/cap//?ids= + // but the caps are granted like: + // https://:/cap/ + U32 url_size = name_lookup_url.size(); + if (url_size > 0 && name_lookup_url[url_size-1] != '/') + { + name_lookup_url += '/'; + } + LLAvatarNameCache::setNameLookupURL(name_lookup_url); if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) { @@ -1474,6 +1489,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("ObjectMediaNavigate"); capabilityNames.append("FetchLib"); capabilityNames.append("FetchLibDescendents"); + capabilityNames.append("GetDisplayNames"); capabilityNames.append("GetTexture"); capabilityNames.append("GroupProposalBallot"); capabilityNames.append("HomeLocation"); -- cgit v1.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/llcommon/llavatarname.cpp | 2 +- indra/llcommon/llavatarname.h | 2 +- indra/llmessage/llavatarnamecache.cpp | 33 ++++++++++++++++----------------- indra/newview/llviewermessage.cpp | 1 + indra/newview/llviewerregion.cpp | 5 +++++ 5 files changed, 24 insertions(+), 19 deletions(-) (limited to 'indra/newview/llviewerregion.cpp') diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp index 48ff7f3cc8..5debf88818 100644 --- a/indra/llcommon/llavatarname.cpp +++ b/indra/llcommon/llavatarname.cpp @@ -39,7 +39,7 @@ LLAvatarName::LLAvatarName() : mSLID(), mDisplayName(), mIsDisplayNameDefault(false), - mExpires(U32_MAX), + mExpires(F64_MAX), mBadge() { } diff --git a/indra/llcommon/llavatarname.h b/indra/llcommon/llavatarname.h index 5a0306c57e..72e2980b5c 100644 --- a/indra/llcommon/llavatarname.h +++ b/indra/llcommon/llavatarname.h @@ -58,7 +58,7 @@ public: // Names can change, so need to keep track of when name was // last checked. // Unix time-from-epoch seconds - U32 mExpires; + F64 mExpires; // Can be a viewer UI image name ("Person_Check") or a server-side // image UUID, or empty string. 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()) { diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 13f52d8db7..000eb45121 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -4615,6 +4615,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** ) msg->getS32("TransactionInfo", "Amount", amount); msg->getString("TransactionInfo", "ItemDescription", item_description); llinfos << "JAMESDEBUG money_balance_reply source " << source_id + << " dest " << dest_id << " item " << item_description << llendl; } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 2b907ee24a..feade68edc 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -176,6 +176,9 @@ public: } } + // JAMESDEBUG *TODO* THIS IS WRONG!!!!!!!!!!!!!!!!!!!!! + // this isn't necessarily the region the viewer is in + // Avatar name lookup library needs to know who to ask std::string name_lookup_url = mRegion->getCapability("GetDisplayNames"); // capabilities require URLs with slashes before query params, like: @@ -188,6 +191,8 @@ public: name_lookup_url += '/'; } LLAvatarNameCache::setNameLookupURL(name_lookup_url); + + llinfos << "JAMESDEBUG cap " << name_lookup_url << llendl; if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) { -- cgit v1.3 From d38727e47ba5d7dd449c6ba62ac6c988ac66236f Mon Sep 17 00:00:00 2001 From: James Cook Date: Mon, 19 Apr 2010 11:26:30 -0700 Subject: DEV-47529 Viewer refresh name lookup cap URL on region cross/teleport Reviewed with Kelly --- indra/newview/llappviewer.cpp | 42 +++++++++++++++++++++++++++++++++++----- indra/newview/llappviewer.h | 2 ++ indra/newview/llviewerregion.cpp | 18 ----------------- 3 files changed, 39 insertions(+), 23 deletions(-) (limited to 'indra/newview/llviewerregion.cpp') diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 02902bc8a5..409146c4a3 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3541,9 +3541,10 @@ void LLAppViewer::idle() // NOTE: Starting at this point, we may still have pointers to "dead" objects // floating throughout the various object lists. // + idleNameCache(); idleNetwork(); - + // Check for away from keyboard, kick idle agents. idle_afk_check(); @@ -3878,6 +3879,41 @@ void LLAppViewer::sendLogoutRequest() } } +void LLAppViewer::idleNameCache() +{ + // Neither old nor new name cache can function before agent has a region + LLViewerRegion* region = gAgent.getRegion(); + if (!region) return; + + // deal with any queued name requests and replies. + gCacheName->processPending(); + + // Agent may have moved to a different region, so need to update cap URL + // for name lookups. Can't do this in the cap grant code, as caps are + // granted to neighbor regions before the main agent gets there. Can't + // do it in the move-into-region code because cap not guaranteed to be + // granted yet, for example on teleport. + std::string name_lookup_url; + name_lookup_url.reserve(128); // avoid a memory allocation below + name_lookup_url = region->getCapability("GetDisplayNames"); + + // Ensure capability has been granted + U32 url_size = name_lookup_url.size(); + if (url_size > 0) + { + // capabilities require URLs with slashes before query params: + // https://:/cap//?ids= + // but the caps are granted like: + // https://:/cap/ + if (name_lookup_url[url_size-1] != '/') + { + name_lookup_url += '/'; + } + LLAvatarNameCache::setNameLookupURL(name_lookup_url); + } + LLAvatarNameCache::idle(); +} + // // Handle messages, and all message related stuff // @@ -3905,10 +3941,6 @@ void LLAppViewer::idleNetwork() { LLFastTimer t(FTM_IDLE_NETWORK); // decode - // deal with any queued name requests and replies. - gCacheName->processPending(); - LLAvatarNameCache::idle(); - llpushcallstacks ; LLTimer check_message_timer; // Read all available packets from network diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index a915b7fa50..ff3816922e 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -210,6 +210,8 @@ private: void idle(); void idleShutdown(); + // update avatar SLID and display name caches + void idleNameCache(); void idleNetwork(); void sendLogoutRequest(); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index feade68edc..83c5760b58 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -175,24 +175,6 @@ public: mRegion->showReleaseNotes(); } } - - // JAMESDEBUG *TODO* THIS IS WRONG!!!!!!!!!!!!!!!!!!!!! - // this isn't necessarily the region the viewer is in - - // Avatar name lookup library needs to know who to ask - std::string name_lookup_url = mRegion->getCapability("GetDisplayNames"); - // capabilities require URLs with slashes before query params, like: - // https://:/cap//?ids= - // but the caps are granted like: - // https://:/cap/ - U32 url_size = name_lookup_url.size(); - if (url_size > 0 && name_lookup_url[url_size-1] != '/') - { - name_lookup_url += '/'; - } - LLAvatarNameCache::setNameLookupURL(name_lookup_url); - - llinfos << "JAMESDEBUG cap " << name_lookup_url << llendl; if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) { -- cgit v1.3 From 6d1e44b0338dd2815f605a5ba6e6528932cf3ebc Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 20 Apr 2010 14:52:09 -0700 Subject: Avatar picker requests are routed via sim capability --- indra/newview/lldateutil.cpp | 5 +++ indra/newview/lldateutil.h | 2 + indra/newview/llfloateravatarpicker.cpp | 44 +++++++++++++++------- indra/newview/llviewerregion.cpp | 1 + .../skins/default/xui/en/floater_avatar_picker.xml | 4 -- 5 files changed, 39 insertions(+), 17 deletions(-) (limited to 'indra/newview/llviewerregion.cpp') diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index 150edb5bf8..1a13cd05fd 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -180,3 +180,8 @@ std::string LLDateUtil::ageFromDateISO(const std::string& date_string) { return ageFromDateISO(date_string, LLDate::now()); } + +std::string LLDateUtil::ageFromDate(S32 year, S32 month, S32 day) +{ + return age_from_date(year, month, day, LLDate::now()); +} diff --git a/indra/newview/lldateutil.h b/indra/newview/lldateutil.h index d077f4eefb..9c62241fe6 100644 --- a/indra/newview/lldateutil.h +++ b/indra/newview/lldateutil.h @@ -50,6 +50,8 @@ namespace LLDateUtil // Calls the above with LLDate::now() std::string ageFromDateISO(const std::string& date_string); + + std::string ageFromDate(S32 year, S32 month, S32 day); } #endif diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index ed458a4b02..06070f876d 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -36,10 +36,12 @@ // Viewer includes #include "llagent.h" #include "llcallingcard.h" -#include "lldateutil.h" // IDEVO +#include "lldate.h" // split() +#include "lldateutil.h" // ageFromDate() #include "llfocusmgr.h" #include "llfloaterreg.h" #include "llviewercontrol.h" +#include "llviewerregion.h" // getCapability() #include "llworld.h" // Linden libraries @@ -371,12 +373,26 @@ void LLFloaterAvatarPicker::find() std::string text = childGetValue("Edit").asString(); mQueryID.generate(); - // IDEVO - if (LLAvatarNameCache::useDisplayNames()) + + std::string url; + url.reserve(128); // avoid a memory allocation or two + + LLViewerRegion* region = gAgent.getRegion(); + url = region->getCapability("AvatarPickerSearch"); + // Prefer use of capabilities to search on both SLID and display name + // but allow display name search to be manually turned off for test + if (!url.empty() + && LLAvatarNameCache::useDisplayNames()) { - std::string url = "http://pdp15.lindenlab.com:8050/my-service/agent/search/"; + // capability urls don't end in '/', but we need one to parse + // query parameters correctly + if (url.size() > 0 && url[url.size()-1] != '/') + { + url += "/"; + } + url += "?name="; url += LLURI::escape(text); - url += "/"; + llinfos << "JAMESDEBUG picker " << url << llendl; LLHTTPClient::get(url, new LLAvatarPickerResponder(mQueryID)); } else @@ -483,7 +499,8 @@ void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD& LLScrollListCtrl* search_results = getChild("SearchResults"); - if (content.size() == 0) + LLSD agents = content["agents"]; + if (agents.size() == 0) { LLStringUtil::format_map_t map; map["[TEXT]"] = childGetText("Edit"); @@ -501,8 +518,8 @@ void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD& search_results->deleteAllItems(); LLSD item; - LLSD::array_const_iterator it = content.beginArray(); - for ( ; it != content.endArray(); ++it) + LLSD::array_const_iterator it = agents.beginArray(); + for ( ; it != agents.endArray(); ++it) { const LLSD& row = *it; item["id"] = row["agent_id"]; @@ -510,12 +527,13 @@ void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD& columns[0]["column"] = "name"; columns[0]["value"] = row["display_name"]; columns[1]["column"] = "slid"; - columns[1]["value"] = row["slid"]; - std::string born_on = row["born_on"].asString(); + columns[1]["value"] = row["sl_id"]; + LLDate account_created = row["account_created"].asDate(); + S32 year, month, day; + account_created.split(&year, &month, &day); + std::string age = LLDateUtil::ageFromDate(year, month, day); columns[2]["column"] = "age"; - columns[2]["value"] = LLDateUtil::ageFromDateISO(born_on); - columns[3]["column"] = "profile"; - columns[3]["value"] = row["profile"]; + columns[2]["value"] = age; search_results->addElement(item); } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 83c5760b58..502fc87e41 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1466,6 +1466,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url) LLSD capabilityNames = LLSD::emptyArray(); capabilityNames.append("AttachmentResources"); + capabilityNames.append("AvatarPickerSearch"); capabilityNames.append("ChatSessionRequest"); capabilityNames.append("CopyInventoryFromNotecard"); capabilityNames.append("DispatchRegionInfo"); diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index 59923bec96..489b7c0536 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -104,10 +104,6 @@ label="Age" name="age" width="100" /> - 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/llcommon/llavatarname.cpp | 10 +++++-- indra/llcommon/llavatarname.h | 2 +- indra/llmessage/llavatarnamecache.cpp | 53 ++++++++++++++++++++--------------- indra/llmessage/llavatarnamecache.h | 11 ++------ indra/newview/llappviewer.cpp | 36 +++++++++++++++--------- indra/newview/llviewerdisplayname.cpp | 14 +++++---- indra/newview/llviewerregion.cpp | 17 +++++++++-- indra/newview/llviewerregion.h | 6 ++++ 8 files changed, 93 insertions(+), 56 deletions(-) (limited to 'indra/newview/llviewerregion.cpp') diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp index 62ba7cb112..c35b8380b8 100644 --- a/indra/llcommon/llavatarname.cpp +++ b/indra/llcommon/llavatarname.cpp @@ -35,12 +35,15 @@ #include "llavatarname.h" +#include "lldate.h" +#include "llsd.h" + // Store these in pre-built std::strings to avoid memory allocations in // LLSD map lookups static const std::string SL_ID("sl_id"); static const std::string DISPLAY_NAME("display_name"); static const std::string IS_DISPLAY_NAME_DEFAULT("is_display_name_default"); -static const std::string EXPIRES("expires"); +static const std::string DISPLAY_NAME_EXPIRES("display_name_expires"); LLAvatarName::LLAvatarName() : mSLID(), @@ -64,7 +67,7 @@ LLSD LLAvatarName::asLLSD() const sd[SL_ID] = mSLID; sd[DISPLAY_NAME] = mDisplayName; sd[IS_DISPLAY_NAME_DEFAULT] = mIsDisplayNameDefault; - sd[EXPIRES] = mExpires; + sd[DISPLAY_NAME_EXPIRES] = LLDate(mExpires); return sd; } @@ -73,5 +76,6 @@ void LLAvatarName::fromLLSD(const LLSD& sd) mSLID = sd[SL_ID].asString(); mDisplayName = sd[DISPLAY_NAME].asString(); mIsDisplayNameDefault = sd[IS_DISPLAY_NAME_DEFAULT].asBoolean(); - mExpires = sd[EXPIRES].asReal(); + LLDate expires = sd[DISPLAY_NAME_EXPIRES]; + mExpires = expires.secondsSinceEpoch(); } diff --git a/indra/llcommon/llavatarname.h b/indra/llcommon/llavatarname.h index 11bd5f30b7..b30dca6e6e 100644 --- a/indra/llcommon/llavatarname.h +++ b/indra/llcommon/llavatarname.h @@ -63,7 +63,7 @@ public: // Names can change, so need to keep track of when name was // last checked. - // Unix time-from-epoch seconds + // Unix time-from-epoch seconds for efficiency F64 mExpires; // Can be a viewer UI image name ("Person_Check") or a server-side 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; +} diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h index 4aabacd1f3..68a6c28b7b 100644 --- a/indra/llmessage/llavatarnamecache.h +++ b/indra/llmessage/llavatarnamecache.h @@ -42,21 +42,16 @@ class LLUUID; namespace LLAvatarNameCache { - // On the viewer, name cache starts in a non-running state until we - // know if we have the name lookup capability for the agent's region. - // In that state it buffers requests for later. - void initClass(bool running); + void initClass(); void cleanupClass(); void importFile(std::istream& istr); void exportFile(std::ostream& ostr); // On the viewer, usually a simulator capabilitity + // If empty, name cache will fall back to using legacy name + // lookup system void setNameLookupURL(const std::string& name_lookup_url); - - // Once we know if the lookup service is available we can start - // requesting names. - void setRunning(bool running); // Periodically makes a batch request for display names not already in // cache. Call once per frame. diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ac9672858d..e160951b91 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3906,6 +3906,11 @@ void LLAppViewer::idleNameCache() // deal with any queued name requests and replies. gCacheName->processPending(); + // Can't run the new cache until we have the list of capabilities + // for the agent region, and can therefore decide whether to use + // display names or fall back to the old name system. + if (!region->capabilitiesReceived()) return; + // Agent may have moved to a different region, so need to update cap URL // for name lookups. Can't do this in the cap grant code, as caps are // granted to neighbor regions before the main agent gets there. Can't @@ -3914,21 +3919,26 @@ void LLAppViewer::idleNameCache() std::string name_lookup_url; name_lookup_url.reserve(128); // avoid a memory allocation below name_lookup_url = region->getCapability("GetDisplayNames"); - - // Ensure capability has been granted - U32 url_size = name_lookup_url.size(); - if (url_size > 0) - { - // capabilities require URLs with slashes before query params: - // https://:/cap//?ids= - // but the caps are granted like: - // https://:/cap/ - if (name_lookup_url[url_size-1] != '/') - { - name_lookup_url += '/'; - } + if (!name_lookup_url.empty()) + { + // we have support for display names, use it + U32 url_size = name_lookup_url.size(); + // capabilities require URLs with slashes before query params: + // https://:/cap//?ids= + // but the caps are granted like: + // https://:/cap/ + if (url_size > 0 && name_lookup_url[url_size-1] != '/') + { + name_lookup_url += '/'; + } LLAvatarNameCache::setNameLookupURL(name_lookup_url); } + else + { + // Display names not available on this region + LLAvatarNameCache::setNameLookupURL( std::string() ); + } + LLAvatarNameCache::idle(); } diff --git a/indra/newview/llviewerdisplayname.cpp b/indra/newview/llviewerdisplayname.cpp index 1cfada48ad..8bed501c6e 100644 --- a/indra/newview/llviewerdisplayname.cpp +++ b/indra/newview/llviewerdisplayname.cpp @@ -120,20 +120,22 @@ class LLDisplayNameUpdate : public LLHTTPNode { LLSD body = input["body"]; LLUUID agent_id = body["agent_id"]; - std::string slid = body["sl_id"]; std::string old_display_name = body["old_display_name"]; - std::string new_display_name = body["new_display_name"]; + // By convention this record is called "agent" in the People API + std::string name_data = body["agent"]; - // force re-request of this agent's name data - LLAvatarNameCache::erase(agent_id); + // Inject the new name data into cache + LLAvatarName av_name; + av_name.fromLLSD( name_data ); + LLAvatarNameCache::insert(agent_id, av_name); // force name tag to update LLVOAvatar::invalidateNameTag(agent_id); LLSD args; args["OLD_NAME"] = old_display_name; - args["SLID"] = slid; - args["NEW_NAME"] = new_display_name; + args["SLID"] = av_name.mSLID; + args["NEW_NAME"] = av_name.mDisplayName; LLNotificationsUtil::add("DisplayNameUpdate", args); } }; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 502fc87e41..9e877bc1af 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -175,7 +175,9 @@ public: mRegion->showReleaseNotes(); } } - + + mRegion->setCapabilitiesReceived(true); + if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) { LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); @@ -232,7 +234,8 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, // LLCapabilityListener binds all the globals it expects to need at // construction time. mCapabilityListener(host.getString(), gMessageSystem, *this, - gAgent.getID(), gAgent.getSessionID()) + gAgent.getID(), gAgent.getSessionID()), + mCapabilitiesReceived(false) { mWidth = region_width_meters; mOriginGlobal = from_region_handle(handle); @@ -1557,6 +1560,16 @@ std::string LLViewerRegion::getCapability(const std::string& name) const return iter->second; } +bool LLViewerRegion::capabilitiesReceived() const +{ + return mCapabilitiesReceived; +} + +void LLViewerRegion::setCapabilitiesReceived(bool received) +{ + mCapabilitiesReceived = received; +} + void LLViewerRegion::logActiveCapabilities() const { int count = 0; diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 49d0900f2a..5f6c754187 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -232,6 +232,11 @@ public: void setCapability(const std::string& name, const std::string& url); // implements LLCapabilityProvider virtual std::string getCapability(const std::string& name) const; + + // has region received its final (not seed) capability list? + bool capabilitiesReceived() const; + void setCapabilitiesReceived(bool received); + static bool isSpecialCapabilityName(const std::string &name); void logActiveCapabilities() const; @@ -412,6 +417,7 @@ private: private: bool mAlive; // can become false if circuit disconnects + bool mCapabilitiesReceived; //spatial partitions for objects in this region std::vector mObjectPartition; -- cgit v1.3