summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2008-04-18 17:58:23 -0400
committerBernard Normier <bernard@zeroc.com>2008-04-18 17:58:23 -0400
commitcb11f5d824675f9b5aa4e24aef5b0b15daa66385 (patch)
treef2e8582394a2524dd08910c5eb7812d28ed78f0d
parentMerge branch 'master' of cvs:/home/git/ice (diff)
downloadice-cb11f5d824675f9b5aa4e24aef5b0b15daa66385.tar.bz2
ice-cb11f5d824675f9b5aa4e24aef5b0b15daa66385.tar.xz
ice-cb11f5d824675f9b5aa4e24aef5b0b15daa66385.zip
Fixed bug #2992
-rw-r--r--cpp/include/Ice/StringConverter.h6
-rw-r--r--cpp/include/IceUtil/Unicode.h51
-rw-r--r--cpp/src/Ice/StringConverter.cpp9
-rw-r--r--cpp/src/IceUtil/ConvertUTF.h8
-rw-r--r--cpp/src/IceUtil/Unicode.cpp24
5 files changed, 54 insertions, 44 deletions
diff --git a/cpp/include/Ice/StringConverter.h b/cpp/include/Ice/StringConverter.h
index de35ba731f1..4d87a9ef7b7 100644
--- a/cpp/include/Ice/StringConverter.h
+++ b/cpp/include/Ice/StringConverter.h
@@ -14,6 +14,7 @@
#include <IceUtil/Exception.h>
#include <IceUtil/Shared.h>
#include <IceUtil/Handle.h>
+#include <IceUtil/Unicode.h>
#include <string>
@@ -70,9 +71,14 @@ class ICE_API UnicodeWstringConverter : public WstringConverter
{
public:
+ UnicodeWstringConverter(IceUtil::ConversionFlags = IceUtil::lenientConversion);
+
virtual Byte* toUTF8(const wchar_t*, const wchar_t*, UTF8Buffer&) const;
virtual void fromUTF8(const Byte*, const Byte*, std::wstring&) const;
+
+private:
+ const IceUtil::ConversionFlags _conversionFlags;
};
#ifdef _WIN32
diff --git a/cpp/include/IceUtil/Unicode.h b/cpp/include/IceUtil/Unicode.h
index 3eaa154021c..2df19ade7e8 100644
--- a/cpp/include/IceUtil/Unicode.h
+++ b/cpp/include/IceUtil/Unicode.h
@@ -16,6 +16,12 @@
namespace IceUtil
{
+enum ConversionFlags
+{
+ strictConversion = 0,
+ lenientConversion
+};
+
#if defined(_MSC_VER) && (_MSC_VER >= 1300)
//
@@ -32,54 +38,54 @@ namespace IceUtil
//
# if defined(_NATIVE_WCHAR_T_DEFINED)
-ICE_UTIL_API std::string wstringToString(const std::wstring&);
+ICE_UTIL_API std::string wstringToString(const std::wstring&, ConversionFlags = lenientConversion);
# if _MSC_VER >= 1400
//
// Building or using with VC8
//
-ICE_UTIL_API std::wstring stringToWstring(const std::string&);
-ICE_UTIL_API std::string wstringToString(const std::basic_string<unsigned short>&);
-ICE_UTIL_API std::basic_string<unsigned short> stringToTypedefWstring(const std::string&);
+ICE_UTIL_API std::wstring stringToWstring(const std::string&, ConversionFlags = lenientConversion);
+ICE_UTIL_API std::string wstringToString(const std::basic_string<unsigned short>&, ConversionFlags = lenientConversion);
+ICE_UTIL_API std::basic_string<unsigned short> stringToTypedefWstring(const std::string&, ConversionFlags = lenientConversion);
# else
//
// Using a VC7.x build with the non-default /Zc
//
-ICE_UTIL_API std::wstring stringToNativeWstring(const std::string&);
+ICE_UTIL_API std::wstring stringToNativeWstring(const std::string&, ConversionFlags = lenientConversion);
inline std::wstring
-stringToWstring(const std::string& str)
+stringToWstring(const std::string& str, ConversionFlags flags = lenientConversion)
{
- return stringToNativeWstring(str);
+ return stringToNativeWstring(str, flags);
}
# endif
# else
-ICE_UTIL_API std::string wstringToString(const std::wstring&);
+ICE_UTIL_API std::string wstringToString(const std::wstring&, ConversionFlags = lenientConversion);
# if _MSC_VER < 1400
//
// Building or using with VC7.x
//
-ICE_UTIL_API std::wstring stringToWstring(const std::string&);
-ICE_UTIL_API std::string wstringToString(const std::basic_string<__wchar_t>&);
-ICE_UTIL_API std::basic_string<__wchar_t> stringToNativeWstring(const std::string&);
+ICE_UTIL_API std::wstring stringToWstring(const std::string&, ConversionFlags = lenientConversion);
+ICE_UTIL_API std::string wstringToString(const std::basic_string<__wchar_t>&, ConversionFlags = lenientConversion);
+ICE_UTIL_API std::basic_string<__wchar_t> stringToNativeWstring(const std::string&, ConversionFlags = lenientConversion);
# else
//
// Using a VC8.x build the non-default /Zc
//
-ICE_UTIL_API std::wstring stringToTypedefWstring(const std::string&);
+ICE_UTIL_API std::wstring stringToTypedefWstring(const std::string&, ConversionFlags = lenientConversion);
inline std::wstring
-stringToWstring(const std::string& str)
+stringToWstring(const std::string& str, ConversionFlags flags = lenientConversion)
{
- return stringToTypedefWstring(str);
+ return stringToTypedefWstring(str, flags);
}
# endif
# endif
#else
-ICE_UTIL_API std::string wstringToString(const std::wstring&);
-ICE_UTIL_API std::wstring stringToWstring(const std::string&);
+ICE_UTIL_API std::string wstringToString(const std::wstring&, ConversionFlags = lenientConversion);
+ICE_UTIL_API std::wstring stringToWstring(const std::string&, ConversionFlags = lenientConversion);
#endif
@@ -128,13 +134,6 @@ namespace IceUtilInternal
// unicode.org
//
-
-enum ConversionFlags
-{
- strictConversion = 0,
- lenientConversion
-};
-
enum ConversionResult
{
conversionOK, /* conversion successful */
@@ -145,15 +144,15 @@ enum ConversionResult
ICE_UTIL_API ConversionResult
convertUTFWstringToUTF8(const wchar_t*& sourceStart, const wchar_t* sourceEnd,
- IceUtil::Byte*& targetStart, IceUtil::Byte* targetEnd, ConversionFlags flags);
+ IceUtil::Byte*& targetStart, IceUtil::Byte* targetEnd, IceUtil::ConversionFlags flags);
ICE_UTIL_API ConversionResult
convertUTF8ToUTFWstring(const IceUtil::Byte*& sourceStart, const IceUtil::Byte* sourceEnd,
- wchar_t*& targetStart, wchar_t* targetEnd, ConversionFlags flags);
+ wchar_t*& targetStart, wchar_t* targetEnd, IceUtil::ConversionFlags flags);
ICE_UTIL_API ConversionResult
convertUTF8ToUTFWstring(const IceUtil::Byte*& sourceStart, const IceUtil::Byte* sourceEnd,
- std::wstring& target, ConversionFlags flags);
+ std::wstring& target, IceUtil::ConversionFlags flags);
}
diff --git a/cpp/src/Ice/StringConverter.cpp b/cpp/src/Ice/StringConverter.cpp
index 1e750a88e1d..e9b6068b9ba 100644
--- a/cpp/src/Ice/StringConverter.cpp
+++ b/cpp/src/Ice/StringConverter.cpp
@@ -20,6 +20,11 @@ using namespace std;
namespace Ice
{
+UnicodeWstringConverter::UnicodeWstringConverter(ConversionFlags flags) :
+ _conversionFlags(flags)
+{
+}
+
Byte*
UnicodeWstringConverter::toUTF8(const wchar_t* sourceStart,
const wchar_t* sourceEnd,
@@ -38,7 +43,7 @@ UnicodeWstringConverter::toUTF8(const wchar_t* sourceStart,
while((result =
convertUTFWstringToUTF8(sourceStart, sourceEnd,
- targetStart, targetEnd, lenientConversion))
+ targetStart, targetEnd, _conversionFlags))
== targetExhausted)
{
targetStart = buffer.getMoreBytes(chunkSize, targetStart);
@@ -74,7 +79,7 @@ UnicodeWstringConverter::fromUTF8(const Byte* sourceStart, const Byte* sourceEnd
}
ConversionResult result =
- convertUTF8ToUTFWstring(sourceStart, sourceEnd, target, lenientConversion);
+ convertUTF8ToUTFWstring(sourceStart, sourceEnd, target, _conversionFlags);
switch(result)
{
diff --git a/cpp/src/IceUtil/ConvertUTF.h b/cpp/src/IceUtil/ConvertUTF.h
index 40973ac0e84..89c047b84ee 100644
--- a/cpp/src/IceUtil/ConvertUTF.h
+++ b/cpp/src/IceUtil/ConvertUTF.h
@@ -120,19 +120,19 @@ typedef bool Boolean; /* 0 or 1 */
ConversionResult ConvertUTF8toUTF16(
const UTF8** sourceStart, const UTF8* sourceEnd,
- UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
+ UTF16** targetStart, UTF16* targetEnd, IceUtil::ConversionFlags flags);
ConversionResult ConvertUTF16toUTF8 (
const UTF16** sourceStart, const UTF16* sourceEnd,
- UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
+ UTF8** targetStart, UTF8* targetEnd, IceUtil::ConversionFlags flags);
ConversionResult ConvertUTF8toUTF32(
const UTF8** sourceStart, const UTF8* sourceEnd,
- UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
+ UTF32** targetStart, UTF32* targetEnd, IceUtil::ConversionFlags flags);
ConversionResult ConvertUTF32toUTF8(
const UTF32** sourceStart, const UTF32* sourceEnd,
- UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
+ UTF8** targetStart, UTF8* targetEnd, IceUtil::ConversionFlags flags);
//
// isLegalUTFSequence is declared in IceUtil/Unicode.h
diff --git a/cpp/src/IceUtil/Unicode.cpp b/cpp/src/IceUtil/Unicode.cpp
index 226259bd21d..8476ece1afd 100644
--- a/cpp/src/IceUtil/Unicode.cpp
+++ b/cpp/src/IceUtil/Unicode.cpp
@@ -185,7 +185,7 @@ IceUtil::UTFConversionException::conversionError() const
string
-IceUtil::wstringToString(const wstring& wstr)
+IceUtil::wstringToString(const wstring& wstr, ConversionFlags flags)
{
string target;
@@ -200,7 +200,7 @@ IceUtil::wstringToString(const wstring& wstr)
ConversionResult cr =
convertUTFWstringToUTF8(
sourceStart, sourceStart + wstr.size(),
- targetStart, targetEnd, lenientConversion);
+ targetStart, targetEnd, flags);
if(cr != conversionOK)
{
@@ -218,14 +218,14 @@ IceUtil::wstringToString(const wstring& wstr)
}
wstring
-IceUtil::stringToWstring(const string& str)
+IceUtil::stringToWstring(const string& str, ConversionFlags flags)
{
wstring result;
const Byte* sourceStart = reinterpret_cast<const Byte*>(str.data());
ConversionResult cr
= convertUTF8ToUTFWstring(sourceStart, sourceStart + str.size(),
- result, lenientConversion);
+ result, flags);
if(cr != conversionOK)
{
@@ -245,27 +245,27 @@ IceUtil::stringToWstring(const string& str)
# if _MSC_VER < 1400
string
-IceUtil::wstringToString(const basic_string<__wchar_t>& str)
+IceUtil::wstringToString(const basic_string<__wchar_t>& str, ConversionFlags flags)
{
- return wstringToString(*reinterpret_cast<const wstring*>(&str));
+ return wstringToString(*reinterpret_cast<const wstring*>(&str), flags);
}
basic_string<__wchar_t>
-IceUtil::stringToNativeWstring(const string& str)
+IceUtil::stringToNativeWstring(const string& str, ConversionFlags flags)
{
- return reinterpret_cast<basic_string<__wchar_t>& >(stringToWstring(str));
+ return reinterpret_cast<basic_string<__wchar_t>& >(stringToWstring(str, flags));
}
# else
string
-IceUtil::wstringToString(const basic_string<unsigned short>& str)
+IceUtil::wstringToString(const basic_string<unsigned short>& str, ConversionFlags flags)
{
- return wstringToString(*reinterpret_cast<const wstring*>(&str));
+ return wstringToString(*reinterpret_cast<const wstring*>(&str), flags);
}
basic_string<unsigned short>
-IceUtil::stringToTypedefWstring(const string& str)
+IceUtil::stringToTypedefWstring(const string& str, ConversionFlags flags)
{
- return reinterpret_cast<basic_string<unsigned short>& >(stringToWstring(str));
+ return reinterpret_cast<basic_string<unsigned short>& >(stringToWstring(str, flags));
}
# endif