Nikolay Sivov : wbemdisp: Add a stub implementation of a method object.

Alexandre Julliard julliard at winehq.org
Fri Feb 26 14:39:29 CST 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Feb 26 10:22:13 2021 +0300

wbemdisp: Add a stub implementation of a method object.

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 | 270 ++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 248 insertions(+), 22 deletions(-)

diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c
index 9cea78cdf71..a73bd6e55da 100644
--- a/dlls/wbemdisp/locator.c
+++ b/dlls/wbemdisp/locator.c
@@ -50,6 +50,7 @@ enum type_id
     ISWbemNamedValueSet_tid,
     ISWbemNamedValue_tid,
     ISWbemMethodSet_tid,
+    ISWbemMethod_tid,
     last_tid
 };
 
@@ -68,6 +69,7 @@ static REFIID wbemdisp_tid_id[] =
     &IID_ISWbemNamedValueSet,
     &IID_ISWbemNamedValue,
     &IID_ISWbemMethodSet,
+    &IID_ISWbemMethod,
 };
 
 static HRESULT get_typeinfo( enum type_id tid, ITypeInfo **ret )
@@ -502,10 +504,232 @@ static HRESULT SWbemPropertySet_create( IWbemClassObject *wbem_object, ISWbemPro
     return S_OK;
 }
 
+struct member
+{
+    BSTR name;
+    BOOL is_method;
+    DISPID dispid;
+};
+
+struct object
+{
+    ISWbemObject ISWbemObject_iface;
+    LONG refs;
+    IWbemClassObject *object;
+    struct member *members;
+    UINT nb_members;
+    DISPID last_dispid;
+    DISPID last_dispid_method;
+};
+
+struct method
+{
+    ISWbemMethod ISWbemMethod_iface;
+    LONG refs;
+};
+
+static struct method *impl_from_ISWbemMethod( ISWbemMethod *iface )
+{
+    return CONTAINING_RECORD( iface, struct method, ISWbemMethod_iface );
+}
+
+static HRESULT WINAPI method_QueryInterface( ISWbemMethod *iface, REFIID riid, void **ppvObject )
+{
+    struct method *method = impl_from_ISWbemMethod( iface );
+
+    TRACE( "%p %s %p\n", method, debugstr_guid(riid), ppvObject );
+
+    if (IsEqualGUID( riid, &IID_ISWbemMethod ) ||
+        IsEqualGUID( riid, &IID_IDispatch ) ||
+        IsEqualGUID( riid, &IID_IUnknown ))
+    {
+        *ppvObject = iface;
+    }
+    else
+    {
+        FIXME( "interface %s not implemented\n", debugstr_guid(riid) );
+        return E_NOINTERFACE;
+    }
+    ISWbemMethod_AddRef( iface );
+    return S_OK;
+}
+
+static ULONG WINAPI method_AddRef( ISWbemMethod *iface )
+{
+    struct method *method = impl_from_ISWbemMethod( iface );
+    return InterlockedIncrement( &method->refs );
+}
+
+static ULONG WINAPI method_Release( ISWbemMethod *iface )
+{
+    struct method *method = impl_from_ISWbemMethod( iface );
+    LONG refs = InterlockedDecrement( &method->refs );
+    if (!refs)
+    {
+        TRACE( "destroying %p\n", method );
+        heap_free( method );
+    }
+    return refs;
+}
+
+static HRESULT WINAPI method_GetTypeInfoCount(
+    ISWbemMethod *iface,
+    UINT *count )
+{
+    struct method *method = impl_from_ISWbemMethod( iface );
+
+    TRACE( "%p, %p\n", method, count );
+    *count = 1;
+    return S_OK;
+}
+
+static HRESULT WINAPI method_GetTypeInfo(
+    ISWbemMethod *iface,
+    UINT index,
+    LCID lcid,
+    ITypeInfo **info )
+{
+    struct method *method = impl_from_ISWbemMethod( iface );
+
+    TRACE( "%p, %u, %u, %p\n", method, index, lcid, info );
+
+    return get_typeinfo( ISWbemMethod_tid, info );
+}
+
+static HRESULT WINAPI method_GetIDsOfNames(
+    ISWbemMethod *iface,
+    REFIID riid,
+    LPOLESTR *names,
+    UINT count,
+    LCID lcid,
+    DISPID *dispid )
+{
+    struct method *method = impl_from_ISWbemMethod( iface );
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE( "%p, %s, %p, %u, %u, %p\n", method, debugstr_guid(riid), names, count, lcid, dispid );
+
+    if (!names || !count || !dispid) return E_INVALIDARG;
+
+    hr = get_typeinfo( ISWbemMethod_tid, &typeinfo );
+    if (SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames( typeinfo, names, count, dispid );
+        ITypeInfo_Release( typeinfo );
+    }
+    return hr;
+}
+
+static HRESULT WINAPI method_Invoke(
+    ISWbemMethod *iface,
+    DISPID member,
+    REFIID riid,
+    LCID lcid,
+    WORD flags,
+    DISPPARAMS *params,
+    VARIANT *result,
+    EXCEPINFO *excep_info,
+    UINT *arg_err )
+{
+    struct method *method = impl_from_ISWbemMethod( iface );
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", method, member, debugstr_guid(riid),
+           lcid, flags, params, result, excep_info, arg_err );
+
+    hr = get_typeinfo( ISWbemMethod_tid, &typeinfo );
+    if (SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke( typeinfo, &method->ISWbemMethod_iface, member, flags,
+                               params, result, excep_info, arg_err );
+        ITypeInfo_Release( typeinfo );
+    }
+    return hr;
+}
+
+static HRESULT WINAPI method_get_Name(
+    ISWbemMethod *iface,
+    BSTR *name )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI method_get_Origin(
+    ISWbemMethod *iface,
+    BSTR *origin )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI method_get_InParameters(
+    ISWbemMethod *iface,
+    ISWbemObject **params )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI method_get_OutParameters(
+    ISWbemMethod *iface,
+    ISWbemObject **params )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI method_get_Qualifiers_(
+    ISWbemMethod *iface,
+    ISWbemQualifierSet **qualifiers )
+{
+    FIXME("\n");
+
+    return E_NOTIMPL;
+}
+
+static const ISWbemMethodVtbl methodvtbl =
+{
+    method_QueryInterface,
+    method_AddRef,
+    method_Release,
+    method_GetTypeInfoCount,
+    method_GetTypeInfo,
+    method_GetIDsOfNames,
+    method_Invoke,
+    method_get_Name,
+    method_get_Origin,
+    method_get_InParameters,
+    method_get_OutParameters,
+    method_get_Qualifiers_,
+};
+
+static HRESULT SWbemMethod_create( ISWbemMethod **obj )
+{
+    struct method *method;
+
+    if (!(method = heap_alloc(sizeof(*method))))
+        return E_OUTOFMEMORY;
+
+    method->ISWbemMethod_iface.lpVtbl = &methodvtbl;
+    method->refs = 1;
+
+    *obj = &method->ISWbemMethod_iface;
+
+    return S_OK;
+}
+
 struct methodset
 {
     ISWbemMethodSet ISWbemMethodSet_iface;
     LONG refs;
+    struct object *object;
 };
 
 static struct methodset *impl_from_ISWbemMethodSet( ISWbemMethodSet *iface )
