From 34db7b90f23c152376c642ad91f307547685c67d Mon Sep 17 00:00:00 2001 From: kichik Date: Sat, 11 Dec 2004 16:10:28 +0000 Subject: [PATCH] use new MultiByteToWideChar and WideCharToMultiByte implementation git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3824 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/DialogTemplate.cpp | 83 +++------------------------------- Source/ResourceVersionInfo.cpp | 26 ++--------- 2 files changed, 10 insertions(+), 99 deletions(-) diff --git a/Source/DialogTemplate.cpp b/Source/DialogTemplate.cpp index 106cd39c..c80c3052 100644 --- a/Source/DialogTemplate.cpp +++ b/Source/DialogTemplate.cpp @@ -49,49 +49,20 @@ void ReadVarLenArr(BYTE* &seeker, char* &readInto, unsigned int uCodePage) { break; default: { - int iStrLen; -#ifdef _WIN32 - iStrLen = WideCharToMultiByte(uCodePage, 0, (WCHAR*)arr, -1, 0, 0, 0, 0); + int iStrLen = WideCharToMultiByte(uCodePage, 0, (WCHAR*)arr, -1, 0, 0, 0, 0); if (iStrLen) { readInto = new char[iStrLen]; - WideCharToMultiByte(uCodePage, 0, (WCHAR*)arr, -1, readInto, iStrLen, 0, 0); - } - else - { - *arr = 0; - seeker += sizeof(WCHAR); - } -#else - iStrLen = WCStrLen((WCHAR *) arr); - - char cp[128] = "CP1252"; - if (uCodePage != CP_ACP) - snprintf(cp, 128, "CP%d", uCodePage); - iconv_t cd = iconv_open(cp, "UCS-2"); - if (cd != (iconv_t) -1) - { - char *in = (char *) arr; - char *out = readInto = new char[iStrLen + 1]; - size_t insize = (iStrLen + 1) * sizeof(WCHAR); - size_t outsize = iStrLen + 1; - if (__iconv_adaptor(iconv, cd, &in, &insize, &out, &outsize) == (size_t) -1) + if (!WideCharToMultiByte(uCodePage, 0, (WCHAR*)arr, -1, readInto, iStrLen, 0, 0)) { delete [] readInto; - readInto = 0; - iconv_close(cd); - static char err[1024]; - snprintf(err,1024,"iconv failed (%d)!",errno); - throw runtime_error(err); + throw runtime_error("ReadVarLenArr - Unicode conversion failed."); } - iconv_close(cd); } else { - readInto = 0; - throw runtime_error("iconv failed! no converter from UCS-2 to current code page"); + throw runtime_error("ReadVarLenArr - Unicode conversion failed."); } -#endif seeker += iStrLen * sizeof(WCHAR); } break; @@ -99,7 +70,6 @@ void ReadVarLenArr(BYTE* &seeker, char* &readInto, unsigned int uCodePage) { } // A macro that writes a given string (that can be a number too) into the buffer -#ifdef _WIN32 #define WriteStringOrId(x) \ if (x) \ if (IS_INTRESOURCE(x)) { \ @@ -110,52 +80,13 @@ void ReadVarLenArr(BYTE* &seeker, char* &readInto, unsigned int uCodePage) { } \ else { \ int us = MultiByteToWideChar(m_uCodePage, 0, x, -1, (WCHAR*)seeker, dwSize); \ + if (!us) { \ + throw runtime_error("WriteStringOrId - Unicode conversion failed."); \ + } \ seeker += us*sizeof(WCHAR); \ } \ else \ seeker += sizeof(WORD); -#else -#define WriteStringOrId(x) \ - if (x) \ - if (IS_INTRESOURCE(x)) { \ - *(WORD*)seeker = 0xFFFF; \ - seeker += sizeof(WORD); \ - *(WORD*)seeker = WORD(DWORD(x)); \ - seeker += sizeof(WORD); \ - } \ - else { \ - char cp[128] = "CP1252"; \ - if (m_uCodePage != CP_ACP) \ - snprintf(cp, 128, "CP%d", m_uCodePage); \ - iconv_t cd = iconv_open("UCS-2", cp); \ - if (cd != (iconv_t) -1) \ - { \ - char *in = (char *) x; \ - char *out = (char *) seeker; \ - size_t insize = strlen(in) + 1; \ - size_t outsize = insize * sizeof(WCHAR); \ - if (__iconv_adaptor(iconv, cd, &in, &insize, &out, &outsize) == (size_t) -1) \ - { \ - *(WCHAR*)seeker = 0; \ - seeker += sizeof(WCHAR); \ - iconv_close(cd); \ - static char err[1024]; \ - snprintf(err,1024,"iconv failed (%d)!",errno); \ - throw runtime_error(err); \ - } \ - seeker = (BYTE *) out; \ - iconv_close(cd); \ - } \ - else \ - { \ - *(WCHAR*)seeker = 0; \ - seeker += sizeof(WCHAR); \ - throw runtime_error("iconv failed! no converter from UCS-2 to current code page"); \ - } \ - } \ - else \ - seeker += sizeof(WORD); -#endif // A macro that adds the size of x (which can be a string a number, or nothing) to dwSize #define AddStringOrIdSize(x) dwSize += x ? (IS_INTRESOURCE(x) ? sizeof(DWORD) : (strlen(x)+1)*sizeof(WCHAR)) : sizeof(WORD) diff --git a/Source/ResourceVersionInfo.cpp b/Source/ResourceVersionInfo.cpp index 52161e14..d40b9743 100644 --- a/Source/ResourceVersionInfo.cpp +++ b/Source/ResourceVersionInfo.cpp @@ -122,34 +122,14 @@ void CResourceVersionInfo::SetProductVersion(int HighPart, int LowPart) // Util function - must be freeded WCHAR* StrToWstrAlloc(const char* istr, int codepage) { -#ifdef _WIN32 int strSize = MultiByteToWideChar(codepage, 0, istr, -1, 0, 0); WCHAR* wstr = new WCHAR[strSize]; - MultiByteToWideChar(codepage, 0, istr, -1, wstr, strSize); - return wstr; -#else - WCHAR *wstr = NULL; - char cp[128] = ""; - if (codepage != CP_ACP) - snprintf(cp, 128, "CP%d", codepage); - iconv_t cd = iconv_open("UCS-2", cp); - if (cd != (iconv_t) -1) + if (!MultiByteToWideChar(codepage, 0, istr, -1, wstr, strSize)) { - int len = strlen(istr); - char *in = (char *) istr; - wstr = new WCHAR[len + 1]; - char *out = (char *) wstr; - size_t insize = len + 1; - size_t outsize = (len + 1) * sizeof(WCHAR); - if (__iconv_adaptor(iconv, cd, &in, &insize, &out, &outsize) == (size_t) -1) - { - delete [] wstr; - wstr = NULL; - } - iconv_close(cd); + delete [] wstr; + wstr = NULL; } return wstr; -#endif } int GetVersionHeader (LPSTR &p, WORD &wLength, WORD &wValueLength, WORD &wType)