[5/5] wmiutils: Implement IWbemPath::SetNamespaceAt.

Hans Leidekker hans at codeweavers.com
Thu Jan 17 08:31:45 CST 2013


---
 dlls/wmiutils/path.c             |   48 ++++++++++++++++++++++--
 dlls/wmiutils/tests/path.c       |   75 ++++++++++++++++++++++++++++++++++++++
 dlls/wmiutils/wmiutils_private.h |    6 +++
 3 files changed, 125 insertions(+), 4 deletions(-)

diff --git a/dlls/wmiutils/path.c b/dlls/wmiutils/path.c
index 73c1c62..afcad67 100644
--- a/dlls/wmiutils/path.c
+++ b/dlls/wmiutils/path.c
@@ -500,11 +500,50 @@ static HRESULT WINAPI path_GetNamespaceCount(
 
 static HRESULT WINAPI path_SetNamespaceAt(
     IWbemPath *iface,
-    ULONG uIndex,
-    LPCWSTR pszName)
+    ULONG idx,
+    LPCWSTR name)
 {
-    FIXME("%p, %u, %s\n", iface, uIndex, debugstr_w(pszName));
-    return E_NOTIMPL;
+    struct path *path = impl_from_IWbemPath( iface );
+    static const ULONGLONG flags =
+        WBEMPATH_INFO_V1_COMPLIANT | WBEMPATH_INFO_V2_COMPLIANT |
+        WBEMPATH_INFO_CIM_COMPLIANT;
+    int i, *tmp_len;
+    WCHAR **tmp, *new;
+    DWORD size;
+
+    TRACE("%p, %u, %s\n", iface, idx, debugstr_w(name));
+
+    if (idx > path->num_namespaces || !name) return WBEM_E_INVALID_PARAMETER;
+    if (!(new = strdupW( name ))) return WBEM_E_OUT_OF_MEMORY;
+
+    size = (path->num_namespaces + 1) * sizeof(WCHAR *);
+    if (path->namespaces) tmp = heap_realloc( path->namespaces, size );
+    else tmp = heap_alloc( size );
+    if (!tmp)
+    {
+        heap_free( new );
+        return WBEM_E_OUT_OF_MEMORY;
+    }
+    path->namespaces = tmp;
+    size = (path->num_namespaces + 1) * sizeof(int);
+    if (path->len_namespaces) tmp_len = heap_realloc( path->len_namespaces, size );
+    else tmp_len = heap_alloc( size );
+    if (!tmp_len)
+    {
+        heap_free( new );
+        return WBEM_E_OUT_OF_MEMORY;
+    }
+    path->len_namespaces = tmp_len;
+    for (i = idx; i < path->num_namespaces; i++)
+    {
+        path->namespaces[i + 1] = path->namespaces[i];
+        path->len_namespaces[i + 1] = path->len_namespaces[i];
+    }
+    path->namespaces[idx] = new;
+    path->len_namespaces[idx] = strlenW( new );
+    path->num_namespaces++;
+    path->flags |= flags;
+    return S_OK;
 }
 
 static HRESULT WINAPI path_GetNamespaceAt(
@@ -532,6 +571,7 @@ static HRESULT WINAPI path_RemoveNamespaceAt(
     TRACE("%p, %u\n", iface, idx);
 
     if (idx >= path->num_namespaces) return WBEM_E_INVALID_PARAMETER;
+
     heap_free( path->namespaces[idx] );
     while (idx < path->num_namespaces - 1)
     {
diff --git a/dlls/wmiutils/tests/path.c b/dlls/wmiutils/tests/path.c
index 049d9b3..31246e9 100644
--- a/dlls/wmiutils/tests/path.c
+++ b/dlls/wmiutils/tests/path.c
@@ -702,6 +702,80 @@ static void test_IWbemPath_RemoveNamespaceAt(void)
     IWbemPath_Release( path );
 }
 
+static void test_IWbemPath_SetNamespaceAt(void)
+{
+    static const ULONGLONG expected_flags =
+        WBEMPATH_INFO_ANON_LOCAL_MACHINE | WBEMPATH_INFO_V1_COMPLIANT |
+        WBEMPATH_INFO_V2_COMPLIANT | WBEMPATH_INFO_CIM_COMPLIANT |
+        WBEMPATH_INFO_SERVER_NAMESPACE_ONLY;
+    static const WCHAR rootW[] = {'r','o','o','t',0};
+    static const WCHAR cimv2W[] = {'c','i','m','v','2',0};
+    IWbemPath *path;
+    WCHAR buf[16];
+    ULONG len, count;
+    ULONGLONG flags;
+    HRESULT hr;
+
+    if (!(path = create_path())) return;
+
+    hr = IWbemPath_SetNamespaceAt( path, 0, NULL );
+    ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
+
+    hr = IWbemPath_SetNamespaceAt( path, 1, cimv2W );
+    ok( hr == WBEM_E_INVALID_PARAMETER, "got %08x\n", hr );
+
+    hr = IWbemPath_SetNamespaceAt( path, 0, cimv2W );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    count = 0xdeadbeef;
+    hr = IWbemPath_GetNamespaceCount( path, &count );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( count == 1, "got %u\n", count );
+
+    flags = 0;
+    hr = IWbemPath_GetInfo( path, 0, &flags );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( flags == expected_flags,
+        "got %lx%08lx\n", (unsigned long)(flags >> 32), (unsigned long)flags );
+
+    buf[0] = 0;
+    len = sizeof(buf) / sizeof(buf[0]);
+    hr = IWbemPath_GetNamespaceAt( path, 0, &len, buf );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( !lstrcmpW( buf, cimv2W ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
+    ok( len == lstrlenW( cimv2W ) + 1, "unexpected length %u\n", len );
+
+    hr = IWbemPath_SetNamespaceAt( path, 0, rootW );
+    ok( hr == S_OK, "got %08x\n", hr );
+
+    flags = 0;
+    hr = IWbemPath_GetInfo( path, 0, &flags );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( flags == expected_flags,
+        "got %lx%08lx\n", (unsigned long)(flags >> 32), (unsigned long)flags );
+
+    count = 0xdeadbeef;
+    hr = IWbemPath_GetNamespaceCount( path, &count );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( count == 2, "got %u\n", count );
+
+    buf[0] = 0;
+    len = sizeof(buf) / sizeof(buf[0]);
+    hr = IWbemPath_GetNamespaceAt( path, 0, &len, buf );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( !lstrcmpW( buf, rootW ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
+    ok( len == lstrlenW( rootW ) + 1, "unexpected length %u\n", len );
+
+    buf[0] = 0;
+    len = sizeof(buf) / sizeof(buf[0]);
+    hr = IWbemPath_GetNamespaceAt( path, 1, &len, buf );
+    ok( hr == S_OK, "got %08x\n", hr );
+    ok( !lstrcmpW( buf, cimv2W ), "unexpected buffer contents %s\n", wine_dbgstr_w(buf) );
+    ok( len == lstrlenW( cimv2W ) + 1, "unexpected length %u\n", len );
+
+    IWbemPath_Release( path );
+}
+
 START_TEST (path)
 {
     CoInitialize( NULL );
@@ -716,6 +790,7 @@ START_TEST (path)
     test_IWbemPath_GetNamespaceAt();
     test_IWbemPath_RemoveAllNamespaces();
     test_IWbemPath_RemoveNamespaceAt();
+    test_IWbemPath_SetNamespaceAt();
 
     CoUninitialize();
 }
diff --git a/dlls/wmiutils/wmiutils_private.h b/dlls/wmiutils/wmiutils_private.h
index 9837ce8..98180c9 100644
--- a/dlls/wmiutils/wmiutils_private.h
+++ b/dlls/wmiutils/wmiutils_private.h
@@ -27,6 +27,12 @@ static inline void *heap_alloc( size_t len )
     return HeapAlloc( GetProcessHeap(), 0, len );
 }
 
+static void *heap_realloc( void *mem, size_t len ) __WINE_ALLOC_SIZE(2);
+static inline void *heap_realloc( void *mem, size_t len )
+{
+    return HeapReAlloc( GetProcessHeap(), 0, mem, len );
+}
+
 static inline BOOL heap_free( void *mem )
 {
     return HeapFree( GetProcessHeap(), 0, mem );
-- 
1.7.10.4






More information about the wine-patches mailing list