Mariusz Pluciński : gameux: Finished implementation of saving game statistics.

Alexandre Julliard julliard at winehq.org
Mon Sep 27 11:29:43 CDT 2010


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

Author: Mariusz Pluciński <vshader at gmail.com>
Date:   Sun Sep 26 15:04:58 2010 +0200

gameux: Finished implementation of saving game statistics.

---

 dlls/gameux/gamestatistics.c |  168 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 163 insertions(+), 5 deletions(-)

diff --git a/dlls/gameux/gamestatistics.c b/dlls/gameux/gamestatistics.c
index a82f03a..0cce059 100644
--- a/dlls/gameux/gamestatistics.c
+++ b/dlls/gameux/gamestatistics.c
@@ -104,12 +104,20 @@ static HRESULT GAMEUX_createStatsDirectory(LPCWSTR lpFilePath)
 static HRESULT GAMEUX_updateStatisticsFile(struct GAMEUX_STATS *stats)
 {
     static const WCHAR sStatistics[] = {'S','t','a','t','i','s','t','i','c','s',0};
+    static const WCHAR sCategory[] = {'C','a','t','e','g','o','r','y',0};
+    static const WCHAR sIndex[] = {'I','n','d','e','x',0};
+    static const WCHAR sStatistic[] = {'S','t','a','t','i','s','t','i','c',0};
+    static const WCHAR sName[] = {'N','a','m','e',0};
+    static const WCHAR sValue[] = {'V','a','l','u','e',0};
 
     HRESULT hr = S_OK;
     IXMLDOMDocument *document;
-    IXMLDOMElement *root;
-    VARIANT vStatsFilePath;
-    BSTR bstrStatistics = NULL;
+    IXMLDOMElement *root, *categoryElement, *statisticsElement;
+    IXMLDOMNode *categoryNode, *statisticsNode;
+    VARIANT vStatsFilePath, vValue;
+    BSTR bstrStatistics = NULL, bstrCategory = NULL, bstrIndex = NULL,
+        bstrStatistic = NULL, bstrName = NULL, bstrValue = NULL;
+    int i, j;
 
     TRACE("(%p)\n", stats);
 
@@ -132,7 +140,150 @@ static HRESULT GAMEUX_updateStatisticsFile(struct GAMEUX_STATS *stats)
     if(SUCCEEDED(hr))
         hr = IXMLDOMDocument_createElement(document, bstrStatistics, &root);
 
-    FIXME("writing statistics not fully implemented\n");
+    if(SUCCEEDED(hr))
+    {
+        bstrCategory = SysAllocString(sCategory);
+        if(!bstrCategory)
+            hr = E_OUTOFMEMORY;
+    }
+
+    if(SUCCEEDED(hr))
+    {
+        bstrIndex = SysAllocString(sIndex);
+        if(!bstrIndex)
+            hr = E_OUTOFMEMORY;
+    }
+
+    if(SUCCEEDED(hr))
+    {
+        bstrStatistic = SysAllocString(sStatistic);
+        if(!bstrStatistic)
+            hr = E_OUTOFMEMORY;
+    }
+
+    if(SUCCEEDED(hr))
+    {
+        bstrName = SysAllocString(sName);
+        if(!bstrName)
+            hr = E_OUTOFMEMORY;
+    }
+
+    if(SUCCEEDED(hr))
+    {
+        bstrValue = SysAllocString(sValue);
+        if(!bstrValue)
+            hr = E_OUTOFMEMORY;
+    }
+
+    if(SUCCEEDED(hr))
+
+    if(SUCCEEDED(hr))
+        for(i=0; i<MAX_CATEGORIES; ++i)
+        {
+            if(lstrlenW(stats->categories[i].sName)==0)
+                continue;
+
+            V_VT(&vValue) = VT_INT;
+            V_INT(&vValue) = NODE_ELEMENT;
+
+            hr = IXMLDOMDocument_createNode(document, vValue, bstrCategory, NULL, &categoryNode);
+
+            if(SUCCEEDED(hr))
+                hr = IXMLDOMNode_QueryInterface(categoryNode, &IID_IXMLDOMElement, (LPVOID*)&categoryElement);
+
+            V_INT(&vValue) = i;
+            if(SUCCEEDED(hr))
+                hr = IXMLDOMElement_setAttribute(categoryElement, bstrIndex, vValue);
+
+            if(SUCCEEDED(hr))
+            {
+                V_VT(&vValue) = VT_BSTR;
+                V_BSTR(&vValue) = SysAllocString(stats->categories[i].sName);
+                if(!V_BSTR(&vValue))
+                    hr = E_OUTOFMEMORY;
+            }
+
+            if(SUCCEEDED(hr))
+            {
+                TRACE("storing category %d: %s\n", i, debugstr_w(V_BSTR(&vValue)));
+                hr = IXMLDOMElement_setAttribute(categoryElement, bstrName, vValue);
+            }
+
+            SysFreeString(V_BSTR(&vValue));
+
+            if(SUCCEEDED(hr))
+            {
+                for(j=0; j<MAX_STATS_PER_CATEGORY; ++j)
+                {
+                    if(lstrlenW(stats->categories[i].stats[j].sName)==0)
+                        continue;
+
+                    V_VT(&vValue) = VT_INT;
+                    V_INT(&vValue) = NODE_ELEMENT;
+
+                    hr = IXMLDOMDocument_createNode(document, vValue, bstrStatistic, NULL, &statisticsNode);
+
+                    if(SUCCEEDED(hr))
+                        hr = IXMLDOMNode_QueryInterface(statisticsNode, &IID_IXMLDOMElement, (LPVOID*)&statisticsElement);
+
+                    V_INT(&vValue) = j;
+                    if(SUCCEEDED(hr))
+                        hr = IXMLDOMElement_setAttribute(statisticsElement, bstrIndex, vValue);
+
+                    if(SUCCEEDED(hr))
+                    {
+                        V_VT(&vValue) = VT_BSTR;
+                        V_BSTR(&vValue) = SysAllocString(stats->categories[i].stats[j].sName);
+                        if(!V_BSTR(&vValue))
+                            hr = E_OUTOFMEMORY;
+                    }
+
+                    if(SUCCEEDED(hr))
+                    {
+                        TRACE("    storing statistic %d: name: %s\n", j, debugstr_w(V_BSTR(&vValue)));
+                        hr = IXMLDOMElement_setAttribute(statisticsElement, bstrName, vValue);
+                    }
+
+                    SysFreeString(V_BSTR(&vValue));
+
+                    if(SUCCEEDED(hr))
+                    {
+                        V_VT(&vValue) = VT_BSTR;
+                        V_BSTR(&vValue) = SysAllocString(stats->categories[i].stats[j].sValue);
+                        if(!V_BSTR(&vValue))
+                            hr = E_OUTOFMEMORY;
+                    }
+
+                    if(SUCCEEDED(hr))
+                    {
+                        TRACE("    storing statistic %d: name: %s\n", j, debugstr_w(V_BSTR(&vValue)));
+                        hr = IXMLDOMElement_setAttribute(statisticsElement, bstrValue, vValue);
+                    }
+
+                    SysFreeString(V_BSTR(&vValue));
+
+                    if(SUCCEEDED(hr))
+                        hr = IXMLDOMElement_appendChild(categoryNode, statisticsNode, &statisticsNode);
+
+                    IXMLDOMElement_Release(statisticsElement);
+                    IXMLDOMNode_Release(statisticsNode);
+                }
+            }
+
+            if(SUCCEEDED(hr))
+                hr = IXMLDOMElement_appendChild(root, categoryNode, &categoryNode);
+
+            IXMLDOMElement_Release(categoryElement);
+            IXMLDOMNode_Release(categoryNode);
+
+            if(FAILED(hr))
+                break;
+        }
+
+    if(SUCCEEDED(hr))
+        hr = IXMLDOMDocument_putref_documentElement(document, root);
+
+    IXMLDOMElement_Release(root);
 
     TRACE("saving game statistics in %s file\n", debugstr_w(stats->sStatsFile));
     if(SUCCEEDED(hr))
@@ -141,8 +292,15 @@ static HRESULT GAMEUX_updateStatisticsFile(struct GAMEUX_STATS *stats)
     if(SUCCEEDED(hr))
         hr = IXMLDOMDocument_save(document, vStatsFilePath);
 
-    SysFreeString(V_BSTR(&vStatsFilePath));
+    IXMLDOMDocument_Release(document);
+
+    SysFreeString(bstrValue);
+    SysFreeString(bstrName);
+    SysFreeString(bstrStatistic);
+    SysFreeString(bstrIndex);
+    SysFreeString(bstrCategory);
     SysFreeString(bstrStatistics);
+    SysFreeString(V_BSTR(&vStatsFilePath));
     TRACE("ret=0x%x\n", hr);
     return hr;
 }




More information about the wine-cvs mailing list