@@ -547,6 +771,7 @@ static ULONG WINAPI methodset_Release( ISWbemMethodSet *iface )
     if (!refs)
     {
         TRACE( "destroying %p\n", set );
+        ISWbemObject_Release( &set->object->ISWbemObject_iface );
         heap_free( set );
     }
     return refs;
@@ -643,9 +868,26 @@ static HRESULT WINAPI methodset_Item(
     LONG flags,
     ISWbemMethod **method )
 {
-    FIXME("\n");
+    struct methodset *set = impl_from_ISWbemMethodSet( iface );
+    IWbemClassObject *in_sign, *out_sign;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %s, %#x, %p\n", set, debugstr_w(name), flags, method);
+
+    *method = NULL;
+
+    if (SUCCEEDED(hr = IWbemClassObject_GetMethod( set->object->object,
+            name, flags, &in_sign, &out_sign )))
+    {
+        if (in_sign)
+            IWbemClassObject_Release( in_sign );
+        if (out_sign)
+            IWbemClassObject_Release( out_sign );
+
+        return SWbemMethod_create( method );
+    }
+
+    return hr;
 }
 
 static HRESULT WINAPI methodset_get_Count(
@@ -671,7 +913,7 @@ static const ISWbemMethodSetVtbl methodsetvtbl =
     methodset_get_Count,
 };
 
-static HRESULT SWbemMethodSet_create( ISWbemMethodSet **obj )
+static HRESULT SWbemMethodSet_create( struct object *object, ISWbemMethodSet **obj )
 {
     struct methodset *set;
 
@@ -680,6 +922,8 @@ static HRESULT SWbemMethodSet_create( ISWbemMethodSet **obj )
 
     set->ISWbemMethodSet_iface.lpVtbl = &methodsetvtbl;
     set->refs = 1;
+    set->object = object;
+    ISWbemObject_AddRef( &object->ISWbemObject_iface );
 
     *obj = &set->ISWbemMethodSet_iface;
 
@@ -689,24 +933,6 @@ static HRESULT SWbemMethodSet_create( ISWbemMethodSet **obj )
 #define DISPID_BASE         0x1800000
 #define DISPID_BASE_METHOD  0x1000000
 
-struct member
-{
-    BSTR name;
-    BOOL is_method;
-    DISPID dispid;
-};
-
-struct object
-{
-    ISWbemObject ISWbemObject_iface;
-    LONG refs;
-    IWbemClassObject *object;
-    struct member *members;
-    UINT nb_members;
-    DISPID last_dispid;
-    DISPID last_dispid_method;
-};
-
 static inline struct object *impl_from_ISWbemObject(
     ISWbemObject *iface )
 {
@@ -1218,7 +1444,7 @@ static HRESULT WINAPI object_get_Methods_(
     struct object *object = impl_from_ISWbemObject( iface );
 
     TRACE( "%p, %p\n", object, set );
-    return SWbemMethodSet_create( set );
+    return SWbemMethodSet_create( object, set );
 }
 
 static HRESULT WINAPI object_get_Derivation_(




More information about the wine-cvs mailing list