diff options
author | Rüdiger Timm <rt@openoffice.org> | 2008-12-16 09:24:51 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2008-12-16 09:24:51 +0000 |
commit | d77dfcfa0fa4172c5a8840c079b5d8cba16f3d0b (patch) | |
tree | 94090cc7bc27eb09a9954508ddae41620bc3be9a /desktop/win32 | |
parent | ef3e6790015f17c5301a910ea75718b43930b039 (diff) |
CWS-TOOLING: integrate CWS native210_DEV300
Diffstat (limited to 'desktop/win32')
-rw-r--r-- | desktop/win32/source/setup/setup.cpp | 79 | ||||
-rw-r--r-- | desktop/win32/source/setup/setup.hxx | 4 | ||||
-rw-r--r-- | desktop/win32/source/setup/setup_main.cxx | 4 | ||||
-rw-r--r-- | desktop/win32/source/setup/setup_main.hxx | 1 |
4 files changed, 87 insertions, 1 deletions
diff --git a/desktop/win32/source/setup/setup.cpp b/desktop/win32/source/setup/setup.cpp index d3ad3ce52b5e..2782a8de3025 100644 --- a/desktop/win32/source/setup/setup.cpp +++ b/desktop/win32/source/setup/setup.cpp @@ -61,11 +61,12 @@ #define SECTION_SETUP TEXT( "Setup" ) #define SECTION_LANGUAGE TEXT( "Languages" ) #define PRODUCT_NAME_VAR TEXT( "%PRODUCTNAME" ) - +#define PRODUCT_VERSION TEXT( "ProductVersion" ) #define ERROR_SHOW_USAGE -2 #define PARAM_SETUP_USED TEXT( " SETUP_USED=1 " ) #define PARAM_PACKAGE TEXT( "/I " ) +#define PARAM_MINOR_UPGRADE TEXT( "/FVOMUS " ) #define PARAM_ADMIN TEXT( "/A " ) #define PARAM_TRANSFORM TEXT( " TRANSFORMS=" ) #define PARAM_REBOOT TEXT( " REBOOT=Force" ) @@ -132,6 +133,8 @@ SetupAppX::SetupAppX() m_pModuleFile = NULL; m_pPatchFiles = NULL; m_pMSIErrorCode = NULL; + m_pUpgradeKey = NULL; + m_pProductVersion = NULL; m_pErrorText = new TCHAR[ MAX_TEXT_LENGTH ]; m_pErrorText[0] = '\0'; @@ -143,6 +146,7 @@ SetupAppX::SetupAppX() m_bQuiet = false; m_bRegNoMsoTypes = false; m_bRegAllMsoTypes = false; + m_bIsMinorUpgrade = false; m_bIgnoreAlreadyRunning = false; } @@ -186,6 +190,8 @@ SetupAppX::~SetupAppX() if ( m_pErrorText ) delete [] m_pErrorText; if ( m_pModuleFile ) delete [] m_pModuleFile; if ( m_pPatchFiles ) delete [] m_pPatchFiles; + if ( m_pUpgradeKey ) delete [] m_pUpgradeKey; + if ( m_pProductVersion ) delete [] m_pProductVersion; } //-------------------------------------------------------------------------- @@ -359,6 +365,20 @@ boolean SetupAppX::ReadProfile() Log( TEXT( " productname = %s\r\n" ), pValue ); m_pAppTitle = SetProdToAppTitle( m_pProductName ); } + else if ( lstrcmpi( TEXT( "upgradekey" ), pName ) == 0 ) + { + m_pUpgradeKey = pValue; + Log( TEXT( " upgradekey = %s\r\n" ), pValue ); + } + else if ( lstrcmpi( TEXT( "productversion" ), pName ) == 0 ) + { + m_pProductVersion = pValue; + Log( TEXT( " productversion = %s\r\n" ), pValue ); + } + else if ( lstrcmpi( TEXT( "productcode" ), pName ) == 0 ) + { + delete [] pValue; + } else { Log( TEXT( "Warning: unknown entry in profile <%s>\r\n" ), pName ); @@ -916,6 +936,8 @@ boolean SetupAppX::Install( long nLanguage ) if ( m_pAdvertise ) nParLen += lstrlen( m_pAdvertise ) + 1; // one for the space + else if ( m_bIsMinorUpgrade ) + nParLen += lstrlen( PARAM_MINOR_UPGRADE ); else nParLen += lstrlen( PARAM_PACKAGE ); @@ -952,6 +974,8 @@ boolean SetupAppX::Install( long nLanguage ) StringCchCat( pParams, nParLen, m_pAdvertise ); else if ( IsAdminInstall() ) StringCchCat( pParams, nParLen, PARAM_ADMIN ); + else if ( m_bIsMinorUpgrade ) + StringCchCat( pParams, nParLen, PARAM_MINOR_UPGRADE ); else StringCchCat( pParams, nParLen, PARAM_PACKAGE ); @@ -1181,6 +1205,59 @@ boolean SetupAppX::CheckVersion() } //-------------------------------------------------------------------------- +boolean SetupAppX::CheckForUpgrade() +{ + // When we have patch files we will never try an Minor upgrade + if ( m_pPatchFiles ) return true; + + if ( !m_pUpgradeKey || ( _tcslen( m_pUpgradeKey ) == 0 ) ) + { + Log( TEXT( " No Upgrade Key Found -> continue with standard installation!\r\n" ) ); + return true; + } + + HKEY hInstKey = NULL; + + if ( ERROR_SUCCESS == RegOpenKeyEx( HKEY_LOCAL_MACHINE, m_pUpgradeKey, 0, KEY_READ, &hInstKey ) ) + { + Log( TEXT( " Found Upgrade Key in Registry (HKLM) -> will try minor upgrade!\r\n" ) ); + m_bIsMinorUpgrade = true; + } + else if ( ERROR_SUCCESS == RegOpenKeyEx( HKEY_CURRENT_USER, m_pUpgradeKey, 0, KEY_READ, &hInstKey ) ) + { + Log( TEXT( " Found Upgrade Key in Registry (HKCU) -> will try minor upgrade!\r\n" ) ); + m_bIsMinorUpgrade = true; + } + else + { + Log( TEXT( " Didn't Find Upgrade Key in Registry -> continue with standard installation!\r\n" ) ); + return true; + } + + if ( m_pProductVersion && ( _tcslen( m_pProductVersion ) > 0 ) ) + { + TCHAR *sProductVersion = new TCHAR[ MAX_PATH + 1 ]; + DWORD nSize = MAX_PATH + 1; + + sProductVersion[0] = '\0'; + + // get product version + if ( ERROR_SUCCESS == RegQueryValueEx( hInstKey, PRODUCT_VERSION, NULL, NULL, (LPBYTE)sProductVersion, &nSize ) ) + { + if ( lstrcmpi( sProductVersion, m_pProductVersion ) == 0 ) + { + Log( TEXT( " Same Product Version already installed, no minor upgrade!\r\n" ) ); + m_bIsMinorUpgrade = false; + } + } + + delete [] sProductVersion; + } + + return true; +} + +//-------------------------------------------------------------------------- boolean SetupAppX::InstallMsi( LPCTSTR pInstaller ) { if ( ! IsAdmin() ) diff --git a/desktop/win32/source/setup/setup.hxx b/desktop/win32/source/setup/setup.hxx index 2b0f63ac7dd4..7e651df5dec7 100644 --- a/desktop/win32/source/setup/setup.hxx +++ b/desktop/win32/source/setup/setup.hxx @@ -84,12 +84,15 @@ class SetupAppX : public SetupApp LPTSTR m_pErrorText; LPTSTR m_pModuleFile; LPTSTR m_pPatchFiles; + LPCTSTR m_pUpgradeKey; + LPCTSTR m_pProductVersion; int *m_pMSIErrorCode; boolean m_bQuiet : 1; boolean m_bIgnoreAlreadyRunning : 1; boolean m_bRegNoMsoTypes :1; boolean m_bRegAllMsoTypes :1; + boolean m_bIsMinorUpgrade :1; FILE *m_pLogFile; @@ -133,6 +136,7 @@ public: virtual boolean GetPatches(); virtual boolean ChooseLanguage( long& rLanguage ); virtual boolean CheckVersion(); + virtual boolean CheckForUpgrade(); virtual boolean Install( long nLanguage ); virtual UINT GetError() const; diff --git a/desktop/win32/source/setup/setup_main.cxx b/desktop/win32/source/setup/setup_main.cxx index ea6ad57ce25c..24b542a17e8b 100644 --- a/desktop/win32/source/setup/setup_main.cxx +++ b/desktop/win32/source/setup/setup_main.cxx @@ -118,6 +118,10 @@ extern "C" int __stdcall WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, int ) if ( ! pSetup->CheckVersion() ) throw pSetup->GetError(); + // CheckForUpgrade() has to be called after calling GetPatches()! + if ( ! pSetup->CheckForUpgrade() ) + throw pSetup->GetError(); + long nLanguage; if ( ! pSetup->ChooseLanguage( nLanguage ) ) diff --git a/desktop/win32/source/setup/setup_main.hxx b/desktop/win32/source/setup/setup_main.hxx index db2f90f77c97..67b54adc0d2a 100644 --- a/desktop/win32/source/setup/setup_main.hxx +++ b/desktop/win32/source/setup/setup_main.hxx @@ -52,6 +52,7 @@ public: virtual boolean GetPatches() = 0; virtual boolean ChooseLanguage( long& rLanguage ) = 0; virtual boolean CheckVersion() = 0; + virtual boolean CheckForUpgrade() = 0; virtual boolean Install( long nLanguage ) = 0; virtual UINT GetError() const = 0; |