diff options
author | Denis Serdjuk <dserduk@productengine.com> | 2010-02-12 16:09:18 +0200 |
---|---|---|
committer | Denis Serdjuk <dserduk@productengine.com> | 2010-02-12 16:09:18 +0200 |
commit | c06742b231b9e7b108f5e3dce6b72d9b9a639537 (patch) | |
tree | 957cbf2e811f13b31299d014f157e32f297377e7 | |
parent | 8b609519ea46b785e529c83067ede3656fc10828 (diff) |
fixed Bug Low EXT-4732 Group invitation is broken for offline avatars
Cause:
gObjectList does contain offline avatars and panel could get avatar name and fill the list
Solution:
This situation is possible only for offline friend, therefore extra avatartracker search has been added.
--HG--
branch : product-engine
-rw-r--r-- | indra/newview/llpanelgroupinvite.cpp | 40 | ||||
-rw-r--r-- | indra/newview/llpanelgroupinvite.h | 4 | ||||
-rw-r--r-- | indra/newview/llviewerobjectlist.h | 4 |
3 files changed, 44 insertions, 4 deletions
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 06a682c905..05261a65de 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -36,6 +36,7 @@ #include "llagent.h" #include "llfloateravatarpicker.h" #include "llbutton.h" +#include "llcallingcard.h" #include "llcombobox.h" #include "llgroupactions.h" #include "llgroupmgr.h" @@ -405,16 +406,13 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids) { LLUUID agent_id = agent_ids[i]; LLViewerObject* dest = gObjectList.findObject(agent_id); + std::string fullname; if(dest && dest->isAvatar()) { - std::string fullname; - LLSD args; LLNameValue* nvfirst = dest->getNVPair("FirstName"); LLNameValue* nvlast = dest->getNVPair("LastName"); if(nvfirst && nvlast) { - args["FIRST"] = std::string(nvfirst->getString()); - args["LAST"] = std::string(nvlast->getString()); fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString()); } if (!fullname.empty()) @@ -427,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids) names.push_back("(Unknown)"); } } + else + { + //looks like user try to invite offline friend + //for offline avatar_id gObjectList.findObject() will return null + //so we need to do this additional search in avatar tracker, see EXT-4732 + if (LLAvatarTracker::instance().isBuddy(agent_id)) + { + if (!gCacheName->getFullName(agent_id, fullname)) + { + // actually it should happen, just in case + gCacheName->get(LLUUID(agent_id), false, boost::bind( + &LLPanelGroupInvite::addUserCallback, this, _1, _2, + _3)); + // for this special case! + //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence + // removed id will be added in callback + agent_ids.erase(agent_ids.begin() + i); + } + else + { + names.push_back(fullname); + } + } + } } mImplementation->addUsers(names, agent_ids); } +void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name) +{ + std::vector<std::string> names; + std::vector<LLUUID> agent_ids; + std::string full_name = first_name + " " + last_name; + agent_ids.push_back(id); + names.push_back(first_name + " " + last_name); + + mImplementation->addUsers(names, agent_ids); +} void LLPanelGroupInvite::draw() { LLPanel::draw(); diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h index 37135b488a..b095dd2395 100644 --- a/indra/newview/llpanelgroupinvite.h +++ b/indra/newview/llpanelgroupinvite.h @@ -43,6 +43,10 @@ public: ~LLPanelGroupInvite(); void addUsers(std::vector<LLUUID>& agent_ids); + /** + * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers(). + */ + void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name); void clear(); void update(); diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index ace5c5038e..2858081dc9 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -233,6 +233,10 @@ public: extern LLViewerObjectList gObjectList; // Inlines +/** + * Note: + * it will return NULL for offline avatar_id + */ inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id) { std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id); |