// 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 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 refresh agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } } return true; } } if (!isRequestPending(agent_id)) { LL_DEBUGS("AvNameCache") << "LLAvatarNameCache queue request for agent " << agent_id << LL_ENDL; sAskQueue.insert(agent_id); } return 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; 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; }
// 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; }
BOOL LLCacheName::Impl::getName(const LLUUID& id, std::string& first, std::string& last) { if(id.isNull()) { first = sCacheName["nobody"]; last.clear(); return TRUE; } LLCacheNameEntry* entry = get_ptr_in_map(mCache, id ); if (entry) { first = entry->mFirstName; last = entry->mLastName; return TRUE; } else { first = sCacheName["waiting"]; last.clear(); if (!isRequestPending(id)) { mAskNameQueue.insert(id); } return FALSE; } }
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); } }
bool fetch( const LLUUID& key, bool refresh/* = true*/ ) { if(!key.isNull() && !isRequestPending(key) && (refresh || sCache.find(key)==sCache.end())) { LL_DEBUGS("ExperienceCache") << " queue request for " << EXPERIENCE_ID << " " << key << LL_ENDL ; sAskQueue[key]=EXPERIENCE_ID; return true; } return false; }
void LLCacheName::Impl::processUUIDRequest(LLMessageSystem* msg, bool isGroup) { // You should only get this message if the cache is at the simulator // level, hence having an upstream provider. if (!mUpstreamHost.isOk()) { llwarns << "LLCacheName - got UUID name/group request, but no upstream provider!" << llendl; return; } LLHost fromHost = msg->getSender(); ReplySender sender(msg); S32 count = msg->getNumberOfBlocksFast(_PREHASH_UUIDNameBlock); for(S32 i = 0; i < count; ++i) { LLUUID id; msg->getUUIDFast(_PREHASH_UUIDNameBlock, _PREHASH_ID, id, i); LLCacheNameEntry* entry = get_ptr_in_map(mCache, id); if(entry) { if (isGroup != entry->mIsGroup) { llwarns << "LLCacheName - Asked for " << (isGroup ? "group" : "user") << " name, " << "but found " << (entry->mIsGroup ? "group" : "user") << ": " << id << llendl; } else { // ...it's in the cache, so send it as the reply sender.send(id, *entry, fromHost); } } else { if (!isRequestPending(id)) { if (isGroup) { mAskGroupQueue.insert(id); } else { mAskNameQueue.insert(id); } } addPending(id, fromHost); } } }
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 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 connection; } } } // 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(); 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; }
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; }