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