symbian-qemu-0.9.1-12/python-2.6.1/Tools/msi/msisupport.c
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/python-2.6.1/Tools/msi/msisupport.c	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,93 @@
+#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;
+}
+