diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/llsdserialize.cpp | 34 | ||||
| -rw-r--r-- | indra/llcommon/llsdserialize.h | 18 | 
2 files changed, 29 insertions, 23 deletions
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index 71744aef3c..be54ed053b 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -2121,22 +2121,13 @@ std::string zip_llsd(LLSD& data)  	deflateEnd(&strm);  	free(output); -#if 0 //verify results work with unzip_llsd -	std::istringstream test(result); -	LLSD test_sd; -	if (!unzip_llsd(test_sd, test, result.size())) -	{ -		LL_ERRS() << "Invalid compression result!" << LL_ENDL; -	} -#endif -  	return result;  }  //decompress a block of LLSD from provided istream  // not very efficient -- creats a copy of decompressed LLSD block in memory  // and deserializes from that copy using LLSDSerialize -bool unzip_llsd(LLSD& data, std::istream& is, S32 size) +LLUZipHelper::EZipRresult LLUZipHelper::unzip_llsd(LLSD& data, std::istream& is, S32 size)  {  	U8* result = NULL;  	U32 cur_size = 0; @@ -2147,7 +2138,7 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)  	U8 *in = new(std::nothrow) U8[size];  	if (!in)  	{ -		return false; +		return ZR_MEM_ERROR;  	}  	is.read((char*) in, size);  @@ -2171,7 +2162,7 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)  			inflateEnd(&strm);  			free(result);  			delete [] in; -			return false; +			return ZR_DATA_ERROR;  		}  		switch (ret) @@ -2183,7 +2174,7 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)  			inflateEnd(&strm);  			free(result);  			delete [] in; -			return false; +			return ZR_MEM_ERROR;  			break;  		} @@ -2198,7 +2189,7 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)  				free(result);  			}  			delete[] in; -			return false; +			return ZR_MEM_ERROR;  		}  		result = new_result;  		memcpy(result+cur_size, out, have); @@ -2212,7 +2203,7 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)  	if (ret != Z_STREAM_END)  	{  		free(result); -		return false; +		return ZR_DATA_ERROR;  	}  	//result now points to the decompressed LLSD block @@ -2234,29 +2225,28 @@ bool unzip_llsd(LLSD& data, std::istream& is, S32 size)  			istr.str(res_str);  		} +#ifdef LL_WINDOWS  		catch (std::length_error)  		{ -			LL_DEBUGS("UNZIP") << "String we are creating is too big" << LL_ENDL;  			free(result); -			return false; +			return ZR_SIZE_ERROR;  		} +#endif  		catch (std::bad_alloc)  		{ -			LL_DEBUGS("UNZIP") << "Failed to allocate for string" << LL_ENDL;  			free(result); -			return false; +			return ZR_MEM_ERROR;  		}  		if (!LLSDSerialize::fromBinary(data, istr, cur_size))  		{ -			LL_WARNS("UNZIP") << "Failed to unzip LLSD block" << LL_ENDL;  			free(result); -			return false; +			return ZR_PARSE_ERROR;  		}  	}  	free(result); -	return true; +	return ZR_OK;  }  //This unzip function will only work with a gzip header and trailer - while the contents  //of the actual compressed data is the same for either format (gzip vs zlib ), the headers diff --git a/indra/llcommon/llsdserialize.h b/indra/llcommon/llsdserialize.h index 23a0c8cfb1..9f58d44fe7 100644 --- a/indra/llcommon/llsdserialize.h +++ b/indra/llcommon/llsdserialize.h @@ -814,8 +814,24 @@ public:  	}  }; +class LL_COMMON_API LLUZipHelper : public LLRefCount +{ +public: +    typedef enum e_zip_result +    { +        ZR_OK = 0, +        ZR_MEM_ERROR, +        ZR_SIZE_ERROR, +        ZR_DATA_ERROR, +        ZR_PARSE_ERROR, +    } EZipRresult; +    // return OK or reason for failure +    static EZipRresult unzip_llsd(LLSD& data, std::istream& is, S32 size); +}; +  //dirty little zip functions -- yell at davep  LL_COMMON_API std::string zip_llsd(LLSD& data); -LL_COMMON_API bool unzip_llsd(LLSD& data, std::istream& is, S32 size); + +  LL_COMMON_API U8* unzip_llsdNavMesh( bool& valid, unsigned int& outsize,std::istream& is, S32 size);  #endif // LL_LLSDSERIALIZE_H  | 
