From 7fe92c766adf97bdeb4d844ffe6d0650a964572e Mon Sep 17 00:00:00 2001 From: skswales Date: Fri, 27 May 2016 15:26:34 +0100 Subject: Work towards tdf#72606 EasyHack _tstring/TCHAR elimination setup_native/source/win32/customactions/shellextensions in MSI Installer compiled as UNICODE Functions suffixed with A/W (ANSI/Wide) as needed for clarity Change-Id: I711f781b47c0efdb1e3d9bf995f7658dbb0e38d1 Reviewed-on: https://gerrit.libreoffice.org/25556 Tested-by: Jenkins Reviewed-by: Michael Stahl --- .../shellextensions/checkdirectory.cxx | 71 ++++------------- .../customactions/shellextensions/checkpatches.cxx | 64 +++------------- .../shellextensions/completeinstallpath.cxx | 80 +++++--------------- .../shellextensions/migrateinstallpath.cxx | 76 +++++-------------- .../customactions/shellextensions/shlxtmsi.hxx | 68 +++++++++++++++++ .../shellextensions/startmenuicon.cxx | 34 +-------- .../customactions/shellextensions/upgrade.cxx | 68 +++++++---------- .../customactions/shellextensions/vistaspecial.cxx | 88 +++++++--------------- 8 files changed, 189 insertions(+), 360 deletions(-) create mode 100755 setup_native/source/win32/customactions/shellextensions/shlxtmsi.hxx (limited to 'setup_native/source') diff --git a/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx b/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx index 1a4f4f01bdc5..ca6b0c5d5c56 100644 --- a/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx +++ b/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx @@ -17,90 +17,47 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifdef _MSC_VER -#pragma warning(push, 1) /* disable warnings within system headers */ -#endif -#define WIN32_LEAN_AND_MEAN -#include -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include "shlxtmsi.hxx" #include #include -#ifdef UNICODE -#define _UNICODE -#define _tstring wstring -#else -#define _tstring string -#endif -#include -#include #include #include #include #include <../tools/seterror.hxx> -static std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty ) -{ - std::_tstring result; - TCHAR szDummy[1] = TEXT(""); - DWORD nChars = 0; - - if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA ) - { - DWORD nBytes = ++nChars * sizeof(TCHAR); - LPTSTR buffer = reinterpret_cast(_alloca(nBytes)); - ZeroMemory( buffer, nBytes ); - MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars); - result = buffer; - } - - return result; -} - -static void UnsetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty) -{ - MsiSetProperty(handle, sProperty.c_str(), NULL); -} - -static void SetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty, const std::_tstring&) -{ - MsiSetProperty(handle, sProperty.c_str(), TEXT("1")); -} - extern "C" UINT __stdcall CheckInstallDirectory(MSIHANDLE handle) { - std::_tstring sInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION")); - std::_tstring sOfficeHostnamePath = GetMsiProperty(handle, TEXT("OFFICEDIRHOSTNAME")); + std::wstring sInstallPath = GetMsiPropertyW(handle, L"INSTALLLOCATION"); + std::wstring sOfficeHostnamePath = GetMsiPropertyW(handle, L"OFFICEDIRHOSTNAME"); - // MessageBox(NULL, sInstallPath.c_str(), "DEBUG", MB_OK); + // MessageBoxW(NULL, sInstallPath.c_str(), L"DEBUG", MB_OK); // unsetting all properties - UnsetMsiProperty( handle, TEXT("DIRECTORY_NOT_EMPTY") ); + UnsetMsiPropertyW( handle, L"DIRECTORY_NOT_EMPTY" ); // 1. Searching for file setup.ini - std::_tstring sSetupIniPath = sInstallPath + sOfficeHostnamePath + TEXT("\\program\\setup.ini"); + std::wstring sSetupIniPath = sInstallPath + sOfficeHostnamePath + L"\\program\\setup.ini"; WIN32_FIND_DATA data; - HANDLE hdl = FindFirstFile(sSetupIniPath.c_str(), &data); + HANDLE hdl = FindFirstFileW(sSetupIniPath.c_str(), &data); - // std::_tstring mystr = "Searching for " + sSetupIniPath; - // MessageBox(NULL, mystr.c_str(), "DEBUG", MB_OK); + // std::wstring mystr = L"Searching for " + sSetupIniPath; + // MessageBoxW(NULL, mystr.c_str(), L"DEBUG", MB_OK); if ( IsValidHandle(hdl) ) { // setup.ini found -> directory cannot be used for installation. - SetMsiProperty( handle, TEXT("DIRECTORY_NOT_EMPTY"), TEXT("1") ); + SetMsiPropertyW( handle, L"DIRECTORY_NOT_EMPTY", L"1" ); SetMsiErrorCode( MSI_ERROR_DIRECTORY_NOT_EMPTY ); - // std::_tstring notEmptyStr = "Directory is not empty. Please choose another installation directory."; - // std::_tstring notEmptyTitle = "Directory not empty"; - // MessageBox(NULL, notEmptyStr.c_str(), notEmptyTitle.c_str(), MB_OK); + // std::wstring notEmptyStr = L"Directory is not empty. Please choose another installation directory."; + // std::wstring notEmptyTitle = L"Directory not empty"; + // MessageBoxW(NULL, notEmptyStr.c_str(), notEmptyTitle.c_str(), MB_OK); + FindClose(hdl); } return ERROR_SUCCESS; diff --git a/setup_native/source/win32/customactions/shellextensions/checkpatches.cxx b/setup_native/source/win32/customactions/shellextensions/checkpatches.cxx index 33ad29fab7e8..f8a28f7ad2f2 100644 --- a/setup_native/source/win32/customactions/shellextensions/checkpatches.cxx +++ b/setup_native/source/win32/customactions/shellextensions/checkpatches.cxx @@ -17,87 +17,47 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifdef _MSC_VER -#pragma warning(push, 1) /* disable warnings within system headers */ -#endif -#define WIN32_LEAN_AND_MEAN -#include -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include "shlxtmsi.hxx" #include #include -#ifdef UNICODE -#define _UNICODE -#define _tstring wstring -#else -#define _tstring string -#endif -#include -#include #include #include #include #include - #ifdef DEBUG -inline void OutputDebugStringFormat( LPCSTR pFormat, ... ) +inline void OutputDebugStringFormatW( PCWSTR pFormat, ... ) { - CHAR buffer[1024]; + WCHAR buffer[1024]; va_list args; va_start( args, pFormat ); - StringCchVPrintfA( buffer, sizeof(buffer), pFormat, args ); - OutputDebugStringA( buffer ); + StringCchVPrintfW( buffer, sizeof(buffer)/sizeof(buffer[0]), pFormat, args ); + OutputDebugStringW( buffer ); va_end(args); } #else -static inline void OutputDebugStringFormat( LPCSTR, ... ) +static inline void OutputDebugStringFormatW( PCWSTR, ... ) { } #endif -static std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty ) -{ - std::_tstring result; - TCHAR szDummy[1] = TEXT(""); - DWORD nChars = 0; - - if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA ) - { - DWORD nBytes = ++nChars * sizeof(TCHAR); - LPTSTR buffer = reinterpret_cast(_alloca(nBytes)); - ZeroMemory( buffer, nBytes ); - MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars); - result = buffer; - } - - return result; -} - -static void SetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty ) -{ - MsiSetProperty( handle, sProperty.c_str(), TEXT("1") ); -} - extern "C" UINT __stdcall CheckPatchList( MSIHANDLE handle ) { - std::_tstring sPatchList = GetMsiProperty( handle, TEXT("PATCH") ); - std::_tstring sRequiredPatch = GetMsiProperty( handle, TEXT("PREREQUIREDPATCH") ); + std::wstring sPatchList = GetMsiPropertyW( handle, L"PATCH" ); + std::wstring sRequiredPatch = GetMsiPropertyW( handle, L"PREREQUIREDPATCH" ); - OutputDebugStringFormat( "CheckPatchList called with PATCH=%s and PRQ= %s\n", sPatchList.c_str(), sRequiredPatch.c_str() ); + OutputDebugStringFormatW( L"CheckPatchList called with PATCH=%s and PRQ=%s\n", sPatchList.c_str(), sRequiredPatch.c_str() ); if ( ( sPatchList.length() != 0 ) && ( sRequiredPatch.length() != 0 ) ) { - if ( _tcsstr( sPatchList.c_str(), sRequiredPatch.c_str() ) ) + if ( wcsstr( sPatchList.c_str(), sRequiredPatch.c_str() ) ) { - SetMsiProperty( handle, TEXT("IGNOREPREREQUIREDPATCH") ); - OutputDebugStringFormat( "Set Property IgnorePrerequiredPatch!\n" ); + SetMsiPropertyW( handle, L"IGNOREPREREQUIREDPATCH", L"1" ); + OutputDebugStringFormatW( L"Set Property IgnorePrerequiredPatch!\n" ); } } return ERROR_SUCCESS; diff --git a/setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx b/setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx index 30cc424a80da..9eb5762dc0e8 100644 --- a/setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx +++ b/setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx @@ -17,50 +17,10 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifdef _MSC_VER -#pragma warning(push, 1) /* disable warnings within system headers */ -#endif -#define WIN32_LEAN_AND_MEAN -#include -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include "shlxtmsi.hxx" #include -#ifdef UNICODE -#define _UNICODE -#define _tstring wstring -#else -#define _tstring string -#endif -#include -#include - -using namespace std; - -namespace -{ - std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty ) - { - std::_tstring result; - TCHAR szDummy[1] = TEXT(""); - DWORD nChars = 0; - - if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA ) - { - DWORD nBytes = ++nChars * sizeof(TCHAR); - LPTSTR buffer = reinterpret_cast(_alloca(nBytes)); - ZeroMemory( buffer, nBytes ); - MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars); - result = buffer; - } - - return result; - } -} // namespace - extern "C" UINT __stdcall CompleteInstallPath( MSIHANDLE handle ) { // This CustomAction is necessary for updates from OOo 3.0, OOo 3.1 and OOo 3.2 to versions @@ -75,15 +35,15 @@ extern "C" UINT __stdcall CompleteInstallPath( MSIHANDLE handle ) // Reading property OFFICEDIRHOSTNAME_, that contains the part of the path behind // the program files folder. - std::_tstring sInstallLocation = GetMsiProperty( handle, TEXT("INSTALLLOCATION") ); - std::_tstring sOfficeDirHostname = GetMsiProperty( handle, TEXT("OFFICEDIRHOSTNAME_") ); + std::wstring sInstallLocation = GetMsiPropertyW( handle, L"INSTALLLOCATION" ); + std::wstring sOfficeDirHostname = GetMsiPropertyW( handle, L"OFFICEDIRHOSTNAME_" ); // If sInstallLocation ends with (contains) the string sOfficeDirHostname, // INSTALLLOCATION is good and nothing has to be done here. bool pathCompletionRequired = true; - if ( _tcsstr( sInstallLocation.c_str(), sOfficeDirHostname.c_str() ) ) + if ( wcsstr( sInstallLocation.c_str(), sOfficeDirHostname.c_str() ) ) { pathCompletionRequired = false; // nothing to do } @@ -93,49 +53,49 @@ extern "C" UINT __stdcall CompleteInstallPath( MSIHANDLE handle ) if ( pathCompletionRequired ) { - std::_tstring sManufacturer = GetMsiProperty( handle, TEXT("Manufacturer") ); - std::_tstring sDefinedName = GetMsiProperty( handle, TEXT("DEFINEDPRODUCT") ); - std::_tstring sUpgradeCode = GetMsiProperty( handle, TEXT("UpgradeCode") ); + std::wstring sManufacturer = GetMsiPropertyW( handle, L"Manufacturer" ); + std::wstring sDefinedName = GetMsiPropertyW( handle, L"DEFINEDPRODUCT" ); + std::wstring sUpgradeCode = GetMsiPropertyW( handle, L"UpgradeCode" ); // sUpdateVersion can be "3.0", "3.1" or "3.2" - std::_tstring sProductKey30 = "Software\\" + sManufacturer + "\\" + sDefinedName + - "\\" + "3.0" + "\\" + sUpgradeCode; + std::wstring sProductKey30 = L"Software\\" + sManufacturer + L"\\" + sDefinedName + + L"\\" L"3.0" L"\\" + sUpgradeCode; - std::_tstring sProductKey31 = "Software\\" + sManufacturer + "\\" + sDefinedName + - "\\" + "3.1" + "\\" + sUpgradeCode; + std::wstring sProductKey31 = L"Software\\" + sManufacturer + L"\\" + sDefinedName + + L"\\" L"3.1" L"\\" + sUpgradeCode; - std::_tstring sProductKey32 = "Software\\" + sManufacturer + "\\" + sDefinedName + - "\\" + "3.2" + "\\" + sUpgradeCode; + std::wstring sProductKey32 = L"Software\\" + sManufacturer + L"\\" + sDefinedName + + L"\\" L"3.2" L"\\" + sUpgradeCode; bool oldVersionExists = false; - if ( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, sProductKey30.c_str(), &hKey ) ) + if ( ERROR_SUCCESS == RegOpenKeyW( HKEY_CURRENT_USER, sProductKey30.c_str(), &hKey ) ) { oldVersionExists = true; RegCloseKey( hKey ); } - else if ( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, sProductKey31.c_str(), &hKey ) ) + else if ( ERROR_SUCCESS == RegOpenKeyW( HKEY_CURRENT_USER, sProductKey31.c_str(), &hKey ) ) { oldVersionExists = true; RegCloseKey( hKey ); } - else if ( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, sProductKey32.c_str(), &hKey ) ) + else if ( ERROR_SUCCESS == RegOpenKeyW( HKEY_CURRENT_USER, sProductKey32.c_str(), &hKey ) ) { oldVersionExists = true; RegCloseKey( hKey ); } - else if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, sProductKey30.c_str(), &hKey ) ) + else if ( ERROR_SUCCESS == RegOpenKeyW( HKEY_LOCAL_MACHINE, sProductKey30.c_str(), &hKey ) ) { oldVersionExists = true; RegCloseKey( hKey ); } - else if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, sProductKey31.c_str(), &hKey ) ) + else if ( ERROR_SUCCESS == RegOpenKeyW( HKEY_LOCAL_MACHINE, sProductKey31.c_str(), &hKey ) ) { oldVersionExists = true; RegCloseKey( hKey ); } - else if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, sProductKey32.c_str(), &hKey ) ) + else if ( ERROR_SUCCESS == RegOpenKeyW( HKEY_LOCAL_MACHINE, sProductKey32.c_str(), &hKey ) ) { oldVersionExists = true; RegCloseKey( hKey ); @@ -146,7 +106,7 @@ extern "C" UINT __stdcall CompleteInstallPath( MSIHANDLE handle ) // Adding the new path content sOfficeDirHostname sInstallLocation = sInstallLocation + sOfficeDirHostname; // Setting the new property value - MsiSetProperty(handle, TEXT("INSTALLLOCATION"), sInstallLocation.c_str()); + MsiSetPropertyW(handle, L"INSTALLLOCATION", sInstallLocation.c_str()); } } diff --git a/setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx b/setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx index 26a6760e327b..3abea1b42543 100644 --- a/setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx +++ b/setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx @@ -17,83 +17,43 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifdef _MSC_VER -#pragma warning(push, 1) /* disable warnings within system headers */ -#endif -#define WIN32_LEAN_AND_MEAN -#include -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include "shlxtmsi.hxx" #include -#ifdef UNICODE -#define _UNICODE -#define _tstring wstring -#else -#define _tstring string -#endif -#include -#include - -using namespace std; - -namespace -{ - std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty ) - { - std::_tstring result; - TCHAR szDummy[1] = TEXT(""); - DWORD nChars = 0; - - if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA ) - { - DWORD nBytes = ++nChars * sizeof(TCHAR); - LPTSTR buffer = reinterpret_cast(_alloca(nBytes)); - ZeroMemory( buffer, nBytes ); - MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars); - result = buffer; - } - - return result; - } -} // namespace - extern "C" UINT __stdcall MigrateInstallPath( MSIHANDLE handle ) { - TCHAR szValue[8192]; - DWORD nValueSize = sizeof(szValue); + WCHAR szValue[8192]; + DWORD nValueSize = sizeof(szValue); // yes, it is the number of bytes HKEY hKey; - std::_tstring sInstDir; + std::wstring sInstDir; - std::_tstring sManufacturer = GetMsiProperty( handle, TEXT("Manufacturer") ); - std::_tstring sDefinedName = GetMsiProperty( handle, TEXT("DEFINEDPRODUCT") ); - std::_tstring sUpdateVersion = GetMsiProperty( handle, TEXT("DEFINEDVERSION") ); - std::_tstring sUpgradeCode = GetMsiProperty( handle, TEXT("UpgradeCode") ); + std::wstring sManufacturer = GetMsiPropertyW( handle, L"Manufacturer" ); + std::wstring sDefinedName = GetMsiPropertyW( handle, L"DEFINEDPRODUCT" ); + std::wstring sUpdateVersion = GetMsiPropertyW( handle, L"DEFINEDVERSION" ); + std::wstring sUpgradeCode = GetMsiPropertyW( handle, L"UpgradeCode" ); - std::_tstring sProductKey = "Software\\" + sManufacturer + "\\" + sDefinedName + - "\\" + sUpdateVersion + "\\" + sUpgradeCode; + std::wstring sProductKey = L"Software\\" + sManufacturer + L"\\" + sDefinedName + + L"\\" + sUpdateVersion + L"\\" + sUpgradeCode; - if ( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, sProductKey.c_str(), &hKey ) ) + if ( ERROR_SUCCESS == RegOpenKeyW( HKEY_CURRENT_USER, sProductKey.c_str(), &hKey ) ) { - if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) ) + if ( ERROR_SUCCESS == RegQueryValueExW( hKey, L"INSTALLLOCATION", NULL, NULL, (LPBYTE)szValue, &nValueSize ) ) { sInstDir = szValue; - MsiSetProperty(handle, TEXT("INSTALLLOCATION"), sInstDir.c_str()); - // MessageBox( NULL, sInstDir.c_str(), "Found in HKEY_CURRENT_USER", MB_OK ); + MsiSetPropertyW(handle, L"INSTALLLOCATION", sInstDir.c_str()); + // MessageBoxW( NULL, sInstDir.c_str(), L"Found in HKEY_CURRENT_USER", MB_OK ); } RegCloseKey( hKey ); } - else if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, sProductKey.c_str(), &hKey ) ) + else if ( ERROR_SUCCESS == RegOpenKeyW( HKEY_LOCAL_MACHINE, sProductKey.c_str(), &hKey ) ) { - if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) ) + if ( ERROR_SUCCESS == RegQueryValueExW( hKey, L"INSTALLLOCATION", NULL, NULL, (LPBYTE)szValue, &nValueSize ) ) { sInstDir = szValue; - MsiSetProperty(handle, TEXT("INSTALLLOCATION"), sInstDir.c_str()); - // MessageBox( NULL, sInstDir.c_str(), "Found in HKEY_LOCAL_MACHINE", MB_OK ); + MsiSetPropertyW(handle, L"INSTALLLOCATION", sInstDir.c_str()); + // MessageBoxW( NULL, sInstDir.c_str(), L"Found in HKEY_LOCAL_MACHINE", MB_OK ); } RegCloseKey( hKey ); diff --git a/setup_native/source/win32/customactions/shellextensions/shlxtmsi.hxx b/setup_native/source/win32/customactions/shellextensions/shlxtmsi.hxx new file mode 100755 index 000000000000..66e3cb1b7e78 --- /dev/null +++ b/setup_native/source/win32/customactions/shellextensions/shlxtmsi.hxx @@ -0,0 +1,68 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SETUP_NATIVE_SOURCE_WIN32_CUSTOMACTIONS_SHELLEXTENSIONS_SHLXTMSI_HXX +#define INCLUDED_SETUP_NATIVE_SOURCE_WIN32_CUSTOMACTIONS_SHELLEXTENSIONS_SHLXTMSI_HXX + +#ifdef _MSC_VER +#pragma warning(push, 1) /* disable warnings within system headers */ +#endif +#define WIN32_LEAN_AND_MEAN +#include +#include +#ifdef _WIN32_WINNT_WINBLUE +#include +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#include + +static inline std::wstring GetMsiPropertyW( MSIHANDLE handle, const std::wstring& sProperty ) +{ + std::wstring result; + WCHAR szDummy[1] = L""; + DWORD nChars = 0; + + if ( MsiGetPropertyW( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA ) + { + DWORD nBytes = ++nChars * sizeof(WCHAR); + PWSTR buffer = reinterpret_cast(_alloca(nBytes)); + ZeroMemory( buffer, nBytes ); + MsiGetPropertyW( handle, sProperty.c_str(), buffer, &nChars ); + result = buffer; + } + + return result; +} + +static inline void SetMsiPropertyW( MSIHANDLE handle, const std::wstring& sProperty, const std::wstring& sValue ) +{ + MsiSetPropertyW( handle, sProperty.c_str(), sValue.c_str() ); +} + +static inline void UnsetMsiPropertyW( MSIHANDLE handle, const std::wstring& sProperty ) +{ + MsiSetPropertyW( handle, sProperty.c_str(), NULL ); +} + +#endif // INCLUDED_SETUP_NATIVE_SOURCE_WIN32_CUSTOMACTIONS_SHELLEXTENSIONS_SHLXTMSI_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx b/setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx index a54e0a458387..a9cd41ad0fef 100644 --- a/setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx +++ b/setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx @@ -17,41 +17,9 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#define UNICODE - -#ifdef _MSC_VER -#pragma warning(push, 1) /* disable warnings within system headers */ -#endif -#define WIN32_LEAN_AND_MEAN -#include -#include -#ifdef _WIN32_WINNT_WINBLUE -#include -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include "shlxtmsi.hxx" #include -#include - -std::wstring GetMsiPropertyW( MSIHANDLE handle, const std::wstring& sProperty ) -{ - std::wstring result; - WCHAR szDummy[1] = L""; - DWORD nChars = 0; - - if ( MsiGetPropertyW( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA ) - { - DWORD nBytes = ++nChars * sizeof(WCHAR); - PWSTR buffer = reinterpret_cast(_alloca(nBytes)); - ZeroMemory( buffer, nBytes ); - MsiGetPropertyW(handle, sProperty.c_str(), buffer, &nChars); - result = buffer; - } - - return result; -} /* Called during installation to customize the start menu folder icon. diff --git a/setup_native/source/win32/customactions/shellextensions/upgrade.cxx b/setup_native/source/win32/customactions/shellextensions/upgrade.cxx index 5a9ce2251432..946c425de24f 100644 --- a/setup_native/source/win32/customactions/shellextensions/upgrade.cxx +++ b/setup_native/source/win32/customactions/shellextensions/upgrade.cxx @@ -17,25 +17,15 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +// NB This file still makes use of largely ANSI MSI API calls #undef UNICODE #undef _UNICODE -#ifdef _MSC_VER -#pragma warning(push, 1) /* disable warnings within system headers */ -#endif -#define WIN32_LEAN_AND_MEAN -#include -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include "shlxtmsi.hxx" #include #include -#include -#include - using namespace std; namespace @@ -109,55 +99,55 @@ namespace return convertedGuid; } - string GetMsiProperty(MSIHANDLE handle, const string& sProperty) + string GetMsiPropertyA(MSIHANDLE handle, const string& sProperty) { string result; - TCHAR szDummy[1] = TEXT(""); + CHAR szDummy[1] = ""; DWORD nChars = 0; - if (MsiGetProperty(handle, sProperty.c_str(), szDummy, &nChars) == ERROR_MORE_DATA) + if (MsiGetPropertyA(handle, sProperty.c_str(), szDummy, &nChars) == ERROR_MORE_DATA) { - DWORD nBytes = ++nChars * sizeof(TCHAR); - LPTSTR buffer = reinterpret_cast(_alloca(nBytes)); + DWORD nBytes = ++nChars * sizeof(CHAR); + LPSTR buffer = reinterpret_cast(_alloca(nBytes)); ZeroMemory( buffer, nBytes ); - MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars); + MsiGetPropertyA( handle, sProperty.c_str(), buffer, &nChars ); result = buffer; } return result; } - inline bool IsSetMsiProperty(MSIHANDLE handle, const string& sProperty) + inline bool IsSetMsiPropertyA(MSIHANDLE handle, const string& sProperty) { - return (GetMsiProperty(handle, sProperty).length() > 0); + return (GetMsiPropertyA(handle, sProperty).length() > 0); } - inline void UnsetMsiProperty(MSIHANDLE handle, const string& sProperty) + inline void UnsetMsiPropertyA(MSIHANDLE handle, const string& sProperty) { - MsiSetProperty(handle, sProperty.c_str(), NULL); + MsiSetPropertyA(handle, sProperty.c_str(), NULL); } - inline void SetMsiProperty(MSIHANDLE handle, const string& sProperty) + inline void SetMsiPropertyA(MSIHANDLE handle, const string& sProperty) { - MsiSetProperty(handle, sProperty.c_str(), TEXT("1")); + MsiSetPropertyA(handle, sProperty.c_str(), "1"); } bool RegistryKeyHasUpgradeSubKey( - HKEY hRootKey, const string& regKey, const string& upgradeKey) + HKEY hRootKey, const wstring& regKey, const string& upgradeKey) { HKEY hKey; - if (RegOpenKey(hRootKey, regKey.c_str(), &hKey) == ERROR_SUCCESS) + if (RegOpenKeyW(hRootKey, regKey.c_str(), &hKey) == ERROR_SUCCESS) { DWORD nSubKeys; DWORD lLongestSubKey; - if (RegQueryInfoKey( + if (RegQueryInfoKeyA( hKey, NULL, NULL, NULL, &nSubKeys, &lLongestSubKey, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { - LPTSTR buffer = reinterpret_cast(_alloca(lLongestSubKey + 1)); + LPSTR buffer = reinterpret_cast(_alloca(lLongestSubKey + 1)); for (DWORD i = 0; i < nSubKeys; i++) { - LONG ret = RegEnumKey(hKey, i, buffer, lLongestSubKey + 1); + LONG ret = RegEnumKeyA(hKey, i, buffer, lLongestSubKey + 1); if ((ret == ERROR_SUCCESS) && (buffer == upgradeKey)) return true; } @@ -169,26 +159,26 @@ namespace extern "C" UINT __stdcall SetProductInstallMode(MSIHANDLE handle) { - string upgradeCode = GetMsiProperty(handle, TEXT("UpgradeCode")); + string upgradeCode = GetMsiPropertyA(handle, "UpgradeCode"); upgradeCode = ConvertGuid(string(upgradeCode.c_str() + 1, upgradeCode.length() - 2)); - //MessageBox(NULL, upgradeCode.c_str(), TEXT("Debug"), MB_OK); + // MessageBoxA(NULL, upgradeCode.c_str(), "Debug", MB_OK); if (RegistryKeyHasUpgradeSubKey( HKEY_CURRENT_USER, - TEXT("Software\\Microsoft\\Installer\\UpgradeCodes"), - upgradeCode) && IsSetMsiProperty(handle, TEXT("ALLUSERS"))) + L"Software\\Microsoft\\Installer\\UpgradeCodes", + upgradeCode) && IsSetMsiPropertyA(handle, "ALLUSERS")) { - UnsetMsiProperty(handle, TEXT("ALLUSERS")); - //MessageBox(NULL, "ALLUSERS removed", "DEBUG", MB_OK); + UnsetMsiPropertyA(handle, "ALLUSERS"); + // MessageBoxW(NULL, L"ALLUSERS removed", L"DEBUG", MB_OK); } else if (RegistryKeyHasUpgradeSubKey( HKEY_LOCAL_MACHINE, - TEXT("Software\\Classes\\Installer\\UpgradeCodes"), - upgradeCode) && !IsSetMsiProperty(handle, TEXT("ALLUSERS"))) + L"Software\\Classes\\Installer\\UpgradeCodes", + upgradeCode) && !IsSetMsiPropertyA(handle, "ALLUSERS")) { - SetMsiProperty(handle, TEXT("ALLUSERS")); - //MessageBox(NULL, "ALLUSERS set", "DEBUG", MB_OK); + SetMsiPropertyA(handle, "ALLUSERS"); + // MessageBoxW(NULL, L"ALLUSERS set", L"DEBUG", MB_OK); } return ERROR_SUCCESS; } diff --git a/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx b/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx index d5e3ce6e5927..dd2b86760614 100644 --- a/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx +++ b/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx @@ -17,27 +17,11 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ -#ifdef _MSC_VER -#pragma warning(push, 1) /* disable warnings within system headers */ -#endif -#define WIN32_LEAN_AND_MEAN -#include -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif +#include "shlxtmsi.hxx" #include #include -#ifdef UNICODE -#define _UNICODE -#define _tstring wstring -#else -#define _tstring string -#endif -#include -#include #include #include #include @@ -45,61 +29,43 @@ #include #include <../tools/seterror.hxx> -static std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty ) -{ - std::_tstring result; - TCHAR szDummy[1] = TEXT(""); - DWORD nChars = 0; - - if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA ) - { - DWORD nBytes = ++nChars * sizeof(TCHAR); - LPTSTR buffer = reinterpret_cast(_alloca(nBytes)); - ZeroMemory( buffer, nBytes ); - MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars); - result = buffer; - } - - return result; -} - -static BOOL RemoveCompleteDirectory(const std::_tstring& rPath) +static BOOL RemoveCompleteDirectoryW(const std::wstring& rPath) { bool bDirectoryRemoved = true; - std::_tstring sPattern = rPath + TEXT("\\") + TEXT("*.*"); + std::wstring sPattern = rPath + L"\\" + L"*.*"; WIN32_FIND_DATA aFindData; // Finding all content in rPath - HANDLE hFindContent = FindFirstFile( sPattern.c_str(), &aFindData ); + HANDLE hFindContent = FindFirstFileW( sPattern.c_str(), &aFindData ); if ( hFindContent != INVALID_HANDLE_VALUE ) { bool fNextFile = false; - std::_tstring sCurrentDir = TEXT("."); - std::_tstring sParentDir = TEXT(".."); + std::wstring sCurrentDir = L"."; + std::wstring sParentDir = L".."; do { - std::_tstring sFileName = aFindData.cFileName; + std::wstring sFileName = aFindData.cFileName; - if (( strcmp(sFileName.c_str(),sCurrentDir.c_str()) != 0 ) && - ( strcmp(sFileName.c_str(),sParentDir.c_str()) != 0 )) + if (( wcscmp(sFileName.c_str(),sCurrentDir.c_str()) != 0 ) && + ( wcscmp(sFileName.c_str(),sParentDir.c_str()) != 0 )) { - std::_tstring sCompleteFileName = rPath + TEXT("\\") + sFileName; + std::wstring sCompleteFileName = rPath + L"\\" + sFileName; if ( aFindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY ) { - RemoveCompleteDirectory(sCompleteFileName); + RemoveCompleteDirectoryW(sCompleteFileName); } else { - DeleteFile( sCompleteFileName.c_str() ); + DeleteFileW( sCompleteFileName.c_str() ); } } - fNextFile = FindNextFile( hFindContent, &aFindData ); + fNextFile = FindNextFileW( hFindContent, &aFindData ); } while ( fNextFile ); @@ -110,7 +76,7 @@ static BOOL RemoveCompleteDirectory(const std::_tstring& rPath) // -> first removing content -> closing handle -> remove empty directory - if( !( RemoveDirectory(rPath.c_str()) ) ) + if( !( RemoveDirectoryW(rPath.c_str()) ) ) { bDirectoryRemoved = false; } @@ -121,19 +87,19 @@ static BOOL RemoveCompleteDirectory(const std::_tstring& rPath) extern "C" UINT __stdcall RenamePrgFolder( MSIHANDLE handle ) { - std::_tstring sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION")); + std::wstring sOfficeInstallPath = GetMsiPropertyW(handle, L"INSTALLLOCATION"); - std::_tstring sRenameSrc = sOfficeInstallPath + TEXT("program"); - std::_tstring sRenameDst = sOfficeInstallPath + TEXT("program_old"); + std::wstring sRenameSrc = sOfficeInstallPath + L"program"; + std::wstring sRenameDst = sOfficeInstallPath + L"program_old"; - bool bSuccess = MoveFile( sRenameSrc.c_str(), sRenameDst.c_str() ); + bool bSuccess = MoveFileW( sRenameSrc.c_str(), sRenameDst.c_str() ); if ( !bSuccess ) { - TCHAR sAppend[2] = TEXT("0"); + WCHAR sAppend[2] = L"0"; for ( int i = 0; i < 10; i++ ) { - sRenameDst = sOfficeInstallPath + TEXT("program_old") + sAppend; - bSuccess = MoveFile( sRenameSrc.c_str(), sRenameDst.c_str() ); + sRenameDst = sOfficeInstallPath + L"program_old" + sAppend; + bSuccess = MoveFileW( sRenameSrc.c_str(), sRenameDst.c_str() ); if ( bSuccess ) break; sAppend[0] += 1; @@ -145,16 +111,16 @@ extern "C" UINT __stdcall RenamePrgFolder( MSIHANDLE handle ) extern "C" UINT __stdcall RemovePrgFolder( MSIHANDLE handle ) { - std::_tstring sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION")); - std::_tstring sRemoveDir = sOfficeInstallPath + TEXT("program_old"); + std::wstring sOfficeInstallPath = GetMsiPropertyW(handle, L"INSTALLLOCATION"); + std::wstring sRemoveDir = sOfficeInstallPath + L"program_old"; - RemoveCompleteDirectory( sRemoveDir ); + RemoveCompleteDirectoryW( sRemoveDir ); - TCHAR sAppend[2] = TEXT("0"); + WCHAR sAppend[2] = L"0"; for ( int i = 0; i < 10; i++ ) { - sRemoveDir = sOfficeInstallPath + TEXT("program_old") + sAppend; - RemoveCompleteDirectory( sRemoveDir ); + sRemoveDir = sOfficeInstallPath + L"program_old" + sAppend; + RemoveCompleteDirectoryW( sRemoveDir ); sAppend[0] += 1; } -- cgit