1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 #include "msihelper.hxx" 23 24 #include <malloc.h> 25 #include <assert.h> 26 27 bool GetMsiProp(MSIHANDLE handle, LPCTSTR name, /*out*/std::wstring& value) 28 { 29 DWORD sz = 0; 30 LPTSTR dummy = TEXT(""); 31 if (MsiGetProperty(handle, name, dummy, &sz) == ERROR_MORE_DATA) 32 { 33 sz++; 34 DWORD nbytes = sz * sizeof(TCHAR); 35 LPTSTR buff = reinterpret_cast<LPTSTR>(_alloca(nbytes)); 36 ZeroMemory(buff, nbytes); 37 MsiGetProperty(handle, name, buff, &sz); 38 value = buff; 39 return true; 40 } 41 return false; 42 } 43 44 void SetMsiProp(MSIHANDLE handle, LPCTSTR name) 45 { 46 MsiSetProperty(handle, name, TEXT("1")); 47 } 48 49 void UnsetMsiProp(MSIHANDLE handle, LPCTSTR name) 50 { 51 MsiSetProperty(handle, name, TEXT("")); 52 } 53 54 bool IsSetMsiProp(MSIHANDLE handle, LPCTSTR name) 55 { 56 std::wstring val; 57 GetMsiProp(handle, name, val); 58 return (val == TEXT("1")); 59 } 60 61 bool IsMsiPropNotEmpty(MSIHANDLE handle, LPCTSTR name) 62 { 63 std::wstring val; 64 GetMsiProp(handle, name, val); 65 return (val != TEXT("")); 66 } 67 68 bool IsAllUserInstallation(MSIHANDLE handle) 69 { 70 return IsSetMsiProp(handle, TEXT("ALLUSERS")); 71 } 72 73 std::wstring GetOfficeInstallationPath(MSIHANDLE handle) 74 { 75 std::wstring progpath; 76 GetMsiProp(handle, TEXT("INSTALLLOCATION"), progpath); 77 return progpath; 78 } 79 80 std::wstring GetOfficeExecutablePath(MSIHANDLE handle) 81 { 82 std::wstring exepath = GetOfficeInstallationPath(handle); 83 exepath += TEXT("program\\soffice.exe"); 84 return exepath; 85 } 86 87 std::wstring GetProductName(MSIHANDLE handle) 88 { 89 std::wstring prodname; 90 GetMsiProp(handle, TEXT("ProductName"), prodname); 91 return prodname; 92 } 93 94 bool IsModuleInstalled(MSIHANDLE handle, LPCTSTR name) 95 { 96 INSTALLSTATE current_state; 97 INSTALLSTATE future_state; 98 MsiGetFeatureState(handle, name, ¤t_state, &future_state); 99 return (current_state == INSTALLSTATE_LOCAL); 100 } 101 102 bool IsModuleSelectedForInstallation(MSIHANDLE handle, LPCTSTR name) 103 { 104 INSTALLSTATE current_state; 105 INSTALLSTATE future_state; 106 MsiGetFeatureState(handle, name, ¤t_state, &future_state); 107 return (future_state == INSTALLSTATE_LOCAL); 108 } 109 110 bool IsModuleSelectedForDeinstallation(MSIHANDLE handle, LPCTSTR name) 111 { 112 INSTALLSTATE current_state; 113 INSTALLSTATE future_state; 114 MsiGetFeatureState(handle, name, ¤t_state, &future_state); 115 return ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_ABSENT)); 116 } 117 118 bool IsCompleteDeinstallation(MSIHANDLE handle) 119 { 120 std::wstring rm; 121 GetMsiProp(handle, TEXT("REMOVE"), rm); 122 return (rm == TEXT("ALL")); 123 } 124