[Libreoffice-commits] .: 2 commits - setup_native/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Sun Jan 27 11:35:01 PST 2013


 setup_native/source/win32/customactions/languagepacks/respintest.cxx            |   57 +++-
 setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx             |  140 +++++-----
 setup_native/source/win32/customactions/regactivex/regactivex.cxx               |   27 +
 setup_native/source/win32/customactions/regpatchactivex/regpatchactivex.cxx     |   41 ++
 setup_native/source/win32/customactions/sellang/sellang.cxx                     |   21 +
 setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx      |   37 ++
 setup_native/source/win32/customactions/shellextensions/checkpatches.cxx        |   42 ++-
 setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx |   33 +-
 setup_native/source/win32/customactions/shellextensions/copyextensiondata.cxx   |   24 +
 setup_native/source/win32/customactions/shellextensions/dotnetcheck.cxx         |   42 ++-
 setup_native/source/win32/customactions/shellextensions/layerlinks.cxx          |   40 ++
 setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx  |   31 +-
 setup_native/source/win32/customactions/shellextensions/postuninstall.cxx       |   23 +
 setup_native/source/win32/customactions/shellextensions/setadmininstall.cxx     |    4 
 setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx       |   37 ++
 setup_native/source/win32/customactions/shellextensions/upgrade.cxx             |   44 ++-
 setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx        |   26 +
 setup_native/source/win32/customactions/thesaurus/thesaurus.cxx                 |   36 ++
 setup_native/source/win32/customactions/tools/checkversion.cxx                  |   35 +-
 setup_native/source/win32/customactions/tools/msiprop.hxx                       |   62 ----
 20 files changed, 584 insertions(+), 218 deletions(-)

New commits:
commit 55fc2b96bb808381fff62b3d34f0e25c13de84a4
Author: Andras Timar <atimar at suse.com>
Date:   Sun Jan 27 20:29:45 2013 +0100

    Revert "fix for fdo#39632 : Consolidate GetMsiProperty()"
    
    This reverts commit 95ee7d9cd3a0b0f397def8e607759c81feb8c592.

diff --git a/setup_native/source/win32/customactions/languagepacks/respintest.cxx b/setup_native/source/win32/customactions/languagepacks/respintest.cxx
index 864f9bf..f757a88 100644
--- a/setup_native/source/win32/customactions/languagepacks/respintest.cxx
+++ b/setup_native/source/win32/customactions/languagepacks/respintest.cxx
@@ -27,7 +27,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -44,18 +44,53 @@
 
 using namespace std;
 
+namespace
+{
+    string GetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        string  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;
+    }
+
+    inline bool IsSetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        return (GetMsiProperty(handle, sProperty).length() > 0);
+    }
+
+    inline void UnsetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        MsiSetProperty(handle, sProperty.c_str(), NULL);
+    }
+
+    inline void SetMsiProperty(MSIHANDLE handle, const string& sProperty, const string&)
+    {
+        MsiSetProperty(handle, sProperty.c_str(), TEXT("1"));
+    }
+} // namespace
+
 extern "C" UINT __stdcall GetUserInstallMode(MSIHANDLE handle)
 {
-    string sOfficeInstallPath = GetMsiPropValue(handle, TEXT("INSTALLLOCATION"));
+    string sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
 
     // MessageBox(NULL, sOfficeInstallPath.c_str(), "DEBUG", MB_OK);
 
     // unsetting all properties
 
-    MsiSetProperty( handle, TEXT("INVALIDDIRECTORY"), NULL );
-    MsiSetProperty( handle, TEXT("ISWRONGPRODUCT"), NULL );
-    MsiSetProperty( handle, TEXT("PATCHISOLDER"), NULL );
-    MsiSetProperty( handle, TEXT("ALLUSERS"), NULL );
+    UnsetMsiProperty( handle, TEXT("INVALIDDIRECTORY") );
+    UnsetMsiProperty( handle, TEXT("ISWRONGPRODUCT") );
+    UnsetMsiProperty( handle, TEXT("PATCHISOLDER") );
+    UnsetMsiProperty( handle, TEXT("ALLUSERS") );
 
     // 1. Searching for "ProductCode" in setup.ini
 
@@ -75,7 +110,7 @@ extern "C" UINT __stdcall GetUserInstallMode(MSIHANDLE handle)
     if ( !_tcsicmp( szValue, TEXT("INVALIDDIRECTORY") ) )
     {
         // No setup.ini or no "ProductCode" in setup.ini. This is an invalid directory.
-        MsiSetProperty( handle, TEXT("INVALIDDIRECTORY"), TEXT("YES") );
+        SetMsiProperty( handle, TEXT("INVALIDDIRECTORY"), TEXT("YES") );
         // MessageBox(NULL, "INVALIDDIRECTORY set, no setup.ini or ProductCode in setup.ini.", "DEBUG", MB_OK);
         SetMsiErrorCode( MSI_ERROR_INVALIDDIRECTORY );
         return ERROR_SUCCESS;
@@ -96,20 +131,20 @@ extern "C" UINT __stdcall GetUserInstallMode(MSIHANDLE handle)
 
     if ( !_tcsicmp( szValue, TEXT("ISWRONGPRODUCT") ) )
     {
-        MsiSetProperty( handle, TEXT("ISWRONGPRODUCT"), TEXT("YES") );
+        SetMsiProperty( handle, TEXT("ISWRONGPRODUCT"), TEXT("YES") );
         // MessageBox(NULL, "ISWRONGPRODUCT 1 set after searching buildid", "DEBUG", MB_OK);
         SetMsiErrorCode( MSI_ERROR_ISWRONGPRODUCT );
         return ERROR_SUCCESS;
     }
 
-    string ProductMajor = GetMsiPropValue(handle, TEXT("PRODUCTMAJOR"));
+    string ProductMajor = GetMsiProperty(handle, TEXT("PRODUCTMAJOR"));
 
     // Comparing the first three characters, for example "680"
     // If not equal, this version is not suited for patch or language pack
 
     if (_tcsnicmp(ProductMajor.c_str(), szValue, 3))
     {
-        MsiSetProperty( handle, TEXT("ISWRONGPRODUCT"), TEXT("YES") );
+        SetMsiProperty( handle, TEXT("ISWRONGPRODUCT"), TEXT("YES") );
         // MessageBox(NULL, "ISWRONGPRODUCT 2 set after searching PRODUCTMAJOR", "DEBUG", MB_OK);
         SetMsiErrorCode( MSI_ERROR_ISWRONGPRODUCT );
         return ERROR_SUCCESS;
@@ -130,7 +165,7 @@ extern "C" UINT __stdcall GetUserInstallMode(MSIHANDLE handle)
 
     if ( szValue[0] )
     {
-        MsiSetProperty( handle, TEXT("ALLUSERS"), szValue );
+        SetMsiProperty( handle, TEXT("ALLUSERS"), szValue );
         // MessageBox(NULL, "ALLUSERS set", "DEBUG", MB_OK);
     }
 
diff --git a/setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx b/setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx
index 4197053..a0f930a 100644
--- a/setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx
+++ b/setup_native/source/win32/customactions/reg4allmsdoc/reg4allmsi.cxx
@@ -22,7 +22,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -66,9 +66,6 @@ static const int EXCEL_START = 7;
 static const int POWERPOINT_START = 15;
 static const int VISIO_START = 23;
 static const int VISIO_END = 25;
-const string PROP_OFF = "0";
-const string PROP_ON = "1";
-
 
 //    ".xlam",    // Office Excel 2007 XML macro-enabled add-in
 //    ".ppam",    // Office PowerPoint 2007 macro-enabled XML add-in
@@ -179,6 +176,30 @@ static LONG DeleteSubKeyTree( HKEY RootKey, LPCSTR lpKey )
     return rc;
 }
 
+bool GetMsiProp( MSIHANDLE handle, LPCSTR name, /*out*/std::string& value )
+{
+    DWORD sz = 0;
+    LPSTR dummy = "";
+    if (MsiGetPropertyA(handle, name, dummy, &sz) == ERROR_MORE_DATA)
+    {
+        sz++;
+        DWORD nbytes = sz * sizeof(TCHAR);
+        LPSTR buff = reinterpret_cast<LPSTR>(_alloca(nbytes));
+        ZeroMemory(buff, nbytes);
+        MsiGetPropertyA(handle, name, buff, &sz);
+        value = buff;
+        return true;
+    }
+    return false;
+}
+
+bool IsSetMsiProp( MSIHANDLE handle, LPCSTR name )
+{
+    std::string val;
+    GetMsiProp( handle, name, val );
+    return (val == "1");
+}
+
 static void registerForExtension( MSIHANDLE handle, const int nIndex, bool bRegister )
 {
     CHAR sPropName[256];
@@ -292,16 +313,56 @@ extern "C" UINT __stdcall LookForRegisteredExtensions( MSIHANDLE handle )
     bool bCalcEnabled = false;
     bool bImpressEnabled = false;
     bool bDrawEnabled = false;
+    bool bRegisterNone = IsSetMsiProp( handle, "REGISTER_NO_MSO_TYPES" );
+
+    if ( ( ERROR_SUCCESS == MsiGetFeatureState( handle, L"gm_p_Wrt", &current_state, &future_state ) ) &&
+         ( (future_state == INSTALLSTATE_LOCAL) || ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_UNKNOWN) ) ) )
+        bWriterEnabled = true;
+
+    OutputDebugStringFormat( "LookForRegisteredExtensions: Install state Writer is [%d], will be [%d]", current_state, future_state );
+    if ( bWriterEnabled )
+        OutputDebugStringFormat( "LookForRegisteredExtensions: Writer is enabled" );
+    else
+        OutputDebugStringFormat( "LookForRegisteredExtensions: Writer is NOT enabled" );
+
+    if ( ( ERROR_SUCCESS == MsiGetFeatureState( handle, L"gm_p_Calc", &current_state, &future_state ) ) &&
+         ( (future_state == INSTALLSTATE_LOCAL) || ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_UNKNOWN) ) ) )
+        bCalcEnabled = true;
+
+    OutputDebugStringFormat( "LookForRegisteredExtensions: Install state Calc is [%d], will be [%d]", current_state, future_state );
+    if ( bCalcEnabled )
+        OutputDebugStringFormat( "LookForRegisteredExtensions: Calc is enabled" );
+    else
+        OutputDebugStringFormat( "LookForRegisteredExtensions: Calc is NOT enabled" );
+
+    if ( ( ERROR_SUCCESS == MsiGetFeatureState( handle, L"gm_p_Impress", &current_state, &future_state ) ) &&
+         ( (future_state == INSTALLSTATE_LOCAL) || ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_UNKNOWN) ) ) )
+        bImpressEnabled = true;
+
+    OutputDebugStringFormat( "LookForRegisteredExtensions: Install state Impress is [%d], will be [%d]", current_state, future_state );
+    if ( bImpressEnabled )
+        OutputDebugStringFormat( "LookForRegisteredExtensions: Impress is enabled" );
+    else
+        OutputDebugStringFormat( "LookForRegisteredExtensions: Impress is NOT enabled" );
+
+    if ( ( ERROR_SUCCESS == MsiGetFeatureState( handle, L"gm_p_Draw", &current_state, &future_state ) ) &&
+         ( (future_state == INSTALLSTATE_LOCAL) || ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_UNKNOWN) ) ) )
+        bDrawEnabled = true;
+
+    OutputDebugStringFormat( "LookForRegisteredExtensions: Install state Draw is [%d], will be [%d]", current_state, future_state );
+    if ( bImpressEnabled )
+        OutputDebugStringFormat( "LookForRegisteredExtensions: Draw is enabled" );
+    else
+        OutputDebugStringFormat( "LookForRegisteredExtensions: Draw is NOT enabled" );
 
     MsiSetPropertyA( handle, "SELECT_WORD", "" );
     MsiSetPropertyA( handle, "SELECT_EXCEL", "" );
     MsiSetPropertyA( handle, "SELECT_POWERPOINT", "" );
     MsiSetPropertyA( handle, "SELECT_VISIO", "" );
 
