diff options
Diffstat (limited to 'indra/newview/llviewerobject.cpp')
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 71 | 
1 files changed, 33 insertions, 38 deletions
| diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index b2bd547811..670272e7be 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -876,7 +876,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  					 const EObjectUpdateType update_type,  					 LLDataPacker *dp)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT);  	U32 retval = 0x0;  	// If region is removed from the list it is also deleted. @@ -2347,8 +2346,6 @@ void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt)  BOOL LLViewerObject::setData(const U8 *datap, const U32 data_size)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT); -	  	delete [] mData;  	if (datap) @@ -2390,8 +2387,6 @@ void LLViewerObject::doUpdateInventory(  	U8 key,  	bool is_new)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT); -  	LLViewerInventoryItem* old_item = NULL;  	if(TASK_INVENTORY_ITEM_KEY == key)  	{ @@ -2475,8 +2470,6 @@ void LLViewerObject::saveScript(  	BOOL active,  	bool is_new)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT); -  	/*  	 * XXXPAM Investigate not making this copy.  Seems unecessary, but I'm unsure about the  	 * interaction with doUpdateInventory() called below. @@ -2552,8 +2545,6 @@ void LLViewerObject::dirtyInventory()  void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener, void* user_data)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT); -	  	LLInventoryCallbackInfo* info = new LLInventoryCallbackInfo;  	info->mListener = listener;  	info->mInventoryData = user_data; @@ -2651,8 +2642,6 @@ S32 LLFilenameAndTask::sCount = 0;  // static  void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT); -	  	LLUUID task_id;  	msg->getUUIDFast(_PREHASH_InventoryData, _PREHASH_TaskID, task_id);  	LLViewerObject* object = gObjectList.findObject(task_id); @@ -2708,24 +2697,33 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS  	if(ft && (0 == error_code) &&  	   (object = gObjectList.findObject(ft->mTaskID)))  	{ -		object->loadTaskInvFile(ft->mFilename); +		if (object->loadTaskInvFile(ft->mFilename)) +		{ -		LLInventoryObject::object_list_t::iterator it = object->mInventory->begin(); -		LLInventoryObject::object_list_t::iterator end = object->mInventory->end(); -		std::list<LLUUID>& pending_lst = object->mPendingInventoryItemsIDs; +			LLInventoryObject::object_list_t::iterator it = object->mInventory->begin(); +			LLInventoryObject::object_list_t::iterator end = object->mInventory->end(); +			std::list<LLUUID>& pending_lst = object->mPendingInventoryItemsIDs; -		for (; it != end && pending_lst.size(); ++it) -		{ -			LLViewerInventoryItem* item = dynamic_cast<LLViewerInventoryItem*>(it->get()); -			if(item && item->getType() != LLAssetType::AT_CATEGORY) +			for (; it != end && pending_lst.size(); ++it)  			{ -				std::list<LLUUID>::iterator id_it = std::find(pending_lst.begin(), pending_lst.begin(), item->getAssetUUID()); -				if (id_it != pending_lst.end()) +				LLViewerInventoryItem* item = dynamic_cast<LLViewerInventoryItem*>(it->get()); +				if(item && item->getType() != LLAssetType::AT_CATEGORY)  				{ -					pending_lst.erase(id_it); +					std::list<LLUUID>::iterator id_it = std::find(pending_lst.begin(), pending_lst.begin(), item->getAssetUUID()); +					if (id_it != pending_lst.end()) +					{ +						pending_lst.erase(id_it); +					}  				}  			}  		} +		else +		{ +			// MAINT-2597 - crash when trying to edit a no-mod object +			// Somehow get an contents inventory response, but with an invalid stream (possibly 0 size?) +			// Stated repro was specific to no-mod objects so failing without user interaction should be safe. +			llwarns << "Trying to load invalid task inventory file. Ignoring file contents." << llendl; +		}  	}  	else  	{ @@ -2737,10 +2735,8 @@ void LLViewerObject::processTaskInvFile(void** user_data, S32 error_code, LLExtS  	delete ft;  } -void LLViewerObject::loadTaskInvFile(const std::string& filename) +BOOL LLViewerObject::loadTaskInvFile(const std::string& filename)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT); -	  	std::string filename_and_local_path = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, filename);  	llifstream ifs(filename_and_local_path);  	if(ifs.good()) @@ -2786,8 +2782,11 @@ void LLViewerObject::loadTaskInvFile(const std::string& filename)  	{  		llwarns << "unable to load task inventory: " << filename_and_local_path  				<< llendl; +		return FALSE;  	}  	doInventoryCallback(); + +	return TRUE;  }  void LLViewerObject::doInventoryCallback() @@ -2864,8 +2863,6 @@ void LLViewerObject::updateInventory(  	U8 key,  	bool is_new)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT); -  	// This slices the object into what we're concerned about on the  	// viewer. The simulator will take the permissions and transfer  	// ownership. @@ -3281,14 +3278,14 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)  	S32 tex_count = getNumTEs();  	for (i = 0; i < tex_count; i++)  	{ - 		getTEImage(i)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); + 		getTEImage(i)->setBoostLevel(LLGLTexture::BOOST_SELECTED);  	}  	if (isSculpted() && !isMesh())  	{  		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);  		LLUUID sculpt_id = sculpt_params->getSculptTexture(); -		LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED); +		LLViewerTextureManager::getFetchedTexture(sculpt_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLGLTexture::BOOST_SELECTED);  	}  	if (boost_children) @@ -3874,8 +3871,6 @@ std::string LLViewerObject::getMediaURL() const  void LLViewerObject::setMediaURL(const std::string& media_url)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT); -	  	if (!mMedia)  	{  		mMedia = new LLViewerObjectMedia; @@ -3925,8 +3920,6 @@ BOOL LLViewerObject::setMaterial(const U8 material)  void LLViewerObject::setNumTEs(const U8 num_tes)  { -	LLMemType mt(LLMemType::MTYPE_OBJECT); -	  	U32 i;  	if (num_tes != getNumTEs())  	{ @@ -4035,7 +4028,7 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)  //	if (mDrawable.notNull() && mDrawable->isVisible())  //	{  		const LLUUID& image_id = getTE(te)->getID(); -		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  //	}  } @@ -4053,15 +4046,15 @@ void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)  	}  } - -S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host) +S32 LLViewerObject::setTETextureCore(const U8 te, LLViewerTexture *image)  { +	const LLUUID& uuid = image->getID();  	S32 retval = 0;  	if (uuid != getTE(te)->getID() ||  		uuid == LLUUID::null)  	{  		retval = LLPrimitive::setTETexture(te, uuid); -		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); +		mTEImages[te] = image;  		setChanged(TEXTURE);  		if (mDrawable.notNull())  		{ @@ -4084,7 +4077,9 @@ void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image)  S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid)  {  	// Invalid host == get from the agent's sim -	return setTETextureCore(te, uuid, LLHost::invalid); +	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture( +		uuid, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, LLHost::invalid); +	return setTETextureCore(te,image);  } | 
