summaryrefslogtreecommitdiff
path: root/cpp/src/IceUtil/StringUtil.cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2012-07-13 00:18:06 +0200
committerJose <jose@zeroc.com>2012-07-13 00:18:06 +0200
commit70802b63320582f0afa8229659ea9fe4a21d02ec (patch)
treeeb455947cc774cc558f96b8d7c78373d2a6f1c2b /cpp/src/IceUtil/StringUtil.cpp
parentICE-4839 - Glacier2 sessionHelper IceSSL plug-in (diff)
downloadice-70802b63320582f0afa8229659ea9fe4a21d02ec.tar.bz2
ice-70802b63320582f0afa8229659ea9fe4a21d02ec.tar.xz
ice-70802b63320582f0afa8229659ea9fe4a21d02ec.zip
WinRT support
Diffstat (limited to 'cpp/src/IceUtil/StringUtil.cpp')
-rw-r--r--cpp/src/IceUtil/StringUtil.cpp64
1 files changed, 56 insertions, 8 deletions
diff --git a/cpp/src/IceUtil/StringUtil.cpp b/cpp/src/IceUtil/StringUtil.cpp
index 64237c25a41..0be8561f18d 100644
--- a/cpp/src/IceUtil/StringUtil.cpp
+++ b/cpp/src/IceUtil/StringUtil.cpp
@@ -497,31 +497,79 @@ IceUtilInternal::errorToString(int error, LPCVOID source)
{
if(error < WSABASEERR)
{
+#ifndef ICE_OS_WINRT
LPVOID lpMsgBuf = 0;
- DWORD ok = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
+#else
+ int size = 256;
+ auto_ptr<BYTE> lpMsgBuf = auto_ptr<BYTE>(new BYTE[size]);
+#endif
+ DWORD ok = 0;
+#ifdef ICE_OS_WINRT
+ while(true)
+ {
+#endif
+ ok = FormatMessageW(
+#ifndef ICE_OS_WINRT
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+#endif
+ FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS |
(source != NULL ? FORMAT_MESSAGE_FROM_HMODULE : 0),
source,
error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR)&lpMsgBuf,
+#ifndef ICE_OS_WINRT
+ (LPWSTR)&lpMsgBuf,
+#else
+ (LPWSTR)lpMsgBuf.get(),
+#endif
0,
NULL);
+#ifdef ICE_OS_WINRT
+ if(!ok && size < 65536)
+ {
+ DWORD err = GetLastError();
+ if(err == ERROR_INSUFFICIENT_BUFFER)
+ {
+ size *= 4;
+ size = max(size, 65536);
+ lpMsgBuf = auto_ptr<BYTE>(new BYTE[size]);
+ continue;
+ }
+ }
+ break;
+ }
+#endif
+
if(ok)
{
- LPCTSTR msg = (LPCTSTR)lpMsgBuf;
- assert(msg && strlen((const char*)msg) > 0);
- string result = (const char*)msg;
+#ifndef ICE_OS_WINRT
+ LPWSTR msg = (LPWSTR)lpMsgBuf;
+#else
+ LPWSTR msg = (LPWSTR)lpMsgBuf.get();
+#endif
+ assert(msg && wcslen((const wchar_t*)msg) > 0);
+ wstring result = (const wchar_t*)msg;
if(result[result.length() - 1] == '\n')
{
result = result.substr(0, result.length() - 2);
}
- LocalFree(lpMsgBuf);
- return result;
+#ifndef ICE_OS_WINRT
+ if(lpMsgBuf)
+ {
+ LocalFree(lpMsgBuf);
+ }
+#endif
+ return IceUtil::wstringToString(result);
}
else
{
+#ifndef ICE_OS_WINRT
+ if(lpMsgBuf)
+ {
+ LocalFree(lpMsgBuf);
+ }
+#endif
ostringstream os;
os << "unknown error: " << error;
return os.str();