diff options
| -rw-r--r-- | indra/newview/lltooldraganddrop.cpp | 67 | 
1 files changed, 56 insertions, 11 deletions
| diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 54484a1dbb..d6e069b3dc 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1445,6 +1445,43 @@ static void give_inventory_cb(const LLSD& notification, const LLSD& response)  	}  } +static void show_item_sharing_confirmation(const std::string name, +										   LLViewerInventoryItem* inv_item, +										   const LLSD& dest, +										   const LLUUID& dest_agent, +										   const LLUUID& session_id = LLUUID::null) +{ +	if (!inv_item) +	{ +		llassert(NULL != inv_item); +		return; +	} + +	LLSD substitutions; +	substitutions["RESIDENTS"] = name; +	substitutions["ITEMS"] = inv_item ? inv_item->getName() : LLStringUtil::null; +	LLSD payload; +	payload["agent_id"] = dest_agent; +	payload["item_id"] = inv_item->getUUID(); +	payload["session_id"] = session_id; +	payload["d&d_dest"] = dest.asString(); +	LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb); +} + +static void get_name_cb(const LLUUID& id, +						const std::string& first_name, +						const std::string& last_name, +						LLViewerInventoryItem* inv_item, +						const LLSD& dest, +						const LLUUID& dest_agent) +{ +	show_item_sharing_confirmation(first_name + " " + last_name, +								   inv_item, +								   dest, +								   id, +								   LLUUID::null); +} +  // function used as drag-and-drop handler for simple agent give inventory requests  //static  bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_id, BOOL drop, @@ -1477,20 +1514,28 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_  			if (drop)  			{  				LLIMModel::LLIMSession * session = LLIMModel::instance().findIMSession(session_id); + +				// If no IM session found get the destination agent's name by id.  				if (NULL == session)  				{ -					llassert(NULL != session); -					return false; +					std::string fullname; + +					// If destination agent's name is found in cash proceed to showing the confirmation dialog. +					// Otherwise set up a callback to show the dialog when the name arrives. +					if (gCacheName->getFullName(dest_agent, fullname)) +					{ +						show_item_sharing_confirmation(fullname, inv_item, dest, dest_agent, LLUUID::null); +					} +					else +					{ +						gCacheName->get(dest_agent, FALSE, boost::bind(&get_name_cb, _1, _2, _3, inv_item, dest, dest_agent)); +					} + +					return true;  				} -				LLSD substitutions; -				substitutions["RESIDENTS"] = session->mName; -				substitutions["ITEMS"] = inv_item->getName(); -				LLSD payload; -				payload["agent_id"] = dest_agent; -				payload["item_id"] = inv_item->getUUID(); -				payload["session_id"] = session_id; -				payload["d&d_dest"] = dest.asString(); -				LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb); + +				// If an IM session with destination agent is found item offer will be logged in this session. +				show_item_sharing_confirmation(session->mName, inv_item, dest, dest_agent, session_id);  			}  		}  		else | 
