diff --git a/dlls/gameux/Makefile.in b/dlls/gameux/Makefile.in index 7cf2600342b..c4c89374d7d 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 00000000000..da1eee01791 --- /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 +#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 1c89098e984..5ee88cd51b2 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