diff options
Diffstat (limited to 'cppe/include')
-rw-r--r-- | cppe/include/IceE/BasicStream.h | 35 | ||||
-rw-r--r-- | cppe/include/IceE/Config.h | 2 | ||||
-rw-r--r-- | cppe/include/IceE/Unicode.h | 156 |
3 files changed, 192 insertions, 1 deletions
diff --git a/cppe/include/IceE/BasicStream.h b/cppe/include/IceE/BasicStream.h index 7e6dca17ddd..fc968be6833 100644 --- a/cppe/include/IceE/BasicStream.h +++ b/cppe/include/IceE/BasicStream.h @@ -15,6 +15,7 @@ #include <IceE/Buffer.h> #include <IceE/AutoArray.h> #include <IceE/Protocol.h> +#include <IceE/Unicode.h> namespace Ice { @@ -450,6 +451,40 @@ public: } void read(std::vector<std::string>&); + void write(const std::wstring& v) + { + std::string s = IceUtil::wstringToString(v); + Ice::Int sz = static_cast<Ice::Int>(s.size()); + writeSize(sz); + if(sz > 0) + { + Container::size_type pos = b.size(); + resize(pos + sz); + memcpy(&b[pos], s.c_str(), sz); + } + } + void write(const std::wstring*, const std::wstring*); + void read(std::wstring& v) + { + Ice::Int sz; + readSize(sz); + if(sz > 0) + { + if(b.end() - i < sz) + { + throwUnmarshalOutOfBoundsException(__FILE__, __LINE__); + } + std::string s(reinterpret_cast<const char*>(&*i), reinterpret_cast<const char*>(&*i) + sz); + IceUtil::stringToWstring(s).swap(v); + i += sz; + } + else + { + v.clear(); + } + } + void read(std::vector<std::wstring>&); + void write(const Ice::ObjectPrx&); void read(Ice::ObjectPrx&); diff --git a/cppe/include/IceE/Config.h b/cppe/include/IceE/Config.h index 0af91514943..1bcd826b5c7 100644 --- a/cppe/include/IceE/Config.h +++ b/cppe/include/IceE/Config.h @@ -129,7 +129,7 @@ # define ICE_DECLSPEC_IMPORT /**/ #endif -#if defined(_MSC_VER) +#if defined(_MSC_VER) && (_MSC_VER >= 1300) # define ICE_DEPRECATED_API __declspec(deprecated) #elif defined(__GNUC__) # define ICE_DEPRECATED_API __attribute__((deprecated)) diff --git a/cppe/include/IceE/Unicode.h b/cppe/include/IceE/Unicode.h new file mode 100644 index 00000000000..a09c0b8c6f1 --- /dev/null +++ b/cppe/include/IceE/Unicode.h @@ -0,0 +1,156 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved. +// +// This copy of Ice-E is licensed to you under the terms described in the +// ICEE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#ifndef ICEE_UNICODE_H +#define ICEE_UNICODE_H + +#include <IceE/Config.h> +#include <IceE/Exception.h> + +namespace IceUtil +{ + +#if defined(_MSC_VER) && (_MSC_VER >= 1300) + +// +// With Visual C++ 7.x, wchar_t is either a typedef unsigned short or a +// native type (when /Zc:wchar_t is used). +// Since wstring is a typedef basic_string<wchar_t>, its type is also +// different depending on whether /Zc:wchar_t is used or not. +// +// With Visual C++ 7.x, the default is typedef; with Visual C++ 8.0, +// the default is native type. +// +// Ice is always built with the default, but provides wstringToString() +// and stringToWstring() implementations for both flavors of wstring. +// + +# if defined(_NATIVE_WCHAR_T_DEFINED) +ICE_API std::string wstringToString(const std::wstring&); + +# if _MSC_VER >= 1400 +// +// Building or using with VC8 +// +ICE_API std::wstring stringToWstring(const std::string&); +ICE_API std::string wstringToString(const std::basic_string<unsigned short>&); +ICE_API std::basic_string<unsigned short> stringToTypedefWstring(const std::string&); +# else +// +// Using a VC7.x build with the non-default /Zc +// +ICE_API std::wstring stringToNativeWstring(const std::string&); +inline std::wstring +stringToWstring(const std::string& str) +{ + return stringToNativeWstring(str); +} +# endif + +# else +ICE_API std::string wstringToString(const std::wstring&); + +# if _MSC_VER < 1400 +// +// Building or using with VC7.x +// +ICE_API std::wstring stringToWstring(const std::string&); +ICE_API std::string wstringToString(const std::basic_string<__wchar_t>&); +ICE_API std::basic_string<__wchar_t> stringToNativeWstring(const std::string&); +# else +// +// Using a VC8.x build the non-default /Zc +// +ICE_API std::wstring stringToTypedefWstring(const std::string&); +inline std::wstring +stringToWstring(const std::string& str) +{ + return stringToTypedefWstring(str); +} +# endif +# endif + +#else + +ICE_API std::string wstringToString(const std::wstring&); +ICE_API std::wstring stringToWstring(const std::string&); + +#endif + + +// +// Converts UTF-8 byte-sequences to and from UTF-16 or UTF-32 (with native +// endianness) depending on sizeof(wchar_t). +// +// These are thin wrappers over the UTF8/16/32 converters provided by +// unicode.org +// +// +// TODO: provide the same support for /Zc:wchar_t as the functions above +// + +enum ConversionResult +{ + conversionOK, /* conversion successful */ + sourceExhausted, /* partial character in source, but hit end */ + targetExhausted, /* insuff. room in target for conversion */ + sourceIllegal /* source sequence is illegal/malformed */ +}; + + +enum ConversionFlags +{ + strictConversion = 0, + lenientConversion +}; + +typedef unsigned char Byte; + +ICE_API bool +isLegalUTF8Sequence(const Byte* source, const Byte* end); + +ICE_API ConversionResult +convertUTFWstringToUTF8(const wchar_t*& sourceStart, const wchar_t* sourceEnd, + Byte*& targetStart, Byte* targetEnd, ConversionFlags flags); + +ICE_API ConversionResult +convertUTF8ToUTFWstring(const Byte*& sourceStart, const Byte* sourceEnd, + wchar_t*& targetStart, wchar_t* targetEnd, ConversionFlags flags); + +ICE_API ConversionResult +convertUTF8ToUTFWstring(const Byte*& sourceStart, const Byte* sourceEnd, + std::wstring& target, ConversionFlags flags); + + + + +// +// UTFConversionException is raised by wstringToString() or stringToWstring() +// to report a conversion error +// +class ICE_API UTFConversionException : public Exception +{ +public: + + UTFConversionException(const char*, int, ConversionResult); + virtual const std::string ice_name() const; + virtual std::string toString() const; + virtual Exception* ice_clone() const; + virtual void ice_throw() const; + + ConversionResult conversionResult() const; +private: + + const ConversionResult _conversionResult; + static const char* _name; +}; + +} + +#endif |