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