Hans Leidekker : wbemdisp: Add a stub implementation of ISWbemObject.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jan 8 16:12:13 CST 2015
Module: wine
Branch: master
Commit: d7d18892efde37b3a9ccd955c053722c63a44606
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7d18892efde37b3a9ccd955c053722c63a44606
Author: Hans Leidekker <hans at codeweavers.com>
Date: Thu Jan 8 13:53:03 2015 +0100
wbemdisp: Add a stub implementation of ISWbemObject.
---
dlls/wbemdisp/locator.c | 191 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 189 insertions(+), 2 deletions(-)
diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c
index b82d218..5e9f437 100644
--- a/dlls/wbemdisp/locator.c
+++ b/dlls/wbemdisp/locator.c
@@ -38,6 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wbemdisp);
enum type_id
{
ISWbemLocator_tid,
+ ISWbemObject_tid,
ISWbemServices_tid,
last_tid
};
@@ -48,6 +49,7 @@ static ITypeInfo *wbemdisp_typeinfo[last_tid];
static REFIID wbemdisp_tid_id[] =
{
&IID_ISWbemLocator,
+ &IID_ISWbemObject,
&IID_ISWbemServices
};
@@ -86,6 +88,179 @@ static HRESULT get_typeinfo( enum type_id tid, ITypeInfo **ret )
return S_OK;
}
+struct object
+{
+ ISWbemObject ISWbemObject_iface;
+ LONG refs;
+ IWbemClassObject *object;
+};
+
+static inline struct object *impl_from_ISWbemObject(
+ ISWbemObject *iface )
+{
+ return CONTAINING_RECORD( iface, struct object, ISWbemObject_iface );
+}
+
+static ULONG WINAPI object_AddRef(
+ ISWbemObject *iface )
+{
+ struct object *object = impl_from_ISWbemObject( iface );
+ return InterlockedIncrement( &object->refs );
+}
+
+static ULONG WINAPI object_Release(
+ ISWbemObject *iface )
+{
+ struct object *object = impl_from_ISWbemObject( iface );
+ LONG refs = InterlockedDecrement( &object->refs );
+ if (!refs)
+ {
+ TRACE( "destroying %p\n", object );
+ IWbemClassObject_Release( object->object );
+ heap_free( object );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI object_QueryInterface(
+ ISWbemObject *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ struct object *object = impl_from_ISWbemObject( iface );
+
+ TRACE( "%p %s %p\n", object, debugstr_guid(riid), ppvObject );
+
+ if (IsEqualGUID( riid, &IID_ISWbemObject ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ))
+ {
+ *ppvObject = object;
+ }
+ else
+ {
+ FIXME( "interface %s not implemented\n", debugstr_guid(riid) );
+ return E_NOINTERFACE;
+ }
+ ISWbemObject_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI object_GetTypeInfoCount(
+ ISWbemObject *iface,
+ UINT *count )
+{
+ struct object *object = impl_from_ISWbemObject( iface );
+
+ TRACE( "%p, %p\n", object, count );
+ *count = 1;
+ return S_OK;
+}
+
+static HRESULT WINAPI object_GetTypeInfo(
+ ISWbemObject *iface,
+ UINT index,
+ LCID lcid,
+ ITypeInfo **info )
+{
+ struct object *object = impl_from_ISWbemObject( iface );
+ TRACE( "%p, %u, %u, %p\n", object, index, lcid, info );
+
+ return get_typeinfo( ISWbemObject_tid, info );
+}
+
+static HRESULT WINAPI object_GetIDsOfNames(
+ ISWbemObject *iface,
+ REFIID riid,
+ LPOLESTR *names,
+ UINT count,
+ LCID lcid,
+ DISPID *dispid )
+{
+ struct object *object = impl_from_ISWbemObject( iface );
+ ITypeInfo *typeinfo;
+ HRESULT hr;
+
+ TRACE( "%p, %s, %p, %u, %u, %p\n", object, debugstr_guid(riid), names, count, lcid, dispid );
+
+ if (!names || !count || !dispid) return E_INVALIDARG;
+
+ hr = get_typeinfo( ISWbemObject_tid, &typeinfo );
+ if (SUCCEEDED(hr))
+ {
+ hr = ITypeInfo_GetIDsOfNames( typeinfo, names, count, dispid );
+ ITypeInfo_Release( typeinfo );
+ }
+ return hr;
+}
+
+static HRESULT WINAPI object_Invoke(
+ ISWbemObject *iface,
+ DISPID member,
+ REFIID riid,
+ LCID lcid,
+ WORD flags,
+ DISPPARAMS *params,
+ VARIANT *result,
+ EXCEPINFO *excep_info,
+ UINT *arg_err )
+{
+ struct object *object = impl_from_ISWbemObject( iface );
+ ITypeInfo *typeinfo;
+ HRESULT hr;
+
+ TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", object, member, debugstr_guid(riid),
+ lcid, flags, params, result, excep_info, arg_err );
+
+ hr = get_typeinfo( ISWbemObject_tid, &typeinfo );
+ if (SUCCEEDED(hr))
+ {
+ hr = ITypeInfo_Invoke( typeinfo, &object->ISWbemObject_iface, member, flags,
+ params, result, excep_info, arg_err );
+ ITypeInfo_Release( typeinfo );
+ }
+ return hr;
+}
+
+static HRESULT WINAPI object_Put_(
+ ISWbemObject *iface,
+ LONG iFlags,
+ IDispatch *objWbemNamedValueSet,
+ ISWbemObjectPath **objWbemObjectPath )
+{
+ FIXME( "\n" );
+ return E_NOTIMPL;
+}
+
+static const ISWbemObjectVtbl object_vtbl =
+{
+ object_QueryInterface,
+ object_AddRef,
+ object_Release,
+ object_GetTypeInfoCount,
+ object_GetTypeInfo,
+ object_GetIDsOfNames,
+ object_Invoke,
+ object_Put_
+};
+
+static HRESULT SWbemObject_create( IWbemClassObject *wbem_object, ISWbemObject **obj )
+{
+ struct object *object;
+
+ TRACE( "%p, %p\n", obj, wbem_object );
+
+ if (!(object = heap_alloc( sizeof(*object) ))) return E_OUTOFMEMORY;
+ object->ISWbemObject_iface.lpVtbl = &object_vtbl;
+ object->refs = 1;
+ object->object = wbem_object;
+ IWbemClassObject_AddRef( object->object );
+
+ *obj = &object->ISWbemObject_iface;
+ TRACE( "returning iface %p\n", *obj );
+ return S_OK;
+}
+
struct services
{
ISWbemServices ISWbemServices_iface;
@@ -227,9 +402,21 @@ static HRESULT WINAPI services_Get(
IDispatch *objWbemNamedValueSet,
ISWbemObject **objWbemObject )
{
- FIXME( "%p, %s, %d, %p, %p\n", iface, debugstr_w(strObjectPath), iFlags, objWbemNamedValueSet,
+ struct services *services = impl_from_ISWbemServices( iface );
+ IWbemClassObject *obj;
+ HRESULT hr;
+
+ TRACE( "%p, %s, %d, %p, %p\n", iface, debugstr_w(strObjectPath), iFlags, objWbemNamedValueSet,
objWbemObject );
- return E_NOTIMPL;
+
+ if (objWbemNamedValueSet) FIXME( "ignoring context\n" );
+
+ hr = IWbemServices_GetObject( services->services, strObjectPath, iFlags, NULL, &obj, NULL );
+ if (hr != S_OK) return hr;
+
+ hr = SWbemObject_create( obj, objWbemObject );
+ IWbemClassObject_Release( obj );
+ return hr;
}
static HRESULT WINAPI services_GetAsync(
More information about the wine-cvs
mailing list