#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 | |
*/ | |
static UINT debug(MSIHANDLE hInstall, LPCSTR msg) | |
{ | |
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; | |
} | |
/* Check whether the TARGETDIR exists and is a directory. | |
* Set TargetExists appropriately. | |
*/ | |
UINT __declspec(dllexport) __stdcall CheckDir(MSIHANDLE hInstall) | |
{ | |
#define PSIZE 1024 | |
WCHAR wpath[PSIZE]; | |
char path[PSIZE]; | |
UINT result; | |
DWORD size = PSIZE; | |
DWORD attributes; | |
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"); | |
} | |
} | |
/* 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) | |
{ | |
INSTALLSTATE ext_old, ext_new, tcl_old, tcl_new, reg_new; | |
UINT result; | |
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; | |
/* 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; | |
// 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; | |
} | |
BOOL APIENTRY DllMain(HANDLE hModule, | |
DWORD ul_reason_for_call, | |
LPVOID lpReserved) | |
{ | |
return TRUE; | |
} | |