Hans Leidekker : wmiutils: Add a stub implementation of IWbemPathKeyList.

Alexandre Julliard julliard at winehq.org
Thu Feb 21 14:29:36 CST 2013


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Thu Feb 21 10:45:51 2013 +0100

wmiutils: Add a stub implementation of IWbemPathKeyList.

---

 dlls/wmiutils/path.c |  233 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 221 insertions(+), 12 deletions(-)

diff --git a/dlls/wmiutils/path.c b/dlls/wmiutils/path.c
index 7b7e46f..5f64aa0 100644
--- a/dlls/wmiutils/path.c
+++ b/dlls/wmiutils/path.c
@@ -32,12 +32,11 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(wmiutils);
 
-struct key
+struct keylist
 {
-    WCHAR *name;
-    int    len_name;
-    WCHAR *value;
-    int    len_value;
+    IWbemPathKeyList IWbemPathKeyList_iface;
+    IWbemPath       *parent;
+    LONG             refs;
 };
 
 struct path
@@ -59,6 +58,207 @@ struct path
     ULONGLONG        flags;
 };
 
+static inline struct keylist *impl_from_IWbemPathKeyList( IWbemPathKeyList *iface )
+{
+    return CONTAINING_RECORD(iface, struct keylist, IWbemPathKeyList_iface);
+}
+
+static inline struct path *impl_from_IWbemPath( IWbemPath *iface )
+{
+    return CONTAINING_RECORD(iface, struct path, IWbemPath_iface);
+}
+
+static ULONG WINAPI keylist_AddRef(
+    IWbemPathKeyList *iface )
+{
+    struct keylist *keylist = impl_from_IWbemPathKeyList( iface );
+    return InterlockedIncrement( &keylist->refs );
+}
+
+static ULONG WINAPI keylist_Release(
+    IWbemPathKeyList *iface )
+{
+    struct keylist *keylist = impl_from_IWbemPathKeyList( iface );
+    LONG refs = InterlockedDecrement( &keylist->refs );
+    if (!refs)
+    {
+        TRACE("destroying %p\n", keylist);
+        IWbemPath_Release( keylist->parent );
+        heap_free( keylist );
+    }
+    return refs;
+}
+
+static HRESULT WINAPI keylist_QueryInterface(
+    IWbemPathKeyList *iface,
+    REFIID riid,
+    void **ppvObject )
+{
+    struct keylist *keylist = impl_from_IWbemPathKeyList( iface );
+
+    TRACE("%p, %s, %p\n", keylist, debugstr_guid(riid), ppvObject);
+
+    if (IsEqualGUID( riid, &IID_IWbemPathKeyList ) ||
+        IsEqualGUID( riid, &IID_IUnknown ))
+    {
+        *ppvObject = iface;
+    }
+    else
+    {
+        FIXME("interface %s not implemented\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+    IWbemPathKeyList_AddRef( iface );
+    return S_OK;
+}
+
+static HRESULT WINAPI keylist_GetCount(
+    IWbemPathKeyList *iface,
+    ULONG *puKeyCount )
+{
+    FIXME("%p, %p\n", iface, puKeyCount);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI keylist_SetKey(
+    IWbemPathKeyList *iface,
+    LPCWSTR wszName,
+    ULONG uFlags,
+    ULONG uCimType,
+    LPVOID pKeyVal )
+{
+    FIXME("%p, %s, 0x%x, %u, %p\n", iface, debugstr_w(wszName), uFlags, uCimType, pKeyVal);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI keylist_SetKey2(
+    IWbemPathKeyList *iface,
+    LPCWSTR wszName,
+    ULONG uFlags,
+    ULONG uCimType,
+    VARIANT *pKeyVal )
+{
+    FIXME("%p, %s, 0x%x, %u, %p\n", iface, debugstr_w(wszName), uFlags, uCimType, pKeyVal);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI keylist_GetKey(
+    IWbemPathKeyList *iface,
+    ULONG uKeyIx,
+    ULONG uFlags,
+    ULONG *puNameBufSize,
+    LPWSTR pszKeyName,
+    ULONG *puKeyValBufSize,
+    LPVOID pKeyVal,
+    ULONG *puApparentCimType )
+{
+    FIXME("%p, %u, 0x%x, %p, %p, %p, %p, %p\n", iface, uKeyIx, uFlags, puNameBufSize,
+          pszKeyName, puKeyValBufSize, pKeyVal, puApparentCimType);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI keylist_GetKey2(
+    IWbemPathKeyList *iface,
+    ULONG uKeyIx,
+    ULONG uFlags,
+    ULONG *puNameBufSize,
+    LPWSTR pszKeyName,
+    VARIANT *pKeyValue,
+    ULONG *puApparentCimType )
+{
+    FIXME("%p, %u, 0x%x, %p, %p, %p, %p\n", iface, uKeyIx, uFlags, puNameBufSize,
+          pszKeyName, pKeyValue, puApparentCimType);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI keylist_RemoveKey(
+    IWbemPathKeyList *iface,
+    LPCWSTR wszName,
+    ULONG uFlags )
+{
+    FIXME("%p, %s, 0x%x\n", iface, debugstr_w(wszName), uFlags);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI keylist_RemoveAllKeys(
+    IWbemPathKeyList *iface,
+    ULONG uFlags )
+{
+    FIXME("%p, 0x%x\n", iface, uFlags);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI keylist_MakeSingleton(
+    IWbemPathKeyList *iface,
+    boolean bSet )
+{
+    FIXME("%p, %d\n", iface, bSet);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI keylist_GetInfo(
+    IWbemPathKeyList *iface,
+    ULONG uRequestedInfo,
+    ULONGLONG *puResponse )
+{
+    FIXME("%p, %u, %p\n", iface, uRequestedInfo, puResponse);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI keylist_GetText(
+    IWbemPathKeyList *iface,
+    LONG lFlags,
+    ULONG *puBuffLength,
+    LPWSTR pszText )
+{
+    FIXME("%p, 0x%x, %p, %p\n", iface, lFlags, puBuffLength, pszText);
+    return E_NOTIMPL;
+}
+
+static const struct IWbemPathKeyListVtbl keylist_vtbl =
+{
+    keylist_QueryInterface,
+    keylist_AddRef,
+    keylist_Release,
+    keylist_GetCount,
+    keylist_SetKey,
+    keylist_SetKey2,
+    keylist_GetKey,
+    keylist_GetKey2,
+    keylist_RemoveKey,
+    keylist_RemoveAllKeys,
+    keylist_MakeSingleton,
+    keylist_GetInfo,
+    keylist_GetText
+};
+
+static HRESULT WbemPathKeyList_create( IUnknown *pUnkOuter, IWbemPath *parent, LPVOID *ppObj )
+{
+    struct keylist *keylist;
+
+    TRACE("%p, %p\n", pUnkOuter, ppObj);
+
+    if (!(keylist = heap_alloc( sizeof(*keylist) ))) return E_OUTOFMEMORY;
+
+    keylist->IWbemPathKeyList_iface.lpVtbl = &keylist_vtbl;
+    keylist->refs = 1;
+    keylist->parent = parent;
+    IWbemPath_AddRef( keylist->parent );
+
+    *ppObj = &keylist->IWbemPathKeyList_iface;
+
+    TRACE("returning iface %p\n", *ppObj);
+    return S_OK;
+}
+
+struct key
+{
+    WCHAR *name;
+    int    len_name;
+    WCHAR *value;
+    int    len_value;
+};
+
 static void init_path( struct path *path )
 {
     path->text           = NULL;
@@ -93,11 +293,6 @@ static void clear_path( struct path *path )
     init_path( path );
 }
 
-static inline struct path *impl_from_IWbemPath( IWbemPath *iface )
-{
-    return CONTAINING_RECORD(iface, struct path, IWbemPath_iface);
-}
-
 static ULONG WINAPI path_AddRef(
     IWbemPath *iface )
 {
@@ -922,8 +1117,22 @@ static HRESULT WINAPI path_GetKeyList(
     IWbemPath *iface,
     IWbemPathKeyList **pOut)
 {
-    FIXME("%p, %p\n", iface, pOut);
-    return E_NOTIMPL;
+    struct path *path = impl_from_IWbemPath( iface );
+    HRESULT hr;
+
+    TRACE("%p, %p\n", iface, pOut);
+
+    EnterCriticalSection( &path->cs );
+
+    if (!path->class)
+    {
+        LeaveCriticalSection( &path->cs );
+        return WBEM_E_INVALID_PARAMETER;
+    }
+    hr = WbemPathKeyList_create( NULL, iface, (void **)pOut );
+
+    LeaveCriticalSection( &path->cs );
+    return hr;
 }
 
 static HRESULT WINAPI path_CreateClassPart(




More information about the wine-cvs mailing list