Mariusz Pluciński : gameux: Add stub of IGameStatistics interface implementation.

Alexandre Julliard julliard at winehq.org
Fri Sep 24 11:43:44 CDT 2010


Module: wine
Branch: master
Commit: 0ef59050c6c855907fc1a2b2f04fbe5ef2816e14
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0ef59050c6c855907fc1a2b2f04fbe5ef2816e14

Author: Mariusz Pluciński <vshader at gmail.com>
Date:   Thu Sep 23 15:37:54 2010 +0200

gameux: Add stub of IGameStatistics interface implementation.

---

 dlls/gameux/gamestatistics.c       |  224 +++++++++++++++++++++++++++++++++++-
 dlls/gameux/tests/gamestatistics.c |    2 +-
 2 files changed, 222 insertions(+), 4 deletions(-)

diff --git a/dlls/gameux/gamestatistics.c b/dlls/gameux/gamestatistics.c
index 0b872ac..6978173 100644
--- a/dlls/gameux/gamestatistics.c
+++ b/dlls/gameux/gamestatistics.c
@@ -31,10 +31,221 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(gameux);
 
-/*
- * IGameStatisticsMgr implementation
+/*******************************************************************************
+ * IGameStatistics implementation
  */
+typedef struct _GameStatisticsImpl
+{
+    const struct IGameStatisticsVtbl *lpVtbl;
+    LONG ref;
+} GameStatisticsImpl;
+
+static inline GameStatisticsImpl *impl_from_IGameStatistics( IGameStatistics *iface )
+{
+    return (GameStatisticsImpl *)((char*)iface - FIELD_OFFSET(GameStatisticsImpl, lpVtbl));
+}
+static inline IGameStatistics *IGameStatistics_from_impl( GameStatisticsImpl* This )
+{
+    return (struct IGameStatistics*)&This->lpVtbl;
+}
+
+
+static HRESULT WINAPI GameStatisticsImpl_QueryInterface(
+        IGameStatistics *iface,
+        REFIID riid,
+        void **ppvObject)
+{
+    GameStatisticsImpl *This = impl_from_IGameStatistics( iface );
+
+    TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
+
+    *ppvObject = NULL;
+
+    if ( IsEqualGUID( riid, &IID_IUnknown ) ||
+         IsEqualGUID( riid, &IID_IGameStatistics ) )
+    {
+        *ppvObject = iface;
+    }
+    else
+    {
+        FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+
+    IGameStatistics_AddRef( iface );
+    return S_OK;
+}
+
+static ULONG WINAPI GameStatisticsImpl_AddRef(IGameStatistics *iface)
+{
+    GameStatisticsImpl *This = impl_from_IGameStatistics( iface );
+    LONG ref;
+
+    ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p): ref=%d\n", This, ref);
+    return ref;
+}
+
+static ULONG WINAPI GameStatisticsImpl_Release(IGameStatistics *iface)
+{
+    GameStatisticsImpl *This = impl_from_IGameStatistics( iface );
+    LONG ref;
+
+    ref = InterlockedDecrement( &This->ref );
+    TRACE("(%p): ref=%d\n", This, ref);
+
+    if ( ref == 0 )
+    {
+        TRACE("freeing IGameStatistics\n");
+        HeapFree( GetProcessHeap(), 0, This );
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_GetMaxCategoryLength(
+    IGameStatistics *iface,
+    UINT *cch)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_GetMaxNameLength(
+    IGameStatistics *iface,
+    UINT *cch)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
 
+static HRESULT WINAPI GameStatisticsImpl_GetMaxValueLength(
+    IGameStatistics *iface,
+    UINT *cch)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_GetMaxCategories(
+    IGameStatistics *iface,
+    WORD *pMax)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_GetMaxStatsPerCategory(
+    IGameStatistics *iface,
+    WORD *pMax)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_SetCategoryTitle(
+    IGameStatistics *iface,
+    WORD categoryIndex,
+    LPCWSTR title)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_GetCategoryTitle(
+    IGameStatistics *iface,
+    WORD categoryIndex,
+    LPWSTR *pTitle)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_GetStatistic(
+    IGameStatistics *iface,
+    WORD categoryIndex,
+    WORD statIndex,
+    LPWSTR *pName,
+    LPWSTR *pValue)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_SetStatistic(
+    IGameStatistics *iface,
+    WORD categoryIndex,
+    WORD statIndex,
+    LPCWSTR name,
+    LPCWSTR value)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_Save(
+    IGameStatistics *iface,
+    BOOL trackChanges)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_SetLastPlayedCategory(
+    IGameStatistics *iface,
+    UINT categoryIndex)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI GameStatisticsImpl_GetLastPlayedCategory(
+    IGameStatistics *iface,
+    UINT *pCategoryIndex)
+{
+    FIXME("stub\n");
+    return E_NOTIMPL;
+}
+
+static const struct IGameStatisticsVtbl GameStatisticsImplVtbl =
+{
+    GameStatisticsImpl_QueryInterface,
+    GameStatisticsImpl_AddRef,
+    GameStatisticsImpl_Release,
+    GameStatisticsImpl_GetMaxCategoryLength,
+    GameStatisticsImpl_GetMaxNameLength,
+    GameStatisticsImpl_GetMaxValueLength,
+    GameStatisticsImpl_GetMaxCategories,
+    GameStatisticsImpl_GetMaxStatsPerCategory,
+    GameStatisticsImpl_SetCategoryTitle,
+    GameStatisticsImpl_GetCategoryTitle,
+    GameStatisticsImpl_GetStatistic,
+    GameStatisticsImpl_SetStatistic,
+    GameStatisticsImpl_Save,
+    GameStatisticsImpl_SetLastPlayedCategory,
+    GameStatisticsImpl_GetLastPlayedCategory
+};
+
+
+HRESULT create_IGameStatistics(GameStatisticsImpl** ppStats)
+{
+    TRACE("(%p)\n", ppStats);
+
+    *ppStats = HeapAlloc( GetProcessHeap(), 0, sizeof(**ppStats));
+    if(!(*ppStats))
+        return E_OUTOFMEMORY;
+
+    (*ppStats)->lpVtbl = &GameStatisticsImplVtbl;
+    (*ppStats)->ref = 1;
+
+    TRACE("returing coclass: %p\n", *ppStats);
+    return S_OK;
+}
+
+/*******************************************************************************
+ * IGameStatisticsMgr implementation
+ */
 typedef struct _GameStatisticsMgrImpl
 {
     const struct IGameStatisticsMgrVtbl *lpVtbl;
@@ -117,6 +328,7 @@ static HRESULT STDMETHODCALLTYPE GameStatisticsMgrImpl_GetGameStatistics(
     WCHAR lpApplicationId[49];
     DWORD dwLength = sizeof(lpApplicationId);
     GAME_INSTALL_SCOPE installScope;
+    GameStatisticsImpl *statisticsImpl;
 
     TRACE("(%p, %s, 0x%x, %p, %p)\n", iface, debugstr_w(GDFBinaryPath), openType, pOpenResult, ppiStats);
 
@@ -150,7 +362,13 @@ static HRESULT STDMETHODCALLTYPE GameStatisticsMgrImpl_GetGameStatistics(
     if(SUCCEEDED(hr))
     {
         TRACE("found app id: %s\n", debugstr_w(lpApplicationId));
-        FIXME("creating instance of IGameStatistics not yet implemented\n");
+        hr = create_IGameStatistics(&statisticsImpl);
+    }
+
+    if(SUCCEEDED(hr))
+    {
+        *ppiStats = IGameStatistics_from_impl(statisticsImpl);
+        FIXME("loading game statistics not yet implemented\n");
         hr = E_NOTIMPL;
     }
 
diff --git a/dlls/gameux/tests/gamestatistics.c b/dlls/gameux/tests/gamestatistics.c
index 87b1066..7641157 100644
--- a/dlls/gameux/tests/gamestatistics.c
+++ b/dlls/gameux/tests/gamestatistics.c
@@ -239,7 +239,7 @@ static void test_gamestatisticsmgr( void )
     /* now, allow to create */
     hr = IGameStatisticsMgr_GetGameStatistics(gsm, sExeName, GAMESTATS_OPEN_OPENORCREATE, &dwOpenResult, &gs);
     todo_wine ok(SUCCEEDED(hr), "GetGameStatistics returned error: 0x%x\n", hr);
-    todo_wine ok(gs!=NULL, "GetGameStatistics did not return valid interface pointer\n");
+    ok(gs!=NULL, "GetGameStatistics did not return valid interface pointer\n");
     if(gs)
     {
         /* test of limit values returned from interface */




More information about the wine-cvs mailing list