Hans Leidekker : wmiutils: Implement IWbemPath::GetInfo.

Alexandre Julliard julliard at winehq.org
Tue Jan 15 13:46:17 CST 2013


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

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Tue Jan 15 11:26:48 2013 +0100

wmiutils: Implement IWbemPath::GetInfo.

---

 dlls/wmiutils/path.c       |   56 ++++++++++++++++++++++++++++---------
 dlls/wmiutils/tests/path.c |   64 ++++++++++++++++++++++++++++++++++++++++++++
 include/wmiutils.idl       |   22 +++++++++++++++
 3 files changed, 128 insertions(+), 14 deletions(-)

diff --git a/dlls/wmiutils/path.c b/dlls/wmiutils/path.c
index abdf0a5..f02c9c6 100644
--- a/dlls/wmiutils/path.c
+++ b/dlls/wmiutils/path.c
@@ -35,16 +35,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(wmiutils);
 struct path
 {
     IWbemPath IWbemPath_iface;
-    LONG    refs;
-    WCHAR  *text;
-    int     len_text;
-    WCHAR  *server;
-    int     len_server;
-    WCHAR **namespaces;
-    int    *len_namespaces;
-    int     num_namespaces;
-    WCHAR  *class;
-    int     len_class;
+    LONG      refs;
+    WCHAR    *text;
+    int       len_text;
+    WCHAR    *server;
+    int       len_server;
+    WCHAR   **namespaces;
+    int      *len_namespaces;
+    int       num_namespaces;
+    WCHAR    *class;
+    int       len_class;
+    ULONGLONG flags;
 };
 
 static void init_path( struct path *path )
@@ -58,6 +59,7 @@ static void init_path( struct path *path )
     path->num_namespaces = 0;
     path->class          = NULL;
     path->len_class      = 0;
+    path->flags          = 0;
 }
 
 static void clear_path( struct path *path )
@@ -136,6 +138,7 @@ static HRESULT parse_text( struct path *path, ULONG mode, const WCHAR *text )
         memcpy( path->server, p, len * sizeof(WCHAR) );
         path->server[len] = 0;
         path->len_server = len;
+        path->flags |= WBEMPATH_INFO_PATH_HAD_SERVER;
     }
     p = q;
     while (*q && *q != ':')
@@ -180,6 +183,7 @@ static HRESULT parse_text( struct path *path, ULONG mode, const WCHAR *text )
 
 done:
     if (hr != S_OK) clear_path( path );
+    else path->flags |= WBEMPATH_INFO_CIM_COMPLIANT | WBEMPATH_INFO_V2_COMPLIANT;
     return hr;
 }
 