-    if ( GetMsiPropValue( handle, TEXT("REGISTER_NO_MSO_TYPES") ).compare( PROP_OFF ) == 0 )
+    if ( ! bRegisterNone )
     {
-
-        if ( GetMsiPropValue( handle, TEXT("REGISTER_ALL_MSO_TYPES") ).compare( PROP_ON ) == 0 )
+        if ( IsSetMsiProp( handle, "REGISTER_ALL_MSO_TYPES" ) )
         {
             if ( bWriterEnabled )
                 MsiSetPropertyA( handle, "SELECT_WORD", "1" );
@@ -314,47 +375,6 @@ extern "C" UINT __stdcall LookForRegisteredExtensions( MSIHANDLE handle )
         }
         else
         {
-            if ( ( ERROR_SUCCESS == MsiGetFeatureState( handle, L"gm_p_Wrt", &current_state, &future_state ) ) &&
-                 ( (future_state == INSTALLSTATE_LOCAL) || ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_UNKNOWN) ) ) )
-                bWriterEnabled = true;
-
-            OutputDebugStringFormat( "LookForRegisteredExtensions: Install state Writer is [%d], will be [%d]", current_state, future_state );
-            if ( bWriterEnabled )
-                OutputDebugStringFormat( "LookForRegisteredExtensions: Writer is enabled" );
-            else
-                OutputDebugStringFormat( "LookForRegisteredExtensions: Writer is NOT enabled" );
-
-            if ( ( ERROR_SUCCESS == MsiGetFeatureState( handle, L"gm_p_Calc", &current_state, &future_state ) ) &&
-                 ( (future_state == INSTALLSTATE_LOCAL) || ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_UNKNOWN) ) ) )
-                bCalcEnabled = true;
-
-            OutputDebugStringFormat( "LookForRegisteredExtensions: Install state Calc is [%d], will be [%d]", current_state, future_state );
-            if ( bCalcEnabled )
-                OutputDebugStringFormat( "LookForRegisteredExtensions: Calc is enabled" );
-            else
-                OutputDebugStringFormat( "LookForRegisteredExtensions: Calc is NOT enabled" );
-
-            if ( ( ERROR_SUCCESS == MsiGetFeatureState( handle, L"gm_p_Impress", &current_state, &future_state ) ) &&
-                 ( (future_state == INSTALLSTATE_LOCAL) || ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_UNKNOWN) ) ) )
-                bImpressEnabled = true;
-
-            OutputDebugStringFormat( "LookForRegisteredExtensions: Install state Impress is [%d], will be [%d]", current_state, future_state );
-            if ( bImpressEnabled )
-                OutputDebugStringFormat( "LookForRegisteredExtensions: Impress is enabled" );
-            else
-                OutputDebugStringFormat( "LookForRegisteredExtensions: Impress is NOT enabled" );
-
-            if ( ( ERROR_SUCCESS == MsiGetFeatureState( handle, L"gm_p_Draw", &current_state, &future_state ) ) &&
-                 ( (future_state == INSTALLSTATE_LOCAL) || ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_UNKNOWN) ) ) )
-                bDrawEnabled = true;
-
-            OutputDebugStringFormat( "LookForRegisteredExtensions: Install state Draw is [%d], will be [%d]", current_state, future_state );
-            if ( bImpressEnabled )
-                OutputDebugStringFormat( "LookForRegisteredExtensions: Draw is enabled" );
-            else
-                OutputDebugStringFormat( "LookForRegisteredExtensions: Draw is NOT enabled" );
-
-
             if ( bWriterEnabled && ! checkSomeExtensionInRegistry( WORD_START, EXCEL_START ) )
             {
                 MsiSetPropertyA( handle, "SELECT_WORD", "1" );
@@ -370,7 +390,7 @@ extern "C" UINT __stdcall LookForRegisteredExtensions( MSIHANDLE handle )
                 MsiSetPropertyA( handle, "SELECT_POWERPOINT", "1" );
                 OutputDebugStringFormat( "LookForRegisteredExtensions: Register for Microsoft PowerPoint" );
             }
