void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) { if (sRunning) { // ...only do immediate lookups when cache is running if (useDisplayNames()) { // ...use new cache std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); if (it != sCache.end()) { 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 { // ...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; } } } // 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); } }
// 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) { // ...only do immediate lookups when cache is running if (useDisplayNames()) { // ...use display names cache std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); if (it != sCache.end()) { *av_name = it->second; if(LGGContactSets::getInstance()->hasPseudonym(agent_id)) { LLSD info = av_name->asLLSD(); info["is_display_name_default"]=LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id); info["display_name"]=LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id)?(info["legacy_first_name"].asString()+" "+info["legacy_last_name"].asString()):LGGContactSets::getInstance()->getPseudonym(agent_id); av_name->fromLLSD(info); } // re-request name if entry is expired if (av_name->mExpires < LLFrameTimer::getTotalSeconds()) { if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " << "refresh agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } } return true; } } else { // ...use legacy names cache std::string full_name; if (gCacheName->getFullName(agent_id, full_name)) { buildLegacyName(full_name, av_name); return true; } } } if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " << "queue request for agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } return false; }
void LLAvatarNameCache::legacyNameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data) { std::string full_name = first + " " +last; // 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(id, av_name, false); }
// 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) { // ...only do immediate lookups when cache is running if (useDisplayNames()) { // ...use display names cache std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); if (it != sCache.end()) { *av_name = it->second; // re-request name if entry is expired if (av_name->mExpires < LLFrameTimer::getTotalSeconds()) { if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " << "refresh agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } } return true; } } else { // ...use legacy names cache std::string full_name; if (gCacheName->getFullName(agent_id, full_name)) { buildLegacyName(full_name, av_name); return true; } } } if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::get " << "queue request for agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } return false; }
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; LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::legacyNameCallback " << "agent " << agent_id << " " << "full name '" << full_name << "'" << ( is_group ? " [group]" : "" ) << LL_ENDL; 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::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; LL_DEBUGS("AvNameCache") << "LLAvatarNameCache::legacyNameCallback " << "agent " << agent_id << " " << "full name '" << full_name << "'" << ( is_group ? " [group]" : "" ) << LL_ENDL; buildLegacyName(full_name, &av_name); // Add to cache, because if we don't we'll keep rerequesting the // same record forever. buildLegacyName should always guarantee // that these records expire reasonably soon // (in TEMP_CACHE_ENTRY_LIFETIME seconds), so if the failure was due // to something temporary we will eventually request and get the right data. processName(agent_id, av_name, true); }
LLAvatarNameCache::callback_connection_t LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) { callback_connection_t connection; if (sRunning) { // ...only do immediate lookups when cache is running if (useDisplayNames()) { LL_DEBUGS("AvNameCache") << "DN cache lookup for " << agent_id << llendl; // ...use new cache std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); if (it != sCache.end()) { LLAvatarName& av_name = it->second; LLSD test = av_name.asLLSD(); LL_DEBUGS("AvNameCache") << "DN cache hit for :" << test["display_name"].asString()+" (" + test["legacy_first_name"].asString()+" "+test["legacy_last_name"].asString()+")" << llendl; if(LGGContactSets::getInstance()->hasPseudonym(agent_id)) { LL_DEBUGS("AvNameCache") << "DN cache hit via alias" << llendl; LLSD info = av_name.asLLSD(); info["is_display_name_default"]=LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id); info["display_name"]=LGGContactSets::getInstance()->hasDisplayNameRemoved(agent_id)?(info["legacy_first_name"].asString()+" "+info["legacy_last_name"].asString()):LGGContactSets::getInstance()->getPseudonym(agent_id); av_name.fromLLSD(info); } if (av_name.mExpires > LLFrameTimer::getTotalSeconds()) { // ...name already exists in cache, fire callback now LL_DEBUGS("AvNameCache") << "DN cache hit valid" << llendl; fireSignal(agent_id, slot, av_name); return connection; } // If we get here, our DN is expired. //Consider it a cache miss, handle as if sRunning was false. LL_DEBUGS("AvNameCache") << "DN cache hit expired. " << av_name.mExpires << " vs. " << LLFrameTimer::getTotalSeconds() << llendl; } //If we get here, cache miss. We'll schedule it below } 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 connection; } } } // schedule a request if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "DN scheduling lookup for" << agent_id << llendl; sAskQueue.insert(agent_id); } else { LL_DEBUGS("AvNameCache") << "DN lookup for " << agent_id << " already in progress. Returning." << llendl; } // 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(); connection = signal->connect(slot); sSignalMap[agent_id] = signal; } else { // ...existing callback, bind additional slot callback_signal_t* signal = sig_it->second; connection = signal->connect(slot); } return connection; }