Andrew Nguyen : dxdiagn: Add code that introduces the infrastructure of a provider information tree .

Alexandre Julliard julliard at winehq.org
Tue Feb 15 11:29:25 CST 2011


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

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Tue Feb 15 01:14:09 2011 -0600

dxdiagn: Add code that introduces the infrastructure of a provider information tree.

---

 dlls/dxdiagn/dxdiag_private.h |   11 +++
 dlls/dxdiagn/provider.c       |  170 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 181 insertions(+), 0 deletions(-)

diff --git a/dlls/dxdiagn/dxdiag_private.h b/dlls/dxdiagn/dxdiag_private.h
index 6329ccf..30891a0 100644
--- a/dlls/dxdiagn/dxdiag_private.h
+++ b/dlls/dxdiagn/dxdiag_private.h
@@ -34,6 +34,16 @@
 typedef struct IDxDiagProviderImpl  IDxDiagProviderImpl;
 typedef struct IDxDiagContainerImpl IDxDiagContainerImpl;
 
+typedef struct IDxDiagContainerImpl_Container {
+  struct list entry;
+  WCHAR *contName;
+
+  struct list subContainers;
+  DWORD nSubContainers;
+  struct list properties;
+  DWORD nProperties;
+} IDxDiagContainerImpl_Container;
+
 /* ---------------- */
 /* IDxDiagProvider  */
 /* ---------------- */
@@ -48,6 +58,7 @@ struct IDxDiagProviderImpl {
   /* IDxDiagProvider fields */
   BOOL        init;
   DXDIAG_INIT_PARAMS params;
+  IDxDiagContainerImpl_Container *info_root;
 };
 
 /* ---------------- */
diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c
index 67d75fa..9674c28 100644
--- a/dlls/dxdiagn/provider.c
+++ b/dlls/dxdiagn/provider.c
@@ -43,6 +43,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(dxdiag);
 
 static HRESULT DXDiag_InitRootDXDiagContainer(IDxDiagContainer* pRootCont, IDxDiagProvider *pProv);
 
