1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #define _WIN32_WINNT 0x0401 29 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 39 40 #include <malloc.h> 41 #include <assert.h> 42 43 #ifdef UNICODE 44 #define _UNICODE 45 #define _tstring wstring 46 #else 47 #define _tstring string 48 #endif 49 #include <tchar.h> 50 #include <string> 51 #include <queue> 52 #include <stdio.h> 53 54 #include <systools/win32/uwinapi.h> 55 #include <../tools/seterror.hxx> 56 57 static std::_tstring GetMsiProperty( MSIHANDLE handle, const std::_tstring& sProperty ) 58 { 59 std::_tstring result; 60 TCHAR szDummy[1] = TEXT(""); 61 DWORD nChars = 0; 62 63 if ( MsiGetProperty( handle, sProperty.c_str(), szDummy, &nChars ) == ERROR_MORE_DATA ) 64 { 65 DWORD nBytes = ++nChars * sizeof(TCHAR); 66 LPTSTR buffer = reinterpret_cast<LPTSTR>(_alloca(nBytes)); 67 ZeroMemory( buffer, nBytes ); 68 MsiGetProperty(handle, sProperty.c_str(), buffer, &nChars); 69 result = buffer; 70 } 71 72 return result; 73 } 74 75 static void UnsetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty) 76 { 77 MsiSetProperty(handle, sProperty.c_str(), NULL); 78 } 79 80 static void SetMsiProperty(MSIHANDLE handle, const std::_tstring& sProperty, const std::_tstring&) 81 { 82 MsiSetProperty(handle, sProperty.c_str(), TEXT("1")); 83 } 84 85 extern "C" UINT __stdcall CheckInstallDirectory(MSIHANDLE handle) 86 { 87 std::_tstring sInstallPath = GetMsiProperty(handle, TEXT("INSTALLLOCATION")); 88 std::_tstring sOfficeHostnamePath = GetMsiProperty(handle, TEXT("OFFICEDIRHOSTNAME")); 89 90 // MessageBox(NULL, sInstallPath.c_str(), "DEBUG", MB_OK); 91 92 // unsetting all properties 93 94 UnsetMsiProperty( handle, TEXT("DIRECTORY_NOT_EMPTY") ); 95 96 // 1. Searching for file setup.ini 97 98 std::_tstring sSetupIniPath = sInstallPath + sOfficeHostnamePath + TEXT("\\program\\setup.ini"); 99 100 WIN32_FIND_DATA data; 101 HANDLE hdl = FindFirstFile(sSetupIniPath.c_str(), &data); 102 103 // std::_tstring mystr = "Searching for " + sSetupIniPath; 104 // MessageBox(NULL, mystr.c_str(), "DEBUG", MB_OK); 105 106 if ( IsValidHandle(hdl) ) 107 { 108 // setup.ini found -> directory cannot be used for installation. 109 SetMsiProperty( handle, TEXT("DIRECTORY_NOT_EMPTY"), TEXT("1") ); 110 SetMsiErrorCode( MSI_ERROR_DIRECTORY_NOT_EMPTY ); 111 // std::_tstring notEmptyStr = "Directory is not empty. Please choose another installation directory."; 112 // std::_tstring notEmptyTitle = "Directory not empty"; 113 // MessageBox(NULL, notEmptyStr.c_str(), notEmptyTitle.c_str(), MB_OK); 114 } 115 116 return ERROR_SUCCESS; 117 } 118