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