Mike McCormack : msi: Move COM server implementation to a separate
file.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jul 24 13:15:07 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 0bfb9c3e3d87ea8b15c01b6c6a7c39566196f958
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=0bfb9c3e3d87ea8b15c01b6c6a7c39566196f958
Author: Mike McCormack <mike at codeweavers.com>
Date: Mon Jul 24 19:47:00 2006 +0900
msi: Move COM server implementation to a separate file.
---
dlls/msi/Makefile.in | 1
dlls/msi/msi.c | 149 -----------------------------------------
dlls/msi/msi_main.c | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++
dlls/msi/msipriv.h | 1
4 files changed, 182 insertions(+), 149 deletions(-)
create mode 100644 dlls/msi/msi_main.c
diff --git a/dlls/msi/Makefile.in b/dlls/msi/Makefile.in
index dabdf1f..744ce2b 100644
--- a/dlls/msi/Makefile.in
+++ b/dlls/msi/Makefile.in
@@ -25,6 +25,7 @@ C_SRCS = \
insert.c \
install.c \
msi.c \
+ msi_main.c \
msiquery.c \
order.c \
package.c \
diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c
index 7e4bae3..70f9c9b 100644
--- a/dlls/msi/msi.c
+++ b/dlls/msi/msi.c
@@ -43,34 +43,8 @@ #include "action.h"
WINE_DEFAULT_DEBUG_CHANNEL(msi);
-/* the UI level */
-INSTALLUILEVEL gUILevel = INSTALLUILEVEL_BASIC;
-HWND gUIhwnd = 0;
-INSTALLUI_HANDLERA gUIHandlerA = NULL;
-INSTALLUI_HANDLERW gUIHandlerW = NULL;
-DWORD gUIFilter = 0;
-LPVOID gUIContext = NULL;
-WCHAR gszLogFile[MAX_PATH];
-HINSTANCE msi_hInstance;
-
-static LONG dll_count;
-
static const WCHAR installerW[] = {'\\','I','n','s','t','a','l','l','e','r',0};
-/*
- * Dll lifetime tracking declaration
- */
-static void LockModule(void)
-{
- InterlockedIncrement(&dll_count);
-}
-
-static void UnlockModule(void)
-{
- InterlockedDecrement(&dll_count);
-}
-
-
UINT WINAPI MsiOpenProductA(LPCSTR szProduct, MSIHANDLE *phProduct)
{
UINT r;
@@ -1320,129 +1294,6 @@ end:
return ret;
}
-
-/******************************************************************
- * DllMain
- */
-BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
-{
- switch(fdwReason)
- {
- case DLL_PROCESS_ATTACH:
- msi_hInstance = hinstDLL;
- DisableThreadLibraryCalls(hinstDLL);
- msi_dialog_register_class();
- break;
- case DLL_PROCESS_DETACH:
- msi_dialog_unregister_class();
- /* FIXME: Cleanup */
- break;
- }
- return TRUE;
-}
-
-typedef struct tagIClassFactoryImpl
-{
- const IClassFactoryVtbl *lpVtbl;
-} IClassFactoryImpl;
-
-static HRESULT WINAPI MsiCF_QueryInterface(LPCLASSFACTORY iface,
- REFIID riid,LPVOID *ppobj)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("%p %s %p\n",This,debugstr_guid(riid),ppobj);
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI MsiCF_AddRef(LPCLASSFACTORY iface)
-{
- LockModule();
- return 2;
-}
-
-static ULONG WINAPI MsiCF_Release(LPCLASSFACTORY iface)
-{
- UnlockModule();
- return 1;
-}
-
-static HRESULT WINAPI MsiCF_CreateInstance(LPCLASSFACTORY iface,
- LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
-
- FIXME("%p %p %s %p\n", This, pOuter, debugstr_guid(riid), ppobj);
- return E_FAIL;
-}
-
-static HRESULT WINAPI MsiCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
-{
- TRACE("(%p)->(%d)\n", iface, dolock);
-
- if(dolock)
- LockModule();
- else
- UnlockModule();
-
- return S_OK;
-}
-
-static const IClassFactoryVtbl MsiCF_Vtbl =
-{
- MsiCF_QueryInterface,
- MsiCF_AddRef,
- MsiCF_Release,
- MsiCF_CreateInstance,
- MsiCF_LockServer
-};
-
-static IClassFactoryImpl Msi_CF = { &MsiCF_Vtbl };
-
-/******************************************************************
- * DllGetClassObject [MSI.@]
- */
-HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
-{
- TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
-
- if( IsEqualCLSID (rclsid, &CLSID_IMsiServer) ||
- IsEqualCLSID (rclsid, &CLSID_IMsiServerMessage) ||
- IsEqualCLSID (rclsid, &CLSID_IMsiServerX1) ||
- IsEqualCLSID (rclsid, &CLSID_IMsiServerX2) ||
- IsEqualCLSID (rclsid, &CLSID_IMsiServerX3) )
- {
- *ppv = (LPVOID) &Msi_CF;
- return S_OK;
- }
- return CLASS_E_CLASSNOTAVAILABLE;
-}
-
-/******************************************************************
- * DllGetVersion [MSI.@]
- */
-HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *pdvi)
-{
- TRACE("%p\n",pdvi);
-
- if (pdvi->cbSize != sizeof(DLLVERSIONINFO))
- return E_INVALIDARG;
-
- pdvi->dwMajorVersion = MSI_MAJORVERSION;
- pdvi->dwMinorVersion = MSI_MINORVERSION;
- pdvi->dwBuildNumber = MSI_BUILDNUMBER;
- pdvi->dwPlatformID = 1;
-
- return S_OK;
-}
-
-/******************************************************************
- * DllCanUnloadNow [MSI.@]
- */
-HRESULT WINAPI DllCanUnloadNow(void)
-{
- return dll_count == 0 ? S_OK : S_FALSE;
-}
-
/***********************************************************************
* MsiGetFeatureUsageW [MSI.@]
*/
diff --git a/dlls/msi/msi_main.c b/dlls/msi/msi_main.c
new file mode 100644
index 0000000..1cd36a0
--- /dev/null
+++ b/dlls/msi/msi_main.c
@@ -0,0 +1,180 @@
+/*
+ * Implementation of the Microsoft Installer (msi.dll)
+ *
+ * Copyright 2006 Mike McCormack for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#define COBJMACROS
+#define NONAMELESSUNION
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "shlwapi.h"
+#include "msipriv.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msi);
+
+static LONG dll_count;
+
+/* the UI level */
+INSTALLUILEVEL gUILevel = INSTALLUILEVEL_BASIC;
+HWND gUIhwnd = 0;
+INSTALLUI_HANDLERA gUIHandlerA = NULL;
+INSTALLUI_HANDLERW gUIHandlerW = NULL;
+DWORD gUIFilter = 0;
+LPVOID gUIContext = NULL;
+WCHAR gszLogFile[MAX_PATH];
+HINSTANCE msi_hInstance;
+
+/*
+ * Dll lifetime tracking declaration
+ */
+static void LockModule(void)
+{
+ InterlockedIncrement(&dll_count);
+}
+
+static void UnlockModule(void)
+{
+ InterlockedDecrement(&dll_count);
+}
+
+/******************************************************************
+ * DllMain
+ */
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+ switch (fdwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ msi_hInstance = hinstDLL;
+ DisableThreadLibraryCalls(hinstDLL);
+ msi_dialog_register_class();
+ break;
+ case DLL_PROCESS_DETACH:
+ msi_dialog_unregister_class();
+ break;
+ }
+ return TRUE;
+}
+
+typedef struct tagIClassFactoryImpl
+{
+ const IClassFactoryVtbl *lpVtbl;
+} IClassFactoryImpl;
+
+static HRESULT WINAPI MsiCF_QueryInterface(LPCLASSFACTORY iface,
+ REFIID riid,LPVOID *ppobj)
+{
+ IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+ FIXME("%p %s %p\n",This,debugstr_guid(riid),ppobj);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI MsiCF_AddRef(LPCLASSFACTORY iface)
+{
+ LockModule();
+ return 2;
+}
+
+static ULONG WINAPI MsiCF_Release(LPCLASSFACTORY iface)
+{
+ UnlockModule();
+ return 1;
+}
+
+static HRESULT WINAPI MsiCF_CreateInstance(LPCLASSFACTORY iface,
+ LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj)
+{
+ IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
+
+ FIXME("%p %p %s %p\n", This, pOuter, debugstr_guid(riid), ppobj);
+ return E_FAIL;
+}
+
+static HRESULT WINAPI MsiCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
+{
+ TRACE("%p %d\n", iface, dolock);
+
+ if (dolock)
+ LockModule();
+ else
+ UnlockModule();
+
+ return S_OK;
+}
+
+static const IClassFactoryVtbl MsiCF_Vtbl =
+{
+ MsiCF_QueryInterface,
+ MsiCF_AddRef,
+ MsiCF_Release,
+ MsiCF_CreateInstance,
+ MsiCF_LockServer
+};
+
+static IClassFactoryImpl Msi_CF = { &MsiCF_Vtbl };
+
+/******************************************************************
+ * DllGetClassObject [MSI.@]
+ */
+HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
+{
+ TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+
+ if( IsEqualCLSID (rclsid, &CLSID_IMsiServer) ||
+ IsEqualCLSID (rclsid, &CLSID_IMsiServerMessage) ||
+ IsEqualCLSID (rclsid, &CLSID_IMsiServerX1) ||
+ IsEqualCLSID (rclsid, &CLSID_IMsiServerX2) ||
+ IsEqualCLSID (rclsid, &CLSID_IMsiServerX3) )
+ {
+ *ppv = (LPVOID) &Msi_CF;
+ return S_OK;
+ }
+ return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+/******************************************************************
+ * DllGetVersion [MSI.@]
+ */
+HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *pdvi)
+{
+ TRACE("%p\n",pdvi);
+
+ if (pdvi->cbSize != sizeof(DLLVERSIONINFO))
+ return E_INVALIDARG;
+
+ pdvi->dwMajorVersion = MSI_MAJORVERSION;
+ pdvi->dwMinorVersion = MSI_MINORVERSION;
+ pdvi->dwBuildNumber = MSI_BUILDNUMBER;
+ pdvi->dwPlatformID = 1;
+
+ return S_OK;
+}
+
+/******************************************************************
+ * DllCanUnloadNow [MSI.@]
+ */
+HRESULT WINAPI DllCanUnloadNow(void)
+{
+ return dll_count == 0 ? S_OK : S_FALSE;
+}
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index b2fe5bc..3fa8466 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -466,6 +466,7 @@ extern INSTALLUI_HANDLERW gUIHandlerW;
extern DWORD gUIFilter;
extern LPVOID gUIContext;
extern WCHAR gszLogFile[MAX_PATH];
+extern HINSTANCE msi_hInstance;
/* memory allocation macro functions */
static inline void *msi_alloc( size_t len )
More information about the wine-cvs
mailing list