From 23fe81e16e8a06a34eadb2bcaa3f854a36fcb903 Mon Sep 17 00:00:00 2001 From: wizou Date: Fri, 28 May 2010 13:30:27 +0000 Subject: [PATCH] Unicode port: Auto-convert InstallOptions INI files to Unicode, to support Unicode texts git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6095 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/InstallOptions/InstallOptions.nsh | 6 ++++ Contrib/InstallOptions/InstallerOptions.cpp | 40 +++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/Contrib/InstallOptions/InstallOptions.nsh b/Contrib/InstallOptions/InstallOptions.nsh index 9d0c15b3..1038ae25 100644 --- a/Contrib/InstallOptions/InstallOptions.nsh +++ b/Contrib/InstallOptions/InstallOptions.nsh @@ -125,6 +125,9 @@ Macros and conversion functions for InstallOptions InitPluginsDir File "/oname=$PLUGINSDIR\${FILE}" "${FILE}" +!ifdef NSIS_UNICODE + InstallOptions::make_unicode "$PLUGINSDIR\${FILE}" +!endif !insertmacro INSTALLOPTIONS_WRITE "${FILE}" "Settings" "RTL" "$(^RTL)" !verbose pop @@ -135,6 +138,9 @@ Macros and conversion functions for InstallOptions InitPluginsDir File "/oname=$PLUGINSDIR\${FILENAME}" "${FILE}" +!ifdef NSIS_UNICODE + InstallOptions::make_unicode "$PLUGINSDIR\${FILENAME}" +!endif !insertmacro INSTALLOPTIONS_WRITE "${FILENAME}" "Settings" "RTL" "$(^RTL)" !macroend diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index 88e75503..552e9580 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -1502,6 +1502,46 @@ void WINAPI showCfgDlg() int initCalled; +#ifdef _UNICODE +// convert ini file to Unicode so that WritePrivateProfileString can write Unicode strings in it +extern "C" void __declspec(dllexport) make_unicode(HWND hwndParent, int string_size, + TCHAR *variables, stack_t **stacktop) +{ + EXDLL_INIT(); + TCHAR filename[MAX_PATH]; + popstring(filename); + HANDLE hFile = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + if (hFile != INVALID_HANDLE_VALUE) + { + DWORD fSize = GetFileSize(hFile, NULL); + LPSTR lpBuffer = (LPSTR) MALLOC(fSize); + if (lpBuffer) + { + DWORD bytes; + ReadFile(hFile, lpBuffer, fSize, &bytes, NULL); + if ((bytes < 2) || (lpBuffer[0] != '\xFF') || (lpBuffer[1] != '\xFE')) // file is not already Unicode + { + LPWSTR lpWide = (LPWSTR) MALLOC((bytes+1)*2); + if (lpWide) + { + int cch = MultiByteToWideChar(CP_ACP, 0, lpBuffer, bytes, lpWide, bytes+1); + if (cch) + { + SetFilePointer(hFile, 0, NULL, FILE_BEGIN); + WriteFile(hFile, "\xFF\xFE", 2, &bytes, NULL); // write Unicode BOM + WriteFile(hFile, lpWide, cch*2, &bytes, NULL); + SetEndOfFile(hFile); + } + FREE(lpWide); + } + } + FREE(lpBuffer); + } + CloseHandle(hFile); + } +} +#endif + extern "C" void __declspec(dllexport) dialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) {