From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/wbemdisp/locator.c | 324 ++++++++++++++++++++++++++++++++- dlls/wbemdisp/tests/wbemdisp.c | 4 - 2 files changed, 322 insertions(+), 6 deletions(-) diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c index 6afe1875a69..ab23b8c51f7 100644 --- a/dlls/wbemdisp/locator.c +++ b/dlls/wbemdisp/locator.c @@ -55,6 +55,7 @@ struct services; static HRESULT EnumVARIANT_create( struct services *, IEnumWbemClassObject *, IEnumVARIANT ** ); static HRESULT ISWbemSecurity_create( ISWbemSecurity ** ); static HRESULT SWbemObject_create( struct services *, IWbemClassObject *, ISWbemObject ** ); +static HRESULT SWbemObjectPath_create( IWbemClassObject *, ISWbemObjectPath ** ); enum type_id { @@ -69,6 +70,7 @@ enum type_id ISWbemNamedValue_tid, ISWbemMethodSet_tid, ISWbemMethod_tid, + ISWbemObjectPath_tid, last_tid }; @@ -88,6 +90,7 @@ static REFIID wbemdisp_tid_id[] = &IID_ISWbemNamedValue, &IID_ISWbemMethodSet, &IID_ISWbemMethod, + &IID_ISWbemObjectPath, }; static HRESULT get_typeinfo( enum type_id tid, ITypeInfo **ret ) @@ -1600,8 +1603,8 @@ static HRESULT WINAPI object_get_Path_( ISWbemObject *iface, ISWbemObjectPath **objWbemObjectPath ) { - FIXME( "\n" ); - return E_NOTIMPL; + struct object *object = impl_from_ISWbemObject( iface ); + return SWbemObjectPath_create( object->object, objWbemObjectPath ); } static HRESULT WINAPI object_get_Security_( @@ -3519,3 +3522,320 @@ HRESULT SWbemNamedValueSet_create( void **obj ) TRACE( "returning iface %p\n", *obj ); return hr; } + +struct objectpath +{ + ISWbemObjectPath ISWbemObjectPath_iface; + LONG refs; + IWbemPath *path; +}; + +static struct objectpath *impl_from_ISWbemObjectPath( ISWbemObjectPath *iface ) +{ + return CONTAINING_RECORD( iface, struct objectpath, ISWbemObjectPath_iface ); +} + +static HRESULT WINAPI objectpath_QueryInterface( ISWbemObjectPath *iface, REFIID riid, void **ppvObject ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + + TRACE( "%p %s %p\n", objectpath, debugstr_guid( riid ), ppvObject ); + + if (IsEqualGUID( riid, &IID_ISWbemObjectPath ) || + IsEqualGUID( riid, &IID_IDispatch ) || + IsEqualGUID( riid, &IID_IUnknown )) + { + *ppvObject = iface; + } + else + { + WARN( "interface %s not implemented\n", debugstr_guid( riid ) ); + *ppvObject = NULL; + return E_NOINTERFACE; + } + + ISWbemObjectPath_AddRef( iface ); + return S_OK; +} + +static ULONG WINAPI objectpath_AddRef( ISWbemObjectPath *iface ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + return InterlockedIncrement( &objectpath->refs ); +} + +static ULONG WINAPI objectpath_Release( ISWbemObjectPath *iface ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + LONG refs = InterlockedDecrement( &objectpath->refs ); + + if (!refs) + { + TRACE( "destroying %p\n", objectpath ); + IWbemPath_Release( objectpath->path ); + free( objectpath ); + } + + return refs; +} + +static HRESULT WINAPI objectpath_GetTypeInfoCount( ISWbemObjectPath *iface, UINT *count ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + + TRACE( "%p, %p\n", objectpath, count ); + + *count = 1; + return S_OK; +} + +static HRESULT WINAPI objectpath_GetTypeInfo( ISWbemObjectPath *iface, UINT index, LCID lcid, ITypeInfo **info ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + + TRACE( "%p, %u, %#lx, %p\n", objectpath, index, lcid, info ); + + return get_typeinfo( ISWbemObjectPath_tid, info ); +} + +static HRESULT WINAPI objectpath_GetIDsOfNames( ISWbemObjectPath *iface, REFIID riid, + LPOLESTR *names, UINT count, LCID lcid, DISPID *dispid ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE( "%p, %s, %p, %u, %#lx, %p\n", objectpath, debugstr_guid( riid ), names, count, lcid, dispid ); + + if (!names || !count || !dispid) return E_INVALIDARG; + + hr = get_typeinfo( ISWbemObjectPath_tid, &typeinfo ); + if (SUCCEEDED(hr)) + { + hr = ITypeInfo_GetIDsOfNames( typeinfo, names, count, dispid ); + ITypeInfo_Release( typeinfo ); + } + return hr; +} + +static HRESULT WINAPI objectpath_Invoke( ISWbemObjectPath *iface, DISPID member, REFIID riid, LCID lcid, + WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excep_info, UINT *arg_err ) +{ + struct objectpath *objectpath = impl_from_ISWbemObjectPath( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE( "%p, %ld, %s, %#lx, %#x, %p, %p, %p, %p\n", objectpath, member, debugstr_guid( riid ), + lcid, flags, params, result, excep_info, arg_err ); + + hr = get_typeinfo( ISWbemObjectPath_tid, &typeinfo ); + if (SUCCEEDED(hr)) + { + hr = ITypeInfo_Invoke( typeinfo, &objectpath->ISWbemObjectPath_iface, member, flags, + params, result, excep_info, arg_err ); + ITypeInfo_Release( typeinfo ); + } + return hr; +} + +static HRESULT WINAPI objectpath_get_Path( ISWbemObjectPath *iface, BSTR *strPath ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Path( ISWbemObjectPath *iface, BSTR strPath ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_RelPath( ISWbemObjectPath *iface, BSTR *strRelPath ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_RelPath( ISWbemObjectPath *iface, BSTR strRelPath ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Server( ISWbemObjectPath *iface, BSTR *strServer ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Server( ISWbemObjectPath *iface, BSTR strServer ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Namespace( ISWbemObjectPath *iface, BSTR *strNamespace ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Namespace( ISWbemObjectPath *iface, BSTR strNamespace ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_ParentNamespace( ISWbemObjectPath *iface, BSTR *strParentNamespace ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_DisplayName( ISWbemObjectPath *iface, BSTR *strDisplayName ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_DisplayName( ISWbemObjectPath *iface, BSTR strDisplayName ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Class( ISWbemObjectPath *iface, BSTR *strClass ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Class( ISWbemObjectPath *iface, BSTR strClass ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_IsClass( ISWbemObjectPath *iface, VARIANT_BOOL *bIsClass ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_SetAsClass( ISWbemObjectPath *iface ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_IsSingleton( ISWbemObjectPath *iface, VARIANT_BOOL *bIsSingleton ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_SetAsSingleton( ISWbemObjectPath *iface ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Keys( ISWbemObjectPath *iface, ISWbemNamedValueSet **objWbemNamedValueSet ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Security_( ISWbemObjectPath *iface, ISWbemSecurity **objWbemSecurity ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Locale( ISWbemObjectPath *iface, BSTR *strLocale ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Locale( ISWbemObjectPath *iface, BSTR strLocale ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_get_Authority( ISWbemObjectPath *iface, BSTR *strAuthority ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static HRESULT WINAPI objectpath_put_Authority( ISWbemObjectPath *iface, BSTR strAuthority ) +{ + FIXME( "\n" ); + return E_NOTIMPL; +} + +static const ISWbemObjectPathVtbl objectpath_vtbl = +{ + objectpath_QueryInterface, + objectpath_AddRef, + objectpath_Release, + objectpath_GetTypeInfoCount, + objectpath_GetTypeInfo, + objectpath_GetIDsOfNames, + objectpath_Invoke, + objectpath_get_Path, + objectpath_put_Path, + objectpath_get_RelPath, + objectpath_put_RelPath, + objectpath_get_Server, + objectpath_put_Server, + objectpath_get_Namespace, + objectpath_put_Namespace, + objectpath_get_ParentNamespace, + objectpath_get_DisplayName, + objectpath_put_DisplayName, + objectpath_get_Class, + objectpath_put_Class, + objectpath_get_IsClass, + objectpath_SetAsClass, + objectpath_get_IsSingleton, + objectpath_SetAsSingleton, + objectpath_get_Keys, + objectpath_get_Security_, + objectpath_get_Locale, + objectpath_put_Locale, + objectpath_get_Authority, + objectpath_put_Authority, +}; + +static HRESULT SWbemObjectPath_create( IWbemClassObject *object, ISWbemObjectPath **obj ) +{ + struct objectpath *objectpath; + VARIANT var; + HRESULT hr; + + TRACE( "%p\n", obj ); + + if (!(objectpath = calloc( 1, sizeof(*objectpath) ))) return E_OUTOFMEMORY; + objectpath->ISWbemObjectPath_iface.lpVtbl = &objectpath_vtbl; + objectpath->refs = 1; + + if (FAILED( hr = CoCreateInstance( &CLSID_WbemDefPath, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemPath, + (void **)&objectpath->path ) )) goto error; + VariantInit( &var ); + if (FAILED( hr = IWbemClassObject_Get( object, L"__PATH", 0, &var, NULL, NULL ) )) goto error; + if (FAILED( hr = IWbemPath_SetText( objectpath->path, WBEMPATH_CREATE_ACCEPT_ALL, V_BSTR( &var ) ))) goto error; + VariantClear( &var ); + + *obj = &objectpath->ISWbemObjectPath_iface; + TRACE( "returning iface %p\n", *obj ); + return S_OK; + +error: + VariantClear( &var ); + if (objectpath->path) IWbemPath_Release( objectpath->path ); + free( objectpath ); + return hr; +} diff --git a/dlls/wbemdisp/tests/wbemdisp.c b/dlls/wbemdisp/tests/wbemdisp.c index 73f4272f66e..940f9370026 100644 --- a/dlls/wbemdisp/tests/wbemdisp.c +++ b/dlls/wbemdisp/tests/wbemdisp.c @@ -261,7 +261,6 @@ static void test_ParseDisplayName(void) hr = IDispatch_Invoke( dispatch, dispid, &IID_NULL, english, DISPATCH_METHOD|DISPATCH_PROPERTYGET, ¶ms, &res, NULL, NULL ); - todo_wine ok( hr == S_OK, "got %#lx\n", hr ); ok( params.rgvarg == NULL, "got %p\n", params.rgvarg ); ok( params.rgdispidNamedArgs == NULL, "got %p\n", params.rgdispidNamedArgs ); @@ -269,8 +268,6 @@ static void test_ParseDisplayName(void) ok( !params.cNamedArgs, "got %u\n", params.cNamedArgs ); ok( V_VT( &res ) == VT_DISPATCH, "got %u\n", V_VT( &res ) ); - if (hr == S_OK) - { hr = IDispatch_QueryInterface( V_DISPATCH( &res ), &IID_ISWbemObjectPath, (void**)&objpath ); ok( hr == S_OK, "got %#lx\n", hr ); VariantClear( &res ); @@ -281,7 +278,6 @@ static void test_ParseDisplayName(void) ok( hr == S_OK, "got %#lx\n", hr ); SysFreeString( dispname ); ISWbemObjectPath_Release( objpath ); - } hr = IDispatch_QueryInterface( dispatch, &IID_ISWbemObject, (void**)&object ); ok( hr == S_OK, "got %#lx\n", hr ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11711