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 
23 
24 #include "msihelper.hxx"
25 
26 #include <malloc.h>
27 #include <assert.h>
28 
GetMsiProp(MSIHANDLE handle,LPCTSTR name,std::wstring & value)29 bool GetMsiProp(MSIHANDLE handle, LPCTSTR name, /*out*/std::wstring& value)
30 {
31     DWORD sz = 0;
32     LPTSTR dummy = TEXT("");
33     if (MsiGetProperty(handle, name, dummy, &sz) == ERROR_MORE_DATA)
34     {
35         sz++;
36         DWORD nbytes = sz * sizeof(TCHAR);
37         LPTSTR buff = reinterpret_cast<LPTSTR>(_alloca(nbytes));
38         ZeroMemory(buff, nbytes);
39         MsiGetProperty(handle, name, buff, &sz);
40         value = buff;
41         return true;
42     }
43     return false;
44 }
45 
SetMsiProp(MSIHANDLE handle,LPCTSTR name)46 void SetMsiProp(MSIHANDLE handle, LPCTSTR name)
47 {
48     MsiSetProperty(handle, name, TEXT("1"));
49 }
50 
UnsetMsiProp(MSIHANDLE handle,LPCTSTR name)51 void UnsetMsiProp(MSIHANDLE handle, LPCTSTR name)
52 {
53     MsiSetProperty(handle, name, TEXT(""));
54 }
55 
IsSetMsiProp(MSIHANDLE handle,LPCTSTR name)56 bool IsSetMsiProp(MSIHANDLE handle, LPCTSTR name)
57 {
58     std::wstring val;
59     GetMsiProp(handle, name, val);
60     return (val == TEXT("1"));
61 }
62 
IsMsiPropNotEmpty(MSIHANDLE handle,LPCTSTR name)63 bool IsMsiPropNotEmpty(MSIHANDLE handle, LPCTSTR name)
64 {
65     std::wstring val;
66     GetMsiProp(handle, name, val);
67     return (val != TEXT(""));
68 }
69 
IsAllUserInstallation(MSIHANDLE handle)70 bool IsAllUserInstallation(MSIHANDLE handle)
71 {
72     return IsSetMsiProp(handle, TEXT("ALLUSERS"));
73 }
74 
GetOfficeInstallationPath(MSIHANDLE handle)75 std::wstring GetOfficeInstallationPath(MSIHANDLE handle)
76 {
77     std::wstring progpath;
78     GetMsiProp(handle, TEXT("INSTALLLOCATION"), progpath);
79     return progpath;
80 }
81 
GetOfficeExecutablePath(MSIHANDLE handle)82 std::wstring GetOfficeExecutablePath(MSIHANDLE handle)
83 {
84     std::wstring exepath = GetOfficeInstallationPath(handle);
85     exepath += TEXT("program\\soffice.exe");
86     return exepath;
87 }
88 
GetProductName(MSIHANDLE handle)89 std::wstring GetProductName(MSIHANDLE handle)
90 {
91     std::wstring prodname;
92     GetMsiProp(handle, TEXT("ProductName"), prodname);
93     return prodname;
94 }
95 
IsModuleInstalled(MSIHANDLE handle,LPCTSTR name)96 bool IsModuleInstalled(MSIHANDLE handle, LPCTSTR name)
97 {
98     INSTALLSTATE current_state;
99     INSTALLSTATE future_state;
100     MsiGetFeatureState(handle, name, &current_state, &future_state);
101     return (current_state == INSTALLSTATE_LOCAL);
102 }
103 
IsModuleSelectedForInstallation(MSIHANDLE handle,LPCTSTR name)104 bool IsModuleSelectedForInstallation(MSIHANDLE handle, LPCTSTR name)
105 {
106     INSTALLSTATE current_state;
107     INSTALLSTATE future_state;
108     MsiGetFeatureState(handle, name, &current_state, &future_state);
109     return (future_state == INSTALLSTATE_LOCAL);
110 }
111 
IsModuleSelectedForDeinstallation(MSIHANDLE handle,LPCTSTR name)112 bool IsModuleSelectedForDeinstallation(MSIHANDLE handle, LPCTSTR name)
113 {
114     INSTALLSTATE current_state;
115     INSTALLSTATE future_state;
116     MsiGetFeatureState(handle, name, &current_state, &future_state);
117     return ((current_state == INSTALLSTATE_LOCAL) && (future_state == INSTALLSTATE_ABSENT));
118 }
119 
IsCompleteDeinstallation(MSIHANDLE handle)120 bool IsCompleteDeinstallation(MSIHANDLE handle)
121 {
122     std::wstring rm;
123     GetMsiProp(handle, TEXT("REMOVE"), rm);
124     return (rm == TEXT("ALL"));
125 }
126