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); } }
TEST(ConnectorTests, DeleteLater) { SignalAndSlotObject::State state; SignalAndSlotObject* object(new SignalAndSlotObject(state)); QtUtils::deleteLaterOn(object, SIGNAL(fireSignal())); EXPECT_FALSE(state.wasDeleted); emit object->fireSignal(); QCoreApplication::sendPostedEvents(object, QEvent::DeferredDelete); EXPECT_TRUE(state.wasDeleted); }
TEST(ConnectorTests, ConnectToSINAL_SLOT_Macro) { SignalAndSlotObject::State state; SignalAndSlotObject object(state); SignalAndSlotObject::State state2; SignalAndSlotObject object2(state2); const auto& connector = QtUtils::makeConnector(&object, &object2); connector.connect(SIGNAL(fireSignal()), SLOT(handleSignal())); EXPECT_FALSE(state.signalHandled); emit object.fireSignal(); EXPECT_TRUE(state2.signalHandled); }
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; }