Version 3.6.0.4, tag libreoffice-3.6.0.4
[LibreOffice.git] / setup_native / source / win32 / customactions / shellextensions / postuninstall.cxx
blob02311ed753f365aa98dea8589756d6ea679b6c02
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 #include <io.h>
53 static std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty )
55 std::_tstring result;
56 TCHAR szDummy[1] = TEXT("");
57 DWORD nChars = 0;
59 if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA )
61 DWORD nBytes = ++nChars * sizeof(TCHAR);
62 LPTSTR buffer = reinterpret_cast<LPTSTR>(_alloca(nBytes));
63 ZeroMemory( buffer, nBytes );
64 MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars);
65 result = buffer;
68 return result;
72 static BOOL ExecuteCommand( LPCTSTR lpCommand, BOOL bSync )
74 BOOL fSuccess = FALSE;
75 STARTUPINFO si;
76 PROCESS_INFORMATION pi;
78 ZeroMemory( &si, sizeof(si) );
79 si.cb = sizeof(si);
81 fSuccess = CreateProcess(
82 NULL,
83 (LPTSTR)lpCommand,
84 NULL,
85 NULL,
86 FALSE,
88 NULL,
89 NULL,
90 &si,
91 &pi
94 if ( fSuccess )
96 if ( bSync )
97 WaitForSingleObject( pi.hProcess, INFINITE );
99 CloseHandle( pi.hProcess );
100 CloseHandle( pi.hThread );
103 return fSuccess;
106 extern "C" UINT __stdcall ExecutePostUninstallScript( MSIHANDLE handle )
108 TCHAR szValue[8192];
109 DWORD nValueSize = sizeof(szValue);
110 HKEY hKey;
111 std::_tstring sInstDir;
113 std::_tstring sProductKey = GetMsiProperty( handle, TEXT("FINDPRODUCT") );
115 // MessageBox( NULL, sProductKey.c_str(), "Titel", MB_OK );
117 if ( ERROR_SUCCESS == RegOpenKey( HKEY_CURRENT_USER, sProductKey.c_str(), &hKey ) )
119 if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) )
121 sInstDir = szValue;
123 RegCloseKey( hKey );
125 else if ( ERROR_SUCCESS == RegOpenKey( HKEY_LOCAL_MACHINE, sProductKey.c_str(), &hKey ) )
127 if ( ERROR_SUCCESS == RegQueryValueEx( hKey, TEXT("INSTALLLOCATION"), NULL, NULL, (LPBYTE)szValue, &nValueSize ) )
129 sInstDir = szValue;
131 RegCloseKey( hKey );
133 else
134 return ERROR_SUCCESS;
136 std::_tstring sInfFile = sInstDir + TEXT("program\\postuninstall.inf");
137 std::_tstring sCommand = _T("RUNDLL32.EXE ");
139 // MessageBox( NULL, sInfFile.c_str(), "Titel", MB_OK );
141 sCommand += _T("setupapi.dll");
143 sCommand += _T(",InstallHinfSection PostUninstall 132 ");
144 sCommand += sInfFile;
146 if ( 0 == _taccess( sInfFile.c_str(), 2 ) )
147 ExecuteCommand( sCommand.c_str(), TRUE );
149 DeleteFile( sInfFile.c_str() );
151 return ERROR_SUCCESS;
154 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */