From ad1f2eb5106a9ba0217ff1080d029f912ecc25e5 Mon Sep 17 00:00:00 2001
From: Seth ProductEngine <slitovchuk@productengine.com>
Date: Tue, 3 Jul 2012 22:31:58 +0300
Subject: CHUI-186 CHUI-187 FIX Removing a P2P convrsation from converstaion
 widget in the upper right corner when a new participant is added. End call
 prompt removed when adding a new participant to a P2P voice call. After
 adding a participant to a P2P voice conversation the resulting conference
 call is restarted voice invites to all participants.

---
 indra/newview/llavataractions.cpp    |  4 +-
 indra/newview/llavataractions.h      |  4 +-
 indra/newview/llimfloater.cpp        | 73 ++++++++++++++++++++----------------
 indra/newview/llimfloater.h          |  2 +-
 indra/newview/llpanelpeoplemenus.cpp |  2 +-
 5 files changed, 46 insertions(+), 39 deletions(-)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 21367c224d..56c9533e11 100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -235,7 +235,7 @@ void LLAvatarActions::startCall(const LLUUID& id)
 }
 
 // static
-void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids)
+void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids, const LLUUID& floater_id)
 {
 	if (ids.size() == 0)
 	{
@@ -252,7 +252,7 @@ void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids)
 	// create the new ad hoc voice session
 	const std::string title = LLTrans::getString("conference-title");
 	LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
-										   ids[0], id_array, true);
+										   ids[0], id_array, true, floater_id);
 	if (session_id == LLUUID::null)
 	{
 		return;
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 46830eb22c..259e87c336 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -82,9 +82,9 @@ public:
 	static void startCall(const LLUUID& id);
 
 	/**
-	 * Start an ad-hoc conference voice call with multiple users
+	 * Start an ad-hoc conference voice call with multiple users in a specific IM floater.
 	 */
-	static void startAdhocCall(const uuid_vec_t& ids);
+	static void startAdhocCall(const uuid_vec_t& ids, const LLUUID& floater_id = LLUUID::null);
 
 	/**
 	 * Start conference chat with the given avatars in a specific IM floater.
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 9d3c0f98ce..536d0b9a23 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -322,7 +322,7 @@ BOOL LLIMFloater::postBuild()
 
 void LLIMFloater::onAddButtonClicked()
 {
-       LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloater::onAvatarPicked, this, _1, _2), TRUE, TRUE);
+       LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLIMFloater::addSessionParticipants, this, _1), TRUE, TRUE);
        if (!picker)
        {
                return;
@@ -337,25 +337,6 @@ void LLIMFloater::onAddButtonClicked()
        }
 }
 
-void LLIMFloater::onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names)
-{
-       if (mIsP2PChat)
-       {
-               mStartConferenceInSameFloater = true;
-               onClose(false);
-
-               uuid_vec_t temp_ids;
-               temp_ids.push_back(mOtherParticipantUUID);
-               temp_ids.insert(temp_ids.end(), ids.begin(), ids.end());
-
-               LLAvatarActions::startConference(temp_ids, mSessionID);
-       }
-       else
-       {
-               inviteToSession(ids);
-       }
-}
-
 bool LLIMFloater::canAddSelectedToChat(const uuid_vec_t& uuids)
 {
        if (!mSession
@@ -388,6 +369,44 @@ bool LLIMFloater::canAddSelectedToChat(const uuid_vec_t& uuids)
        return true;
 }
 
+void LLIMFloater::addSessionParticipants(const uuid_vec_t& uuids)
+{
+	if (mIsP2PChat)
+	{
+		mStartConferenceInSameFloater = true;
+
+		uuid_vec_t temp_ids;
+
+		// Add the initial participant of a P2P session
+		temp_ids.push_back(mOtherParticipantUUID);
+		temp_ids.insert(temp_ids.end(), uuids.begin(), uuids.end());
+
+		LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+
+		// first check whether this is a voice session
+		bool is_voice_call = voice_channel != NULL && voice_channel->isActive();
+
+		// then we can close the current session
+		gIMMgr->leaveSession(mSessionID);
+		LLIMConversation::onClose(false);
+
+		// Start a new ad hoc voice call if we invite new participants to a P2P call,
+		// or start a text chat otherwise.
+		if (is_voice_call)
+		{
+			LLAvatarActions::startAdhocCall(temp_ids, mSessionID);
+		}
+		else
+		{
+			LLAvatarActions::startConference(temp_ids, mSessionID);
+		}
+	}
+	else
+	{
+		inviteToSession(uuids);
+	}
+}
+
 void LLIMFloater::boundVoiceChannel()
 {
 	LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
@@ -1096,19 +1115,7 @@ bool LLIMFloater::dropPerson(LLUUID* person_id, bool drop)
 		res = canAddSelectedToChat(ids);
 		if(res && drop)
 		{
-			if (mIsP2PChat)
-			{
-				mStartConferenceInSameFloater = true;
-				onClose(false);
-
-				ids.push_back(mOtherParticipantUUID);
-
-				LLAvatarActions::startConference(ids, mSessionID);
-			}
-			else
-			{
-				inviteToSession(ids);
-			}
+			addSessionParticipants(ids);
 		}
 	}
 
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 23f9e75e21..2e8fc84746 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -152,7 +152,7 @@ private:
 	static void onInputEditorKeystroke(LLTextEditor* caller, void* userdata);
 	void setTyping(bool typing);
 	void onAddButtonClicked();
-	void onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names);
+	void addSessionParticipants(const uuid_vec_t& uuids);
 	bool canAddSelectedToChat(const uuid_vec_t& uuids);
 
 	void onCallButtonClicked();
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index ac2109dda4..c9eebe24d3 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -82,7 +82,7 @@ LLContextMenu* NearbyMenu::createMenu()
 
 		// registrar.add("Avatar.AddFriend",	boost::bind(&LLAvatarActions::requestFriendshipDialog,	mUUIDs)); // *TODO: unimplemented
 		registrar.add("Avatar.IM",			boost::bind(&LLAvatarActions::startConference,			mUUIDs, LLUUID::null));
-		registrar.add("Avatar.Call",		boost::bind(&LLAvatarActions::startAdhocCall,			mUUIDs));
+		registrar.add("Avatar.Call",		boost::bind(&LLAvatarActions::startAdhocCall,			mUUIDs, LLUUID::null));
 		registrar.add("Avatar.OfferTeleport",	boost::bind(&NearbyMenu::offerTeleport,					this));
 		registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog,		mUUIDs));
 		// registrar.add("Avatar.Share",		boost::bind(&LLAvatarActions::startIM,					mUUIDs)); // *TODO: unimplemented
-- 
cgit v1.2.3