/******************************************************************************* * GAMEUX_ParseGameDefinition * * Helper function, loads data from given XML element into fields of GAME_DATA * structure * * Parameters: * lpXMLGameDefinitionElement [I] Game Definition XML element * GameData [O] structure where data loaded from * XML element will be stored in */ static HRESULT GAMEUX_ParseGameDefinition( IXMLDOMElement *gdElement, struct GAMEUX_GAME_DATA *GameData) { static const WCHAR sGameId[] = {'g','a','m','e','I','D',0}; HRESULT hr = S_OK; BSTR bstrAttribute; VARIANT variant; IXMLDOMNodeList *childrenList; IXMLDOMNode *nextNode; IXMLDOMElement *nextElement; TRACE("(%p, %p)\n", gdElement, GameData); bstrAttribute = SysAllocString(sGameId); if(!bstrAttribute) hr = E_OUTOFMEMORY; hr = IXMLDOMElement_getAttribute(gdElement, bstrAttribute, &variant); if(SUCCEEDED(hr)) { hr = ( GUIDFromStringW(V_BSTR(&variant), &GameData->guidApplicationId)==TRUE ? S_OK : E_FAIL); SysFreeString(V_BSTR(&variant)); } SysFreeString(bstrAttribute); /* browse subnodes */ if(SUCCEEDED(hr)) hr = IXMLDOMElement_get_childNodes(gdElement, &childrenList); if(SUCCEEDED(hr)) { do { hr = IXMLDOMNodeList_nextNode(childrenList, &nextNode); if(hr == S_OK) { hr = IXMLDOMNode_QueryInterface(nextNode, &IID_IXMLDOMElement, (LPVOID*)&nextElement); if(SUCCEEDED(hr)) { hr = GAMEUX_ProcessGameDefinitionElement(nextElement, GameData); IXMLDOMElement_Release(nextElement); } IXMLDOMElement_Release(nextNode); } } while(hr == S_OK); hr = S_OK; IXMLDOMNodeList_Release(childrenList); } return hr; }
/******************************************************************* * GAMEUX_loadGameStatisticsFromFile * Helper function, loads game statistics from file and stores them * in the structure. * * Parameters: * data [I/O] structure containing file name to * load and data fields to store data in */ static HRESULT GAMEUX_loadStatisticsFromFile(struct GAMEUX_STATS *data) { 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 = NULL; IXMLDOMElement *root = NULL, *categoryElement, *statisticElement; IXMLDOMNode *categoryNode, *statisticNode; IXMLDOMNodeList *rootChildren = NULL, *categoryChildren; VARIANT vStatsFilePath, vValue; BSTR bstrStatistics = NULL, bstrCategory = NULL, bstrIndex = NULL, bstrStatistic = NULL, bstrName = NULL, bstrValue = NULL; VARIANT_BOOL isSuccessful = VARIANT_FALSE; int i, j; TRACE("(%p)\n", data); V_VT(&vStatsFilePath) = VT_BSTR; V_BSTR(&vStatsFilePath) = SysAllocString(data->sStatsFile); if(!V_BSTR(&vStatsFilePath)) hr = E_OUTOFMEMORY; if(SUCCEEDED(hr)) hr = CoCreateInstance(&CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&document); if(SUCCEEDED(hr)) { bstrStatistics = SysAllocString(sStatistics); if(!bstrStatistics) hr = E_OUTOFMEMORY; } 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)) hr = IXMLDOMDocument_load(document, vStatsFilePath, &isSuccessful); if(hr == S_OK && isSuccessful != VARIANT_TRUE) hr = S_FALSE; if( hr == S_OK ) hr = IXMLDOMDocument_get_documentElement(document, &root); if(hr == S_OK) hr = IXMLDOMElement_get_childNodes(root, &rootChildren); if(hr == S_OK) { hr = S_OK; while(hr == S_OK) { hr = IXMLDOMNodeList_nextNode(rootChildren, &categoryNode); if(hr == S_OK) { hr = IXMLDOMNode_QueryInterface(categoryNode, &IID_IXMLDOMElement, (LPVOID*)&categoryElement); if(SUCCEEDED(hr)) { hr = IXMLDOMElement_getAttribute(categoryElement, bstrIndex, &vValue); if( hr == S_OK && V_VT(&vValue) != VT_BSTR) hr = E_FAIL; if(SUCCEEDED(hr)) { i = StrToIntW(V_BSTR(&vValue)); hr = IXMLDOMElement_getAttribute(categoryElement, bstrName, &vValue); if( hr == S_OK && V_VT(&vValue) != VT_BSTR) hr = E_FAIL; } if(SUCCEEDED(hr)) { lstrcpynW(data->categories[i].sName, V_BSTR(&vValue), MAX_CATEGORY_LENGTH); TRACE("category %d name %s\n", i, debugstr_w(data->categories[i].sName)); hr = IXMLDOMElement_get_childNodes(categoryElement, &categoryChildren); } if(SUCCEEDED(hr)) { hr = S_OK; while(hr == S_OK) { hr = IXMLDOMNodeList_nextNode(categoryChildren, &statisticNode); if(hr == S_OK) { hr = IXMLDOMNode_QueryInterface(statisticNode, &IID_IXMLDOMElement, (LPVOID*)&statisticElement); if(SUCCEEDED(hr)) { hr = IXMLDOMElement_getAttribute(statisticElement, bstrIndex, &vValue); if( hr == S_OK && V_VT(&vValue) != VT_BSTR) hr = E_FAIL; if(SUCCEEDED(hr)) { j = StrToIntW(V_BSTR(&vValue)); hr = IXMLDOMElement_getAttribute(statisticElement, bstrName, &vValue); if( hr == S_OK && V_VT(&vValue) != VT_BSTR) hr = E_FAIL; } if(SUCCEEDED(hr)) { lstrcpynW(data->categories[i].stats[j].sName, V_BSTR(&vValue), MAX_NAME_LENGTH); hr = IXMLDOMElement_getAttribute(statisticElement, bstrValue, &vValue); if( hr == S_OK && V_VT(&vValue) != VT_BSTR) hr = E_FAIL; } if(SUCCEEDED(hr)) { lstrcpynW(data->categories[i].stats[j].sValue, V_BSTR(&vValue), MAX_VALUE_LENGTH); TRACE("statistic %d name %s value %s\n", j, debugstr_w(data->categories[i].stats[j].sName), debugstr_w(data->categories[i].stats[j].sValue)); } IXMLDOMElement_Release(statisticElement); } IXMLDOMNode_Release(statisticNode); } } if(SUCCEEDED(hr)) hr = S_OK; } IXMLDOMElement_Release(categoryElement); } IXMLDOMNode_Release(categoryNode); } } if(SUCCEEDED(hr)) hr = S_OK; } if(rootChildren) IXMLDOMNodeList_Release(rootChildren); if(root) IXMLDOMElement_Release(root); if(document) IXMLDOMDocument_Release(document); SysFreeString(bstrValue); SysFreeString(bstrName); SysFreeString(bstrStatistic); SysFreeString(bstrIndex); SysFreeString(bstrCategory); SysFreeString(bstrStatistics); SysFreeString(V_BSTR(&vStatsFilePath)); return hr; }