diff options
| author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2013-06-24 15:42:27 -0400 | 
|---|---|---|
| committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2013-06-24 15:42:27 -0400 | 
| commit | 3e0e236f33a866a3962295a99495fd1159532ba8 (patch) | |
| tree | 3f832533a6b274c86007cc8141da1005221e9ff5 | |
| parent | 687b1d3f684e650efa704dac654345bd466620b8 (diff) | |
SH-4243 WIP - cleaned up callback structure for createNewCategory, modified makeNewOutfitLinks() to wait for category creation before populating.
| -rwxr-xr-x | indra/newview/llappearancemgr.cpp | 49 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.h | 4 | ||||
| -rwxr-xr-x | indra/newview/llfloateropenobject.cpp | 21 | ||||
| -rwxr-xr-x | indra/newview/llfloateropenobject.h | 11 | ||||
| -rwxr-xr-x | indra/newview/llinventorymodel.cpp | 72 | ||||
| -rwxr-xr-x | indra/newview/llinventorymodel.h | 9 | ||||
| -rwxr-xr-x | indra/newview/llpaneloutfitsinventory.cpp | 2 | ||||
| -rwxr-xr-x | indra/newview/llstartup.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llviewerinventory.cpp | 3 | ||||
| -rwxr-xr-x | indra/newview/llviewerinventory.h | 6 | 
10 files changed, 89 insertions, 92 deletions
| diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index cb32bf9c40..93b0e6f4e7 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1466,6 +1466,7 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL  		{  			case LLAssetType::AT_LINK:  			{ +				LL_DEBUGS("Avatar") << "linking inventory item " << item->getName() << llendl;  				//getActualDescription() is used for a new description   				//to propagate ordering information saved in descriptions of links  				link_inventory_item(gAgent.getID(), @@ -1482,6 +1483,7 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL  				// Skip copying outfit links.  				if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT)  				{ +					LL_DEBUGS("Avatar") << "linking inventory folder " << item->getName() << llendl;  					link_inventory_item(gAgent.getID(),  										item->getLinkedUUID(),  										dst_id, @@ -1496,7 +1498,7 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL  			case LLAssetType::AT_BODYPART:  			case LLAssetType::AT_GESTURE:  			{ -				llinfos << "copying inventory item " << item->getName() << llendl; +				LL_DEBUGS("Avatar") << "copying inventory item " << item->getName() << llendl;  				copy_inventory_item(gAgent.getID(),  									item->getPermissions().getOwner(),  									item->getUUID(), @@ -2815,11 +2817,14 @@ bool LLAppearanceMgr::updateBaseOutfit()  		llassert(!isOutfitLocked());  		return false;  	} + +  	setOutfitLocked(true);  	gAgentWearables.notifyLoadingStarted();  	const LLUUID base_outfit_id = getBaseOutfitUUID(); +	LL_DEBUGS("Avatar") << "updating base outfit to " << base_outfit_id << llendl;  	if (base_outfit_id.isNull()) return false;  	updateClothingOrderingInfo(); @@ -3334,12 +3339,14 @@ void show_created_outfit(LLUUID& folder_id, bool show_panel = true)  		return;  	} +	LL_DEBUGS("Avatar") << "called" << llendl;  	LLSD key;  	//EXT-7727. For new accounts inventory callback is created during login process  	// and may be processed after login process is finished  	if (show_panel)  	{ +		LL_DEBUGS("Avatar") << "showing panel" << llendl;  		LLFloaterSidePanelContainer::showPanel("appearance", "panel_outfits_inventory", key);  	} @@ -3358,32 +3365,44 @@ void show_created_outfit(LLUUID& folder_id, bool show_panel = true)  	// link, since, the COF version has changed. There is a race  	// condition in initial outfit setup which can lead to rez  	// failures - SH-3860. +	LL_DEBUGS("Avatar") << "requesting appearance update after createBaseOutfitLink" << llendl;  	LLPointer<LLInventoryCallback> cb = new LLUpdateAppearanceOnDestroy;  	LLAppearanceMgr::getInstance()->createBaseOutfitLink(folder_id, cb);  } -LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, bool show_panel) +void LLAppearanceMgr::onOutfitFolderCreated(const LLSD& result, bool show_panel)  { -	if (!isAgentAvatarValid()) return LLUUID::null; - -	gAgentWearables.notifyLoadingStarted(); - -	// First, make a folder in the My Outfits directory. -	const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); -	LLUUID folder_id = gInventory.createNewCategory( -		parent_id, -		LLFolderType::FT_OUTFIT, -		new_folder_name); +	LL_DEBUGS("Avatar") << ll_pretty_print_sd(result) << llendl; -	updateClothingOrderingInfo(); +	LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(no_op_inventory_func, +																		 boost::bind(&LLAppearanceMgr::onOutfitFolderCreatedAndClothingOrdered,this,result,show_panel)); +	updateClothingOrderingInfo(LLUUID::null, false, cb); +} +void LLAppearanceMgr::onOutfitFolderCreatedAndClothingOrdered(const LLSD& result, bool show_panel) +{ +	LLUUID folder_id = result["folder_id"].asUUID();  	LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(no_op_inventory_func,  																		 boost::bind(show_created_outfit,folder_id,show_panel));  	shallowCopyCategoryContents(getCOF(),folder_id, cb); +} + +void LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, bool show_panel) +{ +	if (!isAgentAvatarValid()) return; -	dumpCat(folder_id,"COF, new outfit"); +	LL_DEBUGS("Avatar") << "creating new outfit" << llendl; -	return folder_id; +	gAgentWearables.notifyLoadingStarted(); + +	// First, make a folder in the My Outfits directory. +	const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +	llsd_func_type func = boost::bind(&LLAppearanceMgr::onOutfitFolderCreated,this,_1,show_panel); +	gInventory.createNewCategory( +		parent_id, +		LLFolderType::FT_OUTFIT, +		new_folder_name, +		func);  }  void LLAppearanceMgr::wearBaseOutfit() diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index a257f30ea5..d4993780aa 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -186,7 +186,9 @@ public:  	void removeItemFromAvatar(const LLUUID& item_id); -	LLUUID makeNewOutfitLinks(const std::string& new_folder_name,bool show_panel = true); +	void onOutfitFolderCreated(const LLSD& result, bool show_panel); +	void onOutfitFolderCreatedAndClothingOrdered(const LLSD& result, bool show_panel); +	void makeNewOutfitLinks(const std::string& new_folder_name, bool show_panel = true);  	bool moveWearable(LLViewerInventoryItem* item, bool closer_to_body); diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index 4bfef8b45f..1c086976ba 100755 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -162,21 +162,17 @@ void LLFloaterOpenObject::moveToInventory(bool wear)  	{  		parent_category_id = gInventory.getRootFolderID();  	} -	 -	LLCategoryCreate* cat_data = new LLCategoryCreate(object_id, wear); -	 + +	llsd_func_type func = boost::bind(LLFloaterOpenObject::callbackCreateInventoryCategory,_1,object_id,wear);  	LLUUID category_id = gInventory.createNewCategory(parent_category_id,   													  LLFolderType::FT_NONE,   													  name, -													  callbackCreateInventoryCategory, -													  (void*)cat_data); +													  func);  	//If we get a null category ID, we are using a capability in createNewCategory and we will  	//handle the following in the callbackCreateInventoryCategory routine.  	if ( category_id.notNull() )  	{ -		delete cat_data; -		  		LLCatAndWear* data = new LLCatAndWear;  		data->mCatID = category_id;  		data->mWear = wear; @@ -198,20 +194,18 @@ void LLFloaterOpenObject::moveToInventory(bool wear)  }  // static -void LLFloaterOpenObject::callbackCreateInventoryCategory(const LLSD& result, void* data) +void LLFloaterOpenObject::callbackCreateInventoryCategory(const LLSD& result, LLUUID object_id, bool wear)  { -	LLCategoryCreate* cat_data = (LLCategoryCreate*)data; -	 -	LLUUID category_id = result["folder_id"].asUUID();  	LLCatAndWear* wear_data = new LLCatAndWear; +	LLUUID category_id = result["folder_id"].asUUID();  	wear_data->mCatID = category_id; -	wear_data->mWear = cat_data->mWear; +	wear_data->mWear = wear;  	wear_data->mFolderResponded = true;  	// Copy and/or move the items into the newly created folder.  	// Ignore any "you're going to break this item" messages. -	BOOL success = move_inv_category_world_to_agent(cat_data->mObjectID, category_id, TRUE, +	BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,  													callbackMoveInventory,   													(void*)wear_data);  	if (!success) @@ -221,7 +215,6 @@ void LLFloaterOpenObject::callbackCreateInventoryCategory(const LLSD& result, vo  		LLNotificationsUtil::add("OpenObjectCannotCopy");  	} -	delete cat_data;	  }  // static diff --git a/indra/newview/llfloateropenobject.h b/indra/newview/llfloateropenobject.h index bf7fe69c65..1d7eecd107 100755 --- a/indra/newview/llfloateropenobject.h +++ b/indra/newview/llfloateropenobject.h @@ -45,15 +45,6 @@ public:  	void dirty(); -	class LLCategoryCreate -	{ -		public: -			LLCategoryCreate(LLUUID object_id, bool wear) : mObjectID(object_id), mWear(wear) {} -		public: -			LLUUID mObjectID; -			bool mWear; -	}; -	  	struct LLCatAndWear  	{  		LLUUID mCatID; @@ -72,7 +63,7 @@ protected:  	void onClickMoveToInventory();  	void onClickMoveAndWear(); -	static void callbackCreateInventoryCategory(const LLSD& result, void* data); +	static void callbackCreateInventoryCategory(const LLSD& result, LLUUID object_id, bool wear);  	static void callbackMoveInventory(S32 result, void* data);  private: diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index aadf87ab35..82d58523ce 100755 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -472,11 +472,9 @@ class LLCreateInventoryCategoryResponder : public LLHTTPClient::Responder  	LOG_CLASS(LLCreateInventoryCategoryResponder);  public:  	LLCreateInventoryCategoryResponder(LLInventoryModel* model,  -									   void (*callback)(const LLSD&, void*), -									   void* user_data) : -										mModel(model), -										mCallback(callback),  -										mData(user_data)  +									   boost::optional<llsd_func_type> callback): +		mModel(model), +		mCallback(callback)   	{  	} @@ -497,7 +495,7 @@ protected:  		}  		LLUUID category_id = content["folder_id"].asUUID(); -		 +		LL_DEBUGS("Avatar") << ll_pretty_print_sd(content) << llendl;  		// Add the category to the internal representation  		LLPointer<LLViewerInventoryCategory> cat =  		new LLViewerInventoryCategory( category_id,  @@ -510,17 +508,15 @@ protected:  		LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);  		mModel->accountForUpdate(update);  		mModel->updateCategory(cat); -		 -		if (mCallback && mData) + +		if (mCallback)  		{ -			mCallback(content, mData); +			mCallback.get()(content);  		} -		  	}  private: -	void (*mCallback)(const LLSD&, void*); -	void* mData; +	boost::optional<llsd_func_type> mCallback;  	LLInventoryModel* mModel;  }; @@ -531,8 +527,7 @@ private:  LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,  										   LLFolderType::EType preferred_type,  										   const std::string& pname, -										   void (*callback)(const LLSD&, void*),	//Default to NULL -										   void* user_data)							//Default to NULL +										   boost::optional<llsd_func_type> callback)  {  	LLUUID id; @@ -559,33 +554,32 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,  		name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type));  	} -	if ( callback && user_data )  //callback required for acked message. +	LLViewerRegion* viewer_region = gAgent.getRegion(); +	std::string url; +	if ( viewer_region ) +		url = viewer_region->getCapability("CreateInventoryCategory"); +	 +	if (!url.empty() && callback.get_ptr())  	{ -		LLViewerRegion* viewer_region = gAgent.getRegion(); -		std::string url; -		if ( viewer_region ) -			url = viewer_region->getCapability("CreateInventoryCategory"); +		//Let's use the new capability. -		if (!url.empty()) -		{ -			//Let's use the new capability. -			 -			LLSD request, body; -			body["folder_id"] = id; -			body["parent_id"] = parent_id; -			body["type"] = (LLSD::Integer) preferred_type; -			body["name"] = name; -			 -			request["message"] = "CreateInventoryCategory"; -			request["payload"] = body; -			 -	//		viewer_region->getCapAPI().post(request); -			LLHTTPClient::post( -							   url, -							   body, -							   new LLCreateInventoryCategoryResponder(this, callback, user_data) ); -			return LLUUID::null; -		} +		LLSD request, body; +		body["folder_id"] = id; +		body["parent_id"] = parent_id; +		body["type"] = (LLSD::Integer) preferred_type; +		body["name"] = name; +		 +		request["message"] = "CreateInventoryCategory"; +		request["payload"] = body; + +		LL_DEBUGS("Avatar") << "create category request: " << ll_pretty_print_sd(request) << llendl; +		//		viewer_region->getCapAPI().post(request); +		LLHTTPClient::post( +			url, +			body, +			new LLCreateInventoryCategoryResponder(this, callback) ); + +		return LLUUID::null;  	}  	// Add the category to the internal representation diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 5de951ed05..f28211cfa1 100755 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -34,6 +34,7 @@  #include "llhttpclient.h"  #include "lluuid.h"  #include "llpermissionsflags.h" +#include "llviewerinventory.h"  #include "llstring.h"  #include "llmd5.h"  #include <map> @@ -45,14 +46,9 @@ class LLInventoryObserver;  class LLInventoryObject;  class LLInventoryItem;  class LLInventoryCategory; -class LLViewerInventoryItem; -class LLViewerInventoryCategory; -class LLViewerInventoryItem; -class LLViewerInventoryCategory;  class LLMessageSystem;  class LLInventoryCollectFunctor; -  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // LLInventoryModel  // @@ -394,8 +390,7 @@ public:  	LLUUID createNewCategory(const LLUUID& parent_id,  							 LLFolderType::EType preferred_type,  							 const std::string& name, -							 void (*callback)(const LLSD&, void*) = NULL, -							 void* user_data = NULL ); +							 boost::optional<llsd_func_type> callback = boost::optional<llsd_func_type>());  protected:  	// Internal methods that add inventory and make sure that all of  	// the internal data structures are consistent. These methods diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index d6c927ab58..21b77ef471 100755 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -184,7 +184,7 @@ bool LLPanelOutfitsInventory::onSaveCommit(const LLSD& notification, const LLSD&  		LLStringUtil::trim(outfit_name);  		if( !outfit_name.empty() )  		{ -			LLUUID outfit_folder = LLAppearanceMgr::getInstance()->makeNewOutfitLinks(outfit_name); +			LLAppearanceMgr::getInstance()->makeNewOutfitLinks(outfit_name);  			LLSidepanelAppearance* panel_appearance = getAppearanceSP();  			if (panel_appearance) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 8890df199b..84d42c6345 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2613,10 +2613,10 @@ void LLStartUp::saveInitialOutfit()  	if (sWearablesLoadedCon.connected())  	{ -		lldebugs << "sWearablesLoadedCon is connected, disconnecting" << llendl; +		LL_DEBUGS("Avatar") << "sWearablesLoadedCon is connected, disconnecting" << llendl;  		sWearablesLoadedCon.disconnect();  	} -	lldebugs << "calling makeNewOutfitLinks( \"" << sInitialOutfit << "\" )" << llendl; +	LL_DEBUGS("Avatar") << "calling makeNewOutfitLinks( \"" << sInitialOutfit << "\" )" << llendl;  	LLAppearanceMgr::getInstance()->makeNewOutfitLinks(sInitialOutfit,false);  } diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 26aecd39d1..9725ea6456 100755 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -69,8 +69,9 @@  #include "llclipboard.h"  #include "llhttpretrypolicy.h" -// Two do-nothing ops for use in callbacks. +// do-nothing ops for use in callbacks.  void no_op_inventory_func(const LLUUID&) {}  +void no_op_llsd_func(const LLSD&) {}  void no_op() {}  ///---------------------------------------------------------------------------- diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 032efd9542..de1f3daa1e 100755 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -263,9 +263,11 @@ private:  };  typedef boost::function<void(const LLUUID&)> inventory_func_type; -void no_op_inventory_func(const LLUUID&); // A do-nothing inventory_func - +typedef boost::function<void(const LLSD&)> llsd_func_type;  typedef boost::function<void()> nullary_func_type; + +void no_op_inventory_func(const LLUUID&); // A do-nothing inventory_func +void no_op_llsd_func(const LLSD&); // likewise for LLSD  void no_op(); // A do-nothing nullary func.  // Shim between inventory callback and boost function/callable | 
