diff options
| author | Mnikolenko Productengine <mnikolenko@productengine.com> | 2020-08-04 15:30:20 +0300 | 
|---|---|---|
| committer | Mnikolenko Productengine <mnikolenko@productengine.com> | 2020-08-04 15:30:20 +0300 | 
| commit | 357edecd9b938f2b83a6db0237c6343de7a18fcf (patch) | |
| tree | ea6be1354ecf13d16e6d0f275979359b38d36569 /indra | |
| parent | 40b5babccdfe0d6b1f59e43a08182891c815c196 (diff) | |
SL-13669 Change inventory cache to use a standard LLSD format
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llinventory/llinventory.cpp | 308 | ||||
| -rw-r--r-- | indra/llinventory/llinventory.h | 7 | ||||
| -rw-r--r-- | indra/llinventory/llpermissions.cpp | 142 | ||||
| -rw-r--r-- | indra/llinventory/llpermissions.h | 4 | ||||
| -rw-r--r-- | indra/llinventory/llsaleinfo.cpp | 73 | ||||
| -rw-r--r-- | indra/llinventory/llsaleinfo.h | 5 | ||||
| -rw-r--r-- | indra/newview/llinventorymodel.cpp | 114 | ||||
| -rw-r--r-- | indra/newview/llviewerinventory.cpp | 164 | ||||
| -rw-r--r-- | indra/newview/llviewerinventory.h | 13 | ||||
| -rw-r--r-- | indra/test/llpermissions_tut.cpp | 50 | ||||
| -rw-r--r-- | indra/test/llsaleinfo_tut.cpp | 52 | 
11 files changed, 117 insertions, 815 deletions
| diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index 11647c5518..fcc2e1d173 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -228,22 +228,6 @@ BOOL LLInventoryObject::importLegacyStream(std::istream& input_stream)  	return TRUE;  } -// exportFile should be replaced with exportLegacyStream -// not sure whether exportLegacyStream(llofstream(fp)) would work, fp may need to get icramented... -BOOL LLInventoryObject::exportFile(LLFILE* fp, BOOL) const -{ -	std::string uuid_str; -	fprintf(fp, "\tinv_object\t0\n\t{\n"); -	mUUID.toString(uuid_str); -	fprintf(fp, "\t\tobj_id\t%s\n", uuid_str.c_str()); -	mParentUUID.toString(uuid_str); -	fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); -	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); -	fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); -	fprintf(fp,"\t}\n"); -	return TRUE; -} -  BOOL LLInventoryObject::exportLegacyStream(std::ostream& output_stream, BOOL) const  {  	std::string uuid_str; @@ -604,215 +588,6 @@ BOOL LLInventoryItem::unpackMessage(LLMessageSystem* msg, const char* block, S32  }  // virtual -BOOL LLInventoryItem::importFile(LLFILE* fp) -{ -	// *NOTE: Changing the buffer size will require changing the scanf -	// calls below. -	char buffer[MAX_STRING];	/* Flawfinder: ignore */ -	char keyword[MAX_STRING];	/* Flawfinder: ignore */	 -	char valuestr[MAX_STRING];	/* Flawfinder: ignore */ -	char junk[MAX_STRING];	/* Flawfinder: ignore */ -	BOOL success = TRUE; - -	keyword[0] = '\0'; -	valuestr[0] = '\0'; - -	mInventoryType = LLInventoryType::IT_NONE; -	mAssetUUID.setNull(); -	while(success && (!feof(fp))) -	{ -		if (fgets(buffer, MAX_STRING, fp) == NULL) -		{ -			buffer[0] = '\0'; -		} -		 -		sscanf(buffer, " %254s %254s", keyword, valuestr);	/* Flawfinder: ignore */ -		if(0 == strcmp("{",keyword)) -		{ -			continue; -		} -		if(0 == strcmp("}", keyword)) -		{ -			break; -		} -		else if(0 == strcmp("item_id", keyword)) -		{ -			mUUID.set(valuestr); -		} -		else if(0 == strcmp("parent_id", keyword)) -		{ -			mParentUUID.set(valuestr); -		} -		else if(0 == strcmp("permissions", keyword)) -		{ -			success = mPermissions.importFile(fp); -		} -		else if(0 == strcmp("sale_info", keyword)) -		{ -			// Sale info used to contain next owner perm. It is now in -			// the permissions. Thus, we read that out, and fix legacy -			// objects. It's possible this op would fail, but it -			// should pick up the vast majority of the tasks. -			BOOL has_perm_mask = FALSE; -			U32 perm_mask = 0; -			success = mSaleInfo.importFile(fp, has_perm_mask, perm_mask); -			if(has_perm_mask) -			{ -				if(perm_mask == PERM_NONE) -				{ -					perm_mask = mPermissions.getMaskOwner(); -				} -				// fair use fix. -				if(!(perm_mask & PERM_COPY)) -				{ -					perm_mask |= PERM_TRANSFER; -				} -				mPermissions.setMaskNext(perm_mask); -			} -		} -		else if(0 == strcmp("shadow_id", keyword)) -		{ -			mAssetUUID.set(valuestr); -			LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES); -			cipher.decrypt(mAssetUUID.mData, UUID_BYTES); -		} -		else if(0 == strcmp("asset_id", keyword)) -		{ -			mAssetUUID.set(valuestr); -		} -		else if(0 == strcmp("type", keyword)) -		{ -			mType = LLAssetType::lookup(valuestr); -		} -		else if(0 == strcmp("inv_type", keyword)) -		{ -			mInventoryType = LLInventoryType::lookup(std::string(valuestr)); -		} -		else if(0 == strcmp("flags", keyword)) -		{ -			sscanf(valuestr, "%x", &mFlags); -		} -		else if(0 == strcmp("name", keyword)) -		{ -			//strcpy(valuestr, buffer + strlen(keyword) + 3); -			// *NOTE: Not ANSI C, but widely supported. -			sscanf(	/* Flawfinder: ignore */ -				buffer, -				" %254s%254[\t]%254[^|]", -				keyword, junk, valuestr); - -			// IW: sscanf chokes and puts | in valuestr if there's no name -			if (valuestr[0] == '|') -			{ -				valuestr[0] = '\000'; -			} - -			mName.assign(valuestr); -			LLStringUtil::replaceNonstandardASCII(mName, ' '); -			LLStringUtil::replaceChar(mName, '|', ' '); -		} -		else if(0 == strcmp("desc", keyword)) -		{ -			//strcpy(valuestr, buffer + strlen(keyword) + 3); -			// *NOTE: Not ANSI C, but widely supported. -			sscanf(	/* Flawfinder: ignore */ -				buffer, -				" %254s%254[\t]%254[^|]", -				keyword, junk, valuestr); - -			if (valuestr[0] == '|') -			{ -				valuestr[0] = '\000'; -			} - -			disclaimMem(mDescription); -			mDescription.assign(valuestr); -			claimMem(mDescription); -			LLStringUtil::replaceNonstandardASCII(mDescription, ' '); -			/* TODO -- ask Ian about this code -			const char *donkey = mDescription.c_str(); -			if (donkey[0] == '|') -			{ -				LL_ERRS() << "Donkey" << LL_ENDL; -			} -			*/ -		} -		else if(0 == strcmp("creation_date", keyword)) -		{ -			S32 date; -			sscanf(valuestr, "%d", &date); -			mCreationDate = date; -		} -		else -		{ -			LL_WARNS() << "unknown keyword '" << keyword -					<< "' in inventory import of item " << mUUID << LL_ENDL; -		} -	} - -	// Need to convert 1.0 simstate files to a useful inventory type -	// and potentially deal with bad inventory tyes eg, a landmark -	// marked as a texture. -	if((LLInventoryType::IT_NONE == mInventoryType) -	   || !inventory_and_asset_types_match(mInventoryType, mType)) -	{ -		LL_DEBUGS() << "Resetting inventory type for " << mUUID << LL_ENDL; -		mInventoryType = LLInventoryType::defaultForAssetType(mType); -	} - -	mPermissions.initMasks(mInventoryType); - -	return success; -} - -BOOL LLInventoryItem::exportFile(LLFILE* fp, BOOL include_asset_key) const -{ -	std::string uuid_str; -	fprintf(fp, "\tinv_item\t0\n\t{\n"); -	mUUID.toString(uuid_str); -	fprintf(fp, "\t\titem_id\t%s\n", uuid_str.c_str()); -	mParentUUID.toString(uuid_str); -	fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); -	mPermissions.exportFile(fp); - -	// Check for permissions to see the asset id, and if so write it -	// out as an asset id. Otherwise, apply our cheesy encryption. -	if(include_asset_key) -	{ -		U32 mask = mPermissions.getMaskBase(); -		if(((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) -		   || (mAssetUUID.isNull())) -		{ -			mAssetUUID.toString(uuid_str); -			fprintf(fp, "\t\tasset_id\t%s\n", uuid_str.c_str()); -		} -		else -		{ -			LLUUID shadow_id(mAssetUUID); -			LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES); -			cipher.encrypt(shadow_id.mData, UUID_BYTES); -			shadow_id.toString(uuid_str); -			fprintf(fp, "\t\tshadow_id\t%s\n", uuid_str.c_str()); -		} -	} -	else -	{ -		LLUUID::null.toString(uuid_str); -		fprintf(fp, "\t\tasset_id\t%s\n", uuid_str.c_str()); -	} -	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); -	const std::string inv_type_str = LLInventoryType::lookup(mInventoryType); -	if(!inv_type_str.empty()) fprintf(fp, "\t\tinv_type\t%s\n", inv_type_str.c_str()); -	fprintf(fp, "\t\tflags\t%08x\n", mFlags); -	mSaleInfo.exportFile(fp); -	fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); -	fprintf(fp, "\t\tdesc\t%s|\n", mDescription.c_str()); -	fprintf(fp, "\t\tcreation_date\t%d\n", (S32) mCreationDate); -	fprintf(fp,"\t}\n"); -	return TRUE; -} - -// virtual  BOOL LLInventoryItem::importLegacyStream(std::istream& input_stream)  {  	// *NOTE: Changing the buffer size will require changing the scanf @@ -1463,90 +1238,7 @@ void LLInventoryCategory::unpackMessage(LLMessageSystem* msg,  	msg->getStringFast(block, _PREHASH_Name, mName, block_num);  	LLStringUtil::replaceNonstandardASCII(mName, ' ');  } -	 -// virtual -BOOL LLInventoryCategory::importFile(LLFILE* fp) -{ -	// *NOTE: Changing the buffer size will require changing the scanf -	// calls below. -	char buffer[MAX_STRING];	/* Flawfinder: ignore */ -	char keyword[MAX_STRING];	/* Flawfinder: ignore */ -	char valuestr[MAX_STRING];	/* Flawfinder: ignore */ -	keyword[0] = '\0'; -	valuestr[0] = '\0'; -	while(!feof(fp)) -	{ -		if (fgets(buffer, MAX_STRING, fp) == NULL) -		{ -			buffer[0] = '\0'; -		} -		 -		sscanf(	/* Flawfinder: ignore */ -			buffer, -			" %254s %254s", -			keyword, valuestr); -		if(0 == strcmp("{",keyword)) -		{ -			continue; -		} -		if(0 == strcmp("}", keyword)) -		{ -			break; -		} -		else if(0 == strcmp("cat_id", keyword)) -		{ -			mUUID.set(valuestr); -		} -		else if(0 == strcmp("parent_id", keyword)) -		{ -			mParentUUID.set(valuestr); -		} -		else if(0 == strcmp("type", keyword)) -		{ -			mType = LLAssetType::lookup(valuestr); -		} -		else if(0 == strcmp("pref_type", keyword)) -		{ -			mPreferredType = LLFolderType::lookup(valuestr); -		} -		else if(0 == strcmp("name", keyword)) -		{ -			//strcpy(valuestr, buffer + strlen(keyword) + 3); -			// *NOTE: Not ANSI C, but widely supported. -			sscanf(	/* Flawfinder: ignore */ -				buffer, -				" %254s %254[^|]", -				keyword, valuestr); -			mName.assign(valuestr); -			LLStringUtil::replaceNonstandardASCII(mName, ' '); -			LLStringUtil::replaceChar(mName, '|', ' '); -		} -		else -		{ -			LL_WARNS() << "unknown keyword '" << keyword -					<< "' in inventory import category "  << mUUID << LL_ENDL; -		} -	} -	return TRUE; -} - -BOOL LLInventoryCategory::exportFile(LLFILE* fp, BOOL) const -{ -	std::string uuid_str; -	fprintf(fp, "\tinv_category\t0\n\t{\n"); -	mUUID.toString(uuid_str); -	fprintf(fp, "\t\tcat_id\t%s\n", uuid_str.c_str()); -	mParentUUID.toString(uuid_str); -	fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); -	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); -	fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str()); -	fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); -	fprintf(fp,"\t}\n"); -	return TRUE; -} - -	  // virtual  BOOL LLInventoryCategory::importLegacyStream(std::istream& input_stream)  { diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index 70b200e139..d00c4d43ee 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -95,8 +95,7 @@ public:  	//   Implemented here so that a minimal information set can be transmitted  	//   between simulator and viewer.  	//-------------------------------------------------------------------- -	// virtual BOOL importFile(LLFILE* fp); -	virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const; +  	virtual BOOL importLegacyStream(std::istream& input_stream);  	virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; @@ -197,8 +196,6 @@ public:  	// File Support  	//--------------------------------------------------------------------  public: -	virtual BOOL importFile(LLFILE* fp); -	virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const;  	virtual BOOL importLegacyStream(std::istream& input_stream);  	virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; @@ -269,8 +266,6 @@ public:  	// File Support  	//--------------------------------------------------------------------  public: -	virtual BOOL importFile(LLFILE* fp); -	virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const;  	virtual BOOL importLegacyStream(std::istream& input_stream);  	virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const; diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp index e79b753514..0359d2f554 100644 --- a/indra/llinventory/llpermissions.cpp +++ b/indra/llinventory/llpermissions.cpp @@ -565,148 +565,6 @@ void LLPermissions::unpackMessage(LLMessageSystem* msg, const char* block, S32 b  } -// -// File support -// - -BOOL LLPermissions::importFile(LLFILE* fp) -{ -	init(LLUUID::null, LLUUID::null, LLUUID::null, LLUUID::null); -	const S32 BUFSIZE = 16384; - -	// *NOTE: Changing the buffer size will require changing the scanf -	// calls below. -	char buffer[BUFSIZE];	/* Flawfinder: ignore */ -	char keyword[256];	/* Flawfinder: ignore */ -	char valuestr[256];	/* Flawfinder: ignore */ -	char uuid_str[256];	/* Flawfinder: ignore */ -	U32 mask; - -	keyword[0]  = '\0'; -	valuestr[0] = '\0'; - -	while (!feof(fp)) -	{ -		if (fgets(buffer, BUFSIZE, fp) == NULL) -		{ -			buffer[0] = '\0'; -		} -		 -		sscanf( /* Flawfinder: ignore */ -			buffer, -			" %255s %255s", -			keyword, valuestr); -		if (!strcmp("{", keyword)) -		{ -			continue; -		} -		if (!strcmp("}",keyword)) -		{ -			break; -		} -		else if (!strcmp("creator_mask", keyword)) -		{ -			// legacy support for "creator" masks -			sscanf(valuestr, "%x", &mask); -			mMaskBase = mask; -			fixFairUse(); -		} -		else if (!strcmp("base_mask", keyword)) -		{ -			sscanf(valuestr, "%x", &mask); -			mMaskBase = mask; -			//fixFairUse(); -		} -		else if (!strcmp("owner_mask", keyword)) -		{ -			sscanf(valuestr, "%x", &mask); -			mMaskOwner = mask; -		} -		else if (!strcmp("group_mask", keyword)) -		{ -			sscanf(valuestr, "%x", &mask); -			mMaskGroup = mask; -		} -		else if (!strcmp("everyone_mask", keyword)) -		{ -			sscanf(valuestr, "%x", &mask); -			mMaskEveryone = mask; -		} -		else if (!strcmp("next_owner_mask", keyword)) -		{ -			sscanf(valuestr, "%x", &mask); -			mMaskNextOwner = mask; -		} -		else if (!strcmp("creator_id", keyword)) -		{ -			sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */ -			mCreator.set(uuid_str); -		} -		else if (!strcmp("owner_id", keyword)) -		{ -			sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */ -			mOwner.set(uuid_str); -		} -		else if (!strcmp("last_owner_id", keyword)) -		{ -			sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */ -			mLastOwner.set(uuid_str); -		} -		else if (!strcmp("group_id", keyword)) -		{ -			sscanf(valuestr, "%255s", uuid_str); /* Flawfinder: ignore */ -			mGroup.set(uuid_str); -		} -		else if (!strcmp("group_owned", keyword)) -		{ -			sscanf(valuestr, "%d", &mask); -			if(mask) mIsGroupOwned = true; -			else mIsGroupOwned = false; -		} -		else -		{ -			LL_INFOS() << "unknown keyword " << keyword << " in permissions import" << LL_ENDL; -		} -	} -	fix(); -	return TRUE; -} - - -BOOL LLPermissions::exportFile(LLFILE* fp) const -{ -	std::string uuid_str; - -	fprintf(fp, "\tpermissions 0\n"); -	fprintf(fp, "\t{\n"); - -	fprintf(fp, "\t\tbase_mask\t%08x\n",		mMaskBase); -	fprintf(fp, "\t\towner_mask\t%08x\n",		mMaskOwner); -	fprintf(fp, "\t\tgroup_mask\t%08x\n",		mMaskGroup); -	fprintf(fp, "\t\teveryone_mask\t%08x\n",	mMaskEveryone); -	fprintf(fp, "\t\tnext_owner_mask\t%08x\n",	mMaskNextOwner); - -	mCreator.toString(uuid_str); -	fprintf(fp, "\t\tcreator_id\t%s\n",			uuid_str.c_str()); - -	mOwner.toString(uuid_str); -	fprintf(fp, "\t\towner_id\t%s\n",			uuid_str.c_str()); - -	mLastOwner.toString(uuid_str); -	fprintf(fp, "\t\tlast_owner_id\t%s\n",		uuid_str.c_str()); - -	mGroup.toString(uuid_str); -	fprintf(fp, "\t\tgroup_id\t%s\n",			uuid_str.c_str()); - -	if(mIsGroupOwned) -	{ -		fprintf(fp, "\t\tgroup_owned\t1\n"); -	} -	fprintf(fp,"\t}\n"); -	return TRUE; -} - -  BOOL LLPermissions::importLegacyStream(std::istream& input_stream)  {  	init(LLUUID::null, LLUUID::null, LLUUID::null, LLUUID::null); diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h index 89c66f6ebd..27252f7b97 100644 --- a/indra/llinventory/llpermissions.h +++ b/indra/llinventory/llpermissions.h @@ -311,10 +311,6 @@ public:  	void	packMessage(LLMessageSystem* msg) const;  	void	unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0); -	// Load/save support -	BOOL	importFile(LLFILE* fp); -	BOOL	exportFile(LLFILE* fp) const; -  	BOOL	importLegacyStream(std::istream& input_stream);  	BOOL	exportLegacyStream(std::ostream& output_stream) const; diff --git a/indra/llinventory/llsaleinfo.cpp b/indra/llinventory/llsaleinfo.cpp index 63e34d188e..b7231ee239 100644 --- a/indra/llinventory/llsaleinfo.cpp +++ b/indra/llinventory/llsaleinfo.cpp @@ -78,16 +78,6 @@ U32 LLSaleInfo::getCRC32() const  	return rv;  } - -BOOL LLSaleInfo::exportFile(LLFILE* fp) const -{ -	fprintf(fp, "\tsale_info\t0\n\t{\n"); -	fprintf(fp, "\t\tsale_type\t%s\n", lookup(mSaleType)); -	fprintf(fp, "\t\tsale_price\t%d\n", mSalePrice); -	fprintf(fp,"\t}\n"); -	return TRUE; -} -  BOOL LLSaleInfo::exportLegacyStream(std::ostream& output_stream) const  {  	output_stream << "\tsale_info\t0\n\t{\n"; @@ -129,69 +119,6 @@ bool LLSaleInfo::fromLLSD(const LLSD& sd, BOOL& has_perm_mask, U32& perm_mask)  	return true;  } -// Deleted LLSaleInfo::exportFileXML() and LLSaleInfo::importXML() -// because I can't find any non-test code references to it. 2009-05-04 JC - -BOOL LLSaleInfo::importFile(LLFILE* fp, BOOL& has_perm_mask, U32& perm_mask) -{ -	has_perm_mask = FALSE; - -	// *NOTE: Changing the buffer size will require changing the scanf -	// calls below. -	char buffer[MAX_STRING];	/* Flawfinder: ignore */ -	char keyword[MAX_STRING];	/* Flawfinder: ignore */ -	char valuestr[MAX_STRING];	/* Flawfinder: ignore */ -	BOOL success = TRUE; - -	keyword[0] = '\0'; -	valuestr[0] = '\0'; -	while(success && (!feof(fp))) -	{ -		if (fgets(buffer, MAX_STRING, fp) == NULL) -		{ -			buffer[0] = '\0'; -		} - -		sscanf(	/* Flawfinder: ignore */ -			buffer, -			" %254s %254s", -			keyword, valuestr); -		if(!keyword[0]) -		{ -			continue; -		} -		if(0 == strcmp("{",keyword)) -		{ -			continue; -		} -		if(0 == strcmp("}", keyword)) -		{ -			break; -		} -		else if(0 == strcmp("sale_type", keyword)) -		{ -			mSaleType = lookup(valuestr); -		} -		else if(0 == strcmp("sale_price", keyword)) -		{ -			sscanf(valuestr, "%d", &mSalePrice); -			mSalePrice = llclamp(mSalePrice, 0, S32_MAX); -		} -		else if (!strcmp("perm_mask", keyword)) -		{ -			//LL_INFOS() << "found deprecated keyword perm_mask" << LL_ENDL; -			has_perm_mask = TRUE; -			sscanf(valuestr, "%x", &perm_mask); -		} -		else -		{ -			LL_WARNS() << "unknown keyword '" << keyword -					<< "' in sale info import" << LL_ENDL; -		} -	} -	return success; -} -  BOOL LLSaleInfo::importLegacyStream(std::istream& input_stream, BOOL& has_perm_mask, U32& perm_mask)  {  	has_perm_mask = FALSE; diff --git a/indra/llinventory/llsaleinfo.h b/indra/llinventory/llsaleinfo.h index 4e98ccf6ff..3c8952838b 100644 --- a/indra/llinventory/llsaleinfo.h +++ b/indra/llinventory/llsaleinfo.h @@ -84,11 +84,6 @@ public:  	void setSalePrice(S32 price);  	//void setNextOwnerPermMask(U32 mask)	{ mNextOwnerPermMask = mask; } - -	// file serialization -	BOOL exportFile(LLFILE* fp) const; -	BOOL importFile(LLFILE* fp, BOOL& has_perm_mask, U32& perm_mask); -  	BOOL exportLegacyStream(std::ostream& output_stream) const;  	LLSD asLLSD() const;  	operator LLSD() const { return asLLSD(); } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index e7093eac02..c86a9a40d3 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -56,6 +56,7 @@  #include "llcallbacklist.h"  #include "llvoavatarself.h"  #include "llgesturemgr.h" +#include "llsdserialize.h"  #include "llsdutil.h"  #include "bufferarray.h"  #include "bufferstream.h" @@ -76,8 +77,8 @@ BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;  ///----------------------------------------------------------------------------  //BOOL decompress_file(const char* src_filename, const char* dst_filename); -static const char PRODUCTION_CACHE_FORMAT_STRING[] = "%s.inv"; -static const char GRID_CACHE_FORMAT_STRING[] = "%s.%s.inv"; +static const char PRODUCTION_CACHE_FORMAT_STRING[] = "%s.inv.llsd"; +static const char GRID_CACHE_FORMAT_STRING[] = "%s.%s.inv.llsd";  static const char * const LOG_INV("Inventory");  struct InventoryIDPtrLess @@ -2690,29 +2691,37 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,  {  	if(filename.empty())  	{ -		LL_ERRS(LOG_INV) << "Filename is Null!" << LL_ENDL; +		LL_ERRS(LOG_INV) << "filename is Null!" << LL_ENDL;  		return false;  	} -	LL_INFOS(LOG_INV) << "LLInventoryModel::loadFromFile(" << filename << ")" << LL_ENDL; -	LLFILE* file = LLFile::fopen(filename, "rb");		/*Flawfinder: ignore*/ -	if(!file) +	LL_INFOS(LOG_INV) << "loading inventory from: (" << filename << ")" << LL_ENDL; + +	llifstream file(filename.c_str()); + +	if (!file.is_open())  	{  		LL_INFOS(LOG_INV) << "unable to load inventory from: " << filename << LL_ENDL;  		return false;  	} -	// *NOTE: This buffer size is hard coded into scanf() below. -	char buffer[MAX_STRING];		/*Flawfinder: ignore*/ -	char keyword[MAX_STRING];		/*Flawfinder: ignore*/ -	char value[MAX_STRING];			/*Flawfinder: ignore*/ -	is_cache_obsolete = true;  		// Obsolete until proven current -	while(!feof(file) && fgets(buffer, MAX_STRING, file))  + +	is_cache_obsolete = true; // Obsolete until proven current + +	std::string line; +	LLPointer<LLSDParser> parser = new LLSDNotationParser(); +	while (std::getline(file, line))   	{ -		sscanf(buffer, " %126s %126s", keyword, value);	/* Flawfinder: ignore */ -		if(0 == strcmp("inv_cache_version", keyword)) +		LLSD s_item; +		std::istringstream iss(line); +		if (parser->parse(iss, s_item, line.length()) == LLSDParser::PARSE_FAILURE) +		{ +			LL_INFOS(LOG_INV)<< "Parsing inventory cache failed" << LL_ENDL; +			break; +		} + +		if (s_item.has("inv_cache_version"))  		{ -			S32 version; -			int succ = sscanf(value,"%d",&version); -			if ((1 == succ) && (version == sCurrentInvCacheVersion)) +			S32 version = s_item["inv_cache_version"].asInteger(); +			if (version == sCurrentInvCacheVersion)  			{  				// Cache is up to date  				is_cache_obsolete = false; @@ -2720,43 +2729,33 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,  			}  			else  			{ -				// Cache is out of date +				LL_INFOS(LOG_INV)<< "Inventory cache is out of date" << LL_ENDL;  				break;  			}  		} -		else if(0 == strcmp("inv_category", keyword)) +		else if (s_item.has("cat_id"))  		{  			if (is_cache_obsolete)  				break; -			 +  			LLPointer<LLViewerInventoryCategory> inv_cat = new LLViewerInventoryCategory(LLUUID::null); -			if(inv_cat->importFileLocal(file)) +			if(inv_cat->importLLSD(s_item))  			{  				categories.push_back(inv_cat);  			} -			else -			{ -				LL_WARNS(LOG_INV) << "loadInventoryFromFile().  Ignoring invalid inventory category: " << inv_cat->getName() << LL_ENDL; -				//delete inv_cat; // automatic when inv_cat is reassigned or destroyed -			}  		} -		else if(0 == strcmp("inv_item", keyword)) +		else if (s_item.has("item_id"))  		{  			if (is_cache_obsolete)  				break;  			LLPointer<LLViewerInventoryItem> inv_item = new LLViewerInventoryItem; -			if( inv_item->importFileLocal(file) ) +			if( inv_item->fromLLSD(s_item) )  			{ -				// *FIX: Need a better solution, this prevents the -				// application from freezing, but breaks inventory -				// caching.  				if(inv_item->getUUID().isNull())  				{ -					//delete inv_item; // automatic when inv_cat is reassigned or destroyed  					LL_WARNS(LOG_INV) << "Ignoring inventory with null item id: " -									  << inv_item->getName() << LL_ENDL; -						 +						<< inv_item->getName() << LL_ENDL;  				}  				else  				{ @@ -2769,44 +2768,40 @@ bool LLInventoryModel::loadFromFile(const std::string& filename,  						items.push_back(inv_item);  					}  				} -			} -			else -			{ -				LL_WARNS(LOG_INV) << "loadInventoryFromFile().  Ignoring invalid inventory item: " << inv_item->getName() << LL_ENDL; -				//delete inv_item; // automatic when inv_cat is reassigned or destroyed -			} -		} -		else -		{ -			LL_WARNS(LOG_INV) << "Unknown token in inventory file '" << keyword << "'" -							  << LL_ENDL; +			}	  		}  	} -	fclose(file); -	if (is_cache_obsolete) -		return false; -	return true; + +	file.close(); + +	return !is_cache_obsolete;	  }  // static  bool LLInventoryModel::saveToFile(const std::string& filename, -								  const cat_array_t& categories, -								  const item_array_t& items) +	const cat_array_t& categories, +	const item_array_t& items)  { -	if(filename.empty()) +	if (filename.empty())  	{  		LL_ERRS(LOG_INV) << "Filename is Null!" << LL_ENDL;  		return false;  	} -	LL_INFOS(LOG_INV) << "LLInventoryModel::saveToFile(" << filename << ")" << LL_ENDL; -	LLFILE* file = LLFile::fopen(filename, "wb");		/*Flawfinder: ignore*/ -	if(!file) + +	LL_INFOS(LOG_INV) << "saving inventory to: (" << filename << ")" << LL_ENDL; + +	llofstream fileXML(filename.c_str()); +	if (!fileXML.is_open())  	{  		LL_WARNS(LOG_INV) << "unable to save inventory to: " << filename << LL_ENDL;  		return false;  	} -	fprintf(file, "\tinv_cache_version\t%d\n",sCurrentInvCacheVersion); +	LLSD cache_ver; +	cache_ver["inv_cache_version"] = sCurrentInvCacheVersion; + +	fileXML << LLSDOStreamer<LLSDNotationFormatter>(cache_ver) << std::endl; +  	S32 count = categories.size();  	S32 i;  	for(i = 0; i < count; ++i) @@ -2814,17 +2809,18 @@ bool LLInventoryModel::saveToFile(const std::string& filename,  		LLViewerInventoryCategory* cat = categories[i];  		if(cat->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)  		{ -			cat->exportFileLocal(file); +			fileXML << LLSDOStreamer<LLSDNotationFormatter>(cat->exportLLSD()) << std::endl;  		}  	}  	count = items.size();  	for(i = 0; i < count; ++i)  	{ -		items[i]->exportFile(file); +		fileXML << LLSDOStreamer<LLSDNotationFormatter>(items[i]->asLLSD()) << std::endl;  	} -	fclose(file); +	fileXML.close(); +  	return true;  } diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index d0cbd1181b..6c61c34075 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -81,6 +81,14 @@ static const char * const LOG_INV("Inventory");  static const char * const LOG_LOCAL("InventoryLocalize");  static const char * const LOG_NOTECARD("copy_inventory_from_notecard"); +static const std::string INV_CAT_ID("cat_id"); +static const std::string INV_PARENT_ID("parent_id"); +static const std::string INV_ASSET_TYPE("type"); +static const std::string INV_PREFERRED_TYPE("pref_type"); +static const std::string INV_NAME("name"); +static const std::string INV_OWNER_ID("owner_id"); +static const std::string INV_VERSION("version"); +  #if 1  // *TODO$: LLInventoryCallback should be deprecated to conform to the new boost::bind/coroutine model.  // temp code in transition @@ -519,14 +527,6 @@ void LLViewerInventoryItem::packMessage(LLMessageSystem* msg) const  }  // virtual -BOOL LLViewerInventoryItem::importFile(LLFILE* fp) -{ -	BOOL rv = LLInventoryItem::importFile(fp); -	mIsComplete = TRUE; -	return rv; -} - -// virtual  BOOL LLViewerInventoryItem::importLegacyStream(std::istream& input_stream)  {  	BOOL rv = LLInventoryItem::importLegacyStream(input_stream); @@ -534,32 +534,6 @@ BOOL LLViewerInventoryItem::importLegacyStream(std::istream& input_stream)  	return rv;  } -bool LLViewerInventoryItem::importFileLocal(LLFILE* fp) -{ -	// TODO: convert all functions that return BOOL to return bool -	bool rv = (LLInventoryItem::importFile(fp) ? true : false); -	mIsComplete = false; -	return rv; -} - -bool LLViewerInventoryItem::exportFileLocal(LLFILE* fp) const -{ -	std::string uuid_str; -	fprintf(fp, "\tinv_item\t0\n\t{\n"); -	mUUID.toString(uuid_str); -	fprintf(fp, "\t\titem_id\t%s\n", uuid_str.c_str()); -	mParentUUID.toString(uuid_str); -	fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); -	mPermissions.exportFile(fp); -	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); -	const std::string inv_type_str = LLInventoryType::lookup(mInventoryType); -	if(!inv_type_str.empty()) fprintf(fp, "\t\tinv_type\t%s\n", inv_type_str.c_str()); -	fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); -	fprintf(fp, "\t\tcreation_date\t%d\n", (S32) mCreationDate); -	fprintf(fp,"\t}\n"); -	return true; -} -  void LLViewerInventoryItem::updateParentOnServer(BOOL restamp) const  {  	LLMessageSystem* msg = gMessageSystem; @@ -720,90 +694,52 @@ S32 LLViewerInventoryCategory::getViewerDescendentCount() const  	return descendents_actual;  } -bool LLViewerInventoryCategory::importFileLocal(LLFILE* fp) +LLSD LLViewerInventoryCategory::exportLLSD() const  { -	// *NOTE: This buffer size is hard coded into scanf() below. -	char buffer[MAX_STRING];		/* Flawfinder: ignore */ -	char keyword[MAX_STRING];		/* Flawfinder: ignore */ -	char valuestr[MAX_STRING];		/* Flawfinder: ignore */ +	LLSD cat_data; +	cat_data[INV_CAT_ID] = mUUID; +	cat_data[INV_PARENT_ID] = mParentUUID; +	cat_data[INV_ASSET_TYPE] = LLAssetType::lookup(mType); +	cat_data[INV_PREFERRED_TYPE] = LLFolderType::lookup(mPreferredType); +	cat_data[INV_NAME] = mName; +	cat_data[INV_OWNER_ID] = mOwnerID; +	cat_data[INV_VERSION] = mVersion; -	keyword[0] = '\0'; -	valuestr[0] = '\0'; -	while(!feof(fp)) -	{ -		if (fgets(buffer, MAX_STRING, fp) == NULL) -		{ -			buffer[0] = '\0'; -		} -		 -		sscanf(	/* Flawfinder: ignore */ -			buffer, " %254s %254s", keyword, valuestr);  -		if(0 == strcmp("{",keyword)) -		{ -			continue; -		} -		if(0 == strcmp("}", keyword)) -		{ -			break; -		} -		else if(0 == strcmp("cat_id", keyword)) -		{ -			mUUID.set(valuestr); -		} -		else if(0 == strcmp("parent_id", keyword)) -		{ -			mParentUUID.set(valuestr); -		} -		else if(0 == strcmp("type", keyword)) -		{ -			mType = LLAssetType::lookup(valuestr); -		} -		else if(0 == strcmp("pref_type", keyword)) -		{ -			mPreferredType = LLFolderType::lookup(valuestr); -		} -		else if(0 == strcmp("name", keyword)) -		{ -			//strcpy(valuestr, buffer + strlen(keyword) + 3); -			// *NOTE: Not ANSI C, but widely supported. -			sscanf(	/* Flawfinder: ignore */ -				buffer, " %254s %254[^|]", keyword, valuestr); -			mName.assign(valuestr); -			LLStringUtil::replaceNonstandardASCII(mName, ' '); -			LLStringUtil::replaceChar(mName, '|', ' '); -		} -		else if(0 == strcmp("owner_id", keyword)) -		{ -			mOwnerID.set(valuestr); -		} -		else if(0 == strcmp("version", keyword)) -		{ -			sscanf(valuestr, "%d", &mVersion); -		} -		else -		{ -			LL_WARNS(LOG_INV) << "unknown keyword '" << keyword -							  << "' in inventory import category "  << mUUID << LL_ENDL; -		} -	} -	return true; +	return cat_data;  } -bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const -{ -	std::string uuid_str; -	fprintf(fp, "\tinv_category\t0\n\t{\n"); -	mUUID.toString(uuid_str); -	fprintf(fp, "\t\tcat_id\t%s\n", uuid_str.c_str()); -	mParentUUID.toString(uuid_str); -	fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str()); -	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); -	fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str()); -	fprintf(fp, "\t\tname\t%s|\n", mName.c_str()); -	mOwnerID.toString(uuid_str); -	fprintf(fp, "\t\towner_id\t%s\n", uuid_str.c_str()); -	fprintf(fp, "\t\tversion\t%d\n", mVersion); -	fprintf(fp,"\t}\n"); +bool LLViewerInventoryCategory::importLLSD(const LLSD& cat_data) +{ +	if (cat_data.has(INV_CAT_ID)) +	{ +		setUUID(cat_data[INV_CAT_ID].asUUID()); +	} +	if (cat_data.has(INV_PARENT_ID)) +	{ +		setParent(cat_data[INV_PARENT_ID].asUUID()); +	} +	if (cat_data.has(INV_ASSET_TYPE)) +	{ +		setType(LLAssetType::lookup(cat_data[INV_ASSET_TYPE].asString())); +	} +	if (cat_data.has(INV_PREFERRED_TYPE)) +	{ +		setPreferredType(LLFolderType::lookup(cat_data[INV_PREFERRED_TYPE].asString())); +	} +	if (cat_data.has(INV_NAME)) +	{ +		mName = cat_data[INV_NAME].asString(); +		LLStringUtil::replaceNonstandardASCII(mName, ' '); +		LLStringUtil::replaceChar(mName, '|', ' '); +	} +	if (cat_data.has(INV_OWNER_ID)) +	{ +		mOwnerID = cat_data[INV_OWNER_ID].asUUID(); +	} +	if (cat_data.has(INV_VERSION)) +	{ +		setVersion(cat_data[INV_VERSION].asInteger()); +	}  	return true;  } diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index d537b28682..24b632632b 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -131,14 +131,8 @@ public:  	virtual void packMessage(LLMessageSystem* msg) const;  	virtual BOOL unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);  	virtual BOOL unpackMessage(const LLSD& item); -	virtual BOOL importFile(LLFILE* fp);  	virtual BOOL importLegacyStream(std::istream& input_stream); -	// file handling on the viewer. These are not meant for anything -	// other than cacheing. -	bool exportFileLocal(LLFILE* fp) const; -	bool importFileLocal(LLFILE* fp); -  	// new methods  	BOOL isFinished() const { return mIsComplete; }  	void setComplete(BOOL complete) { mIsComplete = complete; } @@ -226,10 +220,9 @@ public:  	// How many descendents do we currently have information for in the InventoryModel?  	S32 getViewerDescendentCount() const; -	// file handling on the viewer. These are not meant for anything -	// other than caching. -	bool exportFileLocal(LLFILE* fp) const; -	bool importFileLocal(LLFILE* fp); +	LLSD exportLLSD() const; +	bool importLLSD(const LLSD& cat_data); +  	void determineFolderType();  	void changeType(LLFolderType::EType new_folder_type);  	virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0); diff --git a/indra/test/llpermissions_tut.cpp b/indra/test/llpermissions_tut.cpp index fa4b085fd3..e6ccd5ecb7 100644 --- a/indra/test/llpermissions_tut.cpp +++ b/indra/test/llpermissions_tut.cpp @@ -406,43 +406,6 @@ namespace tut  	template<> template<>  	void permission_object_t::test<20>()  	{ -		LLFILE* fp = LLFile::fopen("linden_file.dat","w+"); -		if(!fp) -		{ -			LL_ERRS() << "file couldn't be opened\n" << LL_ENDL; -			return; -		} -		LLPermissions perm,perm1; -		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	 -		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806");  -		LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d");  -		LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");		 -		perm.init(creator,owner,lastOwner,group); -		 -		U32 base = PERM_TRANSFER | PERM_COPY; -		U32 ownerp = PERM_TRANSFER; -		U32 groupp = PERM_TRANSFER; -		U32 everyone = PERM_TRANSFER; -		U32 next = PERM_NONE; - -		perm.initMasks(base, ownerp, everyone, groupp, next); - -		ensure("Permissions export failed", perm.exportFile(fp)); -		fclose(fp);	 -		fp = LLFile::fopen("linden_file.dat","r+"); -		if(!fp) -		{ -			LL_ERRS() << "file couldn't be opened\n" << LL_ENDL; -			return; -		} -		ensure("Permissions import failed", perm1.importFile(fp)); -		fclose(fp); -		ensure_equals("exportFile()/importFile():failed to export and import the data ", perm1, perm);	 -} - -	template<> template<> -	void permission_object_t::test<21>() -	{  		LLPermissions perm,perm1;  		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	  		LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806");  @@ -467,14 +430,7 @@ namespace tut  	}  	template<> template<> -	void permission_object_t::test<22>() -	{ -		// Deleted LLPermissions::exportFileXML() and LLPermissions::importXML() -		// because I can't find any non-test code references to it. 2009-05-04 JC -	} - -	template<> template<> -	void permission_object_t::test<23>() +	void permission_object_t::test<21>()  	{  		LLPermissions perm,perm1;  		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	 @@ -490,7 +446,7 @@ namespace tut  	}  	template<> template<> -	void permission_object_t::test<24>() +	void permission_object_t::test<22>()  	{  		LLPermissions perm,perm1;  		LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");	 @@ -513,7 +469,7 @@ namespace tut  	}  	template<> template<> -	void permission_object_t::test<25>() +	void permission_object_t::test<23>()  	{  		LLAggregatePermissions AggrPermission;	  		LLAggregatePermissions AggrPermission1;	 diff --git a/indra/test/llsaleinfo_tut.cpp b/indra/test/llsaleinfo_tut.cpp index 5f4d9186a8..b7b207610f 100644 --- a/indra/test/llsaleinfo_tut.cpp +++ b/indra/test/llsaleinfo_tut.cpp @@ -107,41 +107,6 @@ namespace tut  	template<> template<>  	void llsaleinfo_test_t::test<2>()  	{ - -		LLFILE* fp = LLFile::fopen("linden_file.dat","w+"); -		if(!fp) -		{ -			LL_ERRS() << "file could not be opened\n" << LL_ENDL; -			return; -		} -			 -		S32 sale_price = 43500; -		LLSaleInfo llsaleinfo(LLSaleInfo::FS_COPY, sale_price); -		 -		llsaleinfo.exportFile(fp); -		fclose(fp); - -		LLSaleInfo llsaleinfo1; -		U32 perm_mask; -		BOOL has_perm_mask; -		fp = LLFile::fopen("linden_file.dat","r"); -		 -		if(!fp) -		{ -			LL_ERRS() << "file coudnt be opened\n" << LL_ENDL; -			return; -		} -		 -		llsaleinfo1.importFile(fp, has_perm_mask, perm_mask); -		fclose(fp); -		 -		ensure("importFile() fn failed ", llsaleinfo.getSaleType() == llsaleinfo1.getSaleType() && -								     llsaleinfo.getSalePrice() == llsaleinfo1.getSalePrice());				 -	} - -	template<> template<> -	void llsaleinfo_test_t::test<3>() -	{  		S32 sale_price = 525452;  		LLSaleInfo llsaleinfo(LLSaleInfo::FS_ORIGINAL, sale_price); @@ -160,14 +125,7 @@ namespace tut  	}  	template<> template<> -	void llsaleinfo_test_t::test<4>() -	{ -		// Deleted LLSaleInfo::exportFileXML() and LLSaleInfo::importXML() -		// because I can't find any non-test code references to it. 2009-05-04 JC -	} - -	template<> template<> -	void llsaleinfo_test_t::test<5>() +	void llsaleinfo_test_t::test<3>()  	{	  		S32 sale_price = 99000;  		LLSaleInfo saleinfo(LLSaleInfo::FS_ORIGINAL, sale_price); @@ -186,7 +144,7 @@ namespace tut  	//static EForSale lookup(const char* name) fn test  	template<> template<> -	void llsaleinfo_test_t::test<6>() +	void llsaleinfo_test_t::test<4>()  	{  		S32 sale_price = 233223;  		LLSaleInfo::EForSale ret_type = LLSaleInfo::lookup("orig"); @@ -200,7 +158,7 @@ namespace tut  	//void LLSaleInfo::accumulate(const LLSaleInfo& sale_info) fn test  	template<> template<> -	void llsaleinfo_test_t::test<7>() +	void llsaleinfo_test_t::test<5>()  	{  		S32 sale_price = 20;  		LLSaleInfo saleinfo(LLSaleInfo::FS_COPY, sale_price); @@ -213,7 +171,7 @@ namespace tut  	// test cases of bool operator==(const LLSaleInfo &rhs) fn  	// test case of bool operator!=(const LLSaleInfo &rhs) fn  	template<> template<> -	void llsaleinfo_test_t::test<8>() +	void llsaleinfo_test_t::test<6>()  	{  		S32 sale_price = 55000;  		LLSaleInfo saleinfo(LLSaleInfo::FS_ORIGINAL, sale_price); @@ -225,7 +183,7 @@ namespace tut  	}			  	template<> template<> -	void llsaleinfo_test_t::test<9>() +	void llsaleinfo_test_t::test<7>()  	{  		//TBD: void LLSaleInfo::packMessage(LLMessageSystem* msg) const | 
