[PATCH 1/2] dmloader: Merge and simplify the IClassFactory implementations.
Michael Stefaniuc
mstefani at redhat.de
Tue Aug 2 03:25:52 CDT 2011
---
dlls/dmloader/Makefile.in | 1 -
dlls/dmloader/classfactory.c | 200 --------------------------------------
dlls/dmloader/dmloader_main.c | 95 +++++++++++++++++-
dlls/dmloader/dmloader_private.h | 21 ----
4 files changed, 90 insertions(+), 227 deletions(-)
delete mode 100644 dlls/dmloader/classfactory.c
diff --git a/dlls/dmloader/Makefile.in b/dlls/dmloader/Makefile.in
index 84c4fae..d5d7bd9 100644
--- a/dlls/dmloader/Makefile.in
+++ b/dlls/dmloader/Makefile.in
@@ -2,7 +2,6 @@ MODULE = dmloader.dll
IMPORTS = dxguid uuid ole32 advapi32
C_SRCS = \
- classfactory.c \
container.c \
debug.c \
dmloader_main.c \
diff --git a/dlls/dmloader/classfactory.c b/dlls/dmloader/classfactory.c
deleted file mode 100644
index 266e713..0000000
--- a/dlls/dmloader/classfactory.c
+++ /dev/null
@@ -1,200 +0,0 @@
- /* IDirectMusicLoaderCF
- * IDirectMusicContainerCF
- *
- * Copyright (C) 2004 Rok Mandeljc
- *
- * This program 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 program 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 program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "dmloader_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dmloader);
-
-/*****************************************************************************
- * IDirectMusicLoaderCF implementation
- */
-static ULONG WINAPI IDirectMusicLoaderCF_AddRef (LPCLASSFACTORY iface);
-
-static HRESULT WINAPI IDirectMusicLoaderCF_QueryInterface (LPCLASSFACTORY iface, REFIID riid, LPVOID *ppobj) {
- IDirectMusicLoaderCF *This = (IDirectMusicLoaderCF *)iface;
-
- TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
- if (IsEqualIID (riid, &IID_IUnknown) ||
- IsEqualIID (riid, &IID_IClassFactory)) {
- IDirectMusicLoaderCF_AddRef (iface);
- *ppobj = This;
- return S_OK;
- }
-
- WARN(": not found\n");
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IDirectMusicLoaderCF_AddRef (LPCLASSFACTORY iface) {
- IDirectMusicLoaderCF *This = (IDirectMusicLoaderCF *)iface;
- TRACE("(%p): AddRef from %d\n", This, This->dwRef);
- return InterlockedIncrement (&This->dwRef);
-}
-
-static ULONG WINAPI IDirectMusicLoaderCF_Release (LPCLASSFACTORY iface) {
- IDirectMusicLoaderCF *This = (IDirectMusicLoaderCF *)iface;
-
- DWORD dwRef = InterlockedDecrement (&This->dwRef);
- TRACE("(%p): ReleaseRef to %d\n", This, dwRef);
- if (dwRef == 0) {
- HeapFree(GetProcessHeap (), 0, This);
- /* decrease number of instances */
- InterlockedDecrement(&dwDirectMusicLoader);
- }
-
- return dwRef;
-}
-
-static HRESULT WINAPI IDirectMusicLoaderCF_CreateInstance (LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
- IDirectMusicLoaderCF *This = (IDirectMusicLoaderCF *)iface;
-
- TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
- if (pOuter) {
- ERR(": pOuter should be NULL\n");
- return CLASS_E_NOAGGREGATION;
- }
-
- return DMUSIC_CreateDirectMusicLoaderImpl (riid, ppobj, pOuter);
-}
-
-static HRESULT WINAPI IDirectMusicLoaderCF_LockServer (LPCLASSFACTORY iface, BOOL dolock) {
- IDirectMusicLoaderCF *This = (IDirectMusicLoaderCF *)iface;
- TRACE("(%p, %d)\n", This, dolock);
- if (dolock)
- InterlockedIncrement (&dwDirectMusicLoader);
- else
- InterlockedDecrement (&dwDirectMusicLoader);
- return S_OK;
-}
-
-static const IClassFactoryVtbl DirectMusicLoaderCF_Vtbl = {
- IDirectMusicLoaderCF_QueryInterface,
- IDirectMusicLoaderCF_AddRef,
- IDirectMusicLoaderCF_Release,
- IDirectMusicLoaderCF_CreateInstance,
- IDirectMusicLoaderCF_LockServer
-};
-
-HRESULT WINAPI DMUSIC_CreateDirectMusicLoaderCF (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter) {
- IDirectMusicLoaderCF *obj;
-
- TRACE("(%s, %p, %p)\n", debugstr_dmguid(lpcGUID), ppobj, pUnkOuter);
- obj = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicLoaderCF));
- if (NULL == obj) {
- *ppobj = NULL;
- return E_OUTOFMEMORY;
- }
- obj->lpVtbl = &DirectMusicLoaderCF_Vtbl;
- obj->dwRef = 0; /* will be inited with QueryInterface */
-
- /* increase number of instances */
- InterlockedIncrement (&dwDirectMusicLoader);
-
- return IDirectMusicLoaderCF_QueryInterface ((LPCLASSFACTORY)obj, lpcGUID, ppobj);
-}
-
-
-/*****************************************************************************
- * IDirectMusicContainerCF implementation
- */
-static ULONG WINAPI IDirectMusicContainerCF_AddRef (LPCLASSFACTORY iface);
-
-static HRESULT WINAPI IDirectMusicContainerCF_QueryInterface (LPCLASSFACTORY iface, REFIID riid, LPVOID *ppobj) {
- IDirectMusicContainerCF *This = (IDirectMusicContainerCF *)iface;
-
- TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
- if (IsEqualIID (riid, &IID_IUnknown) ||
- IsEqualIID (riid, &IID_IClassFactory)) {
- IDirectMusicContainerCF_AddRef (iface);
- *ppobj = This;
- return S_OK;
- }
-
- WARN(": not found\n");
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IDirectMusicContainerCF_AddRef (LPCLASSFACTORY iface) {
- IDirectMusicContainerCF *This = (IDirectMusicContainerCF *)iface;
- TRACE("(%p): AddRef from %d\n", This, This->dwRef);
- return InterlockedIncrement (&This->dwRef);
-}
-
-static ULONG WINAPI IDirectMusicContainerCF_Release (LPCLASSFACTORY iface) {
- IDirectMusicContainerCF *This = (IDirectMusicContainerCF *)iface;
-
- DWORD dwRef = InterlockedDecrement (&This->dwRef);
- TRACE("(%p): ReleaseRef to %d\n", This, dwRef);
- if (dwRef == 0) {
- HeapFree(GetProcessHeap (), 0, This);
- /* decrease number of instances */
- InterlockedDecrement(&dwDirectMusicContainer);
- }
-
- return dwRef;
-}
-
-static HRESULT WINAPI IDirectMusicContainerCF_CreateInstance (LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) {
- IDirectMusicContainerCF *This = (IDirectMusicContainerCF *)iface;
-
- TRACE ("(%p, %p, %s, %p)\n", This, pOuter, debugstr_dmguid(riid), ppobj);
- if (pOuter) {
- ERR(": pOuter should be NULL\n");
- return CLASS_E_NOAGGREGATION;
- }
-
- return DMUSIC_CreateDirectMusicContainerImpl (riid, ppobj, pOuter);
-}
-
-static HRESULT WINAPI IDirectMusicContainerCF_LockServer (LPCLASSFACTORY iface, BOOL dolock) {
- IDirectMusicContainerCF *This = (IDirectMusicContainerCF *)iface;
- TRACE("(%p, %d)\n", This, dolock);
- if (dolock)
- InterlockedIncrement (&dwDirectMusicContainer);
- else
- InterlockedDecrement (&dwDirectMusicContainer);
- return S_OK;
-}
-
-static const IClassFactoryVtbl DirectMusicContainerCF_Vtbl = {
- IDirectMusicContainerCF_QueryInterface,
- IDirectMusicContainerCF_AddRef,
- IDirectMusicContainerCF_Release,
- IDirectMusicContainerCF_CreateInstance,
- IDirectMusicContainerCF_LockServer
-};
-
-HRESULT WINAPI DMUSIC_CreateDirectMusicContainerCF (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter) {
- IDirectMusicContainerCF *obj;
-
- TRACE("(%s, %p, %p)\n", debugstr_dmguid(lpcGUID), ppobj, pUnkOuter);
- obj = HeapAlloc (GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicContainerCF));
- if (NULL == obj) {
- *ppobj = NULL;
- return E_OUTOFMEMORY;
- }
- obj->lpVtbl = &DirectMusicContainerCF_Vtbl;
- obj->dwRef = 0; /* will be inited with QueryInterface */
-
- /* increase number of instances */
- InterlockedIncrement (&dwDirectMusicContainer);
-
- return IDirectMusicContainerCF_QueryInterface ((LPCLASSFACTORY)obj, lpcGUID, ppobj);
-}
diff --git a/dlls/dmloader/dmloader_main.c b/dlls/dmloader/dmloader_main.c
index 8ee1107..80e115e 100644
--- a/dlls/dmloader/dmloader_main.c
+++ b/dlls/dmloader/dmloader_main.c
@@ -26,6 +26,87 @@ static HINSTANCE instance;
LONG dwDirectMusicContainer = 0;
LONG dwDirectMusicLoader = 0;
+typedef struct {
+ IClassFactory IClassFactory_iface;
+ HRESULT WINAPI (*fnCreateInstance)(REFIID riid, void **ppv, IUnknown *pUnkOuter);
+} IClassFactoryImpl;
+
+/******************************************************************
+ * IClassFactory implementation
+ */
+static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
+{
+ return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface);
+}
+
+static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
+{
+ if (ppv == NULL)
+ return E_POINTER;
+
+ if (IsEqualGUID(&IID_IUnknown, riid))
+ TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
+ else if (IsEqualGUID(&IID_IClassFactory, riid))
+ TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
+ else {
+ FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
+ *ppv = NULL;
+ return E_NOINTERFACE;
+}
+
+ *ppv = iface;
+ IClassFactory_AddRef(iface);
+ return S_OK;
+}
+
+static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
+{
+ InterlockedIncrement(&dwDirectMusicLoader);
+
+ return 2; /* non-heap based object */
+}
+
+static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
+{
+ InterlockedDecrement(&dwDirectMusicLoader);
+
+ return 1; /* non-heap based object */
+}
+
+static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter,
+ REFIID riid, void **ppv)
+{
+ IClassFactoryImpl *This = impl_from_IClassFactory(iface);
+
+ TRACE ("(%p, %s, %p)\n", pUnkOuter, debugstr_dmguid(riid), ppv);
+
+ return This->fnCreateInstance(riid, ppv, pUnkOuter);
+}
+
+static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock)
+{
+ TRACE("(%d)\n", dolock);
+
+ if (dolock)
+ InterlockedIncrement(&dwDirectMusicLoader);
+ else
+ InterlockedDecrement(&dwDirectMusicLoader);
+
+ return S_OK;
+}
+
+static const IClassFactoryVtbl classfactory_vtbl = {
+ ClassFactory_QueryInterface,
+ ClassFactory_AddRef,
+ ClassFactory_Release,
+ ClassFactory_CreateInstance,
+ ClassFactory_LockServer
+};
+
+static IClassFactoryImpl dm_loader_CF = {{&classfactory_vtbl}, DMUSIC_CreateDirectMusicLoaderImpl};
+static IClassFactoryImpl dm_container_CF = {{&classfactory_vtbl},
+ DMUSIC_CreateDirectMusicContainerImpl};
+
/******************************************************************
* DllMain
*/
@@ -62,11 +143,15 @@ HRESULT WINAPI DllGetClassObject (REFCLSID rclsid, REFIID riid, LPVOID *ppv)
{
TRACE("(%s, %s, %p)\n", debugstr_dmguid(rclsid), debugstr_dmguid(riid), ppv);
if (IsEqualCLSID (rclsid, &CLSID_DirectMusicLoader) && IsEqualIID (riid, &IID_IClassFactory)) {
- return DMUSIC_CreateDirectMusicLoaderCF (riid, ppv, NULL);
- } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicContainer) && IsEqualIID (riid, &IID_IClassFactory)) {
- return DMUSIC_CreateDirectMusicContainerCF (riid, ppv, NULL);
- }
-
+ IClassFactory_AddRef(&dm_loader_CF.IClassFactory_iface);
+ *ppv = &dm_loader_CF.IClassFactory_iface;
+ return S_OK;
+ } else if (IsEqualCLSID (rclsid, &CLSID_DirectMusicContainer) && IsEqualIID (riid, &IID_IClassFactory)) {
+ IClassFactory_AddRef(&dm_container_CF.IClassFactory_iface);
+ *ppv = &dm_container_CF.IClassFactory_iface;
+ return S_OK;
+ }
+
WARN(": no class found\n");
return CLASS_E_CLASSNOTAVAILABLE;
}
diff --git a/dlls/dmloader/dmloader_private.h b/dlls/dmloader/dmloader_private.h
index 4008806..d8e520b 100644
--- a/dlls/dmloader/dmloader_private.h
+++ b/dlls/dmloader/dmloader_private.h
@@ -64,33 +64,12 @@ typedef struct IDirectMusicLoaderGenericStream IDirectMusicLoaderGenericStream;
/*****************************************************************************
* Creation helpers
*/
-extern HRESULT WINAPI DMUSIC_CreateDirectMusicLoaderCF (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
-extern HRESULT WINAPI DMUSIC_CreateDirectMusicContainerCF (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
-
extern HRESULT WINAPI DMUSIC_CreateDirectMusicLoaderImpl (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
extern HRESULT WINAPI DMUSIC_CreateDirectMusicContainerImpl (LPCGUID lpcGUID, LPVOID *ppobj, LPUNKNOWN pUnkOuter) DECLSPEC_HIDDEN;
extern HRESULT WINAPI DMUSIC_CreateDirectMusicLoaderFileStream (LPVOID *ppobj) DECLSPEC_HIDDEN;
extern HRESULT WINAPI DMUSIC_CreateDirectMusicLoaderResourceStream (LPVOID *ppobj) DECLSPEC_HIDDEN;
extern HRESULT WINAPI DMUSIC_CreateDirectMusicLoaderGenericStream (LPVOID *ppobj) DECLSPEC_HIDDEN;
-/*****************************************************************************
- * IDirectMusicLoaderCF implementation structure
- */
-struct IDirectMusicLoaderCF {
- /* IUnknown fields */
- const IClassFactoryVtbl *lpVtbl;
- LONG dwRef;
-};
-
-/*****************************************************************************
- * IDirectMusicContainerCF implementation structure
- */
-struct IDirectMusicContainerCF {
- /* IUnknown fields */
- const IClassFactoryVtbl *lpVtbl;
- LONG dwRef;
-};
-
/* cache/alias entry */
typedef struct _WINE_LOADER_ENTRY {
struct list entry; /* for listing elements */
--
1.7.4.4
More information about the wine-patches
mailing list