diff options
Diffstat (limited to 'indra/llcommon')
| -rw-r--r-- | indra/llcommon/llformat.cpp | 32 | ||||
| -rw-r--r-- | indra/llcommon/llformat.h | 4 | ||||
| -rw-r--r-- | indra/llcommon/llmd5.cpp | 37 | ||||
| -rw-r--r-- | indra/llcommon/llmd5.h | 11 | ||||
| -rw-r--r-- | indra/llcommon/llstring.cpp | 38 | ||||
| -rw-r--r-- | indra/llcommon/llstring.h | 15 | 
6 files changed, 112 insertions, 25 deletions
diff --git a/indra/llcommon/llformat.cpp b/indra/llcommon/llformat.cpp index cf509bee14..689f649d0a 100644 --- a/indra/llcommon/llformat.cpp +++ b/indra/llcommon/llformat.cpp @@ -37,16 +37,40 @@  #include <cstdarg> -std::string llformat(const char *fmt, ...) +// common used function with va_list argument +// wrapper for vsnprintf to be called from llformatXXX functions. +static void va_format(std::string& out, const char *fmt, va_list va)  {  	char tstr[1024];	/* Flawfinder: ignore */ -	va_list va; -	va_start(va, fmt);  #if LL_WINDOWS  	_vsnprintf(tstr, 1024, fmt, va);  #else  	vsnprintf(tstr, 1024, fmt, va);	/* Flawfinder: ignore */  #endif +	out.assign(tstr); +} + +std::string llformat(const char *fmt, ...) +{ +	std::string res; +	va_list va; +	va_start(va, fmt); +	va_format(res, fmt, va);  	va_end(va); -	return std::string(tstr); +	return res; +} + +std::string llformat_to_utf8(const char *fmt, ...) +{ +	std::string res; +	va_list va; +	va_start(va, fmt); +	va_format(res, fmt, va); +	va_end(va); + +#if LL_WINDOWS +	// made converting to utf8. See EXT-8318. +	res = ll_convert_string_to_utf8_string(res); +#endif +	return res;  } diff --git a/indra/llcommon/llformat.h b/indra/llcommon/llformat.h index dc64edb26d..17d8b4a8ad 100644 --- a/indra/llcommon/llformat.h +++ b/indra/llcommon/llformat.h @@ -42,4 +42,8 @@  std::string LL_COMMON_API llformat(const char *fmt, ...); +// the same version as above but ensures that returned string is in utf8 on windows +// to enable correct converting utf8_to_wstring. +std::string LL_COMMON_API llformat_to_utf8(const char *fmt, ...); +  #endif // LL_LLFORMAT_H diff --git a/indra/llcommon/llmd5.cpp b/indra/llcommon/llmd5.cpp index da9cb94e13..cc73c3e45c 100644 --- a/indra/llcommon/llmd5.cpp +++ b/indra/llcommon/llmd5.cpp @@ -171,11 +171,6 @@ void LLMD5::update(FILE* file){  } - - - - -  // MD5 update for istreams.  // Like update for files; see above. @@ -192,9 +187,10 @@ void LLMD5::update(std::istream& stream){  } - - - +void  LLMD5::update(const std::string& s) +{ +	update((unsigned char *)s.c_str(),s.length()); +}  // MD5 finalization. Ends an MD5 message-digest operation, writing the  // the message digest and zeroizing the context. @@ -277,7 +273,7 @@ LLMD5::LLMD5(const unsigned char *s)  	finalize();  } -void LLMD5::raw_digest(unsigned char *s) +void LLMD5::raw_digest(unsigned char *s) const  {  	if (!finalized)  	{ @@ -293,7 +289,7 @@ void LLMD5::raw_digest(unsigned char *s) -void LLMD5::hex_digest(char *s) +void LLMD5::hex_digest(char *s) const  {  	int i; @@ -319,6 +315,7 @@ void LLMD5::hex_digest(char *s) +  std::ostream& operator<<(std::ostream &stream, LLMD5 context)  {  	char s[33];		/* Flawfinder: ignore */ @@ -327,13 +324,25 @@ std::ostream& operator<<(std::ostream &stream, LLMD5 context)  	return stream;  } +bool operator==(const LLMD5& a, const LLMD5& b) +{ +	unsigned char a_guts[16]; +	unsigned char b_guts[16]; +	a.raw_digest(a_guts); +	b.raw_digest(b_guts); +	if (memcmp(a_guts,b_guts,16)==0) +		return true; +	else +		return false; +} - +bool operator!=(const LLMD5& a, const LLMD5& b) +{ +	return !(a==b); +}  // PRIVATE METHODS: - -  void LLMD5::init(){    finalized=0;  // we just started! @@ -531,3 +540,5 @@ void LLMD5::decode (uint4 *output, const uint1 *input, const uint4 len){      output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) |        (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24);  } + + diff --git a/indra/llcommon/llmd5.h b/indra/llcommon/llmd5.h index df9d7324ab..4e68ba0d5e 100644 --- a/indra/llcommon/llmd5.h +++ b/indra/llcommon/llmd5.h @@ -95,6 +95,7 @@ public:    void  update     (const uint1 *input, const uint4 input_length);    void  update     (std::istream& stream);    void  update     (FILE *file); +  void  update     (const std::string& str);    void  finalize   ();  // constructors for special circumstances.  All these constructors finalize @@ -105,11 +106,10 @@ public:    LLMD5              (const unsigned char *string, const unsigned int number);  // methods to acquire finalized result -  void				raw_digest(unsigned char *array);	// provide 16-byte array for binary data -  void				hex_digest(char *string);			// provide 33-byte array for ascii-hex string -  friend std::ostream&   operator<< (std::ostream&, LLMD5 context); - +  void				raw_digest(unsigned char *array) const;	// provide 16-byte array for binary data +  void				hex_digest(char *string) const;			// provide 33-byte array for ascii-hex string +  friend std::ostream&   operator<< (std::ostream&, LLMD5 context);  private: @@ -131,4 +131,7 @@ private:  }; +LL_COMMON_API bool operator==(const LLMD5& a, const LLMD5& b); +LL_COMMON_API bool operator!=(const LLMD5& a, const LLMD5& b); +  #endif // LL_LLMD5_H diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 1561bda201..2693c0e22b 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -633,14 +633,14 @@ namespace snprintf_hack  	}  } -std::string ll_convert_wide_to_string(const wchar_t* in) +std::string ll_convert_wide_to_string(const wchar_t* in, unsigned int code_page)  {  	std::string out;  	if(in)  	{  		int len_in = wcslen(in);  		int len_out = WideCharToMultiByte( -			CP_ACP, +			code_page,  			0,  			in,  			len_in, @@ -655,7 +655,7 @@ std::string ll_convert_wide_to_string(const wchar_t* in)  		if(pout)  		{  			WideCharToMultiByte( -				CP_ACP, +				code_page,  				0,  				in,  				len_in, @@ -669,6 +669,38 @@ std::string ll_convert_wide_to_string(const wchar_t* in)  	}  	return out;  } + +wchar_t* ll_convert_string_to_wide(const std::string& in, unsigned int code_page) +{ +	// From review: +	// We can preallocate a wide char buffer that is the same length (in wchar_t elements) as the utf8 input, +	// plus one for a null terminator, and be guaranteed to not overflow. + +	//	Normally, I'd call that sort of thing premature optimization, +	// but we *are* seeing string operations taking a bunch of time, especially when constructing widgets. +//	int output_str_len = MultiByteToWideChar(code_page, 0, in.c_str(), in.length(), NULL, 0); + +	// reserve place to NULL terminator +	int output_str_len = in.length(); +	wchar_t* w_out = new wchar_t[output_str_len + 1]; + +	memset(w_out, 0, output_str_len + 1); +	int real_output_str_len = MultiByteToWideChar (code_page, 0, in.c_str(), in.length(), w_out, output_str_len); + +	//looks like MultiByteToWideChar didn't add null terminator to converted string, see EXT-4858. +	w_out[real_output_str_len] = 0; + +	return w_out; +} + +std::string ll_convert_string_to_utf8_string(const std::string& in) +{ +	wchar_t* w_mesg = ll_convert_string_to_wide(in, CP_ACP); +	std::string out_utf8(ll_convert_wide_to_string(w_mesg, CP_UTF8)); +	delete[] w_mesg; + +	return out_utf8; +}  #endif // LL_WINDOWS  long LLStringOps::sPacificTimeOffset = 0; diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 8071c8aa2d..41fac0f8cc 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -564,7 +564,20 @@ using snprintf_hack::snprintf;   *   * This replaces the unsafe W2A macro from ATL.   */ -LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in); +LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in, unsigned int code_page); + +/** + * Converts a string to wide string. + * + * It will allocate memory for result string with "new []". Don't forget to release it with "delete []". + */ +LL_COMMON_API wchar_t* ll_convert_string_to_wide(const std::string& in, unsigned int code_page); + +/** + * Converts incoming string into urf8 string + * + */ +LL_COMMON_API std::string ll_convert_string_to_utf8_string(const std::string& in);  //@}  #endif // LL_WINDOWS  | 