-            if ( bDrawEnabled && ! checkSomeExtensionInRegistry( VISIO_START, VISIO_END ) )
+            if ( bImpressEnabled && ! checkSomeExtensionInRegistry( VISIO_START, VISIO_END ) )
             {
                 MsiSetPropertyA( handle, "SELECT_VISIO", "1" );
                 OutputDebugStringFormat( "LookForRegisteredExtensions: Register for Microsoft Visio" );
@@ -387,7 +407,7 @@ extern "C" UINT __stdcall RegisterSomeExtensions( MSIHANDLE handle )
 {
     OutputDebugStringFormat( "RegisterSomeExtensions: " );
 
-    if ( GetMsiPropValue( handle, TEXT("SELECT_WORD") ).compare( PROP_ON ) == 0 )
+    if ( IsSetMsiProp( handle, "SELECT_WORD" ) )
     {
         registerSomeExtensions( handle, WORD_START, EXCEL_START, true );
         MsiSetFeatureState( handle, L"gm_p_Wrt_MSO_Reg", INSTALLSTATE_LOCAL );
@@ -399,7 +419,7 @@ extern "C" UINT __stdcall RegisterSomeExtensions( MSIHANDLE handle )
         MsiSetFeatureState( handle, L"gm_p_Wrt_MSO_Reg", INSTALLSTATE_ABSENT );
     }
 
-    if ( GetMsiPropValue( handle, TEXT("SELECT_EXCEL") ).compare( PROP_ON ) == 0 )
+    if ( IsSetMsiProp( handle, "SELECT_EXCEL" ) )
     {
         registerSomeExtensions( handle, EXCEL_START, POWERPOINT_START, true );
         MsiSetFeatureState( handle, L"gm_p_Calc_MSO_Reg", INSTALLSTATE_LOCAL );
@@ -411,7 +431,7 @@ extern "C" UINT __stdcall RegisterSomeExtensions( MSIHANDLE handle )
         MsiSetFeatureState( handle, L"gm_p_Calc_MSO_Reg", INSTALLSTATE_ABSENT );
     }
 
-    if ( GetMsiPropValue( handle, TEXT("SELECT_POWERPOINT") ).compare( PROP_ON ) == 0 )
+    if ( IsSetMsiProp( handle, "SELECT_POWERPOINT" ) )
     {
         registerSomeExtensions( handle, POWERPOINT_START, VISIO_START, true );
         MsiSetFeatureState( handle, L"gm_p_Impress_MSO_Reg", INSTALLSTATE_LOCAL );
@@ -423,7 +443,7 @@ extern "C" UINT __stdcall RegisterSomeExtensions( MSIHANDLE handle )
         MsiSetFeatureState( handle, L"gm_p_Impress_MSO_Reg", INSTALLSTATE_ABSENT );
     }
 
-    if ( GetMsiPropValue( handle, TEXT("SELECT_VISIO") ).compare( PROP_ON ) == 0 )
+    if ( IsSetMsiProp( handle, "SELECT_VISIO" ) )
     {
         registerSomeExtensions( handle, VISIO_START, VISIO_END, true );
         MsiSetFeatureState( handle, L"gm_p_Draw_MSO_Reg", INSTALLSTATE_LOCAL );
@@ -439,7 +459,7 @@ extern "C" UINT __stdcall RegisterSomeExtensions( MSIHANDLE handle )
 
 extern "C" UINT __stdcall FindRegisteredExtensions( MSIHANDLE handle )
 {
-    if ( GetMsiPropValue( handle, TEXT("FILETYPEDIALOGUSED") ).compare( PROP_ON ) == 0 )
+    if ( IsSetMsiProp( handle, "FILETYPEDIALOGUSED" ) )
     {
         OutputDebugStringFormat( "FindRegisteredExtensions: FILETYPEDIALOGUSED!" );
         return ERROR_SUCCESS;
@@ -447,9 +467,9 @@ extern "C" UINT __stdcall FindRegisteredExtensions( MSIHANDLE handle )
 
     OutputDebugStringFormat( "FindRegisteredExtensions:" );
 
-    bool bRegisterAll = GetMsiPropValue( handle, TEXT("REGISTER_ALL_MSO_TYPES") ).compare( PROP_ON ) == 0;
+    bool bRegisterAll = IsSetMsiProp( handle, "REGISTER_ALL_MSO_TYPES" );
 
-    if ( GetMsiPropValue( handle, TEXT("REGISTER_NO_MSO_TYPES") ).compare( PROP_ON ) == 0 )
+    if ( IsSetMsiProp( handle, "REGISTER_NO_MSO_TYPES" ) )
     {
         OutputDebugStringFormat( "FindRegisteredExtensions: Register none!" );
         return ERROR_SUCCESS;
@@ -461,13 +481,13 @@ extern "C" UINT __stdcall FindRegisteredExtensions( MSIHANDLE handle )
 
     // setting the msi properties SELECT_* will force registering for all corresponding
     // file types
-    if ( GetMsiPropValue( handle, TEXT("SELECT_WORD") ).compare( PROP_ON ) == 0 )
+    if ( IsSetMsiProp( handle, "SELECT_WORD" ) )
         registerSomeExtensions( handle, WORD_START, EXCEL_START, true );
-    if ( GetMsiPropValue( handle, TEXT("SELECT_EXCEL") ).compare( PROP_ON ) == 0 )
+    if ( IsSetMsiProp( handle, "SELECT_EXCEL" ) )
         registerSomeExtensions( handle, EXCEL_START, POWERPOINT_START, true );
-    if ( GetMsiPropValue( handle, TEXT("SELECT_POWERPOINT") ).compare( PROP_ON ) == 0)
+    if ( IsSetMsiProp( handle, "SELECT_POWERPOINT" ) )
         registerSomeExtensions( handle, POWERPOINT_START, VISIO_START, true );
-    if ( GetMsiPropValue( handle, TEXT("SELECT_VISIO") ).compare( PROP_ON ) == 0)
+    if ( IsSetMsiProp( handle, "SELECT_VISIO" ) )
         registerSomeExtensions( handle, VISIO_START, VISIO_END, true );
 
     registerForExtensions( handle, bRegisterAll );
diff --git a/setup_native/source/win32/customactions/regactivex/regactivex.cxx b/setup_native/source/win32/customactions/regactivex/regactivex.cxx
index 4f16a9f..7be03a2 100644
--- a/setup_native/source/win32/customactions/regactivex/regactivex.cxx
+++ b/setup_native/source/win32/customactions/regactivex/regactivex.cxx
@@ -23,7 +23,7 @@
 #pragma warning(push, 1) /* disable warnings within system headers */
 #endif
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -122,10 +122,29 @@ void UnregisterActiveXNative( const char* pActiveXPath, int nMode, BOOL InstallF
 }
 
 //----------------------------------------------------------
+BOOL GetMsiProp( MSIHANDLE hMSI, const wchar_t* pPropName, wchar_t** ppValue )
+{
+    DWORD sz = 0;
+       if ( MsiGetProperty( hMSI, pPropName, L"", &sz ) == ERROR_MORE_DATA )
+       {
+           sz++;
+           DWORD nbytes = sz * sizeof( wchar_t );
+           wchar_t* buff = reinterpret_cast<wchar_t*>( malloc( nbytes ) );
+           ZeroMemory( buff, nbytes );
+           MsiGetProperty( hMSI, pPropName, buff, &sz );
+           *ppValue = buff;
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+//----------------------------------------------------------
 BOOL GetActiveXControlPath( MSIHANDLE hMSI, char** ppActiveXPath )
 {
     wchar_t* pProgPath = NULL;
-    if ( GetMsiProp( hMSI, L"INSTALLLOCATION", &pProgPath ) )
+    if ( GetMsiProp( hMSI, L"INSTALLLOCATION", &pProgPath ) && pProgPath )
        {
         char* pCharProgPath = UnicodeToAnsiString( pProgPath );
 
@@ -252,7 +271,7 @@ BOOL MakeInstallForAllUsers( MSIHANDLE hMSI )
 {
     BOOL bResult = FALSE;
     wchar_t* pVal = NULL;
-    if ( GetMsiProp( hMSI, L"ALLUSERS", &pVal ) )
+    if ( GetMsiProp( hMSI, L"ALLUSERS", &pVal ) && pVal )
     {
         bResult = UnicodeEquals( pVal , L"1" );
         free( pVal );
@@ -266,7 +285,7 @@ BOOL MakeInstallFor64Bit( MSIHANDLE hMSI )
 {
     BOOL bResult = FALSE;
     wchar_t* pVal = NULL;
-    if ( GetMsiProp( hMSI, L"VersionNT64", &pVal ) )
+    if ( GetMsiProp( hMSI, L"VersionNT64", &pVal ) && pVal )
     {
         bResult = TRUE;
         free( pVal );
diff --git a/setup_native/source/win32/customactions/regpatchactivex/regpatchactivex.cxx b/setup_native/source/win32/customactions/regpatchactivex/regpatchactivex.cxx
index 2362c61..0c51ccb 100644
--- a/setup_native/source/win32/customactions/regpatchactivex/regpatchactivex.cxx
+++ b/setup_native/source/win32/customactions/regpatchactivex/regpatchactivex.cxx
@@ -23,7 +23,7 @@
 #pragma warning(push,1) // disable warnings within system headers
 #endif
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -33,13 +33,46 @@
 #include <stdio.h>
 
 //----------------------------------------------------------
+BOOL UnicodeEquals( wchar_t* pStr1, wchar_t* pStr2 )
+{
+    if ( pStr1 == NULL && pStr2 == NULL )
+        return TRUE;
+    else if ( pStr1 == NULL || pStr2 == NULL )
+        return FALSE;
+
+    while( *pStr1 == *pStr2 && *pStr1 && *pStr2 )
+        pStr1++, pStr2++;
+
+    return ( *pStr1 == 0 && *pStr2 == 0 );
+}
+
+//----------------------------------------------------------
+BOOL GetMsiProp( MSIHANDLE hMSI, const wchar_t* pPropName, wchar_t** ppValue )
+{
+    DWORD sz = 0;
+       if ( MsiGetProperty( hMSI, pPropName, L"", &sz ) == ERROR_MORE_DATA )
+       {
+           sz++;
+           DWORD nbytes = sz * sizeof( wchar_t );
+           wchar_t* buff = reinterpret_cast<wchar_t*>( malloc( nbytes ) );
+           ZeroMemory( buff, nbytes );
+           MsiGetProperty( hMSI, pPropName, buff, &sz );
+           *ppValue = buff;
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+//----------------------------------------------------------
 BOOL MakeInstallForAllUsers( MSIHANDLE hMSI )
 {
     BOOL bResult = FALSE;
-    LPTSTR* pVal = NULL;
-    if ( GetMsiProp( hMSI, TEXT("ALLUSERS"), pVal ) )
+    wchar_t* pVal = NULL;
+    if ( GetMsiProp( hMSI, L"ALLUSERS", &pVal ) && pVal )
     {
-        bResult = ( int (pVal) == 1 );
+        bResult = UnicodeEquals( pVal , L"1" );
         free( pVal );
     }
 
diff --git a/setup_native/source/win32/customactions/sellang/sellang.cxx b/setup_native/source/win32/customactions/sellang/sellang.cxx
index 893a04f..b6f7ec5 100644
--- a/setup_native/source/win32/customactions/sellang/sellang.cxx
+++ b/setup_native/source/win32/customactions/sellang/sellang.cxx
@@ -28,7 +28,7 @@
 #define WINVER 0x0500
 
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #include <malloc.h>
 
 #include <stdio.h>
@@ -40,6 +40,21 @@
 
 #include "spellchecker_selection.hxx"
 
+BOOL GetMsiProp( MSIHANDLE hMSI, const char* pPropName, char** ppValue )
+{
+    DWORD sz = 0;
+    if ( MsiGetProperty( hMSI, pPropName, "", &sz ) == ERROR_MORE_DATA ) {
+        sz++;
+        DWORD nbytes = sz * sizeof( char );
+        char* buff = reinterpret_cast<char*>( malloc( nbytes ) );
+        ZeroMemory( buff, nbytes );
+        MsiGetProperty( hMSI, pPropName, buff, &sz );
+        *ppValue = buff;
+        return ( strlen(buff) > 0 );
+    }
+    return FALSE;
+}
+
 static const char *
 langid_to_string( LANGID langid )
 {
@@ -299,8 +314,8 @@ extern "C" UINT __stdcall SelectLanguage( MSIHANDLE handle )
     /* Keep track of what UI languages are relevant, either the ones explicitly
      * requested with the UI_LANGS property, or all available on the system:
      */
-    LPTSTR pVal = NULL;
-    if ( (GetMsiProp( handle, "UI_LANGS", &pVal )) ) {
+    char* pVal = NULL;
+    if ( (GetMsiProp( handle, "UI_LANGS", &pVal )) && pVal ) {
         char *str_ptr;
         str_ptr = strtok(pVal, ",");
         for(; str_ptr != NULL ;) {
diff --git a/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx b/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx
index 60ed8b5..7b35b3c 100644
--- a/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/checkdirectory.cxx
@@ -24,7 +24,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -46,17 +46,44 @@
 #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 = GetMsiPropValue(handle, TEXT("INSTALLLOCATION"));
-    std::_tstring sOfficeHostnamePath = GetMsiPropValue(handle, TEXT("OFFICEDIRHOSTNAME"));
+    std::_tstring sInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
+    std::_tstring sOfficeHostnamePath = GetMsiProperty(handle, TEXT("OFFICEDIRHOSTNAME"));
 
     // MessageBox(NULL, sInstallPath.c_str(), "DEBUG", MB_OK);
 
     // unsetting all properties
 
-    MsiSetProperty( handle, TEXT("DIRECTORY_NOT_EMPTY"), NULL );
+    UnsetMsiProperty( handle, TEXT("DIRECTORY_NOT_EMPTY") );
 
     // 1. Searching for file setup.ini
 
@@ -71,7 +98,7 @@ extern "C" UINT __stdcall CheckInstallDirectory(MSIHANDLE handle)
     if ( IsValidHandle(hdl) )
     {
         // setup.ini found -> directory cannot be used for installation.
-        MsiSetProperty( handle, TEXT("DIRECTORY_NOT_EMPTY"), TEXT("1") );
+        SetMsiProperty( handle, TEXT("DIRECTORY_NOT_EMPTY"), TEXT("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";
diff --git a/setup_native/source/win32/customactions/shellextensions/checkpatches.cxx b/setup_native/source/win32/customactions/shellextensions/checkpatches.cxx
index 99fb240..94a24cd 100644
--- a/setup_native/source/win32/customactions/shellextensions/checkpatches.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/checkpatches.cxx
@@ -24,7 +24,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -63,24 +63,44 @@ static inline void OutputDebugStringFormat( LPCSTR, ... )
 }
 #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 )
 {
-    LPTSTR sPatchList = NULL;
-    LPTSTR sRequiredPatch = NULL;
+    std::_tstring sPatchList = GetMsiProperty( handle, TEXT("PATCH") );
+    std::_tstring sRequiredPatch = GetMsiProperty( handle, TEXT("PREREQUIREDPATCH") );
 
-    if ( GetMsiProp( handle, TEXT("PATCH"), &sPatchList ) && GetMsiProp( handle, TEXT("PREREQUIREDPATCH"), &sRequiredPatch ) )
+    OutputDebugStringFormat( "CheckPatchList called with PATCH=%s and PRQ= %s\n", sPatchList.c_str(), sRequiredPatch.c_str() );
+
+    if ( ( sPatchList.length() != 0 ) && ( sRequiredPatch.length() != 0 ) )
     {
-        OutputDebugStringFormat( "CheckPatchList called with PATCH=%s and PRQ= %s\n", sPatchList, sRequiredPatch );
-        if ( _tcsstr( sPatchList, sRequiredPatch ) )
+        if ( _tcsstr( sPatchList.c_str(), sRequiredPatch.c_str() ) )
         {
-            MsiSetProperty( handle, TEXT("IGNOREPREREQUIREDPATCH"), TEXT("1") );
+            SetMsiProperty( handle, TEXT("IGNOREPREREQUIREDPATCH") );
             OutputDebugStringFormat( "Set Property IgnorePrerequiredPatch!\n" );
         }
     }
-    else
-    {
-        OutputDebugStringFormat( "CheckPatchList called with PATCH=%s and PRQ= %s\n", sPatchList, sRequiredPatch );
-    }
     return ERROR_SUCCESS;
 }
 
diff --git a/setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx b/setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx
index 5f684c1..d56ad5e 100644
--- a/setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/completeinstallpath.cxx
@@ -23,7 +23,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -41,6 +41,27 @@
 
 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
@@ -55,8 +76,8 @@ 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 = GetMsiPropValue( handle, TEXT("INSTALLLOCATION") );
-    std::_tstring   sOfficeDirHostname = GetMsiPropValue( handle, TEXT("OFFICEDIRHOSTNAME_") );
+    std::_tstring   sInstallLocation = GetMsiProperty( handle, TEXT("INSTALLLOCATION") );
+    std::_tstring   sOfficeDirHostname = GetMsiProperty( handle, TEXT("OFFICEDIRHOSTNAME_") );
 
     // If sInstallLocation ends with (contains) the string sOfficeDirHostname,
     // INSTALLLOCATION is good and nothing has to be done here.
@@ -73,9 +94,9 @@ extern "C" UINT __stdcall CompleteInstallPath( MSIHANDLE handle )
 
     if ( pathCompletionRequired )
     {
-        std::_tstring   sManufacturer = GetMsiPropValue( handle, TEXT("Manufacturer") );
-        std::_tstring   sDefinedName = GetMsiPropValue( handle, TEXT("DEFINEDPRODUCT") );
-        std::_tstring   sUpgradeCode = GetMsiPropValue( handle, TEXT("UpgradeCode") );
+        std::_tstring   sManufacturer = GetMsiProperty( handle, TEXT("Manufacturer") );
+        std::_tstring   sDefinedName = GetMsiProperty( handle, TEXT("DEFINEDPRODUCT") );
+        std::_tstring   sUpgradeCode = GetMsiProperty( handle, TEXT("UpgradeCode") );
 
         // sUpdateVersion can be "3.0", "3.1" or "3.2"
 
diff --git a/setup_native/source/win32/customactions/shellextensions/copyextensiondata.cxx b/setup_native/source/win32/customactions/shellextensions/copyextensiondata.cxx
index 758d9d9..1a52dad 100644
--- a/setup_native/source/win32/customactions/shellextensions/copyextensiondata.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/copyextensiondata.cxx
@@ -28,7 +28,7 @@
 #define WIN32_LEAN_AND_MEAN
 #endif
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #include <shellapi.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
@@ -48,9 +48,27 @@
 #include <string>
 
 
+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;
+}
+
 extern "C" UINT __stdcall copyExtensionData(MSIHANDLE handle) {
 
-    std::_tstring sSourceDir = GetMsiPropValue( handle, TEXT("SourceDir") );
+    std::_tstring sSourceDir = GetMsiProperty( handle, TEXT("SourceDir") );
     std::_tstring sExtensionDir = sSourceDir + TEXT("extension\\");
     std::_tstring sPattern = sExtensionDir + TEXT("*.oxt");
 
@@ -65,7 +83,7 @@ extern "C" UINT __stdcall copyExtensionData(MSIHANDLE handle) {
         bool fNextFile = false;
         bool bFailIfExist = true;
 
-        std::_tstring sDestDir = GetMsiPropValue( handle, TEXT("INSTALLLOCATION") );
+        std::_tstring sDestDir = GetMsiProperty( handle, TEXT("INSTALLLOCATION") );
         std::_tstring sShareInstallDir = sDestDir + TEXT("share\\extension\\install\\");
 
         // creating directories
diff --git a/setup_native/source/win32/customactions/shellextensions/dotnetcheck.cxx b/setup_native/source/win32/customactions/shellextensions/dotnetcheck.cxx
index 42f7f09..864b886 100644
--- a/setup_native/source/win32/customactions/shellextensions/dotnetcheck.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/dotnetcheck.cxx
@@ -27,7 +27,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -45,6 +45,28 @@ using namespace std;
 
 namespace
 {
+    string GetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        string  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;
+    }
+
+    inline void SetMsiProperty(MSIHANDLE handle, const string& sProperty, const string& sValue)
+    {
+        MsiSetProperty(handle, sProperty.c_str(), sValue.c_str());
+    }
+
     void stripFinalBackslash(std::string * path) {
         std::string::size_type i = path->size();
         if (i > 1) {
@@ -104,20 +126,20 @@ Order compareVersions(string const & version1, string const & version2) {
 } // namespace
 
 extern "C" UINT __stdcall DotNetCheck(MSIHANDLE handle) {
-    string present(GetMsiPropValue(handle, TEXT("MsiNetAssemblySupport")));
-    string required(GetMsiPropValue(handle, TEXT("REQUIRED_DOTNET_VERSION")));
+    string present(GetMsiProperty(handle, TEXT("MsiNetAssemblySupport")));
+    string required(GetMsiProperty(handle, TEXT("REQUIRED_DOTNET_VERSION")));
 
     // string myText1 = TEXT("MsiNetAssemblySupport: ") + present;
     // string myText2 = TEXT("REQUIRED_DOTNET_VERSION: ") + required;
     // MessageBox(NULL, myText1.c_str(), "DEBUG", MB_OK);
     // MessageBox(NULL, myText2.c_str(), "DEBUG", MB_OK);
 
-    MsiSetProperty(
+    SetMsiProperty(
         handle, TEXT("DOTNET_SUFFICIENT"),
         (present.empty() || compareVersions(present, required) == ORDER_LESS ?
          TEXT("0") : TEXT("1")));
 
-    // string result(GetMsiPropValue(handle, TEXT("DOTNET_SUFFICIENT")));
+    // string result(GetMsiProperty(handle, TEXT("DOTNET_SUFFICIENT")));
     // string myText3 = TEXT("DOTNET_SUFFICIENT: ") + result;
     // MessageBox(NULL, myText3.c_str(), "DEBUG", MB_OK);
 
@@ -127,23 +149,23 @@ extern "C" UINT __stdcall DotNetCheck(MSIHANDLE handle) {
 
 extern "C" UINT __stdcall ShowProperties(MSIHANDLE handle)
 {
-    string property = GetMsiPropValue(handle, TEXT("INSTALLLOCATION"));
+    string property = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
     string myText = TEXT("INSTALLLOCATION: ") + property;
     MessageBox(NULL, myText.c_str(), "INSTALLLOCATION", MB_OK);
 
-    property = GetMsiPropValue(handle, TEXT("Installed"));
+    property = GetMsiProperty(handle, TEXT("Installed"));
     myText = TEXT("Installed: ") + property;
     MessageBox(NULL, myText.c_str(), "Installed", MB_OK);
 
-    property = GetMsiPropValue(handle, TEXT("PATCH"));
+    property = GetMsiProperty(handle, TEXT("PATCH"));
     myText = TEXT("PATCH: ") + property;
     MessageBox(NULL, myText.c_str(), "PATCH", MB_OK);
 
-    property = GetMsiPropValue(handle, TEXT("REMOVE"));
+    property = GetMsiProperty(handle, TEXT("REMOVE"));
     myText = TEXT("REMOVE: ") + property;
     MessageBox(NULL, myText.c_str(), "REMOVE", MB_OK);
 
-    property = GetMsiPropValue(handle, TEXT("ALLUSERS"));
+    property = GetMsiProperty(handle, TEXT("ALLUSERS"));
     myText = TEXT("ALLUSERS: ") + property;
     MessageBox(NULL, myText.c_str(), "ALLUSERS", MB_OK);
 
diff --git a/setup_native/source/win32/customactions/shellextensions/layerlinks.cxx b/setup_native/source/win32/customactions/shellextensions/layerlinks.cxx
index 67919ec..88e020f 100644
--- a/setup_native/source/win32/customactions/shellextensions/layerlinks.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/layerlinks.cxx
@@ -27,7 +27,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -45,6 +45,38 @@ using namespace std;
 
 namespace
 {
+    string GetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        string  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;
+    }
+
+    inline bool IsSetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        return (GetMsiProperty(handle, sProperty).length() > 0);
+    }
+
+    inline void UnsetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        MsiSetProperty(handle, sProperty.c_str(), NULL);
+    }
+
+    inline void SetMsiProperty(MSIHANDLE handle, const string& sProperty, const string&)
+    {
+        MsiSetProperty(handle, sProperty.c_str(), TEXT("1"));
+    }
+
     void stripFinalBackslash(std::string * path) {
         std::string::size_type i = path->size();
         if (i > 1) {
@@ -58,13 +90,13 @@ namespace
 
 extern "C" UINT __stdcall CreateLayerLinks(MSIHANDLE handle)
 {
-    string sInstallPath = GetMsiPropValue(handle, TEXT("INSTALLLOCATION"));
+    string sInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
 
     string sUreInstallPath = sInstallPath + TEXT("URE");
 
     string sUreLinkPath = sInstallPath + TEXT("ure-link");
 
-    if ( GetMsiPropValue(handle, TEXT("ADMININSTALL")).length() > 0 )
+    if ( IsSetMsiProperty(handle, TEXT("ADMININSTALL")) )
     {
         sUreInstallPath = TEXT("..\\URE");
     }
@@ -117,7 +149,7 @@ extern "C" UINT __stdcall CreateLayerLinks(MSIHANDLE handle)
 
 extern "C" UINT __stdcall RemoveLayerLinks(MSIHANDLE handle)
 {
-    string sInstallPath = GetMsiPropValue(handle, TEXT("INSTALLLOCATION"));
+    string sInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
 
     string sUreLinkPath = sInstallPath + TEXT("ure-link");
     string sUreDirName = sInstallPath + TEXT("URE\\bin");
diff --git a/setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx b/setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx
index 476d235..1b159fd 100644
--- a/setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/migrateinstallpath.cxx
@@ -23,7 +23,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -41,6 +41,27 @@
 
 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];
@@ -48,10 +69,10 @@ extern "C" UINT __stdcall MigrateInstallPath( MSIHANDLE handle )
     HKEY    hKey;
     std::_tstring   sInstDir;
 
-    std::_tstring   sManufacturer = GetMsiPropValue( handle, TEXT("Manufacturer") );
-    std::_tstring   sDefinedName = GetMsiPropValue( handle, TEXT("DEFINEDPRODUCT") );
-    std::_tstring   sUpdateVersion = GetMsiPropValue( handle, TEXT("DEFINEDVERSION") );
-    std::_tstring   sUpgradeCode = GetMsiPropValue( handle, TEXT("UpgradeCode") );
+    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::_tstring   sProductKey = "Software\\" + sManufacturer + "\\" + sDefinedName +
                                         "\\" + sUpdateVersion + "\\" + sUpgradeCode;
diff --git a/setup_native/source/win32/customactions/shellextensions/postuninstall.cxx b/setup_native/source/win32/customactions/shellextensions/postuninstall.cxx
index b8f6e66..2ae1769 100644
--- a/setup_native/source/win32/customactions/shellextensions/postuninstall.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/postuninstall.cxx
@@ -23,7 +23,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -41,6 +41,25 @@
 
 #include <io.h>
 
+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 ExecuteCommand( LPCTSTR lpCommand, BOOL bSync )
 {
     BOOL                fSuccess = FALSE;
@@ -82,7 +101,7 @@ extern "C" UINT __stdcall ExecutePostUninstallScript( MSIHANDLE handle )
     HKEY    hKey;
     std::_tstring   sInstDir;
 
-    std::_tstring   sProductKey = GetMsiPropValue( handle, TEXT("FINDPRODUCT") );
+    std::_tstring   sProductKey = GetMsiProperty( handle, TEXT("FINDPRODUCT") );
 
     // MessageBox( NULL, sProductKey.c_str(), "Titel", MB_OK );
 
diff --git a/setup_native/source/win32/customactions/shellextensions/setadmininstall.cxx b/setup_native/source/win32/customactions/shellextensions/setadmininstall.cxx
index d1b7b9b..bc010c6 100644
--- a/setup_native/source/win32/customactions/shellextensions/setadmininstall.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/setadmininstall.cxx
@@ -24,7 +24,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -53,7 +53,7 @@ static void SetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty)
 
 extern "C" UINT __stdcall SetAdminInstallProperty(MSIHANDLE handle)
 {
-    MsiSetProperty(handle, TEXT("ADMININSTALL"), TEXT("1"));
+    SetMsiProperty(handle, TEXT("ADMININSTALL"));
     return ERROR_SUCCESS;
 }
 
diff --git a/setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx b/setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx
index 92ad25c..de3f3f6 100644
--- a/setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/startmenuicon.cxx
@@ -24,25 +24,50 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
 
 #include <malloc.h>
+
+#ifdef UNICODE
+#define _UNICODE
+#define _tstring    wstring
+#else
+#define _tstring    string
+#endif
 #include <tchar.h>
 #include <string>
 
 
+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;
+}
+
 /*
     Called during installation to customize the start menu folder icon.
     See: http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_extending/custom.asp
 */
 extern "C" UINT __stdcall InstallStartmenuFolderIcon( MSIHANDLE handle )
 {
-    std::string   sOfficeMenuFolder = GetMsiPropValue( handle, TEXT("OfficeMenuFolder") );
-    std::string   sDesktopFile = sOfficeMenuFolder + TEXT("Desktop.ini");
-    std::string   sIconFile = GetMsiPropValue( handle, TEXT("INSTALLLOCATION") ) + TEXT("program\\soffice.exe");
+    std::_tstring   sOfficeMenuFolder = GetMsiProperty( handle, TEXT("OfficeMenuFolder") );
+    std::_tstring sDesktopFile = sOfficeMenuFolder + TEXT("Desktop.ini");
+    std::_tstring   sIconFile = GetMsiProperty( handle, TEXT("INSTALLLOCATION") ) + TEXT("program\\soffice.exe");
 
     OSVERSIONINFO   osverinfo;
     osverinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
@@ -84,8 +109,8 @@ extern "C" UINT __stdcall InstallStartmenuFolderIcon( MSIHANDLE handle )
 
 extern "C" UINT __stdcall DeinstallStartmenuFolderIcon(MSIHANDLE handle)
 {
-    std::string   sOfficeMenuFolder = GetMsiPropValue( handle, TEXT("OfficeMenuFolder") );
-    std::string sDesktopFile = sOfficeMenuFolder + TEXT("Desktop.ini");
+    std::_tstring   sOfficeMenuFolder = GetMsiProperty( handle, TEXT("OfficeMenuFolder") );
+    std::_tstring sDesktopFile = sOfficeMenuFolder + TEXT("Desktop.ini");
 
     SetFileAttributes( sDesktopFile.c_str(), FILE_ATTRIBUTE_NORMAL );
     DeleteFile( sDesktopFile.c_str() );
diff --git a/setup_native/source/win32/customactions/shellextensions/upgrade.cxx b/setup_native/source/win32/customactions/shellextensions/upgrade.cxx
index 92e33c7..9a54963 100644
--- a/setup_native/source/win32/customactions/shellextensions/upgrade.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/upgrade.cxx
@@ -27,7 +27,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -111,6 +111,38 @@ namespace
         return convertedGuid;
     }
 
+    string GetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        string  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;
+    }
+
+    inline bool IsSetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        return (GetMsiProperty(handle, sProperty).length() > 0);
+    }
+
+    inline void UnsetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        MsiSetProperty(handle, sProperty.c_str(), NULL);
+    }
+
+    inline void SetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        MsiSetProperty(handle, sProperty.c_str(), TEXT("1"));
+    }
+
     bool RegistryKeyHasUpgradeSubKey(
         HKEY hRootKey, const string& regKey, const string& upgradeKey)
     {
@@ -139,7 +171,7 @@ namespace
 
 extern "C" UINT __stdcall SetProductInstallMode(MSIHANDLE handle)
 {
-    string upgradeCode = GetMsiPropValue(handle, TEXT("UpgradeCode"));
+    string upgradeCode = GetMsiProperty(handle, TEXT("UpgradeCode"));
     upgradeCode = ConvertGuid(string(upgradeCode.c_str() + 1, upgradeCode.length() - 2));
 
     //MessageBox(NULL, upgradeCode.c_str(), TEXT("Debug"), MB_OK);
@@ -147,17 +179,17 @@ extern "C" UINT __stdcall SetProductInstallMode(MSIHANDLE handle)
     if (RegistryKeyHasUpgradeSubKey(
         HKEY_CURRENT_USER,
         TEXT("Software\\Microsoft\\Installer\\UpgradeCodes"),
-        upgradeCode))
+        upgradeCode) && IsSetMsiProperty(handle, TEXT("ALLUSERS")))
     {
-        MsiSetProperty(handle, TEXT("ALLUSERS"), NULL);
+        UnsetMsiProperty(handle, TEXT("ALLUSERS"));
         //MessageBox(NULL, "ALLUSERS removed", "DEBUG", MB_OK);
     }
     else if (RegistryKeyHasUpgradeSubKey(
              HKEY_LOCAL_MACHINE,
              TEXT("Software\\Classes\\Installer\\UpgradeCodes"),
-             upgradeCode))
+             upgradeCode) && !IsSetMsiProperty(handle, TEXT("ALLUSERS")))
     {
-        MsiSetProperty(handle, TEXT("ALLUSERS"), TEXT("1"));
+        SetMsiProperty(handle, TEXT("ALLUSERS"));
         //MessageBox(NULL, "ALLUSERS set", "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 862c7a3..7011fcd 100644
--- a/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx
+++ b/setup_native/source/win32/customactions/shellextensions/vistaspecial.cxx
@@ -24,7 +24,7 @@
 #endif
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -65,7 +65,25 @@ static inline void OutputDebugStringFormat( LPCSTR, ... )
 #endif
 
 
-static bool RemoveCompleteDirectory( std::_tstring sPath )
+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( std::_tstring sPath )
 {
     bool bDirectoryRemoved = true;
 
@@ -125,7 +143,7 @@ static bool RemoveCompleteDirectory( std::_tstring sPath )
 
 extern "C" UINT __stdcall RenamePrgFolder( MSIHANDLE handle )
 {
-    std::_tstring sOfficeInstallPath = GetMsiPropValue(handle, TEXT("INSTALLLOCATION"));
+    std::_tstring sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
 
     std::_tstring sRenameSrc = sOfficeInstallPath + TEXT("program");
     std::_tstring sRenameDst = sOfficeInstallPath + TEXT("program_old");
@@ -149,7 +167,7 @@ extern "C" UINT __stdcall RenamePrgFolder( MSIHANDLE handle )
 
 extern "C" UINT __stdcall RemovePrgFolder( MSIHANDLE handle )
 {
-    std::_tstring sOfficeInstallPath = GetMsiPropValue(handle, TEXT("INSTALLLOCATION"));
+    std::_tstring sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
     std::_tstring sRemoveDir = sOfficeInstallPath + TEXT("program_old");
 
     RemoveCompleteDirectory( sRemoveDir );
diff --git a/setup_native/source/win32/customactions/thesaurus/thesaurus.cxx b/setup_native/source/win32/customactions/thesaurus/thesaurus.cxx
index a27801c..349ed75 100644
--- a/setup_native/source/win32/customactions/thesaurus/thesaurus.cxx
+++ b/setup_native/source/win32/customactions/thesaurus/thesaurus.cxx
@@ -23,7 +23,7 @@
 #define WINVER 0x0500
 
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #include <malloc.h>
 
 #include <stdio.h>
@@ -43,6 +43,38 @@ using namespace std;
 namespace
 {
 
+    string GetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        string  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;
+    }
+
+    inline bool IsSetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        return (GetMsiProperty(handle, sProperty).length() > 0);
+    }
+
+    inline void UnsetMsiProperty(MSIHANDLE handle, const string& sProperty)
+    {
+        MsiSetProperty(handle, sProperty.c_str(), NULL);
+    }
+
+    inline void SetMsiProperty(MSIHANDLE handle, const string& sProperty, const string&)
+    {
+        MsiSetProperty(handle, sProperty.c_str(), TEXT("1"));
+    }
+
     static const int MAXLINE = 1024*64;
 
 
@@ -161,7 +193,7 @@ namespace
 extern "C" UINT __stdcall CreateIndexes( MSIHANDLE handle )
 {
 
-    string sOfficeInstallPath = GetMsiPropValue(handle, TEXT("INSTALLLOCATION"));
+    string sOfficeInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION"));
     createIndexesForThesaurusFiles(sOfficeInstallPath);
     return ERROR_SUCCESS;
 }
diff --git a/setup_native/source/win32/customactions/tools/checkversion.cxx b/setup_native/source/win32/customactions/tools/checkversion.cxx
index 0484488..dc42bfa 100644
--- a/setup_native/source/win32/customactions/tools/checkversion.cxx
+++ b/setup_native/source/win32/customactions/tools/checkversion.cxx
@@ -23,7 +23,7 @@
 #pragma warning(push,1) // disable warnings within system headers
 #endif
 #include <windows.h>
-#include <../tools/msiprop.hxx>
+#include <msiquery.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif
@@ -36,6 +36,25 @@
 #include <seterror.hxx>
 
 //----------------------------------------------------------
+BOOL GetMsiProp( MSIHANDLE hMSI, const wchar_t* pPropName, wchar_t** ppValue )
+{
+    DWORD sz = 0;
+       if ( MsiGetProperty( hMSI, pPropName, L"", &sz ) == ERROR_MORE_DATA )
+       {
+           sz++;
+           DWORD nbytes = sz * sizeof( wchar_t );
+           wchar_t* buff = reinterpret_cast<wchar_t*>( malloc( nbytes ) );
+           ZeroMemory( buff, nbytes );
+           MsiGetProperty( hMSI, pPropName, buff, &sz );
+           *ppValue = buff;
+
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+//----------------------------------------------------------
 #ifdef DEBUG
 inline void OutputDebugStringFormat( LPCTSTR pFormat, ... )
 {
@@ -59,7 +78,7 @@ extern "C" UINT __stdcall CheckVersions( MSIHANDLE hMSI )
 
     wchar_t* pVal = NULL;
 
-    if ( GetMsiProp( hMSI, L"NEWPRODUCTS", &pVal ) )
+    if ( GetMsiProp( hMSI, L"NEWPRODUCTS", &pVal ) && pVal )
     {
         OutputDebugStringFormat( TEXT("DEBUG: NEWPRODUCTS found [%s]"), pVal );
         if ( *pVal != 0 )
@@ -67,7 +86,7 @@ extern "C" UINT __stdcall CheckVersions( MSIHANDLE hMSI )
         free( pVal );
     }
     pVal = NULL;
-    if ( GetMsiProp( hMSI, L"SAMEPRODUCTS", &pVal ) )
+    if ( GetMsiProp( hMSI, L"SAMEPRODUCTS", &pVal ) && pVal )
     {
         OutputDebugStringFormat( TEXT("DEBUG: SAMEPRODUCTS found [%s]"), pVal );
         if ( *pVal != 0 )
@@ -75,7 +94,7 @@ extern "C" UINT __stdcall CheckVersions( MSIHANDLE hMSI )
         free( pVal );
     }
     pVal = NULL;
-    if ( GetMsiProp( hMSI, L"OLDPRODUCTS", &pVal ) )
+    if ( GetMsiProp( hMSI, L"OLDPRODUCTS", &pVal ) && pVal )
     {
         OutputDebugStringFormat( TEXT("DEBUG: OLDPRODUCTS found [%s]"), pVal );
         if ( *pVal != 0 )
@@ -83,7 +102,7 @@ extern "C" UINT __stdcall CheckVersions( MSIHANDLE hMSI )
         free( pVal );
     }
     pVal = NULL;
-    if ( GetMsiProp( hMSI, L"BETAPRODUCTS", &pVal ) )
+    if ( GetMsiProp( hMSI, L"BETAPRODUCTS", &pVal ) && pVal )
     {
         OutputDebugStringFormat( TEXT("DEBUG: BETAPRODUCTS found [%s]"), pVal );
         if ( *pVal != 0 )
@@ -92,7 +111,7 @@ extern "C" UINT __stdcall CheckVersions( MSIHANDLE hMSI )
     }
 
     pVal = NULL;
-    if ( GetMsiProp( hMSI, L"NEWPRODUCTSPATCH", &pVal ) )
+    if ( GetMsiProp( hMSI, L"NEWPRODUCTSPATCH", &pVal ) && pVal )
     {
         OutputDebugStringFormat( TEXT("DEBUG: NEWPRODUCTSPATCH found [%s]"), pVal );
         if ( *pVal != 0 )
@@ -100,7 +119,7 @@ extern "C" UINT __stdcall CheckVersions( MSIHANDLE hMSI )
         free( pVal );
     }
     pVal = NULL;
-    if ( GetMsiProp( hMSI, L"SAMEPRODUCTSPATCH", &pVal ) )
+    if ( GetMsiProp( hMSI, L"SAMEPRODUCTSPATCH", &pVal ) && pVal )
     {
         OutputDebugStringFormat( TEXT("DEBUG: SAMEPRODUCTSPATCH found [%s]"), pVal );
         if ( *pVal != 0 )
@@ -108,7 +127,7 @@ extern "C" UINT __stdcall CheckVersions( MSIHANDLE hMSI )
         free( pVal );
     }
     pVal = NULL;
-    if ( GetMsiProp( hMSI, L"OLDPRODUCTSPATCH", &pVal ) )
+    if ( GetMsiProp( hMSI, L"OLDPRODUCTSPATCH", &pVal ) && pVal )
     {
         OutputDebugStringFormat( TEXT("DEBUG: OLDPRODUCTSPATCH found [%s]"), pVal );
         if ( *pVal != 0 )
diff --git a/setup_native/source/win32/customactions/tools/msiprop.hxx b/setup_native/source/win32/customactions/tools/msiprop.hxx
deleted file mode 100755
index 5d75130..0000000
--- a/setup_native/source/win32/customactions/tools/msiprop.hxx
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- 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 .
- */
-
-#pragma once
-#include <windows.h>
-#include <string>
-//#include <malloc.h>
-#include <msiquery.h>
-#ifdef UNICODE
-#define _UNICODE
-#define _tstring    wstring
-#else
-#define _tstring    string
-#endif
-
-using namespace std;
-
-namespace {
-inline bool GetMsiProp(MSIHANDLE hMSI, LPCTSTR pPropName, LPTSTR* ppValue)
-{
-    DWORD sz = 0;
-    ppValue = NULL;
-    if (MsiGetProperty(hMSI, pPropName, TEXT(""), &sz) == ERROR_MORE_DATA)
-    {
-        DWORD nBytes = ++sz * sizeof(TCHAR); // add 1 for null termination
-        LPTSTR buffer = reinterpret_cast<LPTSTR>(_alloca( nBytes ));
-        ZeroMemory(buffer, nBytes);
-        MsiGetProperty(hMSI, pPropName, buffer, &sz);
-        *ppValue = buffer;
-    }
-
-    return ppValue?true:false ;
-
-}
-
-//std::_tstring GMPV(  ,  const std::_tstring& sProperty)
-inline string GetMsiPropValue(MSIHANDLE hMSI, LPCTSTR pPropName)
-{
-    LPTSTR ppValue = NULL;
-    (void)GetMsiProp(hMSI, pPropName, &ppValue);
-    string toto =  reinterpret_cast<const char *> (ppValue);
-    return toto;
-}
-
-}
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file
commit 2d70b928a982a787aa975acd0770e3bf9ffb94b1
Author: Andras Timar <atimar at suse.com>
Date:   Sun Jan 27 20:27:28 2013 +0100

    Revert "chmod 644"
    
    This reverts commit bf8e8e8bd03647632ed0b55c2b983a4d16cee40e.

diff --git a/setup_native/source/win32/customactions/tools/msiprop.hxx b/setup_native/source/win32/customactions/tools/msiprop.hxx
old mode 100644
new mode 100755


More information about the Libreoffice-commits mailing list