+static HRESULT build_information_tree(IDxDiagContainerImpl_Container **pinfo_root);
+static void free_information_tree(IDxDiagContainerImpl_Container *node);
+
 /* IDxDiagProvider IUnknown parts follow: */
 static HRESULT WINAPI IDxDiagProviderImpl_QueryInterface(PDXDIAGPROVIDER iface, REFIID riid, LPVOID *ppobj)
 {
@@ -80,6 +83,7 @@ static ULONG WINAPI IDxDiagProviderImpl_Release(PDXDIAGPROVIDER iface) {
     TRACE("(%p)->(ref before=%u)\n", This, refCount + 1);
 
     if (!refCount) {
+        free_information_tree(This->info_root);
         HeapFree(GetProcessHeap(), 0, This);
     }
 
@@ -91,6 +95,8 @@ static ULONG WINAPI IDxDiagProviderImpl_Release(PDXDIAGPROVIDER iface) {
 /* IDxDiagProvider Interface follow: */
 static HRESULT WINAPI IDxDiagProviderImpl_Initialize(PDXDIAGPROVIDER iface, DXDIAG_INIT_PARAMS* pParams) {
     IDxDiagProviderImpl *This = (IDxDiagProviderImpl *)iface;
+    HRESULT hr;
+
     TRACE("(%p,%p)\n", iface, pParams);
 
     if (NULL == pParams) {
@@ -101,6 +107,13 @@ static HRESULT WINAPI IDxDiagProviderImpl_Initialize(PDXDIAGPROVIDER iface, DXDI
       return E_INVALIDARG;
     }
 
+    if (!This->info_root)
+    {
+        hr = build_information_tree(&This->info_root);
+        if (FAILED(hr))
+            return hr;
+    }
+
     This->init = TRUE;
     memcpy(&This->params, pParams, pParams->dwSize);
     return S_OK;
@@ -814,3 +827,160 @@ static HRESULT DXDiag_InitRootDXDiagContainer(IDxDiagContainer* pRootCont, IDxDi
 
   return S_OK;
 }
+
+static void free_information_tree(IDxDiagContainerImpl_Container *node)
+{
+    IDxDiagContainerImpl_Container *ptr, *cursor2;
+
+    if (!node)
+        return;
+
+    HeapFree(GetProcessHeap(), 0, node->contName);
+
+    LIST_FOR_EACH_ENTRY_SAFE(ptr, cursor2, &node->subContainers, IDxDiagContainerImpl_Container, entry)
+    {
+        list_remove(&ptr->entry);
+        free_information_tree(ptr);
+    }
+
+    HeapFree(GetProcessHeap(), 0, node);
+}
+
+static IDxDiagContainerImpl_Container *allocate_information_node(const WCHAR *name)
+{
+    IDxDiagContainerImpl_Container *ret;
+
+    ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret));
+    if (!ret)
+        return NULL;
+
+    if (name)
+    {
+        ret->contName = HeapAlloc(GetProcessHeap(), 0, (strlenW(name) + 1) * sizeof(*name));
+        if (!ret->contName)
+        {
+            HeapFree(GetProcessHeap(), 0, ret);
+            return NULL;
+        }
+        strcpyW(ret->contName, name);
+    }
+
+    list_init(&ret->subContainers);
+    list_init(&ret->properties);
+
+    return ret;
+}
+
+static inline void add_subcontainer(IDxDiagContainerImpl_Container *node, IDxDiagContainerImpl_Container *subCont)
+{
+    list_add_tail(&node->subContainers, &subCont->entry);
+    ++node->nSubContainers;
+}
+
+static HRESULT build_systeminfo_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_displaydevices_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_directmusic_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_directinput_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_directplay_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_systemdevices_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_directxfiles_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_directshowfilters_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_logicaldisks_tree(IDxDiagContainerImpl_Container *node)
+{
+    return S_OK;
+}
+
+static HRESULT build_information_tree(IDxDiagContainerImpl_Container **pinfo_root)
+{
+    static const WCHAR DxDiag_SystemInfo[] = {'D','x','D','i','a','g','_','S','y','s','t','e','m','I','n','f','o',0};
+    static const WCHAR DxDiag_DisplayDevices[] = {'D','x','D','i','a','g','_','D','i','s','p','l','a','y','D','e','v','i','c','e','s',0};
+    static const WCHAR DxDiag_DirectSound[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','S','o','u','n','d',0};
+    static const WCHAR DxDiag_DirectMusic[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','M','u','s','i','c',0};
+    static const WCHAR DxDiag_DirectInput[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','I','n','p','u','t',0};
+    static const WCHAR DxDiag_DirectPlay[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','P','l','a','y',0};
+    static const WCHAR DxDiag_SystemDevices[] = {'D','x','D','i','a','g','_','S','y','s','t','e','m','D','e','v','i','c','e','s',0};
+    static const WCHAR DxDiag_DirectXFiles[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','X','F','i','l','e','s',0};
+    static const WCHAR DxDiag_DirectShowFilters[] = {'D','x','D','i','a','g','_','D','i','r','e','c','t','S','h','o','w','F','i','l','t','e','r','s',0};
+    static const WCHAR DxDiag_LogicalDisks[] = {'D','x','D','i','a','g','_','L','o','g','i','c','a','l','D','i','s','k','s',0};
+
+    static const struct
+    {
+        const WCHAR *name;
+        HRESULT (*initfunc)(IDxDiagContainerImpl_Container *);
+    } root_children[] =
+    {
+        {DxDiag_SystemInfo, build_systeminfo_tree},
+        {DxDiag_DisplayDevices, build_displaydevices_tree},
+        {DxDiag_DirectSound, build_directsound_tree},
+        {DxDiag_DirectMusic, build_directmusic_tree},
+        {DxDiag_DirectInput, build_directinput_tree},
+        {DxDiag_DirectPlay, build_directplay_tree},
+        {DxDiag_SystemDevices, build_systemdevices_tree},
+        {DxDiag_DirectXFiles, build_directxfiles_tree},
+        {DxDiag_DirectShowFilters, build_directshowfilters_tree},
+        {DxDiag_LogicalDisks, build_logicaldisks_tree},
+    };
+
+    IDxDiagContainerImpl_Container *info_root;
+    size_t index;
+
+    info_root = allocate_information_node(NULL);
+    if (!info_root)
+        return E_OUTOFMEMORY;
+
+    for (index = 0; index < sizeof(root_children)/sizeof(root_children[0]); index++)
+    {
+        IDxDiagContainerImpl_Container *node;
+
+        node = allocate_information_node(root_children[index].name);
+        if (!node)
+        {
+            free_information_tree(info_root);
+            return E_OUTOFMEMORY;
+        }
+
+        root_children[index].initfunc(node);
+
+        add_subcontainer(info_root, node);
+    }
+
+    *pinfo_root = info_root;
+    return S_OK;
+}




More information about the wine-cvs mailing list