Nikolay Sivov : wbemdisp: Add SWbemNamedValueSet stub.

Alexandre Julliard julliard at winehq.org
Wed Feb 24 15:45:39 CST 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Feb 24 09:40:23 2021 +0300

wbemdisp: Add SWbemNamedValueSet stub.

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

---

 dlls/wbemdisp/locator.c          | 237 ++++++++++++++++++++++++++++++++++++++-
 dlls/wbemdisp/main.c             |   3 +
 dlls/wbemdisp/tests/wbemdisp.c   |  12 ++
 dlls/wbemdisp/wbemdisp_private.h |   1 +
 include/wbemdisp.idl             |  11 ++
 5 files changed, 263 insertions(+), 1 deletion(-)

diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c
index 28c8e5b4120..bbb0625f4e8 100644
--- a/dlls/wbemdisp/locator.c
+++ b/dlls/wbemdisp/locator.c
@@ -47,6 +47,7 @@ enum type_id
     ISWbemPropertySet_tid,
     ISWbemServices_tid,
     ISWbemSecurity_tid,
+    ISWbemNamedValueSet_tid,
     last_tid
 };
 
@@ -61,7 +62,8 @@ static REFIID wbemdisp_tid_id[] =
     &IID_ISWbemProperty,
     &IID_ISWbemPropertySet,
     &IID_ISWbemServices,
-    &IID_ISWbemSecurity
+    &IID_ISWbemSecurity,
+    &IID_ISWbemNamedValueSet,
 };
 
 static HRESULT get_typeinfo( enum type_id tid, ITypeInfo **ret )
@@ -2456,3 +2458,236 @@ static HRESULT ISWbemSecurity_create( ISWbemSecurity **obj )
     TRACE( "returning iface %p\n", *obj );
     return S_OK;
 }