@@ -197,6 +201,7 @@ static HRESULT WINAPI path_SetText(
     if (!uMode || !pszPath) return WBEM_E_INVALID_PARAMETER;
 
     clear_path( path );
+    if (!pszPath[0]) return S_OK;
     if ((hr = parse_text( path, uMode, pszPath )) != S_OK) return hr;
 
     len = strlenW( pszPath );
@@ -404,11 +409,34 @@ static HRESULT WINAPI path_GetText(
 
 static HRESULT WINAPI path_GetInfo(
     IWbemPath *iface,
-    ULONG uRequestedInfo,
-    ULONGLONG *puResponse)
+    ULONG info,
+    ULONGLONG *response)
 {
-    FIXME("%p, %d, %p\n", iface, uRequestedInfo, puResponse);
-    return E_NOTIMPL;
+    struct path *path = impl_from_IWbemPath( iface );
+
+    TRACE("%p, %u, %p\n", iface, info, response);
+
+    if (info || !response) return WBEM_E_INVALID_PARAMETER;
+
+    FIXME("some flags are not implemented\n");
+
+    *response = path->flags;
+    if (!path->server || (path->len_server == 1 && path->server[0] == '.'))
+        *response |= WBEMPATH_INFO_ANON_LOCAL_MACHINE;
+    else
+        *response |= WBEMPATH_INFO_HAS_MACHINE_NAME;
+
+    if (!path->class)
+        *response |= WBEMPATH_INFO_SERVER_NAMESPACE_ONLY;
+    else
+    {
+        *response |= WBEMPATH_INFO_HAS_SUBSCOPES;
+        if (path->text && strchrW( path->text, '=' )) /* FIXME */
+            *response |= WBEMPATH_INFO_IS_INST_REF;
+        else
+            *response |= WBEMPATH_INFO_IS_CLASS_REF;
+    }
+    return S_OK;
 }
 
 static HRESULT WINAPI path_SetServer(
diff --git a/dlls/wmiutils/tests/path.c b/dlls/wmiutils/tests/path.c
index 2d435f0..3367690 100644
--- a/dlls/wmiutils/tests/path.c
+++ b/dlls/wmiutils/tests/path.c
@@ -370,6 +370,69 @@ static void test_IWbemPath_GetServer(void)
     IWbemPath_Release( path );
 }
 
+static void test_IWbemPath_GetInfo(void)
+{
+    IWbemPath *path;
+    HRESULT hr;
+    ULONGLONG resp;
+
+    if (!(path = create_path())) return;
+
+    hr = IWbemPath_GetInfo( path, 0, NULL );
+    ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
+
+    hr = IWbemPath_GetInfo( path, 1, NULL );
+    ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
+
+    resp = 0xdeadbeef;
+    hr = IWbemPath_GetInfo( path, 0, &resp );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( resp == (WBEMPATH_INFO_ANON_LOCAL_MACHINE | WBEMPATH_INFO_SERVER_NAMESPACE_ONLY),
+        "got %lx%08lx\n", (unsigned long)(resp >> 32), (unsigned long)resp );
+
+    hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path17 );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    hr = IWbemPath_GetInfo( path, 0, NULL );
+    ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
+
+    hr = IWbemPath_GetInfo( path, 1, NULL );
+    ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
+
+    resp = 0xdeadbeef;
+    hr = IWbemPath_GetInfo( path, 0, &resp );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( resp == (WBEMPATH_INFO_ANON_LOCAL_MACHINE | WBEMPATH_INFO_IS_INST_REF |
+                 WBEMPATH_INFO_HAS_SUBSCOPES | WBEMPATH_INFO_V2_COMPLIANT |
+                 WBEMPATH_INFO_CIM_COMPLIANT | WBEMPATH_INFO_PATH_HAD_SERVER),
+        "got %lx%08lx\n", (unsigned long)(resp >> 32), (unsigned long)resp );
+
+    IWbemPath_Release( path );
+    if (!(path = create_path())) return;
+
+    hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path12 );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    resp = 0xdeadbeef;
+    hr = IWbemPath_GetInfo( path, 0, &resp );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( resp == (WBEMPATH_INFO_ANON_LOCAL_MACHINE | WBEMPATH_INFO_IS_CLASS_REF |
+                 WBEMPATH_INFO_HAS_SUBSCOPES | WBEMPATH_INFO_V2_COMPLIANT |
+                 WBEMPATH_INFO_CIM_COMPLIANT),
+        "got %lx%08lx\n", (unsigned long)(resp >> 32), (unsigned long)resp );
+
+    hr = IWbemPath_SetText( path, WBEMPATH_CREATE_ACCEPT_ALL, path1 );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    resp = 0xdeadbeef;
+    hr = IWbemPath_GetInfo( path, 0, &resp );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( resp == (WBEMPATH_INFO_ANON_LOCAL_MACHINE | WBEMPATH_INFO_SERVER_NAMESPACE_ONLY),
+        "got %lx%08lx\n", (unsigned long)(resp >> 32), (unsigned long)resp );
+
+    IWbemPath_Release( path );
+}
+
 START_TEST (path)
 {
     CoInitialize( NULL );
@@ -378,6 +441,7 @@ START_TEST (path)
     test_IWbemPath_GetText();
     test_IWbemPath_GetClassName();
     test_IWbemPath_GetServer();
+    test_IWbemPath_GetInfo();
 
     CoUninitialize();
 }
diff --git a/include/wmiutils.idl b/include/wmiutils.idl
index 82f64d1..fa790c8 100644
--- a/include/wmiutils.idl
+++ b/include/wmiutils.idl
@@ -21,6 +21,28 @@ import "oaidl.idl";
 interface IWbemPath;
 interface IWbemPathKeyList;
 
+typedef [v1_enum] enum tag_WBEM_PATH_STATUS_FLAG
+{
+    WBEMPATH_INFO_ANON_LOCAL_MACHINE    = 0x1,
+    WBEMPATH_INFO_HAS_MACHINE_NAME      = 0x2,
+    WBEMPATH_INFO_IS_CLASS_REF          = 0x4,
+    WBEMPATH_INFO_IS_INST_REF           = 0x8,
+    WBEMPATH_INFO_HAS_SUBSCOPES         = 0x10,
+    WBEMPATH_INFO_IS_COMPOUND           = 0x20,
+    WBEMPATH_INFO_HAS_V2_REF_PATHS      = 0x40,
+    WBEMPATH_INFO_HAS_IMPLIED_KEY       = 0x80,
+    WBEMPATH_INFO_CONTAINS_SINGLETON    = 0x100,
+    WBEMPATH_INFO_V1_COMPLIANT          = 0x200,
+    WBEMPATH_INFO_V2_COMPLIANT          = 0x400,
+    WBEMPATH_INFO_CIM_COMPLIANT         = 0x800,
+    WBEMPATH_INFO_IS_SINGLETON          = 0x1000,
+    WBEMPATH_INFO_IS_PARENT             = 0x2000,
+    WBEMPATH_INFO_SERVER_NAMESPACE_ONLY = 0x4000,
+    WBEMPATH_INFO_NATIVE_PATH           = 0x8000,
+    WBEMPATH_INFO_WMI_PATH              = 0x10000,
+    WBEMPATH_INFO_PATH_HAD_SERVER       = 0x20000
+} tag_WBEM_PATH_STATUS_FLAG;
+
 typedef [v1_enum] enum tag_WBEM_PATH_CREATE_FLAG
 {
     WBEMPATH_CREATE_ACCEPT_RELATIVE     = 0x1,




More information about the wine-cvs mailing list