[Libreoffice-commits] core.git: setup_native/Library_shlxtmsi.mk setup_native/source

skswales stuart.swales.croftnuisk at gmail.com
Mon May 30 11:14:03 UTC 2016


 setup_native/Library_shlxtmsi.mk                                                |    2 
 setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx      |   71 +-------
 setup_native/source/win32/customactions/shellextensions/checkpatches.cxx        |   64 +------
 setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx |   80 ++-------
 setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx  |   76 ++------
 setup_native/source/win32/customactions/shellextensions/shlxtmsi.hxx            |   68 +++++++
 setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx       |   34 ---
 setup_native/source/win32/customactions/shellextensions/upgrade.cxx             |   68 +++----
 setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx        |   88 +++-------
 9 files changed, 191 insertions(+), 360 deletions(-)

New commits:
commit 7fe92c766adf97bdeb4d844ffe6d0650a964572e
Author: skswales <stuart.swales.croftnuisk at gmail.com>
Date:   Fri May 27 15:26:34 2016 +0100

    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 <ci at libreoffice.org>
    Reviewed-by: Michael Stahl <mstahl at redhat.com>

diff --git a/setup_native/Library_shlxtmsi.mk b/setup_native/Library_shlxtmsi.mk
index 161ff8a..fd0f089 100644
--- a/setup_native/Library_shlxtmsi.mk
+++ b/setup_native/Library_shlxtmsi.mk
@@ -12,6 +12,8 @@ $(eval $(call gb_Library_Library,shlxtmsi))
 $(eval $(call gb_Library_use_external,shlxtmsi,boost_headers))
 
 $(eval $(call gb_Library_add_defs,shlxtmsi,\
+	-DUNICODE \
+	-D_UNICODE \
 	-U_DLL \
 ))
 
diff --git a/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx b/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx
index 1a4f4f0..ca6b0c5 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 <windows.h>
-#include <msiquery.h>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
+#include "shlxtmsi.hxx"
 
 #include <malloc.h>
 #include <assert.h>
 
-#ifdef UNICODE
-#define _UNICODE
-#define _tstring    wstring
-#else
-#define _tstring    string
-#endif
-#include <tchar.h>
-#include <string>
 #include <queue>
 #include <stdio.h>
 
 #include <systools/win32/uwinapi.h>
 #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<LPTSTR>(_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 33ad29f..f8a28f7 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 <windows.h>
-#include <msiquery.h>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
+#include "shlxtmsi.hxx"
 
 #include <malloc.h>
 #include <assert.h>
 
-#ifdef UNICODE
-#define _UNICODE
-#define _tstring    wstring
-#else
-#define _tstring    string
-#endif
-#include <tchar.h>
-#include <string>
 #include <queue>
 #include <stdio.h>
 #include <strsafe.h>
 
 #include <systools/win32/uwinapi.h>
 
-
 #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<LPTSTR>(_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 30cc424..9eb5762 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 <windows.h>
-#include <msiquery.h>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
+#include "shlxtmsi.hxx"
 
 #include <malloc.h>
 
-#ifdef UNICODE
-#define _UNICODE
-#define _tstring    wstring
-#else
-#define _tstring    string
-#endif
-#include <tchar.h>
-#include <string>
-
-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<LPTSTR>(_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 26a6760..3abea1b 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 <windows.h>
-#include <msiquery.h>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
+#include "shlxtmsi.hxx"
 
 #include <malloc.h>
 
-#ifdef UNICODE
-#define _UNICODE
-#define _tstring    wstring
-#else
-#define _tstring    string
-#endif
-#include <tchar.h>
-#include <string>
-
-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<LPTSTR>(_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 0000000..66e3cb1
--- /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 <windows.h>
+#include <msiquery.h>
+#ifdef _WIN32_WINNT_WINBLUE
+#include <VersionHelpers.h>
+#endif
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#include <string>
+
+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<PWSTR>(_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 a54e0a4..a9cd41a 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 <windows.h>
-#include <msiquery.h>
-#ifdef _WIN32_WINNT_WINBLUE
-#include <VersionHelpers.h>
-#endif
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
+#include "shlxtmsi.hxx"
 
 #include <malloc.h>
-#include <string>
-
-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<PWSTR>(_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 5a9ce22..946c425 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 <windows.h>
-#include <msiquery.h>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
+#include "shlxtmsi.hxx"
 
 #include <malloc.h>
 #include <assert.h>
 
-#include <tchar.h>
-#include <string>
-
 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<LPTSTR>(_alloca(nBytes));
+            DWORD nBytes = ++nChars * sizeof(CHAR);
+            LPSTR buffer = reinterpret_cast<LPSTR>(_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<LPTSTR>(_alloca(lLongestSubKey + 1));
+                LPSTR buffer = reinterpret_cast<LPSTR>(_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 d5e3ce6..dd2b867 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 <windows.h>
-#include <msiquery.h>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
+#include "shlxtmsi.hxx"
 
 #include <malloc.h>
 #include <assert.h>
 
-#ifdef UNICODE
-#define _UNICODE
-#define _tstring    wstring
-#else
-#define _tstring    string
-#endif
-#include <tchar.h>
-#include <string>
 #include <queue>
 #include <stdio.h>
 #include <strsafe.h>
@@ -45,61 +29,43 @@
 #include <systools/win32/uwinapi.h>
 #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<LPTSTR>(_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;
     }
 


More information about the Libreoffice-commits mailing list