+
+struct namedvalueset
+{
+    ISWbemNamedValueSet ISWbemNamedValueSet_iface;
+    LONG refs;
+};
+
+static struct namedvalueset *impl_from_ISWbemNamedValueSet( ISWbemNamedValueSet *iface )
+{
+    return CONTAINING_RECORD( iface, struct namedvalueset, ISWbemNamedValueSet_iface );
+}
+
+static HRESULT WINAPI namedvalueset_QueryInterface(
+    ISWbemNamedValueSet *iface,
+    REFIID riid,
+    void **ppvObject )
+{
+    struct namedvalueset *set = impl_from_ISWbemNamedValueSet( iface );
+
+    TRACE( "%p, %s, %p\n", set, debugstr_guid( riid ), ppvObject );
+
+    if (IsEqualGUID( riid, &IID_ISWbemNamedValueSet ) ||
+        IsEqualGUID( riid, &IID_IDispatch ) ||
+        IsEqualGUID( riid, &IID_IUnknown ))
+    {
+        *ppvObject = iface;
+    }
+    else
+    {
+        FIXME( "interface %s not implemented\n", debugstr_guid(riid) );
+        return E_NOINTERFACE;
+    }
+    ISWbemNamedValueSet_AddRef( iface );
+    return S_OK;
+}
+
+static ULONG WINAPI namedvalueset_AddRef(
+    ISWbemNamedValueSet *iface )
+{
+    struct namedvalueset *set = impl_from_ISWbemNamedValueSet( iface );
+    return InterlockedIncrement( &set->refs );
+}
+
+static ULONG WINAPI namedvalueset_Release(
+    ISWbemNamedValueSet *iface )
+{
+    struct namedvalueset *set = impl_from_ISWbemNamedValueSet( iface );
+    LONG refs = InterlockedDecrement( &set->refs );
+    if (!refs)
+    {
+        TRACE( "destroying %p\n", set );
+        heap_free( set );
+    }
+    return refs;
+}
+
+static HRESULT WINAPI namedvalueset_GetTypeInfoCount(
+    ISWbemNamedValueSet *iface,
+    UINT *count )
+{
+    struct namedvalueset *set = impl_from_ISWbemNamedValueSet( iface );
+    TRACE( "%p, %p\n", set, count );
+
+    *count = 1;
+    return S_OK;
+}
+
+static HRESULT WINAPI namedvalueset_GetTypeInfo(
+    ISWbemNamedValueSet *iface,
+    UINT index,
+    LCID lcid,
+    ITypeInfo **info )
+{
+    struct namedvalueset *set = impl_from_ISWbemNamedValueSet( iface );
+
+    TRACE( "%p, %u, %u, %p\n", set, index, lcid, info );
+
+    return get_typeinfo( ISWbemNamedValueSet_tid, info );
+}
+
+static HRESULT WINAPI namedvalueset_GetIDsOfNames(
+    ISWbemNamedValueSet *iface,
+    REFIID riid,
+    LPOLESTR *names,
+    UINT count,
+    LCID lcid,
+    DISPID *dispid )
+{
+    struct namedvalueset *set = impl_from_ISWbemNamedValueSet( iface );
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE( "%p, %s, %p, %u, %u, %p\n", set, debugstr_guid(riid), names, count, lcid, dispid );
+
+    if (!names || !count || !dispid) return E_INVALIDARG;
+
+    hr = get_typeinfo( ISWbemNamedValueSet_tid, &typeinfo );
+    if (SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames( typeinfo, names, count, dispid );
+        ITypeInfo_Release( typeinfo );
+    }
+    return hr;
+}
+
+static HRESULT WINAPI namedvalueset_Invoke(
+    ISWbemNamedValueSet *iface,
+    DISPID member,
+    REFIID riid,
+    LCID lcid,
+    WORD flags,
+    DISPPARAMS *params,
+    VARIANT *result,
+    EXCEPINFO *excep_info,
+    UINT *arg_err )
+{
+    struct namedvalueset *set = impl_from_ISWbemNamedValueSet( iface );
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", set, member, debugstr_guid(riid),
+           lcid, flags, params, result, excep_info, arg_err );
+
+    hr = get_typeinfo( ISWbemNamedValueSet_tid, &typeinfo );
+    if (SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke( typeinfo, &set->ISWbemNamedValueSet_iface, member, flags,
+                               params, result, excep_info, arg_err );
+        ITypeInfo_Release( typeinfo );
+    }
+    return hr;
+}
+
+static HRESULT WINAPI namedvalueset_get__NewEnum(
+    ISWbemNamedValueSet *iface,
+    IUnknown **unk )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI namedvalueset_Item(
+    ISWbemNamedValueSet *iface,
+    BSTR name,
+    LONG flags,
+    ISWbemNamedValue **value )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI namedvalueset_Count(
+    ISWbemNamedValueSet *iface,
+    LONG *count )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI namedvalueset_Add(
+    ISWbemNamedValueSet *iface,
+    BSTR name,
+    VARIANT *value,
+    LONG flags,
+    ISWbemNamedValue **namedvalue )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI namedvalueset_Remove(
+    ISWbemNamedValueSet *iface,
+    BSTR name,
+    LONG flags )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI namedvalueset_Clone(
+    ISWbemNamedValueSet *iface,
+    ISWbemNamedValueSet **valueset )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI namedvalueset_DeleteAll(
+    ISWbemNamedValueSet *iface )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static const ISWbemNamedValueSetVtbl namedvalueset_vtbl =
+{
+    namedvalueset_QueryInterface,
+    namedvalueset_AddRef,
+    namedvalueset_Release,
+    namedvalueset_GetTypeInfoCount,
+    namedvalueset_GetTypeInfo,
+    namedvalueset_GetIDsOfNames,
+    namedvalueset_Invoke,
+    namedvalueset_get__NewEnum,
+    namedvalueset_Item,
+    namedvalueset_Count,
+    namedvalueset_Add,
+    namedvalueset_Remove,
+    namedvalueset_Clone,
+    namedvalueset_DeleteAll,
+};
+
+HRESULT SWbemNamedValueSet_create( void **obj )
+{
+    struct namedvalueset *set;
+
+    TRACE( "%p\n", obj );
+
+    if (!(set = heap_alloc_zero( sizeof(*set) ))) return E_OUTOFMEMORY;
+    set->ISWbemNamedValueSet_iface.lpVtbl = &namedvalueset_vtbl;
+    set->refs = 1;
+
+    *obj = &set->ISWbemNamedValueSet_iface;
+    TRACE( "returning iface %p\n", *obj );
+    return S_OK;
+}
diff --git a/dlls/wbemdisp/main.c b/dlls/wbemdisp/main.c
index cfaf7d787eb..b0064582187 100644
--- a/dlls/wbemdisp/main.c
+++ b/dlls/wbemdisp/main.c
@@ -262,6 +262,7 @@ static const struct IClassFactoryVtbl factory_vtbl =
 };
 
 static struct factory swbem_locator_cf = { { &factory_vtbl }, SWbemLocator_create };
+static struct factory swbem_namedvalueset_cf = { { &factory_vtbl }, SWbemNamedValueSet_create };
 static struct factory winmgmts_cf = { { &factory_vtbl }, WinMGMTS_create };
 
 BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
@@ -289,6 +290,8 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *obj )
         cf = &swbem_locator_cf.IClassFactory_iface;
     else if (IsEqualGUID( rclsid, &CLSID_WinMGMTS ))
         cf = &winmgmts_cf.IClassFactory_iface;
+    else if (IsEqualGUID( rclsid, &CLSID_SWbemNamedValueSet ))
+        cf = &swbem_namedvalueset_cf.IClassFactory_iface;
     else
         return CLASS_E_CLASSNOTAVAILABLE;
 
diff --git a/dlls/wbemdisp/tests/wbemdisp.c b/dlls/wbemdisp/tests/wbemdisp.c
index fa51ce6d756..24225ad1ac1 100644
--- a/dlls/wbemdisp/tests/wbemdisp.c
+++ b/dlls/wbemdisp/tests/wbemdisp.c
@@ -402,12 +402,24 @@ static void test_locator(void)
     ISWbemLocator_Release( locator );
 }
 
+static void test_namedvalueset(void)
+{
+    ISWbemNamedValueSet *set;
+    HRESULT hr;
+
+    hr = CoCreateInstance( &CLSID_SWbemNamedValueSet, NULL, CLSCTX_INPROC_SERVER, &IID_ISWbemNamedValueSet, (void **)&set );
+    ok( hr == S_OK, "got %x\n", hr );
+
+    ISWbemNamedValueSet_Release(set);
+}
+
 START_TEST(wbemdisp)
 {
     CoInitialize( NULL );
 
     test_ParseDisplayName();
     test_locator();
+    test_namedvalueset();
 
     CoUninitialize();
 }
diff --git a/dlls/wbemdisp/wbemdisp_private.h b/dlls/wbemdisp/wbemdisp_private.h
index b03a13e2ea0..1648843fcba 100644
--- a/dlls/wbemdisp/wbemdisp_private.h
+++ b/dlls/wbemdisp/wbemdisp_private.h
@@ -17,3 +17,4 @@
  */
 
 HRESULT SWbemLocator_create(LPVOID *) DECLSPEC_HIDDEN;
+HRESULT SWbemNamedValueSet_create(void **) DECLSPEC_HIDDEN;
diff --git a/include/wbemdisp.idl b/include/wbemdisp.idl
index 8ccdd0ca5e2..6f09f7ee154 100644
--- a/include/wbemdisp.idl
+++ b/include/wbemdisp.idl
@@ -1196,4 +1196,15 @@ coclass SWbemLocator
     interface ISWbemLocator;
 }
 
+[
+    threading(apartment),
+    uuid(9aed384e-ce8b-11d1-8b05-00600806d9b6),
+    progid("WbemScripting.SWbemNamedValueSet.1"),
+    vi_progid("WbemScripting.SWbemNamedValueSet")
+]
+coclass SWbemNamedValueSet
+{
+    interface ISWbemNamedValueSet;
+}
+
 } /* WbemScripting */




More information about the wine-cvs mailing list