diff options
| author | Nyx Linden <nyx@lindenlab.com> | 2013-02-28 17:26:14 -0500 | 
|---|---|---|
| committer | Nyx Linden <nyx@lindenlab.com> | 2013-02-28 17:26:14 -0500 | 
| commit | 3005bdf7aa628953bf640c1ab69ea7299b5876b1 (patch) | |
| tree | 3dead4cf3b5d4108a963cfb0fded739bd74422e0 | |
| parent | d1c144519306cae7eff7f781417482c85068988c (diff) | |
| parent | 105c286bf3906a17d4c8560573e81b09fc29086b (diff) | |
merge
| -rwxr-xr-x | indra/newview/app_settings/settings.xml | 11 | ||||
| -rwxr-xr-x | indra/newview/llagent.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.cpp | 208 | ||||
| -rwxr-xr-x | indra/newview/llappearancemgr.h | 10 | ||||
| -rwxr-xr-x | indra/newview/llfloatersidepanelcontainer.cpp | 24 | ||||
| -rwxr-xr-x | indra/newview/llinventorymodel.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llinventorymodelbackgroundfetch.cpp | 28 | ||||
| -rwxr-xr-x | indra/newview/llpaneleditwearable.cpp | 28 | ||||
| -rw-r--r-- | indra/newview/llpaneleditwearable.h | 12 | ||||
| -rw-r--r-- | indra/newview/llstartup.cpp | 9 | ||||
| -rwxr-xr-x | indra/newview/llviewerinventory.cpp | 19 | ||||
| -rwxr-xr-x | indra/newview/llviewerinventory.h | 8 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.cpp | 81 | ||||
| -rw-r--r-- | indra/newview/llviewerregion.h | 5 | ||||
| -rwxr-xr-x | indra/newview/llvoavatar.cpp | 57 | ||||
| -rwxr-xr-x | indra/newview/llvoavatar.h | 7 | ||||
| -rwxr-xr-x | indra/newview/llvoavatarself.cpp | 2 | 
17 files changed, 426 insertions, 98 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5db8d4e6a1..826a79b455 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1982,6 +1982,17 @@        <key>Value</key>        <integer>1</integer>      </map> +    <key>DebugForceAppearanceRequestFailure</key> +    <map> +      <key>Comment</key> +      <string>Request wrong cof version to test the failure path for server appearance update requests.</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>DebugHideEmptySystemFolders</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 48faeb81e0..99b79aadc4 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -4292,10 +4292,6 @@ void LLAgent::requestLeaveGodMode()  	sendReliableMessage();  } -extern void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value); -extern std::string get_sequential_numbered_file_name(const std::string& prefix, -													 const std::string& suffix); -  // For debugging, trace agent state at times appearance message are sent out.  void LLAgent::dumpSentAppearance(const std::string& dump_prefix)  { diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 23a908c0ff..6c3858b947 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -50,6 +50,7 @@  #include "llviewerregion.h"  #include "llwearablelist.h"  #include "llsdutil.h" +#include "llsdserialize.h"  std::string self_av_string()  { @@ -210,7 +211,7 @@ public:  	void addItem(const LLUUID& item_id)  	{  		LL_DEBUGS("Avatar") << "item_id " << item_id << llendl; - +		  		if (!requestOperation(item_id))  		{  			LL_DEBUGS("Avatar") << "item_id " << item_id << " requestOperation false, skipping" << llendl; @@ -1691,7 +1692,7 @@ void LLAppearanceMgr::purgeCategory(const LLUUID& category, bool keep_outfit_lin  				gInventory.purgeObject(item->getUUID());  			}  #else -		gInventory.purgeObject(item->getUUID()); +			gInventory.purgeObject(item->getUUID());  		}  #endif  	} @@ -1805,8 +1806,6 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)  	removeDuplicateItems(gest_items);  	// Create links to new COF contents. -	LL_DEBUGS("Avatar") << self_av_string() << "creating LLCallAfterInventoryLinkMgr" << LL_ENDL; -  	LLInventoryModel::item_array_t all_items;  	all_items += body_items;  	all_items += wear_items; @@ -1820,7 +1819,7 @@ void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)  	// Add link to outfit if category is an outfit.   	if (!append)  	{ -		createBaseOutfitLink(category, NULL); +		createBaseOutfitLink(category, link_waiter);  	}  	// Remove current COF contents.  Have to do this after creating @@ -3031,7 +3030,7 @@ class RequestAgentUpdateAppearanceResponder: public LLHTTPClient::Responder  public:  	RequestAgentUpdateAppearanceResponder()  	{ -		mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 16.0, 2.0, 5); +		mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 32.0, 2.0, 10);  	}  	virtual ~RequestAgentUpdateAppearanceResponder() @@ -3045,6 +3044,10 @@ public:  		if (content["success"].asBoolean())  		{  			LL_DEBUGS("Avatar") << "OK" << LL_ENDL; +			if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) +			{ +				dumpContents(gAgentAvatarp->getFullname() + "_appearance_request_ok", content); +			}  		}  		else  		{ @@ -3055,8 +3058,13 @@ public:  	// Error  	/*virtual*/ void errorWithContent(U32 status, const std::string& reason, const LLSD& content)  	{ -		llwarns << "appearance update request failed, status: " << status << " reason: " << reason << llendl; -		LL_DEBUGS("Avatar") << "content: " << ll_pretty_print_sd(content) << LL_ENDL; +		llwarns << "appearance update request failed, status: " << status << " reason: " << reason << " code: " << content["code"].asInteger() << " error: \"" << content["error"].asString() << "\"" << llendl; +		if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) +		{ +			dumpContents(gAgentAvatarp->getFullname() + "_appearance_request_error", content); +			debugCOF(content); +		 +		}  		onFailure(status);  	}	 @@ -3075,11 +3083,109 @@ public:  		{  			llwarns << "giving up after too many retries" << llendl;  		} +	}	 + +	void dumpContents(const std::string outprefix, const LLSD& content) +	{ +		std::string outfilename = get_sequential_numbered_file_name(outprefix,".xml"); +		std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); +		std::ofstream ofs(fullpath.c_str(), std::ios_base::out); +		ofs << LLSDOStreamer<LLSDXMLFormatter>(content, LLSDFormatter::OPTIONS_PRETTY); +		LL_DEBUGS("Avatar") << "results saved to: " << fullpath << LL_ENDL; +	} + +	void debugCOF(const LLSD& content) +	{ +		LL_DEBUGS("Avatar") << "AIS COF, version found: " << content["expected"].asInteger() << llendl; +		std::set<LLUUID> ais_items, local_items; +		const LLSD& cof_raw = content["cof_raw"]; +		for (LLSD::array_const_iterator it = cof_raw.beginArray(); +			 it != cof_raw.endArray(); ++it) +		{ +			const LLSD& item = *it; +			if (item["parent_id"].asUUID() == LLAppearanceMgr::instance().getCOF()) +			{ +				ais_items.insert(item["item_id"].asUUID()); +				if (item["type"].asInteger() == 24) // link +				{ +					LL_DEBUGS("Avatar") << "Link: item_id: " << item["item_id"].asUUID() +										<< " linked_item_id: " << item["asset_id"].asUUID() +										<< " name: " << item["name"].asString() +										<< llendl;  +				} +				else if (item["type"].asInteger() == 25) // folder link +				{ +					LL_DEBUGS("Avatar") << "Folder link: item_id: " << item["item_id"].asUUID() +										<< " linked_item_id: " << item["asset_id"].asUUID() +										<< " name: " << item["name"].asString() +										<< llendl;  +					 +				} +				else +				{ +					LL_DEBUGS("Avatar") << "Other: item_id: " << item["item_id"].asUUID() +										<< " linked_item_id: " << item["asset_id"].asUUID() +										<< " name: " << item["name"].asString() +										<< llendl;  +				} +			} +		} +		LL_DEBUGS("Avatar") << llendl; +		LL_DEBUGS("Avatar") << "Local COF, version requested: " << content["observed"].asInteger() << llendl; +		LLInventoryModel::cat_array_t cat_array; +		LLInventoryModel::item_array_t item_array; +		gInventory.collectDescendents(LLAppearanceMgr::instance().getCOF(), +									  cat_array,item_array,LLInventoryModel::EXCLUDE_TRASH); +		for (S32 i=0; i<item_array.count(); i++) +		{ +			const LLViewerInventoryItem* inv_item = item_array.get(i).get(); +			local_items.insert(inv_item->getUUID()); +			LL_DEBUGS("Avatar") << "item_id: " << inv_item->getUUID() +								<< " linked_item_id: " << inv_item->getLinkedUUID() +								<< " name: " << inv_item->getName() +								<< llendl; +		} +		LL_DEBUGS("Avatar") << llendl; +		for (std::set<LLUUID>::iterator it = local_items.begin(); it != local_items.end(); ++it) +		{ +			if (ais_items.find(*it) == ais_items.end()) +			{ +				LL_DEBUGS("Avatar") << "LOCAL ONLY: " << *it << llendl; +			} +		} +		for (std::set<LLUUID>::iterator it = ais_items.begin(); it != ais_items.end(); ++it) +		{ +			if (local_items.find(*it) == local_items.end()) +			{ +				LL_DEBUGS("Avatar") << "AIS ONLY: " << *it << llendl; +			} +		}  	}  	LLPointer<LLHTTPRetryPolicy> mRetryPolicy;  }; +LLSD LLAppearanceMgr::dumpCOF() const +{ +	LLSD result = LLSD::emptyArray(); +	 +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t item_array; +	gInventory.collectDescendents(getCOF(),cat_array,item_array,LLInventoryModel::EXCLUDE_TRASH); +	for (S32 i=0; i<item_array.count(); i++) +	{ +		const LLViewerInventoryItem* inv_item = item_array.get(i).get(); +		LLSD item; +		item["item_id"] = inv_item->getUUID(); +		item["linked_item_id"] = inv_item->getLinkedUUID(); +		item["name"] = inv_item->getName(); +		item["description"] = inv_item->getActualDescription(); +		item["type"] = inv_item->getActualType(); +		result.append(item); +	} +	return result; +} +  void LLAppearanceMgr::requestServerAppearanceUpdate(LLCurl::ResponderPtr responder_ptr)  {  	if (gAgentAvatarp->isEditingAppearance())  @@ -3091,6 +3197,7 @@ void LLAppearanceMgr::requestServerAppearanceUpdate(LLCurl::ResponderPtr respond  	if (!gAgent.getRegion())  	{  		llwarns << "Region not set, cannot request server appearance update" << llendl; +		return;  	}  	if (gAgent.getRegion()->getCentralBakeVersion()==0)  	{ @@ -3106,7 +3213,15 @@ void LLAppearanceMgr::requestServerAppearanceUpdate(LLCurl::ResponderPtr respond  	LLSD body;  	S32 cof_version = getCOFVersion();  	body["cof_version"] = cof_version; -	LL_DEBUGS("Avatar") << "my_cof_version " << cof_version << llendl; +	if (gSavedSettings.getBOOL("DebugForceAppearanceRequestFailure")) +	{ +		body["cof_version"] = cof_version+999; +	} +	if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) +	{ +		body["debug_cof"] = dumpCOF(); 	 +	} +	LL_DEBUGS("Avatar") << "request url " << url << " my_cof_version " << cof_version << llendl;  	//LLCurl::ResponderPtr responder_ptr;  	if (!responder_ptr.get()) @@ -3118,6 +3233,81 @@ void LLAppearanceMgr::requestServerAppearanceUpdate(LLCurl::ResponderPtr respond  	mLastUpdateRequestCOFVersion = cof_version;  } +class LLIncrementCofVersionResponder : public LLHTTPClient::Responder +{ +public: +	LLIncrementCofVersionResponder() : LLHTTPClient::Responder() +	{ +		mRetryPolicy = new LLAdaptiveRetryPolicy(1.0, 16.0, 2.0, 5); +	} + +	virtual ~LLIncrementCofVersionResponder() +	{ +	} + +	virtual void result(const LLSD &pContent) +	{ +		llinfos << "Successfully incremented agent's COF." << llendl; +		S32 new_version = pContent["category"]["version"].asInteger(); + +		LLAppearanceMgr* app_mgr = LLAppearanceMgr::getInstance(); + +		// cof_version should have increased +		llassert(new_version > app_mgr->mLastUpdateRequestCOFVersion); + +		app_mgr->mLastUpdateRequestCOFVersion = new_version; +	} +	virtual void error(U32 pStatus, const std::string& pReason) +	{ +		llwarns << "While attempting to increment the agent's cof we got an error because '" +			<< pReason << "' [status:" << pStatus << "]" << llendl; +		F32 seconds_to_wait; +		if (mRetryPolicy->shouldRetry(pStatus,seconds_to_wait)) +		{ +			llinfos << "retrying" << llendl; +			doAfterInterval(boost::bind(&LLAppearanceMgr::incrementCofVersion, +										LLAppearanceMgr::getInstance(), +										LLHTTPClient::ResponderPtr(this)), +										seconds_to_wait); +		} +		else +		{ +			llwarns << "giving up after too many retries" << llendl; +		} +	} + +	LLPointer<LLHTTPRetryPolicy> mRetryPolicy; +}; + +void LLAppearanceMgr::incrementCofVersion(LLHTTPClient::ResponderPtr responder_ptr) +{ +	// If we don't have a region, report it as an error +	if (gAgent.getRegion() == NULL) +	{ +		llwarns << "Region not set, cannot request cof_version increment" << llendl; +		return; +	} + +	std::string url = gAgent.getRegion()->getCapability("IncrementCofVersion"); +	if (url.empty()) +	{ +		llwarns << "No cap for IncrementCofVersion." << llendl; +		return; +	} + +	llinfos << "Requesting cof_version be incremented via capability to: " +			<< url << llendl; +	LLSD headers; +	LLSD body = LLSD::emptyMap(); + +	if (!responder_ptr.get()) +	{ +		responder_ptr = LLHTTPClient::ResponderPtr(new LLIncrementCofVersionResponder()); +	} + +	LLHTTPClient::get(url, body, responder_ptr, headers, 30.0f); +} +  void show_created_outfit(LLUUID& folder_id, bool show_panel = true)  {  	if (!LLApp::isRunning()) diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 1a1ca1ca7d..84e08db4c8 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -94,6 +94,9 @@ public:  	const LLUUID getCOF() const;  	S32 getCOFVersion() const; +	// Debugging - get truncated LLSD summary of COF contents. +	LLSD dumpCOF() const; +  	// COF version of last viewer-initiated appearance update request.  	S32 mLastUpdateRequestCOFVersion;  	S32 getLastUpdateRequestCOFVersion() const; @@ -141,7 +144,7 @@ public:  	// Find COF entries referencing the given item.  	LLInventoryModel::item_array_t findCOFItemLinks(const LLUUID& item_id); -	 +  	// Remove COF entries  	void removeCOFItemLinks(const LLUUID& item_id);  	void removeCOFLinksOfType(LLWearableType::EType type); @@ -197,6 +200,11 @@ public:  	void requestServerAppearanceUpdate(LLCurl::ResponderPtr responder_ptr = NULL); +	void incrementCofVersion(LLHTTPClient::ResponderPtr responder_ptr = NULL); + +	// *HACK Remove this after server side texture baking is deployed on all sims. +	void incrementCofVersionLegacy(); +  protected:  	LLAppearanceMgr();  	~LLAppearanceMgr(); diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 02150819a0..ce5ea66471 100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -59,30 +59,22 @@ void LLFloaterSidePanelContainer::onOpen(const LLSD& key)  void LLFloaterSidePanelContainer::onClickCloseBtn()  { -	llinfos << "close clicked" << llendl; -  	LLPanelOutfitEdit* panel_outfit_edit =  		dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); -	if (panel_outfit_edit && panel_outfit_edit->getVisible()) +	if (panel_outfit_edit)  	{  		LLFloater *parent = gFloaterView->getParentFloater(panel_outfit_edit); -		if (parent == this) +		if (parent == this )  		{ -			LLSidepanelAppearance* panel_appearance = -				dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance")); -			panel_appearance->showOutfitsInventoryPanel(); +			LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance")); +			if ( panel_appearance ) +			{ +				panel_appearance->getWearable()->onClose(); +				panel_appearance->showOutfitsInventoryPanel(); +			}  		}  	} -	if ( panel_outfit_edit ) -	{ -		LLSidepanelAppearance* panel_appearance = dynamic_cast<LLSidepanelAppearance*>(getPanel("appearance")); -		if ( panel_appearance ) -		{ -			panel_appearance->getWearable()->onClose(); -			panel_appearance->showOutfitsInventoryPanel(); -		} -	}  	LLFloater::onClickCloseBtn();  } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index ac1f40b486..f0bfc68866 100755 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -1922,7 +1922,18 @@ bool LLInventoryModel::loadSkeleton(  			for(cat_set_t::iterator it = temp_cats.begin(); it != temp_cats.end(); ++it)  			{  				LLViewerInventoryCategory *llvic = (*it); +#if 0  				llvic->setVersion(NO_VERSION); +#else // SH-3860 WIP +				if (llvic->getPreferredType()==LLFolderType::FT_CURRENT_OUTFIT && llvic->getVersion()==1) +				{ +					llinfos << "preserving empty COF for first-time login" << llendl; +				} +				else +				{ +					llvic->setVersion(NO_VERSION); +				} +#endif  				addCategory(*it);  			}  		} diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index eb92902de9..024d34519f 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -564,7 +564,6 @@ BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat  {  	return (std::find(mRecursiveCatUUIDs.begin(),mRecursiveCatUUIDs.end(), cat_id) != mRecursiveCatUUIDs.end());  } -  // Bundle up a bunch of requests to send all at once.  // static     void LLInventoryModelBackgroundFetch::bulkFetch() @@ -687,20 +686,23 @@ void LLInventoryModelBackgroundFetch::bulkFetch()  	{  		if (folder_count)  		{ -			std::string url = region->getCapability("FetchInventoryDescendents2");    -			mFetchCount++; -			if (folder_request_body["folders"].size()) -			{ -				LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body, recursive_cats); -				LLHTTPClient::post(url, folder_request_body, fetcher, 300.0); -			} -			if (folder_request_body_lib["folders"].size()) +			std::string url = region->getCapability("FetchInventoryDescendents2");   			 +			if ( !url.empty() )  			{ -				std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents2"); +				mFetchCount++; +				if (folder_request_body["folders"].size()) +				{ +					LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body, recursive_cats); +					LLHTTPClient::post(url, folder_request_body, fetcher, 300.0); +				} +				if (folder_request_body_lib["folders"].size()) +				{ +					std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents2"); -				LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body_lib, recursive_cats); -				LLHTTPClient::post(url_lib, folder_request_body_lib, fetcher, 300.0); -			} +					LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(folder_request_body_lib, recursive_cats); +					LLHTTPClient::post(url_lib, folder_request_body_lib, fetcher, 300.0); +				} +			}					  		}  		if (item_count)  		{ diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index 52b5481976..a49bbcd924 100755 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -52,6 +52,7 @@  #include "lltexturectrl.h"  #include "lltextureentry.h"  #include "llviewercontrol.h"    // gSavedSettings +#include "llviewerregion.h"  #include "llviewertexturelist.h"  #include "llagentcamera.h"  #include "llmorphview.h" @@ -882,8 +883,8 @@ void LLPanelEditWearable::setWearable(LLViewerWearable *wearable, BOOL disable_c  //static   void LLPanelEditWearable::onBackButtonClicked(void* userdata) -{	 -	LLPanelEditWearable *panel = (LLPanelEditWearable*) userdata;     +{ +    LLPanelEditWearable *panel = (LLPanelEditWearable*) userdata;  	if ( panel->isDirty() )  	{  		LLAppearanceMgr::instance().setOutfitDirty( true );		 @@ -1045,6 +1046,11 @@ void LLPanelEditWearable::updatePanelPickerControls(LLWearableType::EType type)          }  } +void LLPanelEditWearable::incrementCofVersionLegacy() +{ + +} +  void LLPanelEditWearable::saveChanges(bool force_save_as)  {          if (!mWearablePtr || !isDirty()) @@ -1073,10 +1079,10 @@ void LLPanelEditWearable::saveChanges(bool force_save_as)          if (force_save_as)          { -			// the name of the wearable has changed, re-save wearable with new name -			LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID()); +                // the name of the wearable has changed, re-save wearable with new name +                LLAppearanceMgr::instance().removeCOFItemLinks(mWearablePtr->getItemID());  			gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, new_name, description, FALSE); -			mNameEditor->setText(mWearableItem->getName()); +                mNameEditor->setText(mWearableItem->getName());          }          else          { @@ -1096,8 +1102,18 @@ void LLPanelEditWearable::saveChanges(bool force_save_as)  				// Remove old link  				gInventory.purgeObject(link_item->getUUID());  			} -			gAgentWearables.saveWearable(mWearablePtr->getType(), index, TRUE, new_name); +                gAgentWearables.saveWearable(mWearablePtr->getType(), index, TRUE, new_name);          } + +	if (gAgent.getRegion() && gAgent.getRegion()->getCentralBakeVersion() > 0) +	{ +		LLAppearanceMgr::getInstance()->incrementCofVersion(); +	} +	else +	{ +		// *HACK This should be removed when all regions support the IncrementCOFVersion capability. +		incrementCofVersionLegacy(); +	}  }  void LLPanelEditWearable::revertChanges() diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h index ac4344de2e..6533d55f2f 100644 --- a/indra/newview/llpaneleditwearable.h +++ b/indra/newview/llpaneleditwearable.h @@ -78,7 +78,6 @@ public:  	virtual void		setVisible(BOOL visible); -  private:  	typedef std::map<F32, LLViewerVisualParam*> value_map_t; @@ -96,7 +95,7 @@ private:  	void				toggleTypeSpecificControls(LLWearableType::EType type);  	void				updateTypeSpecificControls(LLWearableType::EType type); -	//alpha mask checkboxes +	// alpha mask checkboxes  	void configureAlphaCheckbox(LLAvatarAppearanceDefines::ETextureIndex te, const std::string& name);  	void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLAvatarAppearanceDefines::ETextureIndex te);  	void updateAlphaCheckboxes(); @@ -106,7 +105,7 @@ private:  	// callback for HeightUnits parameter.  	bool changeHeightUnits(const LLSD& new_value); -	// updates current metric and replacemet metric label text +	// updates current metric and replacement metric label text  	void updateMetricLayout(BOOL new_value);  	// updates avatar height label @@ -116,6 +115,9 @@ private:  	void setWearablePanelVisibilityChangeCallback(LLPanel* bodypart_panel); +	// *HACK Remove this when serverside texture baking is available on all regions. +	void incrementCofVersionLegacy(); +  	// the pointer to the wearable we're editing. NULL means we're not editing a wearable.  	LLViewerWearable *mWearablePtr;  	LLViewerInventoryItem* mWearableItem; @@ -130,7 +132,7 @@ private:  	LLTextBox *mTxtAvatarHeight; -	// localized and parametrized strings that used to build avatar_height_label +	// localized and parameterized strings that used to build avatar_height_label  	std::string mMeters;  	std::string mFeet;  	std::string mHeigth; @@ -153,7 +155,7 @@ private:  	LLPanel *mPanelEyes;  	LLPanel *mPanelHair; -	//clothes +	// clothes  	LLPanel *mPanelShirt;  	LLPanel *mPanelPants;  	LLPanel *mPanelShoes; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 9d0df5e83e..717f578ddb 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2572,12 +2572,21 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,  	}  	else  	{ +		// FIXME SH-3860 - this creates a race condition, where COF +		// changes (base outfit link added) after appearance update +		// request has been submitted.  		sWearablesLoadedCon = gAgentWearables.addLoadedCallback(LLStartUp::saveInitialOutfit);  		bool do_copy = true;  		bool do_append = false;  		LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); +#if 0 // SH-3860 WIP +		// Need to fetch cof contents before we can wear. +		callAfterCategoryFetch(LLAppearanceMgr::instance().getCOF(), +							   boost::bind(&LLAppearanceMgr::wearInventoryCategory, LLAppearanceMgr::getInstance(), cat, do_copy, do_append)); +#else  		LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append); +#endif  		lldebugs << "initial outfit category id: " << cat_id << llendl;  	} diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index d6f0874a58..59efcfa7fa 100755 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -592,7 +592,7 @@ void LLViewerInventoryCategory::copyViewerCategory(const LLViewerInventoryCatego  {  	copyCategory(other);  	mOwnerID = other->mOwnerID; -	mVersion = other->mVersion; +	setVersion(other->getVersion());  	mDescendentCount = other->mDescendentCount;  	mDescendentsRequested = other->mDescendentsRequested;  } @@ -660,9 +660,19 @@ void LLViewerInventoryCategory::removeFromServer( void )  	gAgent.sendReliableMessage();  } +S32 LLViewerInventoryCategory::getVersion() const +{ +	return mVersion; +} + +void LLViewerInventoryCategory::setVersion(S32 version) +{ +	mVersion = version; +} +  bool LLViewerInventoryCategory::fetch()  { -	if((VERSION_UNKNOWN == mVersion) +	if((VERSION_UNKNOWN == getVersion())  	   && mDescendentsRequested.hasExpired())	//Expired check prevents multiple downloads.  	{  		LL_DEBUGS("InventoryFetch") << "Fetching category children: " << mName << ", UUID: " << mUUID << LL_ENDL; @@ -1127,6 +1137,11 @@ void link_inventory_item(  		}  	} +#if 1 // debugging stuff +	LLViewerInventoryCategory* cat = gInventory.getCategory(parent_id); +	lldebugs << "cat: " << cat << llendl; +	 +#endif  	LLMessageSystem* msg = gMessageSystem;  	msg->newMessageFast(_PREHASH_LinkInventoryItem);  	msg->nextBlock(_PREHASH_AgentData); diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 13e95c57cb..6fb0fd0153 100755 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -205,13 +205,13 @@ public:  	// Version handling  	enum { VERSION_UNKNOWN = -1, VERSION_INITIAL = 1 }; -	S32 getVersion() const { return mVersion; } -	void setVersion(S32 version) { mVersion = version; } +	S32 getVersion() const; +	void setVersion(S32 version);  	// Returns true if a fetch was issued.  	bool fetch(); -	// used to help make cacheing more robust - for example, if +	// used to help make caching more robust - for example, if  	// someone is getting 4 packets but logs out after 3. the viewer  	// may never know the cache is wrong.  	enum { DESCENDENT_COUNT_UNKNOWN = -1 }; @@ -219,7 +219,7 @@ public:  	void setDescendentCount(S32 descendents) { mDescendentCount = descendents; }  	// file handling on the viewer. These are not meant for anything -	// other than cacheing. +	// other than caching.  	bool exportFileLocal(LLFILE* fp) const;  	bool importFileLocal(LLFILE* fp);  	void determineFolderType(); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index d60ec04578..e940dda010 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -142,7 +142,8 @@ public:  	LLUUID mCacheID;  	CapabilityMap mCapabilities; -	 +	CapabilityMap mSecondCapabilitiesTracker;  +  	LLEventPoll* mEventPoll;  	S32 mSeedCapMaxAttempts; @@ -219,7 +220,7 @@ public:  		}      } -    void result(const LLSD& content) +   void result(const LLSD& content)      {  		LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle);  		if(!regionp) //region was removed @@ -237,6 +238,7 @@ public:  		for(iter = content.beginMap(); iter != content.endMap(); ++iter)  		{  			regionp->setCapability(iter->first, iter->second); +			  			LL_DEBUGS2("AppInit", "Capabilities") << "got capability for "   				<< iter->first << LL_ENDL; @@ -265,6 +267,59 @@ private:  	S32 mID;  }; +class BaseCapabilitiesCompleteTracker :  public LLHTTPClient::Responder +{ +	LOG_CLASS(BaseCapabilitiesCompleteTracker); +public: +	BaseCapabilitiesCompleteTracker( U64 region_handle) +	: mRegionHandle(region_handle) +	{ } +	 +	virtual ~BaseCapabilitiesCompleteTracker() +	{ } + +	void error(U32 statusNum, const std::string& reason) +	{ } + +	void result(const LLSD& content) +	{ +		LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); +		if( !regionp )  +		{ +			return ; +		}		 +		LLSD::map_const_iterator iter; +		for(iter = content.beginMap(); iter != content.endMap(); ++iter) +		{ +			regionp->setCapabilityDebug(iter->first, iter->second);	 +			//llinfos<<"BaseCapabilitiesCompleteTracker New Caps "<<iter->first<<" "<< iter->second<<llendl; +		} +		 +		if ( regionp->getRegionImpl()->mCapabilities.size() != regionp->getRegionImpl()->mSecondCapabilitiesTracker.size() ) +		{ +			llinfos<<"BaseCapabilitiesCompleteTracker "<<"Sim sent duplicate seed caps that differs in size - most likely content."<<llendl;			 +			//todo#add cap debug versus original check? +			/*CapabilityMap::const_iterator iter = regionp->getRegionImpl()->mCapabilities.begin(); +			while (iter!=regionp->getRegionImpl()->mCapabilities.end() ) +			{ +				llinfos<<"BaseCapabilitiesCompleteTracker Original "<<iter->first<<" "<< iter->second<<llendl; +				++iter; +			} +			*/ +			regionp->getRegionImplNC()->mSecondCapabilitiesTracker.clear(); +		} + +	} + +	static BaseCapabilitiesCompleteTracker* build( U64 region_handle ) +	{ +		return new BaseCapabilitiesCompleteTracker( region_handle ); +	} + +private: +	U64 mRegionHandle;	 +}; +  LLViewerRegion::LLViewerRegion(const U64 &handle,  							   const LLHost &host, @@ -1529,11 +1584,12 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)  	capabilityNames.append("EventQueueGet");  	if (gSavedSettings.getBOOL("UseHTTPInventory")) -	{ +	{	  		capabilityNames.append("FetchLib2");  		capabilityNames.append("FetchLibDescendents2");  		capabilityNames.append("FetchInventory2");  		capabilityNames.append("FetchInventoryDescendents2"); +		capabilityNames.append("IncrementCOFVersion");  	}  	capabilityNames.append("GetDisplayNames"); @@ -1547,7 +1603,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)  	capabilityNames.append("LandResources");  	capabilityNames.append("MapLayer");  	capabilityNames.append("MapLayerGod"); -	capabilityNames.append("MeshUploadFlag"); +	capabilityNames.append("MeshUploadFlag");	  	capabilityNames.append("NavMeshGenerationStatus");  	capabilityNames.append("NewFileAgentInventory");  	capabilityNames.append("ObjectMedia"); @@ -1587,7 +1643,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)  	capabilityNames.append("ViewerMetrics");  	capabilityNames.append("ViewerStartAuction");  	capabilityNames.append("ViewerStats"); -	 +  	// Please add new capabilities alphabetically to reduce  	// merge conflicts.  } @@ -1595,8 +1651,14 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)  void LLViewerRegion::setSeedCapability(const std::string& url)  {  	if (getCapability("Seed") == url) -    { -		// llwarns << "Ignoring duplicate seed capability" << llendl; +    {	 +		//llwarns << "Ignoring duplicate seed capability" << llendl; +		//Instead of just returning we build up a second set of seed caps and compare them  +		//to the "original" seed cap received and determine why there is problem! +		LLSD capabilityNames = LLSD::emptyArray(); +		mImpl->buildCapabilityNames( capabilityNames ); +		LLHTTPClient::post( url, capabilityNames, BaseCapabilitiesCompleteTracker::build(getHandle() ), +							LLSD(), CAP_REQUEST_TIMEOUT );  		return;      } @@ -1732,6 +1794,11 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u  	}  } +void LLViewerRegion::setCapabilityDebug(const std::string& name, const std::string& url) +{ +	mImpl->mSecondCapabilitiesTracker[name] = url; +} +  bool LLViewerRegion::isSpecialCapabilityName(const std::string &name)  {  	return name == "EventQueueGet" || name == "UntrustedSimulatorMessage"; diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 20d96ad9ac..b5fe4677b7 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -241,6 +241,7 @@ public:  	void failedSeedCapability();  	S32 getNumSeedCapRetries();  	void setCapability(const std::string& name, const std::string& url); +	void setCapabilityDebug(const std::string& name, const std::string& url);  	// implements LLCapabilityProvider      virtual std::string getCapability(const std::string& name) const; @@ -339,7 +340,9 @@ public:  	void getNeighboringRegions( std::vector<LLViewerRegion*>& uniqueRegions );  	void getNeighboringRegionsStatus( std::vector<S32>& regions ); -	 +	const LLViewerRegionImpl * getRegionImpl() const { return mImpl; } +	LLViewerRegionImpl * getRegionImplNC() { return mImpl; } +  public:  	struct CompareDistance  	{ diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index aa90cbc5d2..f6fd8b2409 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -190,11 +190,6 @@ enum ERenderName  	RENDER_NAME_FADE  }; - -// Utility func - FIXME move out of avatar. -std::string get_sequential_numbered_file_name(const std::string& prefix, -											  const std::string& suffix); -  //-----------------------------------------------------------------------------  // Callback data  //----------------------------------------------------------------------------- @@ -215,6 +210,24 @@ struct LLTextureMaskData   **   **/ +struct LLAppearanceMessageContents +{ +	LLAppearanceMessageContents(): +		mAppearanceVersion(-1), +		mParamAppearanceVersion(-1), +		mCOFVersion(LLViewerInventoryCategory::VERSION_UNKNOWN) +	{ +	} +	LLTEContents mTEContents; +	S32 mAppearanceVersion; +	S32 mParamAppearanceVersion; +	S32 mCOFVersion; +	// For future use: +	//U32 appearance_flags = 0; +	std::vector<F32> mParamWeights; +	std::vector<LLVisualParam*> mParams; +}; +  //-----------------------------------------------------------------------------  // class LLBodyNoiseMotion  //----------------------------------------------------------------------------- @@ -6732,10 +6745,11 @@ void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value)  void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix, -										  const std::vector<F32>& params_for_dump, -										  const LLTEContents& tec) +										  const LLAppearanceMessageContents& contents)  {  	std::string outfilename = get_sequential_numbered_file_name(dump_prefix,".xml"); +	const std::vector<F32>& params_for_dump = contents.mParamWeights; +	const LLTEContents& tec = contents.mTEContents;  	LLAPRFile outfile;  	std::string fullpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,outfilename); @@ -6750,7 +6764,12 @@ void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix,  		LL_DEBUGS("Avatar") << "dumping appearance message to " << fullpath << llendl;  	} +	apr_file_printf(file, "<header>\n"); +	apr_file_printf(file, "\t\t<cof_version %i />\n", contents.mCOFVersion); +	apr_file_printf(file, "\t\t<appearance_version %i />\n", contents.mAppearanceVersion); +	apr_file_printf(file, "</header>\n"); +	apr_file_printf(file, "\n<params>\n");  	LLVisualParam* param = getFirstVisualParam();  	for (S32 i = 0; i < params_for_dump.size(); i++)  	{ @@ -6763,32 +6782,18 @@ void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix,  		dump_visual_param(file, viewer_param, value);  		param = getNextVisualParam();  	} +	apr_file_printf(file, "</params>\n"); + +	apr_file_printf(file, "\n<textures>\n");  	for (U32 i = 0; i < tec.face_count; i++)  	{  		std::string uuid_str;  		((LLUUID*)tec.image_data)[i].toString(uuid_str);  		apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", i, uuid_str.c_str());  	} +	apr_file_printf(file, "</textures>\n");  } -struct LLAppearanceMessageContents -{ -	LLAppearanceMessageContents(): -		mAppearanceVersion(-1), -		mParamAppearanceVersion(-1), -		mCOFVersion(LLViewerInventoryCategory::VERSION_UNKNOWN) -	{ -	} -	LLTEContents mTEContents; -	S32 mAppearanceVersion; -	S32 mParamAppearanceVersion; -	S32 mCOFVersion; -	// For future use: -	//U32 appearance_flags = 0; -	std::vector<F32> mParamWeights; -	std::vector<LLVisualParam*> mParams; -}; -  void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& contents)  {  	parseTEMessage(mesgsys, _PREHASH_ObjectData, -1, contents.mTEContents); @@ -6927,7 +6932,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	parseAppearanceMessage(mesgsys, contents);  	if (enable_verbose_dumps)  	{ -		dumpAppearanceMsgParams(dump_prefix + "appearance_msg", contents.mParamWeights, contents.mTEContents); +		dumpAppearanceMsgParams(dump_prefix + "appearance_msg", contents);  	}  	S32 appearance_version; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index c989673cdf..5ebd8d0399 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -928,8 +928,7 @@ private:  public:  	void				dumpArchetypeXML(const std::string& prefix, bool group_by_wearables = false);  	void 				dumpAppearanceMsgParams( const std::string& dump_prefix, -												 const std::vector<F32>& paramsForDump, -												 const LLTEContents& tec); +												 const LLAppearanceMessageContents& contents);  	static void			dumpBakedStatus();  	const std::string 	getBakedStatusForPrintout() const;  	void				dumpAvatarTEs(const std::string& context) const; @@ -980,5 +979,9 @@ protected: // Shared with LLVOAvatarSelf  extern const F32 SELF_ADDITIONAL_PRI;  extern const S32 MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL; +std::string get_sequential_numbered_file_name(const std::string& prefix, +											  const std::string& suffix); +void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value); +  #endif // LL_VOAVATAR_H diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 0e8e48099e..c069488a37 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -3049,8 +3049,6 @@ void LLVOAvatarSelf::dumpScratchTextureByteCount()  	llinfos << "Scratch Texture GL: " << (sScratchTexBytes/1024) << "KB" << llendl;  } -void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value); -  void LLVOAvatarSelf::dumpWearableInfo(LLAPRFile& outfile)  {  	apr_file_t* file = outfile.getFileHandle(); | 
