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, ¤t_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, ¤t_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, ¤t_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