diff options
| -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); | 
