Hans Leidekker : wbemprox: Implement IWbemQualifierSet::GetNames.

Alexandre Julliard julliard at winehq.org
Wed Aug 28 18:23:20 CDT 2019


Module: wine
Branch: master
Commit: 434e94a68941df70e48cd9641bf195281a2208c4
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=434e94a68941df70e48cd9641bf195281a2208c4

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Aug 28 14:14:29 2019 +0200

wbemprox: Implement IWbemQualifierSet::GetNames.

Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wbemprox/qualifier.c   | 65 +++++++++++++++++++++++++++++++++++----------
 dlls/wbemprox/tests/query.c | 11 ++++++++
 2 files changed, 62 insertions(+), 14 deletions(-)

diff --git a/dlls/wbemprox/qualifier.c b/dlls/wbemprox/qualifier.c
index aa64481..d29abd3 100644
--- a/dlls/wbemprox/qualifier.c
+++ b/dlls/wbemprox/qualifier.c
@@ -101,19 +101,32 @@ static HRESULT create_qualifier_enum( const WCHAR *class, const WCHAR *member, c
         {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','_','_','Q','U','A','L',
          'I','F','I','E','R','S',' ','W','H','E','R','E',' ','C','l','a','s','s','=',
          '\'','%','s','\'',' ','A','N','D',' ','M','e','m','b','e','r','=','\'','%','s','\'',0};
-    static const WCHAR noneW[] = {'_','_','N','O','N','E',0};
+    static const WCHAR fmt3W[] =
+        {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','_','_','Q','U','A','L',
+         'I','F','I','E','R','S',' ','W','H','E','R','E',' ','C','l','a','s','s','=',
+         '\'','%','s','\'',0};
     WCHAR *query;
     HRESULT hr;
     int len;
 
-    if (!member) member = noneW;
-    len = lstrlenW( class ) + lstrlenW( member );
-    if (name) len += lstrlenW( name ) + ARRAY_SIZE(fmtW);
-    else len += ARRAY_SIZE(fmt2W);
-
-    if (!(query = heap_alloc( len * sizeof(WCHAR) ))) return E_OUTOFMEMORY;
-    if (name) swprintf( query, len, fmtW, class, member, name );
-    else swprintf( query, len, fmt2W, class, member );
+    if (member && name)
+    {
+        len = lstrlenW( class ) + lstrlenW( member ) + lstrlenW( name ) + ARRAY_SIZE(fmtW);
+        if (!(query = heap_alloc( len * sizeof(WCHAR) ))) return E_OUTOFMEMORY;
+        swprintf( query, len, fmtW, class, member, name );
+    }
+    else if (member)
+    {
+        len = lstrlenW( class ) + lstrlenW( member ) + ARRAY_SIZE(fmt2W);
+        if (!(query = heap_alloc( len * sizeof(WCHAR) ))) return E_OUTOFMEMORY;
+        swprintf( query, len, fmt2W, class, member );
+    }
+    else
+    {
+        len = lstrlenW( class ) + ARRAY_SIZE(fmt3W);
+        if (!(query = heap_alloc( len * sizeof(WCHAR) ))) return E_OUTOFMEMORY;
+        swprintf( query, len, fmt3W, class );
+    }
 
     hr = exec_query( query, iter );
     heap_free( query );
@@ -123,7 +136,6 @@ static HRESULT create_qualifier_enum( const WCHAR *class, const WCHAR *member, c
 static HRESULT get_qualifier_value( const WCHAR *class, const WCHAR *member, const WCHAR *name,
                                     VARIANT *val, LONG *flavor )
 {
-    static const WCHAR qualifiersW[] = {'_','_','Q','U','A','L','I','F','I','E','R','S',0};
     static const WCHAR intvalueW[] = {'I','n','t','e','g','e','r','V','a','l','u','e',0};
     static const WCHAR strvalueW[] = {'S','t','r','i','n','g','V','a','l','u','e',0};
     static const WCHAR boolvalueW[] = {'B','o','o','l','V','a','l','u','e',0};
@@ -137,7 +149,7 @@ static HRESULT get_qualifier_value( const WCHAR *class, const WCHAR *member, con
     hr = create_qualifier_enum( class, member, name, &iter );
     if (FAILED( hr )) return hr;
 
-    hr = create_class_object( qualifiersW, iter, 0, NULL, &obj );
+    hr = create_class_object( NULL, iter, 0, NULL, &obj );
     IEnumWbemClassObject_Release( iter );
     if (FAILED( hr )) return hr;
 
@@ -179,7 +191,12 @@ static HRESULT WINAPI qualifier_set_Get(
 {
     struct qualifier_set *set = impl_from_IWbemQualifierSet( iface );
 
-    FIXME("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszName), lFlags, pVal, plFlavor);
+    TRACE("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszName), lFlags, pVal, plFlavor);
+    if (lFlags)
+    {
+        FIXME("flags %08x not supported\n", lFlags);
+        return E_NOTIMPL;
+    }
     return get_qualifier_value( set->class, set->member, wszName, pVal, plFlavor );
 }
 
@@ -206,8 +223,28 @@ static HRESULT WINAPI qualifier_set_GetNames(
     LONG lFlags,
     SAFEARRAY **pNames )
 {
-    FIXME("%p, %08x, %p\n", iface, lFlags, pNames);
-    return E_NOTIMPL;
+    struct qualifier_set *set = impl_from_IWbemQualifierSet( iface );
+    IEnumWbemClassObject *iter;
+    IWbemClassObject *obj;
+    HRESULT hr;
+
+    TRACE("%p, %08x, %p\n", iface, lFlags, pNames);
+    if (lFlags)
+    {
+        FIXME("flags %08x not supported\n", lFlags);
+        return E_NOTIMPL;
+    }
+
+    hr = create_qualifier_enum( set->class, set->member, NULL, &iter );
+    if (FAILED( hr )) return hr;
+
+    hr = create_class_object( NULL, iter, 0, NULL, &obj );
+    IEnumWbemClassObject_Release( iter );
+    if (FAILED( hr )) return hr;
+
+    hr = IWbemClassObject_GetNames( obj, NULL, 0, NULL, pNames );
+    IWbemClassObject_Release( obj );
+    return hr;
 }
 
 static HRESULT WINAPI qualifier_set_BeginEnumeration(
diff --git a/dlls/wbemprox/tests/query.c b/dlls/wbemprox/tests/query.c
index 162df54..b180cfc 100644
--- a/dlls/wbemprox/tests/query.c
+++ b/dlls/wbemprox/tests/query.c
@@ -46,6 +46,8 @@ static HRESULT exec_query( IWbemServices *services, const WCHAR *str, IEnumWbemC
         for (;;)
         {
             VARIANT var;
+            IWbemQualifierSet *qualifiers;
+            SAFEARRAY *names;
 
             IEnumWbemClassObject_Next( *result, 10000, 1, &obj, &count );
             if (!count) break;
@@ -60,6 +62,15 @@ static HRESULT exec_query( IWbemServices *services, const WCHAR *str, IEnumWbemC
                 trace("description: %s\n", wine_dbgstr_w(V_BSTR(&var)));
                 VariantClear( &var );
             }
+
+            hr = IWbemClassObject_GetQualifierSet( obj, &qualifiers );
+            ok( hr == S_OK, "got %08x\n", hr );
+
+            hr = IWbemQualifierSet_GetNames( qualifiers, 0, &names );
+            ok( hr == S_OK, "got %08x\n", hr );
+
+            SafeArrayDestroy( names );
+            IWbemQualifierSet_Release( qualifiers );
             IWbemClassObject_Release( obj );
         }
     }




More information about the wine-cvs mailing list