| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  | #include "windows.h"
 | 
					
						
							|  |  |  | #include "msiquery.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Print a debug message to the installer log file.
 | 
					
						
							|  |  |  |  * To see the debug messages, install with | 
					
						
							|  |  |  |  * msiexec /i pythonxy.msi /l*v python.log | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2005-02-18 16:18:09 +00:00
										 |  |  | static UINT debug(MSIHANDLE hInstall, LPCSTR msg) | 
					
						
							| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     MSIHANDLE hRec = MsiCreateRecord(1); | 
					
						
							|  |  |  |     if (!hRec || MsiRecordSetStringA(hRec, 1, msg) != ERROR_SUCCESS) { | 
					
						
							|  |  |  |         return ERROR_INSTALL_FAILURE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     MsiProcessMessage(hInstall, INSTALLMESSAGE_INFO, hRec); | 
					
						
							|  |  |  |     MsiCloseHandle(hRec); | 
					
						
							|  |  |  |     return ERROR_SUCCESS; | 
					
						
							| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Check whether the TARGETDIR exists and is a directory.
 | 
					
						
							|  |  |  |  * Set TargetExists appropriately. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | UINT __declspec(dllexport) __stdcall CheckDir(MSIHANDLE hInstall) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2005-02-18 16:18:09 +00:00
										 |  |  | #define PSIZE 1024
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     WCHAR wpath[PSIZE]; | 
					
						
							|  |  |  |     char path[PSIZE]; | 
					
						
							|  |  |  |     UINT result; | 
					
						
							|  |  |  |     DWORD size = PSIZE; | 
					
						
							|  |  |  |     DWORD attributes; | 
					
						
							| 
									
										
										
										
											2005-02-18 16:18:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     result = MsiGetPropertyW(hInstall, L"TARGETDIR", wpath, &size); | 
					
						
							|  |  |  |     if (result != ERROR_SUCCESS) | 
					
						
							|  |  |  |         return result; | 
					
						
							|  |  |  |     wpath[size] = L'\0'; | 
					
						
							|  |  |  |     path[size] = L'\0'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     attributes = GetFileAttributesW(wpath); | 
					
						
							|  |  |  |     if (attributes == INVALID_FILE_ATTRIBUTES || | 
					
						
							|  |  |  |         !(attributes & FILE_ATTRIBUTE_DIRECTORY)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return MsiSetPropertyA(hInstall, "TargetExists", "0"); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         return MsiSetPropertyA(hInstall, "TargetExists", "1"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Update the state of the REGISTRY.tcl component according to the
 | 
					
						
							|  |  |  |  * Extension and TclTk features. REGISTRY.tcl must be installed | 
					
						
							|  |  |  |  * if both features are installed, and must be absent otherwise. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | UINT __declspec(dllexport) __stdcall UpdateEditIDLE(MSIHANDLE hInstall) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     INSTALLSTATE ext_old, ext_new, tcl_old, tcl_new, reg_new; | 
					
						
							|  |  |  |     UINT result; | 
					
						
							| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     result = MsiGetFeatureStateA(hInstall, "Extensions", &ext_old, &ext_new); | 
					
						
							|  |  |  |     if (result != ERROR_SUCCESS) | 
					
						
							|  |  |  |         return result; | 
					
						
							|  |  |  |     result = MsiGetFeatureStateA(hInstall, "TclTk", &tcl_old, &tcl_new); | 
					
						
							|  |  |  |     if (result != ERROR_SUCCESS) | 
					
						
							|  |  |  |         return result; | 
					
						
							| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     /* If the current state is Absent, and the user did not select
 | 
					
						
							|  |  |  |        the feature in the UI, Installer apparently sets the "selected" | 
					
						
							|  |  |  |        state to unknown. Update it to the current value, then. */ | 
					
						
							|  |  |  |     if (ext_new == INSTALLSTATE_UNKNOWN) | 
					
						
							|  |  |  |         ext_new = ext_old; | 
					
						
							|  |  |  |     if (tcl_new == INSTALLSTATE_UNKNOWN) | 
					
						
							|  |  |  |         tcl_new = tcl_old; | 
					
						
							| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     // XXX consider current state of REGISTRY.tcl?
 | 
					
						
							|  |  |  |     if (((tcl_new == INSTALLSTATE_LOCAL) || | 
					
						
							|  |  |  |              (tcl_new == INSTALLSTATE_SOURCE) || | 
					
						
							|  |  |  |              (tcl_new == INSTALLSTATE_DEFAULT)) && | 
					
						
							|  |  |  |         ((ext_new == INSTALLSTATE_LOCAL) || | 
					
						
							|  |  |  |          (ext_new == INSTALLSTATE_SOURCE) || | 
					
						
							|  |  |  |          (ext_new == INSTALLSTATE_DEFAULT))) { | 
					
						
							|  |  |  |         reg_new = INSTALLSTATE_SOURCE; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         reg_new = INSTALLSTATE_ABSENT; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     result = MsiSetComponentStateA(hInstall, "REGISTRY.tcl", reg_new); | 
					
						
							|  |  |  |     return result; | 
					
						
							| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  | BOOL APIENTRY DllMain(HANDLE hModule, | 
					
						
							|  |  |  |                       DWORD  ul_reason_for_call, | 
					
						
							| 
									
										
										
										
											2004-12-12 15:29:21 +00:00
										 |  |  |                       LPVOID lpReserved) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |