From 5c8b2deb82cfe753d6fe25e418f99f05d76e0b73 Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Wed, 23 Dec 2009 15:15:49 -0500
Subject: For EXT-3622: Take off item, wear a different item --> first item is
 put on again.  Fixed the 'remove all clothing' case.

---
 indra/newview/llinventorybridge.cpp | 38 +++++++++++++++++++++++++++++++++++++
 indra/newview/llinventorybridge.h   |  1 +
 indra/newview/llviewermenu.cpp      |  2 +-
 3 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index beecd48419..d70221b22a 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -4939,6 +4939,44 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
 	delete on_remove_struct;
 }
 
+/* static */
+void LLWearableBridge::removeAllClothesFromAvatar()
+{
+	// Remove COF links.
+	for (S32 itype = WT_SHAPE; itype < WT_COUNT; ++itype)
+	{
+		if (itype == WT_SHAPE || itype == WT_SKIN || itype == WT_HAIR || itype == WT_EYES)
+			continue;
+
+		// MULTI-WEARABLES: fixed to index 0
+		LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(
+			gAgentWearables.getWearableInventoryItem((EWearableType)itype, 0));
+		if (!item)
+			continue;
+		const LLUUID &item_id = gInventory.getLinkedItemID(item->getUUID());
+		const LLWearable *wearable = gAgentWearables.getWearableFromItemID(item_id);
+		if (!wearable)
+			continue;
+
+		// Find and remove this item from the COF.
+		LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(
+			item_id, LLAppearanceManager::instance().getCOF());
+		llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
+		for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
+			 iter != items.end();
+			 ++iter)
+		{
+			const LLViewerInventoryItem *linked_item = (*iter);
+			const LLUUID &item_id = linked_item->getUUID();
+			gInventory.purgeObject(item_id);
+		}
+	}
+	gInventory.notifyObservers();
+
+	// Remove wearables from gAgentWearables
+	LLAgentWearables::userRemoveAllClothes();
+}
+
 /* static */
 void LLWearableBridge::removeItemFromAvatar(LLViewerInventoryItem *item)
 {
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index c93fc85a7d..cc1fa45b26 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -574,6 +574,7 @@ public:
 	static void		onRemoveFromAvatar( void* userdata );
 	static void		onRemoveFromAvatarArrived( LLWearable* wearable, 	void* userdata );
 	static void 	removeItemFromAvatar(LLViewerInventoryItem *item);
+	static void 	removeAllClothesFromAvatar();
 	void			removeFromAvatar();
 
 protected:
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 46a21066ba..620c700077 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -7423,7 +7423,7 @@ class LLEditTakeOff : public view_listener_t
 	{
 		std::string clothing = userdata.asString();
 		if (clothing == "all")
-			LLAgentWearables::userRemoveAllClothes();
+			LLWearableBridge::removeAllClothesFromAvatar();
 		else
 		{
 			EWearableType type = LLWearableDictionary::typeNameToType(clothing);
-- 
cgit v1.2.3