wbemdisp: Implement InParameters() property for a method object.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Hans Leidekker <hans@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0e6c797999
commit
28dc9e1e0a
|
@ -35,8 +35,17 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(wbemdisp);
|
WINE_DEFAULT_DEBUG_CHANNEL(wbemdisp);
|
||||||
|
|
||||||
|
static WCHAR *heap_strdupW( const WCHAR *src )
|
||||||
|
{
|
||||||
|
WCHAR *dst;
|
||||||
|
if (!src) return NULL;
|
||||||
|
if ((dst = heap_alloc( (lstrlenW( src ) + 1) * sizeof(WCHAR) ))) lstrcpyW( dst, src );
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT EnumVARIANT_create( IEnumWbemClassObject *, IEnumVARIANT ** );
|
static HRESULT EnumVARIANT_create( IEnumWbemClassObject *, IEnumVARIANT ** );
|
||||||
static HRESULT ISWbemSecurity_create( ISWbemSecurity ** );
|
static HRESULT ISWbemSecurity_create( ISWbemSecurity ** );
|
||||||
|
static HRESULT SWbemObject_create( IWbemClassObject *, ISWbemObject ** );
|
||||||
|
|
||||||
enum type_id
|
enum type_id
|
||||||
{
|
{
|
||||||
|
@ -522,10 +531,19 @@ struct object
|
||||||
DISPID last_dispid_method;
|
DISPID last_dispid_method;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct methodset
|
||||||
|
{
|
||||||
|
ISWbemMethodSet ISWbemMethodSet_iface;
|
||||||
|
LONG refs;
|
||||||
|
struct object *object;
|
||||||
|
};
|
||||||
|
|
||||||
struct method
|
struct method
|
||||||
{
|
{
|
||||||
ISWbemMethod ISWbemMethod_iface;
|
ISWbemMethod ISWbemMethod_iface;
|
||||||
LONG refs;
|
LONG refs;
|
||||||
|
struct methodset *set;
|
||||||
|
WCHAR *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct method *impl_from_ISWbemMethod( ISWbemMethod *iface )
|
static struct method *impl_from_ISWbemMethod( ISWbemMethod *iface )
|
||||||
|
@ -567,6 +585,8 @@ static ULONG WINAPI method_Release( ISWbemMethod *iface )
|
||||||
if (!refs)
|
if (!refs)
|
||||||
{
|
{
|
||||||
TRACE( "destroying %p\n", method );
|
TRACE( "destroying %p\n", method );
|
||||||
|
ISWbemMethodSet_Release( &method->set->ISWbemMethodSet_iface );
|
||||||
|
heap_free( method->name );
|
||||||
heap_free( method );
|
heap_free( method );
|
||||||
}
|
}
|
||||||
return refs;
|
return refs;
|
||||||
|
@ -671,9 +691,27 @@ static HRESULT WINAPI method_get_InParameters(
|
||||||
ISWbemMethod *iface,
|
ISWbemMethod *iface,
|
||||||
ISWbemObject **params )
|
ISWbemObject **params )
|
||||||
{
|
{
|
||||||
FIXME("\n");
|
struct method *method = impl_from_ISWbemMethod( iface );
|
||||||
|
IWbemClassObject *in_sign = NULL, *instance;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
return E_NOTIMPL;
|
TRACE("%p, %p\n", method, params);
|
||||||
|
|
||||||
|
*params = NULL;
|
||||||
|
|
||||||
|
if (SUCCEEDED(hr = IWbemClassObject_GetMethod( method->set->object->object,
|
||||||
|
method->name, 0, &in_sign, NULL )) && in_sign != NULL)
|
||||||
|
{
|
||||||
|
hr = IWbemClassObject_SpawnInstance( in_sign, 0, &instance );
|
||||||
|
IWbemClassObject_Release( in_sign );
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
hr = SWbemObject_create( instance, params );
|
||||||
|
IWbemClassObject_Release( instance );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI method_get_OutParameters(
|
static HRESULT WINAPI method_get_OutParameters(
|
||||||
|
@ -710,7 +748,7 @@ static const ISWbemMethodVtbl methodvtbl =
|
||||||
method_get_Qualifiers_,
|
method_get_Qualifiers_,
|
||||||
};
|
};
|
||||||
|
|
||||||
static HRESULT SWbemMethod_create( ISWbemMethod **obj )
|
static HRESULT SWbemMethod_create( struct methodset *set, const WCHAR *name, ISWbemMethod **obj )
|
||||||
{
|
{
|
||||||
struct method *method;
|
struct method *method;
|
||||||
|
|
||||||
|
@ -719,19 +757,19 @@ static HRESULT SWbemMethod_create( ISWbemMethod **obj )
|
||||||
|
|
||||||
method->ISWbemMethod_iface.lpVtbl = &methodvtbl;
|
method->ISWbemMethod_iface.lpVtbl = &methodvtbl;
|
||||||
method->refs = 1;
|
method->refs = 1;
|
||||||
|
method->set = set;
|
||||||
|
ISWbemMethodSet_AddRef( &method->set->ISWbemMethodSet_iface );
|
||||||
|
if (!(method->name = heap_strdupW( name )))
|
||||||
|
{
|
||||||
|
ISWbemMethod_Release( &method->ISWbemMethod_iface );
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
*obj = &method->ISWbemMethod_iface;
|
*obj = &method->ISWbemMethod_iface;
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct methodset
|
|
||||||
{
|
|
||||||
ISWbemMethodSet ISWbemMethodSet_iface;
|
|
||||||
LONG refs;
|
|
||||||
struct object *object;
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct methodset *impl_from_ISWbemMethodSet( ISWbemMethodSet *iface )
|
static struct methodset *impl_from_ISWbemMethodSet( ISWbemMethodSet *iface )
|
||||||
{
|
{
|
||||||
return CONTAINING_RECORD( iface, struct methodset, ISWbemMethodSet_iface );
|
return CONTAINING_RECORD( iface, struct methodset, ISWbemMethodSet_iface );
|
||||||
|
@ -884,7 +922,7 @@ static HRESULT WINAPI methodset_Item(
|
||||||
if (out_sign)
|
if (out_sign)
|
||||||
IWbemClassObject_Release( out_sign );
|
IWbemClassObject_Release( out_sign );
|
||||||
|
|
||||||
return SWbemMethod_create( method );
|
return SWbemMethod_create( set, name, method );
|
||||||
}
|
}
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
|
|
Loading…
Reference in New Issue