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 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #define UNICODE
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
27*b1cdbd2cSJim Jagielski #pragma warning(push,1) // disable warnings within system headers
28*b1cdbd2cSJim Jagielski #endif
29*b1cdbd2cSJim Jagielski #include <windows.h>
30*b1cdbd2cSJim Jagielski #include <msiquery.h>
31*b1cdbd2cSJim Jagielski #ifdef _MSC_VER
32*b1cdbd2cSJim Jagielski #pragma warning(pop)
33*b1cdbd2cSJim Jagielski #endif
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include <string.h>
36*b1cdbd2cSJim Jagielski #include <malloc.h>
37*b1cdbd2cSJim Jagielski #include <stdio.h>
38*b1cdbd2cSJim Jagielski #include "strsafe.h"
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include <seterror.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski //----------------------------------------------------------
GetMsiProp(MSIHANDLE hMSI,const wchar_t * pPropName,wchar_t ** ppValue)43*b1cdbd2cSJim Jagielski BOOL GetMsiProp( MSIHANDLE hMSI, const wchar_t* pPropName, wchar_t** ppValue )
44*b1cdbd2cSJim Jagielski {
45*b1cdbd2cSJim Jagielski     DWORD sz = 0;
46*b1cdbd2cSJim Jagielski    	if ( MsiGetProperty( hMSI, pPropName, L"", &sz ) == ERROR_MORE_DATA )
47*b1cdbd2cSJim Jagielski    	{
48*b1cdbd2cSJim Jagielski        	sz++;
49*b1cdbd2cSJim Jagielski        	DWORD nbytes = sz * sizeof( wchar_t );
50*b1cdbd2cSJim Jagielski        	wchar_t* buff = reinterpret_cast<wchar_t*>( malloc( nbytes ) );
51*b1cdbd2cSJim Jagielski        	ZeroMemory( buff, nbytes );
52*b1cdbd2cSJim Jagielski        	MsiGetProperty( hMSI, pPropName, buff, &sz );
53*b1cdbd2cSJim Jagielski    		*ppValue = buff;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski 		return TRUE;
56*b1cdbd2cSJim Jagielski 	}
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski 	return FALSE;
59*b1cdbd2cSJim Jagielski }
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski //----------------------------------------------------------
62*b1cdbd2cSJim Jagielski #ifdef DEBUG
OutputDebugStringFormat(LPCTSTR pFormat,...)63*b1cdbd2cSJim Jagielski inline void OutputDebugStringFormat( LPCTSTR pFormat, ... )
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski 	TCHAR    buffer[1024];
66*b1cdbd2cSJim Jagielski 	va_list  args;
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski 	va_start( args, pFormat );
69*b1cdbd2cSJim Jagielski 	StringCchVPrintf( buffer, sizeof(buffer), pFormat, args );
70*b1cdbd2cSJim Jagielski 	OutputDebugString( buffer );
71*b1cdbd2cSJim Jagielski }
72*b1cdbd2cSJim Jagielski #else
OutputDebugStringFormat(LPCTSTR,...)73*b1cdbd2cSJim Jagielski static inline void OutputDebugStringFormat( LPCTSTR, ... )
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski }
76*b1cdbd2cSJim Jagielski #endif
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski //----------------------------------------------------------
CheckVersions(MSIHANDLE hMSI)79*b1cdbd2cSJim Jagielski extern "C" UINT __stdcall CheckVersions( MSIHANDLE hMSI )
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski 	// MessageBox(NULL, L"CheckVersions", L"Information", MB_OK | MB_ICONINFORMATION);
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski     wchar_t* pVal = NULL;
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski 	if ( GetMsiProp( hMSI, L"NEWPRODUCTS", &pVal ) && pVal )
86*b1cdbd2cSJim Jagielski 	{
87*b1cdbd2cSJim Jagielski         OutputDebugStringFormat( TEXT("DEBUG: NEWPRODUCTS found [%s]"), pVal );
88*b1cdbd2cSJim Jagielski 		if ( *pVal != 0 )
89*b1cdbd2cSJim Jagielski             SetMsiErrorCode( MSI_ERROR_NEW_VERSION_FOUND );
90*b1cdbd2cSJim Jagielski 		free( pVal );
91*b1cdbd2cSJim Jagielski 	}
92*b1cdbd2cSJim Jagielski     pVal = NULL;
93*b1cdbd2cSJim Jagielski 	if ( GetMsiProp( hMSI, L"SAMEPRODUCTS", &pVal ) && pVal )
94*b1cdbd2cSJim Jagielski 	{
95*b1cdbd2cSJim Jagielski         OutputDebugStringFormat( TEXT("DEBUG: SAMEPRODUCTS found [%s]"), pVal );
96*b1cdbd2cSJim Jagielski 		if ( *pVal != 0 )
97*b1cdbd2cSJim Jagielski             SetMsiErrorCode( MSI_ERROR_SAME_VERSION_FOUND );
98*b1cdbd2cSJim Jagielski 		free( pVal );
99*b1cdbd2cSJim Jagielski 	}
100*b1cdbd2cSJim Jagielski     pVal = NULL;
101*b1cdbd2cSJim Jagielski 	if ( GetMsiProp( hMSI, L"OLDPRODUCTS", &pVal ) && pVal )
102*b1cdbd2cSJim Jagielski 	{
103*b1cdbd2cSJim Jagielski         OutputDebugStringFormat( TEXT("DEBUG: OLDPRODUCTS found [%s]"), pVal );
104*b1cdbd2cSJim Jagielski 		if ( *pVal != 0 )
105*b1cdbd2cSJim Jagielski             SetMsiErrorCode( MSI_ERROR_OLD_VERSION_FOUND );
106*b1cdbd2cSJim Jagielski 		free( pVal );
107*b1cdbd2cSJim Jagielski 	}
108*b1cdbd2cSJim Jagielski     pVal = NULL;
109*b1cdbd2cSJim Jagielski 	if ( GetMsiProp( hMSI, L"BETAPRODUCTS", &pVal ) && pVal )
110*b1cdbd2cSJim Jagielski 	{
111*b1cdbd2cSJim Jagielski         OutputDebugStringFormat( TEXT("DEBUG: BETAPRODUCTS found [%s]"), pVal );
112*b1cdbd2cSJim Jagielski 		if ( *pVal != 0 )
113*b1cdbd2cSJim Jagielski             SetMsiErrorCode( MSI_ERROR_OLD_VERSION_FOUND );
114*b1cdbd2cSJim Jagielski 		free( pVal );
115*b1cdbd2cSJim Jagielski 	}
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski     pVal = NULL;
118*b1cdbd2cSJim Jagielski 	if ( GetMsiProp( hMSI, L"NEWPRODUCTSPATCH", &pVal ) && pVal )
119*b1cdbd2cSJim Jagielski 	{
120*b1cdbd2cSJim Jagielski         OutputDebugStringFormat( TEXT("DEBUG: NEWPRODUCTSPATCH found [%s]"), pVal );
121*b1cdbd2cSJim Jagielski 		if ( *pVal != 0 )
122*b1cdbd2cSJim Jagielski             SetMsiErrorCode( MSI_ERROR_NEW_PATCH_FOUND );
123*b1cdbd2cSJim Jagielski 		free( pVal );
124*b1cdbd2cSJim Jagielski 	}
125*b1cdbd2cSJim Jagielski     pVal = NULL;
126*b1cdbd2cSJim Jagielski 	if ( GetMsiProp( hMSI, L"SAMEPRODUCTSPATCH", &pVal ) && pVal )
127*b1cdbd2cSJim Jagielski 	{
128*b1cdbd2cSJim Jagielski         OutputDebugStringFormat( TEXT("DEBUG: SAMEPRODUCTSPATCH found [%s]"), pVal );
129*b1cdbd2cSJim Jagielski 		if ( *pVal != 0 )
130*b1cdbd2cSJim Jagielski             SetMsiErrorCode( MSI_ERROR_SAME_PATCH_FOUND );
131*b1cdbd2cSJim Jagielski 		free( pVal );
132*b1cdbd2cSJim Jagielski 	}
133*b1cdbd2cSJim Jagielski     pVal = NULL;
134*b1cdbd2cSJim Jagielski 	if ( GetMsiProp( hMSI, L"OLDPRODUCTSPATCH", &pVal ) && pVal )
135*b1cdbd2cSJim Jagielski 	{
136*b1cdbd2cSJim Jagielski         OutputDebugStringFormat( TEXT("DEBUG: OLDPRODUCTSPATCH found [%s]"), pVal );
137*b1cdbd2cSJim Jagielski 		if ( *pVal != 0 )
138*b1cdbd2cSJim Jagielski             SetMsiErrorCode( MSI_ERROR_OLD_PATCH_FOUND );
139*b1cdbd2cSJim Jagielski 		free( pVal );
140*b1cdbd2cSJim Jagielski 	}
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 	return ERROR_SUCCESS;
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 
146