diff --git a/dlls/gameux/Makefile.in b/dlls/gameux/Makefile.in index 8b65e626878..59a170c1df9 100644 --- a/dlls/gameux/Makefile.in +++ b/dlls/gameux/Makefile.in @@ -9,6 +9,7 @@ IMPORTS = uuid ole32 user32 advapi32 C_SRCS = \ factory.c \ gameexplorer.c \ + gamestatistics.c \ main.c \ regsvr.c diff --git a/dlls/gameux/factory.c b/dlls/gameux/factory.c index da1eee01791..38be7a5fed1 100644 --- a/dlls/gameux/factory.c +++ b/dlls/gameux/factory.c @@ -131,6 +131,7 @@ static const struct IClassFactoryVtbl gameuxcf_vtbl = }; static gameuxcf gameexplorercf = { &gameuxcf_vtbl, GameExplorer_create }; +static gameuxcf gamestatisticscf = { &gameuxcf_vtbl, GameStatistics_create }; /*************************************************************** * gameux ClassFactory @@ -148,6 +149,10 @@ HRESULT WINAPI DllGetClassObject( { cf = (IClassFactory*)&gameexplorercf.lpVtbl; } + else if( IsEqualCLSID( rclsid, &CLSID_GameStatistics )) + { + cf = (IClassFactory*) &gamestatisticscf.lpVtbl; + } if(!cf) return CLASS_E_CLASSNOTAVAILABLE; diff --git a/dlls/gameux/gamestatistics.c b/dlls/gameux/gamestatistics.c new file mode 100644 index 00000000000..098754e0337 --- /dev/null +++ b/dlls/gameux/gamestatistics.c @@ -0,0 +1,151 @@ +/* + * Gameux library coclass GameStatistics 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 "ole2.h" + +#include "gameux.h" +#include "gameux_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(gameux); + +/* + * IGameStatisticsMgr implementation + */ + +typedef struct _GameStatisticsMgrImpl +{ + const struct IGameStatisticsMgrVtbl *lpVtbl; + LONG ref; +} GameStatisticsMgrImpl; + +static inline GameStatisticsMgrImpl *impl_from_IGameStatisticsMgr( IGameStatisticsMgr *iface ) +{ + return (GameStatisticsMgrImpl *)((char*)iface - FIELD_OFFSET(GameStatisticsMgrImpl, lpVtbl)); +} + + +static HRESULT WINAPI GameStatisticsMgrImpl_QueryInterface( + IGameStatisticsMgr *iface, + REFIID riid, + void **ppvObject) +{ + GameStatisticsMgrImpl *This = impl_from_IGameStatisticsMgr( iface ); + + TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject ); + + *ppvObject = NULL; + + if(IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IGameStatisticsMgr) ) + { + *ppvObject = iface; + } + else + { + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IGameStatisticsMgr_AddRef( iface ); + return S_OK; +} + +static ULONG WINAPI GameStatisticsMgrImpl_AddRef(IGameStatisticsMgr *iface) +{ + GameStatisticsMgrImpl *This = impl_from_IGameStatisticsMgr( iface ); + LONG ref; + + ref = InterlockedIncrement(&This->ref); + + TRACE("(%p): ref=%d\n", This, ref); + return ref; +} + +static ULONG WINAPI GameStatisticsMgrImpl_Release(IGameStatisticsMgr *iface) +{ + GameStatisticsMgrImpl *This = impl_from_IGameStatisticsMgr( iface ); + LONG ref; + + ref = InterlockedDecrement(&This->ref); + TRACE("(%p): ref=%d\n", This, ref); + + if ( ref == 0 ) + { + TRACE("freeing GameStatistics object\n"); + HeapFree( GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT STDMETHODCALLTYPE GameStatisticsMgrImpl_GetGameStatistics( + IGameStatisticsMgr* iface, + LPCWSTR GDFBinaryPath, + GAMESTATS_OPEN_TYPE openType, + GAMESTATS_OPEN_RESULT *pOpenResult, + IGameStatistics **ppiStats) +{ + FIXME("stub (%p, %s, 0x%x, %p, %p)\n", iface, debugstr_w(GDFBinaryPath), openType, pOpenResult, ppiStats); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE GameStatisticsMgrImpl_RemoveGameStatistics( + IGameStatisticsMgr* iface, + LPCWSTR GDFBinaryPath) +{ + FIXME("stub (%p, %s)\n", iface, debugstr_w(GDFBinaryPath)); + return E_NOTIMPL; +} + +static const struct IGameStatisticsMgrVtbl GameStatisticsMgrImplVtbl = +{ + GameStatisticsMgrImpl_QueryInterface, + GameStatisticsMgrImpl_AddRef, + GameStatisticsMgrImpl_Release, + GameStatisticsMgrImpl_GetGameStatistics, + GameStatisticsMgrImpl_RemoveGameStatistics, +}; + +HRESULT GameStatistics_create( + IUnknown *pUnkOuter, + IUnknown **ppObj) +{ + GameStatisticsMgrImpl *pGameStatistics; + + TRACE("(%p, %p)\n", pUnkOuter, ppObj); + + pGameStatistics = HeapAlloc( GetProcessHeap(), 0, sizeof (*pGameStatistics) ); + + if( !pGameStatistics ) + return E_OUTOFMEMORY; + + pGameStatistics->lpVtbl = &GameStatisticsMgrImplVtbl; + pGameStatistics->ref = 1; + + *ppObj = (IUnknown*)(&pGameStatistics->lpVtbl); + + TRACE("returning iface %p\n", *ppObj); + return S_OK; +} diff --git a/dlls/gameux/gameux_private.h b/dlls/gameux/gameux_private.h index 3872cb9c344..bce3bf8cc11 100644 --- a/dlls/gameux/gameux_private.h +++ b/dlls/gameux/gameux_private.h @@ -19,3 +19,4 @@ */ extern HRESULT GameExplorer_create(IUnknown* pUnkOuter, IUnknown **ppObj); +extern HRESULT GameStatistics_create(IUnknown* pUnkOuter, IUnknown **ppObj); diff --git a/dlls/gameux/regsvr.c b/dlls/gameux/regsvr.c index 50f7462b838..965cc12ef78 100644 --- a/dlls/gameux/regsvr.c +++ b/dlls/gameux/regsvr.c @@ -464,6 +464,15 @@ static struct regsvr_coclass const coclass_list[] = { "gameux.GameExplorer.1", "1.0", }, + { + &CLSID_GameStatistics, + "GameStatistics Class", + NULL, + "gameux.dll", + "Apartment", + "gameux.GameStatistics.1", + "1,0", + }, { NULL } /* list terminator */ };