From efb512dc65c43ea73e7b4da3e2c45d276043842e Mon Sep 17 00:00:00 2001
From: Steve Bennetts <steve@lindenlab.com>
Date: Wed, 18 Nov 2009 14:07:35 -0800
Subject: [PATCH] EXT-2644 - Add "Close Session" option to chicklet context
 menus

---
 indra/newview/llavataractions.cpp                 | 13 +++++++++++++
 indra/newview/llavataractions.h                   |  5 +++++
 indra/newview/llchiclet.cpp                       | 10 +++++++++-
 indra/newview/llfloatergroups.cpp                 |  2 +-
 indra/newview/llgroupactions.cpp                  | 15 ++++++++++++++-
 indra/newview/llgroupactions.h                    |  7 ++++++-
 indra/newview/llpanelpeople.cpp                   |  2 +-
 .../skins/default/xui/en/menu_imchiclet_group.xml |  8 ++++++++
 .../skins/default/xui/en/menu_imchiclet_p2p.xml   |  8 ++++++++
 9 files changed, 65 insertions(+), 5 deletions(-)

diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index ee4a9df15fa..0844cca7662 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -189,6 +189,19 @@ void LLAvatarActions::startIM(const LLUUID& id)
 	make_ui_sound("UISndStartIM");
 }
 
+// static
+void LLAvatarActions::endIM(const LLUUID& id)
+{
+	if (id.isNull())
+		return;
+	
+	LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, id);
+	if (session_id != LLUUID::null)
+	{
+		gIMMgr->leaveSession(session_id);
+	}
+}
+
 // static
 void LLAvatarActions::startCall(const LLUUID& id)
 {
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 66ea6880dbf..d9dab95a770 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -73,6 +73,11 @@ class LLAvatarActions
 	 */
 	static void startIM(const LLUUID& id);
 
+	/**
+	 * End instant messaging session.
+	 */
+	static void endIM(const LLUUID& id);
+
 	/**
 	 * Start an avatar-to-avatar voice call with another user
 	 */
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 4078fac4ecb..5375c3ea493 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -482,6 +482,10 @@ void LLIMP2PChiclet::onMenuItemClicked(const LLSD& user_data)
 	{
 		LLAvatarActions::requestFriendshipDialog(other_participant_id);
 	}
+	else if("close" == level)
+	{
+		LLAvatarActions::endIM(other_participant_id);
+	}
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -776,12 +780,16 @@ void LLIMGroupChiclet::onMenuItemClicked(const LLSD& user_data)
 
 	if("group chat" == level)
 	{
-		LLGroupActions::startChat(group_id);
+		LLGroupActions::startIM(group_id);
 	}
 	else if("info" == level)
 	{
 		LLGroupActions::show(group_id);
 	}
+	else if("close" == level)
+	{
+		LLGroupActions::endIM(group_id);
+	}
 }
 
 
diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp
index 45af515a869..7cb925bc0b0 100644
--- a/indra/newview/llfloatergroups.cpp
+++ b/indra/newview/llfloatergroups.cpp
@@ -327,7 +327,7 @@ void LLPanelGroups::startIM()
 
 	if (group_list && (group_id = group_list->getCurrentID()).notNull())
 	{
-		LLGroupActions::startChat(group_id);
+		LLGroupActions::startIM(group_id);
 	}
 }
 
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index e60bde9fd89..f4e1951c7b2 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -272,7 +272,7 @@ void LLGroupActions::closeGroup(const LLUUID& group_id)
 
 
 // static
-void LLGroupActions::startChat(const LLUUID& group_id)
+void LLGroupActions::startIM(const LLUUID& group_id)
 {
 	if (group_id.isNull())
 		return;
@@ -298,6 +298,19 @@ void LLGroupActions::startChat(const LLUUID& group_id)
 	}
 }
 
+// static
+void LLGroupActions::endIM(const LLUUID& group_id)
+{
+	if (group_id.isNull())
+		return;
+	
+	LLUUID session_id = gIMMgr->computeSessionID(IM_SESSION_GROUP_START, group_id);
+	if (session_id != LLUUID::null)
+	{
+		gIMMgr->leaveSession(session_id);
+	}
+}
+
 // static
 bool LLGroupActions::isInGroup(const LLUUID& group_id)
 {
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index 74c84d15617..9750b3e3cb7 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -88,7 +88,12 @@ class LLGroupActions
 	/**
 	 * Start group instant messaging session.
 	 */
-	static void startChat(const LLUUID& group_id);
+	static void startIM(const LLUUID& group_id);
+
+	/**
+	 * End group instant messaging session.
+	 */
+	static void endIM(const LLUUID& group_id);
 
 	/// Returns if the current user is a member of the group
 	static bool isInGroup(const LLUUID& group_id);
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 709525d4e26..4dc88725573 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -1017,7 +1017,7 @@ void LLPanelPeople::onChatButtonClicked()
 {
 	LLUUID group_id = getCurrentItemID();
 	if (group_id.notNull())
-		LLGroupActions::startChat(group_id);
+		LLGroupActions::startIM(group_id);
 }
 
 void LLPanelPeople::onImButtonClicked()
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
index 542e319792b..dfe4605b7ac 100644
--- a/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_group.xml
@@ -24,4 +24,12 @@
          function="IMChicletMenu.Action"
          parameter="info" />
     </menu_item_call>
+    <menu_item_call
+     label="Close Session"
+     layout="topleft"
+     name="Close Session">
+        <menu_item_call.on_click
+         function="IMChicletMenu.Action"
+         parameter="close" />
+    </menu_item_call>
 </menu>
diff --git a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
index c205868429e..4cabcb90317 100644
--- a/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
+++ b/indra/newview/skins/default/xui/en/menu_imchiclet_p2p.xml
@@ -32,4 +32,12 @@
          function="IMChicletMenu.Action"
          parameter="add" />
     </menu_item_call>
+    <menu_item_call
+     label="Close Session"
+     layout="topleft"
+     name="Close Session">
+        <menu_item_call.on_click
+         function="IMChicletMenu.Action"
+         parameter="close" />
+    </menu_item_call>
 </menu>
-- 
GitLab