|
From: <hv...@us...> - 2015-05-04 11:45:07
|
Revision: 61484
http://sourceforge.net/p/firebird/code/61484
Author: hvlad
Date: 2015-05-04 11:45:05 +0000 (Mon, 04 May 2015)
Log Message:
-----------
Windows implementation of ISC_utf8Upper. Refactoring. Update VC10 and VC12 builds.
Modified Paths:
--------------
firebird/trunk/builds/win32/msvc10/common.vcxproj
firebird/trunk/builds/win32/msvc10/common.vcxproj.filters
firebird/trunk/builds/win32/msvc12/common.vcxproj
firebird/trunk/builds/win32/msvc12/common.vcxproj.filters
firebird/trunk/src/common/isc_file.cpp
Modified: firebird/trunk/builds/win32/msvc10/common.vcxproj
===================================================================
--- firebird/trunk/builds/win32/msvc10/common.vcxproj 2015-05-04 07:40:13 UTC (rev 61483)
+++ firebird/trunk/builds/win32/msvc10/common.vcxproj 2015-05-04 11:45:05 UTC (rev 61484)
@@ -79,6 +79,7 @@
<ClCompile Include="..\..\..\src\common\TextType.cpp" />
<ClCompile Include="..\..\..\src\common\ThreadData.cpp" />
<ClCompile Include="..\..\..\src\common\ThreadStart.cpp" />
+ <ClCompile Include="..\..\..\src\common\unicodeUpper.cpp" />
<ClCompile Include="..\..\..\src\common\unicode_util.cpp" />
<ClCompile Include="..\..\..\src\common\utils.cpp" />
<ClCompile Include="..\..\..\src\common\UtilSvc.cpp" />
@@ -183,6 +184,7 @@
<ClInclude Include="..\..\..\src\common\TextType.h" />
<ClInclude Include="..\..\..\src\common\ThreadData.h" />
<ClInclude Include="..\..\..\src\common\ThreadStart.h" />
+ <ClInclude Include="..\..\..\src\common\unicodeUpper.h" />
<ClInclude Include="..\..\..\src\common\unicode_util.h" />
<ClInclude Include="..\..\..\src\common\UtilSvc.h" />
<ClInclude Include="..\..\..\src\common\utils_proto.h" />
Modified: firebird/trunk/builds/win32/msvc10/common.vcxproj.filters
===================================================================
--- firebird/trunk/builds/win32/msvc10/common.vcxproj.filters 2015-05-04 07:40:13 UTC (rev 61483)
+++ firebird/trunk/builds/win32/msvc10/common.vcxproj.filters 2015-05-04 11:45:05 UTC (rev 61484)
@@ -207,6 +207,9 @@
<ClCompile Include="..\..\..\src\common\DynamicStrings.cpp">
<Filter>common</Filter>
</ClCompile>
+ <ClCompile Include="..\..\..\src\common\unicodeUpper.cpp">
+ <Filter>common</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\common\xdr_proto.h">
@@ -518,5 +521,8 @@
<ClInclude Include="..\..\..\src\common\SimpleStatusVector.h">
<Filter>headers</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\src\common\unicodeUpper.h">
+ <Filter>headers</Filter>
+ </ClInclude>
</ItemGroup>
</Project>
\ No newline at end of file
Modified: firebird/trunk/builds/win32/msvc12/common.vcxproj
===================================================================
--- firebird/trunk/builds/win32/msvc12/common.vcxproj 2015-05-04 07:40:13 UTC (rev 61483)
+++ firebird/trunk/builds/win32/msvc12/common.vcxproj 2015-05-04 11:45:05 UTC (rev 61484)
@@ -79,6 +79,7 @@
<ClCompile Include="..\..\..\src\common\TextType.cpp" />
<ClCompile Include="..\..\..\src\common\ThreadData.cpp" />
<ClCompile Include="..\..\..\src\common\ThreadStart.cpp" />
+ <ClCompile Include="..\..\..\src\common\unicodeUpper.cpp" />
<ClCompile Include="..\..\..\src\common\unicode_util.cpp" />
<ClCompile Include="..\..\..\src\common\utils.cpp" />
<ClCompile Include="..\..\..\src\common\UtilSvc.cpp" />
@@ -175,6 +176,7 @@
<ClInclude Include="..\..\..\src\common\sdltable.h" />
<ClInclude Include="..\..\..\src\common\sdl_proto.h" />
<ClInclude Include="..\..\..\src\common\sha.h" />
+ <ClInclude Include="..\..\..\src\common\SimpleStatusVector.h" />
<ClInclude Include="..\..\..\src\common\StatementMetadata.h" />
<ClInclude Include="..\..\..\src\common\StatusArg.h" />
<ClInclude Include="..\..\..\src\common\StatusHolder.h" />
@@ -182,6 +184,7 @@
<ClInclude Include="..\..\..\src\common\TextType.h" />
<ClInclude Include="..\..\..\src\common\ThreadData.h" />
<ClInclude Include="..\..\..\src\common\ThreadStart.h" />
+ <ClInclude Include="..\..\..\src\common\unicodeUpper.h" />
<ClInclude Include="..\..\..\src\common\unicode_util.h" />
<ClInclude Include="..\..\..\src\common\UtilSvc.h" />
<ClInclude Include="..\..\..\src\common\utils_proto.h" />
Modified: firebird/trunk/builds/win32/msvc12/common.vcxproj.filters
===================================================================
--- firebird/trunk/builds/win32/msvc12/common.vcxproj.filters 2015-05-04 07:40:13 UTC (rev 61483)
+++ firebird/trunk/builds/win32/msvc12/common.vcxproj.filters 2015-05-04 11:45:05 UTC (rev 61484)
@@ -207,6 +207,9 @@
<ClCompile Include="..\..\..\src\common\DynamicStrings.cpp">
<Filter>common</Filter>
</ClCompile>
+ <ClCompile Include="..\..\..\src\common\unicodeUpper.cpp">
+ <Filter>common</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\src\common\xdr_proto.h">
@@ -515,5 +518,11 @@
<ClInclude Include="..\..\..\src\common\DynamicStrings.h">
<Filter>headers</Filter>
</ClInclude>
+ <ClInclude Include="..\..\..\src\common\SimpleStatusVector.h">
+ <Filter>headers</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\src\common\unicodeUpper.h">
+ <Filter>headers</Filter>
+ </ClInclude>
</ItemGroup>
</Project>
\ No newline at end of file
Modified: firebird/trunk/src/common/isc_file.cpp
===================================================================
--- firebird/trunk/src/common/isc_file.cpp 2015-05-04 07:40:13 UTC (rev 61483)
+++ firebird/trunk/src/common/isc_file.cpp 2015-05-04 11:45:05 UTC (rev 61484)
@@ -1706,11 +1706,129 @@
}
#endif // HAVE_ICONV_H
+#if defined WIN_NT
+
+template <int BUFSIZE>
+class WideCharBuffer
+{
+public:
+ WideCharBuffer() :
+ m_len16(0)
+ {}
+
+ bool fromString(UINT codePage, AbstractString &str)
+ {
+ if (str.isEmpty())
+ {
+ m_len16 = 0;
+ return true;
+ }
+
+ int bufSize = m_utf16.getCapacity();
+ WCHAR* utf16Buffer = m_utf16.getBuffer(bufSize);
+ m_len16 = MultiByteToWideChar(codePage, 0, str.c_str(), str.length(), utf16Buffer, bufSize);
+
+ if (m_len16 == 0)
+ {
+ DWORD err = GetLastError();
+ if (err != ERROR_INSUFFICIENT_BUFFER)
+ return false;
+
+ bufSize = MultiByteToWideChar(codePage, 0, str.c_str(), str.length(), NULL, 0);
+ if (bufSize == 0)
+ return false;
+
+ utf16Buffer = m_utf16.getBuffer(bufSize);
+ m_len16 = MultiByteToWideChar(codePage, 0, str.c_str(), str.length(), utf16Buffer, bufSize);
+ }
+ return (m_len16 != 0);
+ }
+
+ bool toString(UINT codePage, AbstractString &str)
+ {
+ if (m_len16 == 0)
+ {
+ str.resize(0);
+ return true;
+ }
+
+ BOOL defaultCharUsed = FALSE;
+ LPBOOL pDefaultCharUsed = &defaultCharUsed;
+ if (codePage == CP_UTF8 || codePage == CP_UTF7)
+ pDefaultCharUsed = NULL;
+
+ WCHAR* utf16Buffer = m_utf16.begin();
+
+ char* utf8Buffer = str.getBuffer(str.capacity());
+ int len8 = WideCharToMultiByte(codePage, 0, utf16Buffer, m_len16,
+ utf8Buffer, str.capacity(), NULL, pDefaultCharUsed);
+
+ if (len8 == 0 || defaultCharUsed)
+ {
+ DWORD err = GetLastError();
+ if (err != ERROR_INSUFFICIENT_BUFFER)
+ return false;
+
+ len8 = WideCharToMultiByte(codePage, 0, utf16Buffer, m_len16, NULL, 0, NULL, pDefaultCharUsed);
+ if (len8 == 0 || defaultCharUsed)
+ return false;
+
+ utf8Buffer = str.getBuffer(len8);
+ len8 = WideCharToMultiByte(codePage, 0, utf16Buffer, m_len16, utf8Buffer, len8, NULL, pDefaultCharUsed);
+ }
+ if (len8 == 0 || defaultCharUsed)
+ return false;
+
+ str.resize(len8);
+ return true;
+ }
+
+ WCHAR* getBuffer()
+ {
+ return m_utf16.begin();
+ }
+
+ int getLength()
+ {
+ return m_len16;
+ }
+
+private:
+ HalfStaticArray<WCHAR, BUFSIZE> m_utf16;
+ int m_len16;
+};
+
+#endif // WIN_NT
+
+
void ISC_utf8Upper(Firebird::AbstractString& str)
{
- //// FIXME: What about Windows?
+ if (str.isEmpty())
+ return;
-#ifdef HAVE_ICONV_H
+#if defined(WIN_NT)
+ WideCharBuffer<256> wBuffer;
+
+ bool error = !wBuffer.fromString(CP_UTF8, str);
+ if (!error)
+ {
+ WCHAR* wch = wBuffer.getBuffer();
+ const WCHAR *const end = wch + wBuffer.getLength();
+ for (; wch < end; wch++)
+ *wch = unicodeUpper(*wch);
+
+ error = !wBuffer.toString(CP_UTF8, str);
+ }
+
+ if (error)
+ {
+ DWORD errCode = GetLastError();
+ status_exception::raise(
+ Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
+ Arg::Windows(errCode));
+ }
+
+#elif defined(HAVE_ICONV_H)
iConv().utf8ToUnicode.convert(str);
{ // aligner scope
@@ -1731,61 +1849,16 @@
return;
#if defined(WIN_NT)
- HalfStaticArray<WCHAR, MAX_PATH> utf16;
- WCHAR* utf16Buffer = utf16.getBuffer(MAX_PATH);
- int len16 = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), utf16Buffer, MAX_PATH);
+ WideCharBuffer<MAX_PATH> wBuffer;
- if (len16 == 0)
+ if (!wBuffer.fromString(CP_ACP, str) || !wBuffer.toString(CP_UTF8, str))
{
DWORD err = GetLastError();
- if (err != ERROR_INSUFFICIENT_BUFFER)
- {
- status_exception::raise(
- Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
- Arg::Windows(err));
- }
-
- len16 = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), NULL, 0);
- if (len16 == 0)
- {
- err = GetLastError();
- status_exception::raise(
- Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
- Arg::Windows(err));
- }
-
- utf16Buffer = utf16.getBuffer(len16);
- len16 = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), utf16Buffer, len16);
+ status_exception::raise(
+ Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
+ Arg::Windows(err));
}
- char* utf8Buffer = str.getBuffer(str.capacity());
- int len8 = WideCharToMultiByte(CP_UTF8, 0, utf16Buffer, len16,
- utf8Buffer, str.capacity(), NULL, NULL);
-
- if (len8 == 0)
- {
- DWORD err = GetLastError();
- if (err != ERROR_INSUFFICIENT_BUFFER)
- {
- status_exception::raise(
- Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
- Arg::Windows(err));
- }
-
- len8 = WideCharToMultiByte(CP_UTF8, 0, utf16Buffer, len16, NULL, 0, NULL, NULL);
- if (len8 == 0)
- {
- err = GetLastError();
- status_exception::raise(
- Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
- Arg::Windows(err));
- }
-
- utf8Buffer = str.getBuffer(len8);
- len8 = WideCharToMultiByte(CP_UTF8, 0, utf16Buffer, len16, utf8Buffer, len8, NULL, NULL);
- }
- str.resize(len8);
-
#elif defined(HAVE_ICONV_H)
iConv().systemToUtf8.convert(str);
#endif
@@ -1799,63 +1872,16 @@
return;
#if defined(WIN_NT)
- HalfStaticArray<WCHAR, MAX_PATH> utf16;
- WCHAR* utf16Buffer = utf16.getBuffer(MAX_PATH);
- int len16 = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), utf16Buffer, MAX_PATH);
+ WideCharBuffer<MAX_PATH> wBuffer;
- if (len16 == 0)
+ if (!wBuffer.fromString(CP_UTF8, str) || !wBuffer.toString(CP_ACP, str))
{
DWORD err = GetLastError();
- if (err != ERROR_INSUFFICIENT_BUFFER)
- {
- status_exception::raise(
- Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
- Arg::Windows(err));
- }
-
- len16 = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), NULL, 0);
- if (len16 == 0)
- {
- err = GetLastError();
- status_exception::raise(
- Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
- Arg::Windows(err));
- }
-
- utf16Buffer = utf16.getBuffer(len16);
- len16 = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), utf16Buffer, len16);
+ status_exception::raise(
+ Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
+ Arg::Windows(err));
}
- BOOL defaultCharUsed;
- char* ansiBuffer = str.getBuffer(str.capacity());
- int len8 = WideCharToMultiByte(CP_ACP, 0, utf16Buffer, len16,
- ansiBuffer, str.capacity(), NULL, &defaultCharUsed);
-
- if (len8 == 0 || defaultCharUsed)
- {
- DWORD err = GetLastError();
- if (err != ERROR_INSUFFICIENT_BUFFER)
- {
- status_exception::raise(
- Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
- Arg::Windows(err));
- }
-
- len8 = WideCharToMultiByte(CP_ACP, 0, utf16Buffer, len16, NULL, 0, NULL, &defaultCharUsed);
- if (len8 == 0 || defaultCharUsed)
- {
- err = GetLastError();
- status_exception::raise(
- Arg::Gds(isc_bad_conn_str) << Arg::Gds(isc_transliteration_failed) <<
- Arg::Windows(err));
- }
-
- ansiBuffer = str.getBuffer(len8);
- len8 = WideCharToMultiByte(CP_ACP, 0, utf16Buffer, len16,
- ansiBuffer, len8, NULL, &defaultCharUsed);
- }
- str.resize(len8);
-
#elif defined(HAVE_ICONV_H)
iConv().utf8ToSystem.convert(str);
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|