Mariusz Pluciński : gameux: Add IClassFactory implementation.
Alexandre Julliard
julliard at winehq.org
Wed Jul 28 10:45:12 CDT 2010
Module: wine
Branch: master
Commit: de239b7ac7f1ac37615c3abac9d598e8ccf8894b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=de239b7ac7f1ac37615c3abac9d598e8ccf8894b
Author: Mariusz Pluciński <vshader at gmail.com>
Date: Sat Jul 24 15:53:19 2010 +0200
gameux: Add IClassFactory implementation.
---
dlls/gameux/Makefile.in | 1 +
dlls/gameux/factory.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++
dlls/gameux/gameux.spec | 2 +-
3 files changed, 158 insertions(+), 1 deletions(-)
diff --git a/dlls/gameux/Makefile.in b/dlls/gameux/Makefile.in
index 7cf2600..c4c8937 100644
--- a/dlls/gameux/Makefile.in
+++ b/dlls/gameux/Makefile.in
@@ -7,6 +7,7 @@ MODULE = gameux.dll
IMPORTS = uuid
C_SRCS = \
+ factory.c \
gameexplorer.c \
main.c
diff --git a/dlls/gameux/factory.c b/dlls/gameux/factory.c
new file mode 100644
index 0000000..da1eee0
--- /dev/null
+++ b/dlls/gameux/factory.c
@@ -0,0 +1,156 @@
+/*
+ * Gameux library IClassFactory implementation
+ *
+ * Copyright (C) 2010 Mariusz Pluciński
+ *
+ * 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
+ */
+
+#define COBJMACROS
+
+#include "config.h"
+
+#include <stdarg.h>
+#include "windef.h"
+#include "winbase.h"
+#include "ole2.h"
+
+#include "gameux.h"
+#include "gameux_private.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(gameux);
+
+typedef HRESULT (*fnCreateInstance)(IUnknown *pUnkOuter, IUnknown **ppObj);
+
+/***************************************************************
+ * gameux ClassFactory
+ */
+typedef struct _gameuxcf
+{
+ const struct IClassFactoryVtbl *lpVtbl;
+ fnCreateInstance pfnCreateInstance;
+} gameuxcf;
+
+static inline gameuxcf *impl_from_IClassFactory(IClassFactory *iface)
+{
+ return (gameuxcf*)((char*)iface - FIELD_OFFSET(gameuxcf, lpVtbl));
+}
+
+static HRESULT WINAPI gameuxcf_QueryInterface(
+ IClassFactory *iface,
+ REFIID riid,
+ LPVOID *ppObj)
+{
+ TRACE("(%p, %s, %p)\n", iface, debugstr_guid(riid), ppObj);
+
+ *ppObj = NULL;
+
+ if(IsEqualGUID(riid, &IID_IUnknown) ||
+ IsEqualGUID(riid, &IID_IClassFactory))
+ {
+ IClassFactory_AddRef(iface);
+ *ppObj = iface;
+ return S_OK;
+ }
+
+ FIXME("interface %s not implemented\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI gameuxcf_AddRef(
+ IClassFactory *iface)
+{
+ TRACE("(%p)\n", iface);
+ return 2;
+}
+
+static ULONG WINAPI gameuxcf_Release(
+ IClassFactory *iface)
+{
+ TRACE("(%p)\n", iface);
+ return 1;
+}
+
+static HRESULT WINAPI gameuxcf_CreateInstance(
+ IClassFactory *iface,
+ LPUNKNOWN pUnkOuter,
+ REFIID riid,
+ LPVOID *ppObj)
+{
+ gameuxcf *This = impl_from_IClassFactory(iface);
+ HRESULT hr;
+ IUnknown *pUnk;
+
+ TRACE("(%p, %p, %s, %p)\n", iface, pUnkOuter, debugstr_guid(riid), ppObj);
+
+ *ppObj = NULL;
+
+ if(pUnkOuter)
+ return CLASS_E_NOAGGREGATION;
+
+ hr = This->pfnCreateInstance(pUnkOuter, &pUnk);
+ if(FAILED(hr))
+ return hr;
+
+ hr = IUnknown_QueryInterface(pUnk, riid, ppObj);
+ IUnknown_Release(pUnk);
+ return hr;
+}
+
+static HRESULT WINAPI gameuxcf_LockServer(
+ IClassFactory *iface,
+ BOOL dolock)
+{
+ gameuxcf *This = impl_from_IClassFactory(iface);
+ TRACE("(%p, %d)\n", This, dolock);
+ FIXME("stub\n");
+ return S_OK;
+}
+
+static const struct IClassFactoryVtbl gameuxcf_vtbl =
+{
+ gameuxcf_QueryInterface,
+ gameuxcf_AddRef,
+ gameuxcf_Release,
+ gameuxcf_CreateInstance,
+ gameuxcf_LockServer
+};
+
+static gameuxcf gameexplorercf = { &gameuxcf_vtbl, GameExplorer_create };
+
+/***************************************************************
+ * gameux ClassFactory
+ */
+HRESULT WINAPI DllGetClassObject(
+ REFCLSID rclsid,
+ REFIID riid,
+ LPVOID *ppv)
+{
+ IClassFactory *cf = NULL;
+
+ TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+
+ if(IsEqualCLSID(rclsid, &CLSID_GameExplorer))
+ {
+ cf = (IClassFactory*)&gameexplorercf.lpVtbl;
+ }
+
+ if(!cf)
+ return CLASS_E_CLASSNOTAVAILABLE;
+
+ return IClassFactory_QueryInterface(cf, riid, ppv);
+}
diff --git a/dlls/gameux/gameux.spec b/dlls/gameux/gameux.spec
index 1c89098..5ee88cd 100644
--- a/dlls/gameux/gameux.spec
+++ b/dlls/gameux/gameux.spec
@@ -1,5 +1,5 @@
@ stub GameUxShimW
@ stdcall -private DllCanUnloadNow()
-@ stub DllGetClassObject
+@ stdcall -private DllGetClassObject(ptr ptr ptr)
@ stub DllRegisterServer
@ stub DllUnregisterServer
More information about the wine-cvs
mailing list