Hans Leidekker : wbemdisp: Add a stub implementation of ISWbemObjectSet.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jan 8 16:12:13 CST 2015
Module: wine
Branch: master
Commit: bc6270e3f9a0f422cd82139b84589a1b2b46a3ad
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bc6270e3f9a0f422cd82139b84589a1b2b46a3ad
Author: Hans Leidekker <hans at codeweavers.com>
Date: Thu Jan 8 13:53:22 2015 +0100
wbemdisp: Add a stub implementation of ISWbemObjectSet.
---
dlls/wbemdisp/locator.c | 234 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 232 insertions(+), 2 deletions(-)
diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c
index 5e9f437..7f5756a 100644
--- a/dlls/wbemdisp/locator.c
+++ b/dlls/wbemdisp/locator.c
@@ -39,6 +39,7 @@ enum type_id
{
ISWbemLocator_tid,
ISWbemObject_tid,
+ ISWbemObjectSet_tid,
ISWbemServices_tid,
last_tid
};
@@ -50,6 +51,7 @@ static REFIID wbemdisp_tid_id[] =
{
&IID_ISWbemLocator,
&IID_ISWbemObject,
+ &IID_ISWbemObjectSet,
&IID_ISWbemServices
};
@@ -261,6 +263,221 @@ static HRESULT SWbemObject_create( IWbemClassObject *wbem_object, ISWbemObject *
return S_OK;
}
+struct objectset
+{
+ ISWbemObjectSet ISWbemObjectSet_iface;
+ LONG refs;
+ IEnumWbemClassObject *objectenum;
+};
+
+static inline struct objectset *impl_from_ISWbemObjectSet(
+ ISWbemObjectSet *iface )
+{
+ return CONTAINING_RECORD( iface, struct objectset, ISWbemObjectSet_iface );
+}
+
+static ULONG WINAPI objectset_AddRef(
+ ISWbemObjectSet *iface )
+{
+ struct objectset *objectset = impl_from_ISWbemObjectSet( iface );
+ return InterlockedIncrement( &objectset->refs );
+}
+
+static ULONG WINAPI objectset_Release(
+ ISWbemObjectSet *iface )
+{
+ struct objectset *objectset = impl_from_ISWbemObjectSet( iface );
+ LONG refs = InterlockedDecrement( &objectset->refs );
+ if (!refs)
+ {
+ TRACE( "destroying %p\n", objectset );
+ IEnumWbemClassObject_Release( objectset->objectenum );
+ heap_free( objectset );
+ }
+ return refs;
+}
+
+static HRESULT WINAPI objectset_QueryInterface(
+ ISWbemObjectSet *iface,
+ REFIID riid,
+ void **ppvObject )
+{
+ struct objectset *objectset = impl_from_ISWbemObjectSet( iface );
+
+ TRACE( "%p %s %p\n", objectset, debugstr_guid(riid), ppvObject );
+
+ if (IsEqualGUID( riid, &IID_ISWbemObjectSet ) ||
+ IsEqualGUID( riid, &IID_IDispatch ) ||
+ IsEqualGUID( riid, &IID_IUnknown ))
+ {
+ *ppvObject = objectset;
+ }
+ else
+ {
+ FIXME( "interface %s not implemented\n", debugstr_guid(riid) );
+ return E_NOINTERFACE;
+ }
+ ISWbemObjectSet_AddRef( iface );
+ return S_OK;
+}
+
+static HRESULT WINAPI objectset_GetTypeInfoCount(
+ ISWbemObjectSet *iface,
+ UINT *count )
+{
+ struct objectset *objectset = impl_from_ISWbemObjectSet( iface );
+ TRACE( "%p, %p\n", objectset, count );
+ *count = 1;
+ return S_OK;
+}
+
+static HRESULT WINAPI objectset_GetTypeInfo(
+ ISWbemObjectSet *iface,
+ UINT index,
+ LCID lcid,
+ ITypeInfo **info )
+{
+ struct objectset *objectset = impl_from_ISWbemObjectSet( iface );
+ TRACE( "%p, %u, %u, %p\n", objectset, index, lcid, info );
+
+ return get_typeinfo( ISWbemObjectSet_tid, info );
+}
+
+static HRESULT WINAPI objectset_GetIDsOfNames(
+ ISWbemObjectSet *iface,
+ REFIID riid,
+ LPOLESTR *names,
+ UINT count,
+ LCID lcid,
+ DISPID *dispid )
+{
+ struct objectset *objectset = impl_from_ISWbemObjectSet( iface );
+ ITypeInfo *typeinfo;
+ HRESULT hr;
+
+ TRACE( "%p, %s, %p, %u, %u, %p\n", objectset, debugstr_guid(riid), names, count, lcid, dispid );
+
+ if (!names || !count || !dispid) return E_INVALIDARG;
+
+ hr = get_typeinfo( ISWbemObjectSet_tid, &typeinfo );
+ if (SUCCEEDED(hr))
+ {
+ hr = ITypeInfo_GetIDsOfNames( typeinfo, names, count, dispid );
+ ITypeInfo_Release( typeinfo );
+ }
+ return hr;
+}
+
+static HRESULT WINAPI objectset_Invoke(
+ ISWbemObjectSet *iface,
+ DISPID member,
+ REFIID riid,
+ LCID lcid,
+ WORD flags,
+ DISPPARAMS *params,
+ VARIANT *result,
+ EXCEPINFO *excep_info,
+ UINT *arg_err )
+{
+ struct objectset *objectset = impl_from_ISWbemObjectSet( iface );
+ ITypeInfo *typeinfo;
+ HRESULT hr;
+
+ TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", objectset, member, debugstr_guid(riid),
+ lcid, flags, params, result, excep_info, arg_err );
+
+ hr = get_typeinfo( ISWbemObjectSet_tid, &typeinfo );
+ if (SUCCEEDED(hr))
+ {
+ hr = ITypeInfo_Invoke( typeinfo, &objectset->ISWbemObjectSet_iface, member, flags,
+ params, result, excep_info, arg_err );
+ ITypeInfo_Release( typeinfo );
+ }
+ return hr;
+}
+
+static HRESULT WINAPI objectset_get__NewEnum(
+ ISWbemObjectSet *iface,
+ IUnknown **pUnk )
+{
+ FIXME( "\n" );
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI objectset_Item(
+ ISWbemObjectSet *iface,
+ BSTR strObjectPath,
+ LONG iFlags,
+ ISWbemObject **objWbemObject )
+{
+ FIXME( "\n" );
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI objectset_get_Count(
+ ISWbemObjectSet *iface,
+ LONG *iCount )
+{
+ struct objectset *objectset = impl_from_ISWbemObjectSet( iface );
+
+ TRACE( "%p, %p\n", objectset, iCount );
+
+ *iCount = 0;
+ IEnumWbemClassObject_Reset( objectset->objectenum );
+ while (!IEnumWbemClassObject_Skip( objectset->objectenum, WBEM_INFINITE, 1 )) (*iCount)++;
+ return S_OK;
+}
+
+static HRESULT WINAPI objectset_get_Security_(
+ ISWbemObjectSet *iface,
+ ISWbemSecurity **objWbemSecurity )
+{
+ FIXME( "\n" );
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI objectset_ItemIndex(
+ ISWbemObjectSet *iface,
+ LONG lIndex,
+ ISWbemObject **objWbemObject )
+{
+ FIXME( "\n" );
+ return E_NOTIMPL;
+}
+
+static const ISWbemObjectSetVtbl objectset_vtbl =
+{
+ objectset_QueryInterface,
+ objectset_AddRef,
+ objectset_Release,
+ objectset_GetTypeInfoCount,
+ objectset_GetTypeInfo,
+ objectset_GetIDsOfNames,
+ objectset_Invoke,
+ objectset_get__NewEnum,
+ objectset_Item,
+ objectset_get_Count,
+ objectset_get_Security_,
+ objectset_ItemIndex
+};
+
+static HRESULT SWbemObjectSet_create( IEnumWbemClassObject *wbem_objectenum, ISWbemObjectSet **obj )
+{
+ struct objectset *objectset;
+
+ TRACE( "%p, %p\n", obj, wbem_objectenum );
+
+ if (!(objectset = heap_alloc( sizeof(*objectset) ))) return E_OUTOFMEMORY;
+ objectset->ISWbemObjectSet_iface.lpVtbl = &objectset_vtbl;
+ objectset->refs = 1;
+ objectset->objectenum = wbem_objectenum;
+ IEnumWbemClassObject_AddRef( objectset->objectenum );
+
+ *obj = &objectset->ISWbemObjectSet_iface;
+ TRACE( "returning iface %p\n", *obj );
+ return S_OK;
+}
+
struct services
{
ISWbemServices ISWbemServices_iface;
@@ -507,8 +724,21 @@ static HRESULT WINAPI services_ExecQuery(
IDispatch *objWbemNamedValueSet,
ISWbemObjectSet **objWbemObjectSet )
{
- FIXME( "\n" );
- return E_NOTIMPL;
+ struct services *services = impl_from_ISWbemServices( iface );
+ IEnumWbemClassObject *iter;
+ HRESULT hr;
+
+ TRACE( "%p, %s, %s, %x, %p, %p\n", iface, debugstr_w(strQuery), debugstr_w(strQueryLanguage),
+ iFlags, objWbemNamedValueSet, objWbemObjectSet );
+
+ if (objWbemNamedValueSet) FIXME( "ignoring context\n" );
+
+ hr = IWbemServices_ExecQuery( services->services, strQueryLanguage, strQuery, iFlags, NULL, &iter );
+ if (hr != S_OK) return hr;
+
+ hr = SWbemObjectSet_create( iter, objWbemObjectSet );
+ IEnumWbemClassObject_Release( iter );
+ return hr;
}
static HRESULT WINAPI services_ExecQueryAsync(
More information about the wine-cvs
mailing list