Version 3.6.0.4, tag libreoffice-3.6.0.4
[LibreOffice.git] / setup_native / source / win32 / customactions / shellextensions / migrateinstallpath.cxx
blob395a21fb8d4e027f798cbdfec5fa6b6e81298026
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*************************************************************************
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * Copyright 2000, 2010 Oracle and/or its affiliates.
8 * OpenOffice.org - a multi-platform office productivity suite
10 * This file is part of OpenOffice.org.
12 * OpenOffice.org is free software: you can redistribute it and/or modify
13 * it under the terms of the GNU Lesser General Public License version 3
14 * only, as published by the Free Software Foundation.
16 * OpenOffice.org is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU Lesser General Public License version 3 for more details
20 * (a copy is included in the LICENSE file that accompanied this code).
22 * You should have received a copy of the GNU Lesser General Public License
23 * version 3 along with OpenOffice.org. If not, see
24 * <http://www.openoffice.org/license.html>
25 * for a copy of the LGPLv3 License.
27 ************************************************************************/
29 #define _WIN32_WINDOWS 0x0410
30 #ifdef _MSC_VER
31 #pragma warning(push, 1) /* disable warnings within system headers */
32 #endif
33 #define WIN32_LEAN_AND_MEAN
34 #include <windows.h>
35 #include <msiquery.h>
36 #ifdef _MSC_VER
37 #pragma warning(pop)
38 #endif
40 #include <malloc.h>
42 #ifdef UNICODE
43 #define _UNICODE
44 #define _tstring wstring
45 #else
46 #define _tstring string
47 #endif
48 #include <tchar.h>
49 #include <string>
51 using namespace std;
53 namespace
55 std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty )
57 std::_tstring result;
58 TCHAR szDummy[1] = TEXT("");
59 DWORD nChars = 0;
61 if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA )
63 DWORD nBytes = ++nChars * sizeof(TCHAR);
64 LPTSTR buffer = reinterpret_cast<LPTSTR>(_alloca(nBytes));
65 ZeroMemory( buffer, nBytes );
66 MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars);
67 result = buffer;
70 return result;
72 } // namespace
74 extern "C" UINT __stdcall MigrateInstallPath( MSIHANDLE handle )
76 TCHAR szValue[8192];
77 DWORD nValueSize = sizeof(szValue);
78 HKEY hKey;
79 std::_tstring sInstDir;
81 std::_tstring sManufacturer = GetMsiProperty( handle, TEXT("Manufacturer") );
82 std::_tstring sDefinedName = GetMsiProperty( handle, TEXT("DEFINEDPRODUCT") );
83 std::_tstring sUpdateVersion = GetMsiProperty( handle, TEXT("DEFINEDVERSION") );
84 std::_tstring sUpgradeCode = GetMsiProperty( handle, TEXT("UpgradeCode") );
86 std::_tstring sProductKey = "Software\\" + sManufacturer + "\\" + sDefinedName +
87 "\\" + sUpdateVersion + "\\" + sUpgradeCode;
89 if ( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, sProductKey.c_str(), &hKey ) )
91 if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) )
93 sInstDir = szValue;
94 MsiSetProperty(handle, TEXT("INSTALLLOCATION"), sInstDir.c_str());
95 // MessageBox( NULL, sInstDir.c_str(), "Found in HKEY_CURRENT_USER", MB_OK );
98 RegCloseKey( hKey );
100 else if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, sProductKey.c_str(), &hKey ) )
102 if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) )
104 sInstDir = szValue;
105 MsiSetProperty(handle, TEXT("INSTALLLOCATION"), sInstDir.c_str());
106 // MessageBox( NULL, sInstDir.c_str(), "Found in HKEY_LOCAL_MACHINE", MB_OK );
109 RegCloseKey( hKey );
112 return ERROR_SUCCESS;
116 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */