2 * Copyright 2013 Hans Leidekker for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
32 #include "wine/debug.h"
33 #include "wine/heap.h"
34 #include "wine/unicode.h"
35 #include "wbemdisp_private.h"
36 #include "wbemdisp_classes.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(wbemdisp
);
40 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*, IEnumVARIANT
** );
48 ISWbemPropertySet_tid
,
53 static ITypeLib
*wbemdisp_typelib
;
54 static ITypeInfo
*wbemdisp_typeinfo
[last_tid
];
56 static REFIID wbemdisp_tid_id
[] =
62 &IID_ISWbemPropertySet
,
66 static HRESULT
get_typeinfo( enum type_id tid
, ITypeInfo
**ret
)
70 if (!wbemdisp_typelib
)
74 hr
= LoadRegTypeLib( &LIBID_WbemScripting
, 1, 2, LOCALE_SYSTEM_DEFAULT
, &typelib
);
77 ERR( "LoadRegTypeLib failed: %08x\n", hr
);
80 if (InterlockedCompareExchangePointer( (void **)&wbemdisp_typelib
, typelib
, NULL
))
81 ITypeLib_Release( typelib
);
83 if (!wbemdisp_typeinfo
[tid
])
87 hr
= ITypeLib_GetTypeInfoOfGuid( wbemdisp_typelib
, wbemdisp_tid_id
[tid
], &typeinfo
);
90 ERR( "GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(wbemdisp_tid_id
[tid
]), hr
);
93 if (InterlockedCompareExchangePointer( (void **)(wbemdisp_typeinfo
+ tid
), typeinfo
, NULL
))
94 ITypeInfo_Release( typeinfo
);
96 *ret
= wbemdisp_typeinfo
[tid
];
97 ITypeInfo_AddRef( *ret
);
103 ISWbemProperty ISWbemProperty_iface
;
105 IWbemClassObject
*object
;
109 static inline struct property
*impl_from_ISWbemProperty( ISWbemProperty
*iface
)
111 return CONTAINING_RECORD( iface
, struct property
, ISWbemProperty_iface
);
114 static ULONG WINAPI
property_AddRef( ISWbemProperty
*iface
)
116 struct property
*property
= impl_from_ISWbemProperty( iface
);
117 return InterlockedIncrement( &property
->refs
);
120 static ULONG WINAPI
property_Release( ISWbemProperty
*iface
)
122 struct property
*property
= impl_from_ISWbemProperty( iface
);
123 LONG refs
= InterlockedDecrement( &property
->refs
);
126 TRACE( "destroying %p\n", property
);
127 IWbemClassObject_Release( property
->object
);
128 SysFreeString( property
->name
);
129 heap_free( property
);
134 static HRESULT WINAPI
property_QueryInterface( ISWbemProperty
*iface
, REFIID riid
, void **obj
)
136 struct property
*property
= impl_from_ISWbemProperty( iface
);
138 TRACE( "%p %s %p\n", property
, debugstr_guid(riid
), obj
);
140 if (IsEqualGUID( riid
, &IID_ISWbemProperty
) ||
141 IsEqualGUID( riid
, &IID_IDispatch
) ||
142 IsEqualGUID( riid
, &IID_IUnknown
))
148 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
149 return E_NOINTERFACE
;
151 ISWbemProperty_AddRef( iface
);
155 static HRESULT WINAPI
property_GetTypeInfoCount( ISWbemProperty
*iface
, UINT
*count
)
157 struct property
*property
= impl_from_ISWbemProperty( iface
);
158 TRACE( "%p, %p\n", property
, count
);
163 static HRESULT WINAPI
property_GetTypeInfo( ISWbemProperty
*iface
, UINT index
,
164 LCID lcid
, ITypeInfo
**info
)
166 struct property
*property
= impl_from_ISWbemProperty( iface
);
167 TRACE( "%p, %u, %u, %p\n", property
, index
, lcid
, info
);
169 return get_typeinfo( ISWbemProperty_tid
, info
);
172 static HRESULT WINAPI
property_GetIDsOfNames( ISWbemProperty
*iface
, REFIID riid
, LPOLESTR
*names
,
173 UINT count
, LCID lcid
, DISPID
*dispid
)
175 struct property
*property
= impl_from_ISWbemProperty( iface
);
179 TRACE( "%p, %s, %p, %u, %u, %p\n", property
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
181 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
183 hr
= get_typeinfo( ISWbemProperty_tid
, &typeinfo
);
186 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
187 ITypeInfo_Release( typeinfo
);
192 static HRESULT WINAPI
property_Invoke( ISWbemProperty
*iface
, DISPID member
, REFIID riid
,
193 LCID lcid
, WORD flags
, DISPPARAMS
*params
,
194 VARIANT
*result
, EXCEPINFO
*excep_info
, UINT
*arg_err
)
196 struct property
*property
= impl_from_ISWbemProperty( iface
);
200 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", property
, member
, debugstr_guid(riid
),
201 lcid
, flags
, params
, result
, excep_info
, arg_err
);
203 hr
= get_typeinfo( ISWbemProperty_tid
, &typeinfo
);
206 hr
= ITypeInfo_Invoke( typeinfo
, &property
->ISWbemProperty_iface
, member
, flags
,
207 params
, result
, excep_info
, arg_err
);
208 ITypeInfo_Release( typeinfo
);
213 static HRESULT WINAPI
property_get_Value( ISWbemProperty
*iface
, VARIANT
*value
)
215 struct property
*property
= impl_from_ISWbemProperty( iface
);
217 TRACE( "%p %p\n", property
, value
);
219 return IWbemClassObject_Get( property
->object
, property
->name
, 0, value
, NULL
, NULL
);
222 static HRESULT WINAPI
property_put_Value( ISWbemProperty
*iface
, VARIANT
*varValue
)
228 static HRESULT WINAPI
property_get_Name( ISWbemProperty
*iface
, BSTR
*strName
)
234 static HRESULT WINAPI
property_get_IsLocal( ISWbemProperty
*iface
, VARIANT_BOOL
*bIsLocal
)
240 static HRESULT WINAPI
property_get_Origin( ISWbemProperty
*iface
, BSTR
*strOrigin
)
246 static HRESULT WINAPI
property_get_CIMType( ISWbemProperty
*iface
, WbemCimtypeEnum
*iCimType
)
252 static HRESULT WINAPI
property_get_Qualifiers_( ISWbemProperty
*iface
, ISWbemQualifierSet
**objWbemQualifierSet
)
258 static HRESULT WINAPI
property_get_IsArray( ISWbemProperty
*iface
, VARIANT_BOOL
*bIsArray
)
264 static const ISWbemPropertyVtbl property_vtbl
=
266 property_QueryInterface
,
269 property_GetTypeInfoCount
,
270 property_GetTypeInfo
,
271 property_GetIDsOfNames
,
276 property_get_IsLocal
,
278 property_get_CIMType
,
279 property_get_Qualifiers_
,
283 static HRESULT
SWbemProperty_create( IWbemClassObject
*wbem_object
, BSTR name
, ISWbemProperty
**obj
)
285 struct property
*property
;
287 TRACE( "%p, %p\n", obj
, wbem_object
);
289 if (!(property
= heap_alloc( sizeof(*property
) ))) return E_OUTOFMEMORY
;
290 property
->ISWbemProperty_iface
.lpVtbl
= &property_vtbl
;
292 property
->object
= wbem_object
;
293 IWbemClassObject_AddRef( property
->object
);
294 property
->name
= SysAllocStringLen( name
, SysStringLen( name
) );
295 *obj
= &property
->ISWbemProperty_iface
;
296 TRACE( "returning iface %p\n", *obj
);
302 ISWbemPropertySet ISWbemPropertySet_iface
;
304 IWbemClassObject
*object
;
307 static inline struct propertyset
*impl_from_ISWbemPropertySet(
308 ISWbemPropertySet
*iface
)
310 return CONTAINING_RECORD( iface
, struct propertyset
, ISWbemPropertySet_iface
);
313 static ULONG WINAPI
propertyset_AddRef( ISWbemPropertySet
*iface
)
315 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
316 return InterlockedIncrement( &propertyset
->refs
);
319 static ULONG WINAPI
propertyset_Release( ISWbemPropertySet
*iface
)
321 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
322 LONG refs
= InterlockedDecrement( &propertyset
->refs
);
325 TRACE( "destroying %p\n", propertyset
);
326 IWbemClassObject_Release( propertyset
->object
);
327 heap_free( propertyset
);
332 static HRESULT WINAPI
propertyset_QueryInterface( ISWbemPropertySet
*iface
,
333 REFIID riid
, void **obj
)
335 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
337 TRACE( "%p %s %p\n", propertyset
, debugstr_guid(riid
), obj
);
339 if (IsEqualGUID( riid
, &IID_ISWbemPropertySet
) ||
340 IsEqualGUID( riid
, &IID_IDispatch
) ||
341 IsEqualGUID( riid
, &IID_IUnknown
))
347 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
348 return E_NOINTERFACE
;
350 ISWbemPropertySet_AddRef( iface
);
354 static HRESULT WINAPI
propertyset_GetTypeInfoCount( ISWbemPropertySet
*iface
, UINT
*count
)
356 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
357 TRACE( "%p, %p\n", propertyset
, count
);
362 static HRESULT WINAPI
propertyset_GetTypeInfo( ISWbemPropertySet
*iface
,
363 UINT index
, LCID lcid
, ITypeInfo
**info
)
365 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
366 TRACE( "%p, %u, %u, %p\n", propertyset
, index
, lcid
, info
);
368 return get_typeinfo( ISWbemPropertySet_tid
, info
);
371 static HRESULT WINAPI
propertyset_GetIDsOfNames( ISWbemPropertySet
*iface
, REFIID riid
, LPOLESTR
*names
,
372 UINT count
, LCID lcid
, DISPID
*dispid
)
374 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
378 TRACE( "%p, %s, %p, %u, %u, %p\n", propertyset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
380 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
382 hr
= get_typeinfo( ISWbemPropertySet_tid
, &typeinfo
);
385 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
386 ITypeInfo_Release( typeinfo
);
391 static HRESULT WINAPI
propertyset_Invoke( ISWbemPropertySet
*iface
, DISPID member
, REFIID riid
,
392 LCID lcid
, WORD flags
, DISPPARAMS
*params
,
393 VARIANT
*result
, EXCEPINFO
*excep_info
, UINT
*arg_err
)
395 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
399 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", propertyset
, member
, debugstr_guid(riid
),
400 lcid
, flags
, params
, result
, excep_info
, arg_err
);
402 hr
= get_typeinfo( ISWbemPropertySet_tid
, &typeinfo
);
405 hr
= ITypeInfo_Invoke( typeinfo
, &propertyset
->ISWbemPropertySet_iface
, member
, flags
,
406 params
, result
, excep_info
, arg_err
);
407 ITypeInfo_Release( typeinfo
);
412 static HRESULT WINAPI
propertyset_get__NewEnum( ISWbemPropertySet
*iface
, IUnknown
**unk
)
418 static HRESULT WINAPI
propertyset_Item( ISWbemPropertySet
*iface
, BSTR name
,
419 LONG flags
, ISWbemProperty
**prop
)
421 struct propertyset
*propertyset
= impl_from_ISWbemPropertySet( iface
);
425 TRACE( "%p, %s, %08x, %p\n", propertyset
, debugstr_w(name
), flags
, prop
);
427 hr
= IWbemClassObject_Get( propertyset
->object
, name
, 0, &var
, NULL
, NULL
);
430 hr
= SWbemProperty_create( propertyset
->object
, name
, prop
);
431 VariantClear( &var
);
436 static HRESULT WINAPI
propertyset_get_Count( ISWbemPropertySet
*iface
, LONG
*count
)
442 static HRESULT WINAPI
propertyset_Add( ISWbemPropertySet
*iface
, BSTR name
, WbemCimtypeEnum type
,
443 VARIANT_BOOL is_array
, LONG flags
, ISWbemProperty
**prop
)
449 static HRESULT WINAPI
propertyset_Remove( ISWbemPropertySet
*iface
, BSTR name
, LONG flags
)
455 static const ISWbemPropertySetVtbl propertyset_vtbl
=
457 propertyset_QueryInterface
,
460 propertyset_GetTypeInfoCount
,
461 propertyset_GetTypeInfo
,
462 propertyset_GetIDsOfNames
,
464 propertyset_get__NewEnum
,
466 propertyset_get_Count
,
471 static HRESULT
SWbemPropertySet_create( IWbemClassObject
*wbem_object
, ISWbemPropertySet
**obj
)
473 struct propertyset
*propertyset
;
475 TRACE( "%p, %p\n", obj
, wbem_object
);
477 if (!(propertyset
= heap_alloc( sizeof(*propertyset
) ))) return E_OUTOFMEMORY
;
478 propertyset
->ISWbemPropertySet_iface
.lpVtbl
= &propertyset_vtbl
;
479 propertyset
->refs
= 1;
480 propertyset
->object
= wbem_object
;
481 IWbemClassObject_AddRef( propertyset
->object
);
482 *obj
= &propertyset
->ISWbemPropertySet_iface
;
484 TRACE( "returning iface %p\n", *obj
);
488 #define DISPID_BASE 0x1800000
498 ISWbemObject ISWbemObject_iface
;
500 IWbemClassObject
*object
;
501 struct member
*members
;
506 static inline struct object
*impl_from_ISWbemObject(
507 ISWbemObject
*iface
)
509 return CONTAINING_RECORD( iface
, struct object
, ISWbemObject_iface
);
512 static ULONG WINAPI
object_AddRef(
513 ISWbemObject
*iface
)
515 struct object
*object
= impl_from_ISWbemObject( iface
);
516 return InterlockedIncrement( &object
->refs
);
519 static ULONG WINAPI
object_Release(
520 ISWbemObject
*iface
)
522 struct object
*object
= impl_from_ISWbemObject( iface
);
523 LONG refs
= InterlockedDecrement( &object
->refs
);
528 TRACE( "destroying %p\n", object
);
529 IWbemClassObject_Release( object
->object
);
530 for (i
= 0; i
< object
->nb_members
; i
++) SysFreeString( object
->members
[i
].name
);
531 heap_free( object
->members
);
537 static HRESULT WINAPI
object_QueryInterface(
542 struct object
*object
= impl_from_ISWbemObject( iface
);
544 TRACE( "%p %s %p\n", object
, debugstr_guid(riid
), ppvObject
);
546 if (IsEqualGUID( riid
, &IID_ISWbemObject
) ||
547 IsEqualGUID( riid
, &IID_IDispatch
) ||
548 IsEqualGUID( riid
, &IID_IUnknown
))
554 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
555 return E_NOINTERFACE
;
557 ISWbemObject_AddRef( iface
);
561 static HRESULT WINAPI
object_GetTypeInfoCount(
565 struct object
*object
= impl_from_ISWbemObject( iface
);
567 TRACE( "%p, %p\n", object
, count
);
572 static HRESULT WINAPI
object_GetTypeInfo(
578 struct object
*object
= impl_from_ISWbemObject( iface
);
579 FIXME( "%p, %u, %u, %p\n", object
, index
, lcid
, info
);
583 static HRESULT
init_members( struct object
*object
)
589 if (object
->members
) return S_OK
;
591 hr
= IWbemClassObject_GetNames( object
->object
, NULL
, 0, NULL
, &sa
);
592 if (FAILED( hr
)) return hr
;
593 hr
= SafeArrayGetUBound( sa
, 1, &bound
);
596 SafeArrayDestroy( sa
);
599 if (!(object
->members
= heap_alloc( sizeof(struct member
) * (bound
+ 1) )))
601 SafeArrayDestroy( sa
);
602 return E_OUTOFMEMORY
;
604 for (i
= 0; i
<= bound
; i
++)
606 hr
= SafeArrayGetElement( sa
, &i
, &object
->members
[i
].name
);
609 for (i
--; i
>= 0; i
--) SysFreeString( object
->members
[i
].name
);
610 SafeArrayDestroy( sa
);
611 heap_free( object
->members
);
612 object
->members
= NULL
;
613 return E_OUTOFMEMORY
;
615 object
->members
[i
].dispid
= 0;
617 object
->nb_members
= bound
+ 1;
618 SafeArrayDestroy( sa
);
622 static DISPID
get_member_dispid( struct object
*object
, const WCHAR
*name
)
625 for (i
= 0; i
< object
->nb_members
; i
++)
627 if (!strcmpiW( object
->members
[i
].name
, name
))
629 if (!object
->members
[i
].dispid
) object
->members
[i
].dispid
= ++object
->last_dispid
;
630 return object
->members
[i
].dispid
;
633 return DISPID_UNKNOWN
;
636 static HRESULT WINAPI
object_GetIDsOfNames(
644 struct object
*object
= impl_from_ISWbemObject( iface
);
649 TRACE( "%p, %s, %p, %u, %u, %p\n", object
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
651 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
653 hr
= init_members( object
);
654 if (FAILED( hr
)) return hr
;
656 hr
= get_typeinfo( ISWbemObject_tid
, &typeinfo
);
659 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
660 ITypeInfo_Release( typeinfo
);
662 if (SUCCEEDED(hr
)) return hr
;
664 for (i
= 0; i
< count
; i
++)
666 if ((dispid
[i
] = get_member_dispid( object
, names
[i
] )) == DISPID_UNKNOWN
) break;
668 if (i
!= count
) return DISP_E_UNKNOWNNAME
;
672 static BSTR
get_member_name( struct object
*object
, DISPID dispid
)
675 for (i
= 0; i
< object
->nb_members
; i
++)
677 if (object
->members
[i
].dispid
== dispid
) return object
->members
[i
].name
;
682 static HRESULT WINAPI
object_Invoke(
690 EXCEPINFO
*excep_info
,
693 struct object
*object
= impl_from_ISWbemObject( iface
);
698 TRACE( "%p, %x, %s, %u, %x, %p, %p, %p, %p\n", object
, member
, debugstr_guid(riid
),
699 lcid
, flags
, params
, result
, excep_info
, arg_err
);
701 if (member
<= DISPID_BASE
)
703 hr
= get_typeinfo( ISWbemObject_tid
, &typeinfo
);
706 hr
= ITypeInfo_Invoke( typeinfo
, &object
->ISWbemObject_iface
, member
, flags
,
707 params
, result
, excep_info
, arg_err
);
708 ITypeInfo_Release( typeinfo
);
713 if (flags
!= (DISPATCH_METHOD
|DISPATCH_PROPERTYGET
))
715 FIXME( "flags %x not supported\n", flags
);
718 if (!(name
= get_member_name( object
, member
)))
719 return DISP_E_MEMBERNOTFOUND
;
721 memset( params
, 0, sizeof(*params
) );
722 return IWbemClassObject_Get( object
->object
, name
, 0, result
, NULL
, NULL
);
725 static HRESULT WINAPI
object_Put_(
728 IDispatch
*objWbemNamedValueSet
,
729 ISWbemObjectPath
**objWbemObjectPath
)
735 static HRESULT WINAPI
object_PutAsync_(
737 IDispatch
*objWbemSink
,
739 IDispatch
*objWbemNamedValueSet
,
740 IDispatch
*objWbemAsyncContext
)
746 static HRESULT WINAPI
object_Delete_(
749 IDispatch
*objWbemNamedValueSet
)
755 static HRESULT WINAPI
object_DeleteAsync_(
757 IDispatch
*objWbemSink
,
759 IDispatch
*objWbemNamedValueSet
,
760 IDispatch
*objWbemAsyncContext
)
766 static HRESULT WINAPI
object_Instances_(
769 IDispatch
*objWbemNamedValueSet
,
770 ISWbemObjectSet
**objWbemObjectSet
)
776 static HRESULT WINAPI
object_InstancesAsync_(
778 IDispatch
*objWbemSink
,
780 IDispatch
*objWbemNamedValueSet
,
781 IDispatch
*objWbemAsyncContext
)
787 static HRESULT WINAPI
object_Subclasses_(
790 IDispatch
*objWbemNamedValueSet
,
791 ISWbemObjectSet
**objWbemObjectSet
)
797 static HRESULT WINAPI
object_SubclassesAsync_(
799 IDispatch
*objWbemSink
,
801 IDispatch
*objWbemNamedValueSet
,
802 IDispatch
*objWbemAsyncContext
)
808 static HRESULT WINAPI
object_Associators_(
814 VARIANT_BOOL bClassesOnly
,
815 VARIANT_BOOL bSchemaOnly
,
816 BSTR strRequiredAssocQualifier
,
817 BSTR strRequiredQualifier
,
819 IDispatch
*objWbemNamedValueSet
,
820 ISWbemObjectSet
**objWbemObjectSet
)
826 static HRESULT WINAPI
object_AssociatorsAsync_(
828 IDispatch
*objWbemSink
,
833 VARIANT_BOOL bClassesOnly
,
834 VARIANT_BOOL bSchemaOnly
,
835 BSTR strRequiredAssocQualifier
,
836 BSTR strRequiredQualifier
,
838 IDispatch
*objWbemNamedValueSet
,
839 IDispatch
*objWbemAsyncContext
)
845 static HRESULT WINAPI
object_References_(
849 VARIANT_BOOL bClassesOnly
,
850 VARIANT_BOOL bSchemaOnly
,
851 BSTR strRequiredQualifier
,
853 IDispatch
*objWbemNamedValueSet
,
854 ISWbemObjectSet
**objWbemObjectSet
)
860 static HRESULT WINAPI
object_ReferencesAsync_(
862 IDispatch
*objWbemSink
,
865 VARIANT_BOOL bClassesOnly
,
866 VARIANT_BOOL bSchemaOnly
,
867 BSTR strRequiredQualifier
,
869 IDispatch
*objWbemNamedValueSet
,
870 IDispatch
*objWbemAsyncContext
)
876 static HRESULT WINAPI
object_ExecMethod_(
879 IDispatch
*objWbemInParameters
,
881 IDispatch
*objWbemNamedValueSet
,
882 ISWbemObject
**objWbemOutParameters
)
888 static HRESULT WINAPI
object_ExecMethodAsync_(
890 IDispatch
*objWbemSink
,
892 IDispatch
*objWbemInParameters
,
894 IDispatch
*objWbemNamedValueSet
,
895 IDispatch
*objWbemAsyncContext
)
901 static HRESULT WINAPI
object_Clone_(
903 ISWbemObject
**objWbemObject
)
909 static HRESULT WINAPI
object_GetObjectText_(
912 BSTR
*strObjectText
)
918 static HRESULT WINAPI
object_SpawnDerivedClass_(
921 ISWbemObject
**objWbemObject
)
927 static HRESULT WINAPI
object_SpawnInstance_(
930 ISWbemObject
**objWbemObject
)
936 static HRESULT WINAPI
object_CompareTo_(
938 IDispatch
*objWbemObject
,
940 VARIANT_BOOL
*bResult
)
946 static HRESULT WINAPI
object_get_Qualifiers_(
948 ISWbemQualifierSet
**objWbemQualifierSet
)
954 static HRESULT WINAPI
object_get_Properties_( ISWbemObject
*iface
, ISWbemPropertySet
**prop_set
)
956 struct object
*object
= impl_from_ISWbemObject( iface
);
958 TRACE( "%p, %p\n", object
, prop_set
);
959 return SWbemPropertySet_create( object
->object
, prop_set
);
962 static HRESULT WINAPI
object_get_Methods_(
964 ISWbemMethodSet
**objWbemMethodSet
)
970 static HRESULT WINAPI
object_get_Derivation_(
972 VARIANT
*strClassNameArray
)
978 static HRESULT WINAPI
object_get_Path_(
980 ISWbemObjectPath
**objWbemObjectPath
)
986 static HRESULT WINAPI
object_get_Security_(
988 ISWbemSecurity
**objWbemSecurity
)
994 static const ISWbemObjectVtbl object_vtbl
=
996 object_QueryInterface
,
999 object_GetTypeInfoCount
,
1001 object_GetIDsOfNames
,
1006 object_DeleteAsync_
,
1008 object_InstancesAsync_
,
1010 object_SubclassesAsync_
,
1011 object_Associators_
,
1012 object_AssociatorsAsync_
,
1014 object_ReferencesAsync_
,
1016 object_ExecMethodAsync_
,
1018 object_GetObjectText_
,
1019 object_SpawnDerivedClass_
,
1020 object_SpawnInstance_
,
1022 object_get_Qualifiers_
,
1023 object_get_Properties_
,
1024 object_get_Methods_
,
1025 object_get_Derivation_
,
1027 object_get_Security_
1030 static HRESULT
SWbemObject_create( IWbemClassObject
*wbem_object
, ISWbemObject
**obj
)
1032 struct object
*object
;
1034 TRACE( "%p, %p\n", obj
, wbem_object
);
1036 if (!(object
= heap_alloc( sizeof(*object
) ))) return E_OUTOFMEMORY
;
1037 object
->ISWbemObject_iface
.lpVtbl
= &object_vtbl
;
1039 object
->object
= wbem_object
;
1040 IWbemClassObject_AddRef( object
->object
);
1041 object
->members
= NULL
;
1042 object
->nb_members
= 0;
1043 object
->last_dispid
= DISPID_BASE
;
1045 *obj
= &object
->ISWbemObject_iface
;
1046 TRACE( "returning iface %p\n", *obj
);
1052 ISWbemObjectSet ISWbemObjectSet_iface
;
1054 IEnumWbemClassObject
*objectenum
;
1058 static inline struct objectset
*impl_from_ISWbemObjectSet(
1059 ISWbemObjectSet
*iface
)
1061 return CONTAINING_RECORD( iface
, struct objectset
, ISWbemObjectSet_iface
);
1064 static ULONG WINAPI
objectset_AddRef(
1065 ISWbemObjectSet
*iface
)
1067 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1068 return InterlockedIncrement( &objectset
->refs
);
1071 static ULONG WINAPI
objectset_Release(
1072 ISWbemObjectSet
*iface
)
1074 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1075 LONG refs
= InterlockedDecrement( &objectset
->refs
);
1078 TRACE( "destroying %p\n", objectset
);
1079 IEnumWbemClassObject_Release( objectset
->objectenum
);
1080 heap_free( objectset
);
1085 static HRESULT WINAPI
objectset_QueryInterface(
1086 ISWbemObjectSet
*iface
,
1090 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1092 TRACE( "%p %s %p\n", objectset
, debugstr_guid(riid
), ppvObject
);
1094 if (IsEqualGUID( riid
, &IID_ISWbemObjectSet
) ||
1095 IsEqualGUID( riid
, &IID_IDispatch
) ||
1096 IsEqualGUID( riid
, &IID_IUnknown
))
1102 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1103 return E_NOINTERFACE
;
1105 ISWbemObjectSet_AddRef( iface
);
1109 static HRESULT WINAPI
objectset_GetTypeInfoCount(
1110 ISWbemObjectSet
*iface
,
1113 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1114 TRACE( "%p, %p\n", objectset
, count
);
1119 static HRESULT WINAPI
objectset_GetTypeInfo(
1120 ISWbemObjectSet
*iface
,
1125 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1126 TRACE( "%p, %u, %u, %p\n", objectset
, index
, lcid
, info
);
1128 return get_typeinfo( ISWbemObjectSet_tid
, info
);
1131 static HRESULT WINAPI
objectset_GetIDsOfNames(
1132 ISWbemObjectSet
*iface
,
1139 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1140 ITypeInfo
*typeinfo
;
1143 TRACE( "%p, %s, %p, %u, %u, %p\n", objectset
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1145 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1147 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
1150 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1151 ITypeInfo_Release( typeinfo
);
1156 static HRESULT WINAPI
objectset_Invoke(
1157 ISWbemObjectSet
*iface
,
1164 EXCEPINFO
*excep_info
,
1167 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1168 ITypeInfo
*typeinfo
;
1171 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", objectset
, member
, debugstr_guid(riid
),
1172 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1174 hr
= get_typeinfo( ISWbemObjectSet_tid
, &typeinfo
);
1177 hr
= ITypeInfo_Invoke( typeinfo
, &objectset
->ISWbemObjectSet_iface
, member
, flags
,
1178 params
, result
, excep_info
, arg_err
);
1179 ITypeInfo_Release( typeinfo
);
1184 static HRESULT WINAPI
objectset_get__NewEnum(
1185 ISWbemObjectSet
*iface
,
1188 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1189 IEnumWbemClassObject
*objectenum
;
1192 TRACE( "%p, %p\n", objectset
, pUnk
);
1194 hr
= IEnumWbemClassObject_Clone( objectset
->objectenum
, &objectenum
);
1195 if (FAILED( hr
)) return hr
;
1197 hr
= EnumVARIANT_create( objectenum
, (IEnumVARIANT
**)pUnk
);
1198 IEnumWbemClassObject_Release( objectenum
);
1202 static HRESULT WINAPI
objectset_Item(
1203 ISWbemObjectSet
*iface
,
1206 ISWbemObject
**objWbemObject
)
1212 static HRESULT WINAPI
objectset_get_Count(
1213 ISWbemObjectSet
*iface
,
1216 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1218 TRACE( "%p, %p\n", objectset
, iCount
);
1220 *iCount
= objectset
->count
;
1224 static HRESULT WINAPI
objectset_get_Security_(
1225 ISWbemObjectSet
*iface
,
1226 ISWbemSecurity
**objWbemSecurity
)
1232 static HRESULT WINAPI
objectset_ItemIndex(
1233 ISWbemObjectSet
*iface
,
1235 ISWbemObject
**objWbemObject
)
1237 struct objectset
*objectset
= impl_from_ISWbemObjectSet( iface
);
1240 IEnumVARIANT
*enum_var
;
1243 TRACE( "%p, %d, %p\n", objectset
, lIndex
, objWbemObject
);
1245 *objWbemObject
= NULL
;
1246 hr
= ISWbemObjectSet_get_Count( iface
, &count
);
1247 if (FAILED(hr
)) return hr
;
1249 if (lIndex
>= count
) return WBEM_E_NOT_FOUND
;
1251 hr
= ISWbemObjectSet_get__NewEnum( iface
, (IUnknown
**)&enum_var
);
1252 if (FAILED(hr
)) return hr
;
1254 IEnumVARIANT_Reset( enum_var
);
1255 hr
= IEnumVARIANT_Skip( enum_var
, lIndex
);
1257 hr
= IEnumVARIANT_Next( enum_var
, 1, &var
, NULL
);
1258 IEnumVARIANT_Release( enum_var
);
1262 if (V_VT( &var
) == VT_DISPATCH
)
1263 hr
= IDispatch_QueryInterface( V_DISPATCH( &var
), &IID_ISWbemObject
, (void **)objWbemObject
);
1265 hr
= WBEM_E_NOT_FOUND
;
1266 VariantClear( &var
);
1272 static const ISWbemObjectSetVtbl objectset_vtbl
=
1274 objectset_QueryInterface
,
1277 objectset_GetTypeInfoCount
,
1278 objectset_GetTypeInfo
,
1279 objectset_GetIDsOfNames
,
1281 objectset_get__NewEnum
,
1283 objectset_get_Count
,
1284 objectset_get_Security_
,
1288 static LONG
get_object_count( IEnumWbemClassObject
*iter
)
1291 while (IEnumWbemClassObject_Skip( iter
, WBEM_INFINITE
, 1 ) == S_OK
) count
++;
1292 IEnumWbemClassObject_Reset( iter
);
1296 static HRESULT
SWbemObjectSet_create( IEnumWbemClassObject
*wbem_objectenum
, ISWbemObjectSet
**obj
)
1298 struct objectset
*objectset
;
1300 TRACE( "%p, %p\n", obj
, wbem_objectenum
);
1302 if (!(objectset
= heap_alloc( sizeof(*objectset
) ))) return E_OUTOFMEMORY
;
1303 objectset
->ISWbemObjectSet_iface
.lpVtbl
= &objectset_vtbl
;
1304 objectset
->refs
= 1;
1305 objectset
->objectenum
= wbem_objectenum
;
1306 IEnumWbemClassObject_AddRef( objectset
->objectenum
);
1307 objectset
->count
= get_object_count( objectset
->objectenum
);
1309 *obj
= &objectset
->ISWbemObjectSet_iface
;
1310 TRACE( "returning iface %p\n", *obj
);
1316 IEnumVARIANT IEnumVARIANT_iface
;
1318 IEnumWbemClassObject
*objectenum
;
1321 static inline struct enumvar
*impl_from_IEnumVARIANT(
1322 IEnumVARIANT
*iface
)
1324 return CONTAINING_RECORD( iface
, struct enumvar
, IEnumVARIANT_iface
);
1327 static ULONG WINAPI
enumvar_AddRef(
1328 IEnumVARIANT
*iface
)
1330 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1331 return InterlockedIncrement( &enumvar
->refs
);
1334 static ULONG WINAPI
enumvar_Release(
1335 IEnumVARIANT
*iface
)
1337 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1338 LONG refs
= InterlockedDecrement( &enumvar
->refs
);
1341 TRACE( "destroying %p\n", enumvar
);
1342 IEnumWbemClassObject_Release( enumvar
->objectenum
);
1343 heap_free( enumvar
);
1348 static HRESULT WINAPI
enumvar_QueryInterface(
1349 IEnumVARIANT
*iface
,
1353 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1355 TRACE( "%p %s %p\n", enumvar
, debugstr_guid(riid
), ppvObject
);
1357 if (IsEqualGUID( riid
, &IID_IEnumVARIANT
) ||
1358 IsEqualGUID( riid
, &IID_IUnknown
))
1364 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1365 return E_NOINTERFACE
;
1367 IEnumVARIANT_AddRef( iface
);
1371 static HRESULT WINAPI
enumvar_Next( IEnumVARIANT
*iface
, ULONG celt
, VARIANT
*var
, ULONG
*fetched
)
1373 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1374 IWbemClassObject
*obj
;
1377 TRACE( "%p, %u, %p, %p\n", iface
, celt
, var
, fetched
);
1379 if (celt
) IEnumWbemClassObject_Next( enumvar
->objectenum
, WBEM_INFINITE
, 1, &obj
, &count
);
1385 hr
= SWbemObject_create( obj
, &sobj
);
1386 IWbemClassObject_Release( obj
);
1387 if (FAILED( hr
)) return hr
;
1389 V_VT( var
) = VT_DISPATCH
;
1390 V_DISPATCH( var
) = (IDispatch
*)sobj
;
1392 if (fetched
) *fetched
= count
;
1393 return (count
< celt
) ? S_FALSE
: S_OK
;
1396 static HRESULT WINAPI
enumvar_Skip( IEnumVARIANT
*iface
, ULONG celt
)
1398 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1400 TRACE( "%p, %u\n", iface
, celt
);
1402 return IEnumWbemClassObject_Skip( enumvar
->objectenum
, WBEM_INFINITE
, celt
);
1405 static HRESULT WINAPI
enumvar_Reset( IEnumVARIANT
*iface
)
1407 struct enumvar
*enumvar
= impl_from_IEnumVARIANT( iface
);
1409 TRACE( "%p\n", iface
);
1411 return IEnumWbemClassObject_Reset( enumvar
->objectenum
);
1414 static HRESULT WINAPI
enumvar_Clone( IEnumVARIANT
*iface
, IEnumVARIANT
**penum
)
1416 FIXME( "%p, %p\n", iface
, penum
);
1420 static const struct IEnumVARIANTVtbl enumvar_vtbl
=
1422 enumvar_QueryInterface
,
1431 static HRESULT
EnumVARIANT_create( IEnumWbemClassObject
*objectenum
, IEnumVARIANT
**obj
)
1433 struct enumvar
*enumvar
;
1435 if (!(enumvar
= heap_alloc( sizeof(*enumvar
) ))) return E_OUTOFMEMORY
;
1436 enumvar
->IEnumVARIANT_iface
.lpVtbl
= &enumvar_vtbl
;
1438 enumvar
->objectenum
= objectenum
;
1439 IEnumWbemClassObject_AddRef( enumvar
->objectenum
);
1441 *obj
= &enumvar
->IEnumVARIANT_iface
;
1442 TRACE( "returning iface %p\n", *obj
);
1448 ISWbemServices ISWbemServices_iface
;
1450 IWbemServices
*services
;
1453 static inline struct services
*impl_from_ISWbemServices(
1454 ISWbemServices
*iface
)
1456 return CONTAINING_RECORD( iface
, struct services
, ISWbemServices_iface
);
1459 static ULONG WINAPI
services_AddRef(
1460 ISWbemServices
*iface
)
1462 struct services
*services
= impl_from_ISWbemServices( iface
);
1463 return InterlockedIncrement( &services
->refs
);
1466 static ULONG WINAPI
services_Release(
1467 ISWbemServices
*iface
)
1469 struct services
*services
= impl_from_ISWbemServices( iface
);
1470 LONG refs
= InterlockedDecrement( &services
->refs
);
1473 TRACE( "destroying %p\n", services
);
1474 IWbemServices_Release( services
->services
);
1475 heap_free( services
);
1480 static HRESULT WINAPI
services_QueryInterface(
1481 ISWbemServices
*iface
,
1485 struct services
*services
= impl_from_ISWbemServices( iface
);
1487 TRACE( "%p %s %p\n", services
, debugstr_guid(riid
), ppvObject
);
1489 if (IsEqualGUID( riid
, &IID_ISWbemServices
) ||
1490 IsEqualGUID( riid
, &IID_IDispatch
) ||
1491 IsEqualGUID( riid
, &IID_IUnknown
))
1497 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1498 return E_NOINTERFACE
;
1500 ISWbemServices_AddRef( iface
);
1504 static HRESULT WINAPI
services_GetTypeInfoCount(
1505 ISWbemServices
*iface
,
1508 struct services
*services
= impl_from_ISWbemServices( iface
);
1509 TRACE( "%p, %p\n", services
, count
);
1515 static HRESULT WINAPI
services_GetTypeInfo(
1516 ISWbemServices
*iface
,
1521 struct services
*services
= impl_from_ISWbemServices( iface
);
1522 TRACE( "%p, %u, %u, %p\n", services
, index
, lcid
, info
);
1524 return get_typeinfo( ISWbemServices_tid
, info
);
1527 static HRESULT WINAPI
services_GetIDsOfNames(
1528 ISWbemServices
*iface
,
1535 struct services
*services
= impl_from_ISWbemServices( iface
);
1536 ITypeInfo
*typeinfo
;
1539 TRACE( "%p, %s, %p, %u, %u, %p\n", services
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
1541 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
1543 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
1546 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
1547 ITypeInfo_Release( typeinfo
);
1552 static HRESULT WINAPI
services_Invoke(
1553 ISWbemServices
*iface
,
1560 EXCEPINFO
*excep_info
,
1563 struct services
*services
= impl_from_ISWbemServices( iface
);
1564 ITypeInfo
*typeinfo
;
1567 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", services
, member
, debugstr_guid(riid
),
1568 lcid
, flags
, params
, result
, excep_info
, arg_err
);
1570 hr
= get_typeinfo( ISWbemServices_tid
, &typeinfo
);
1573 hr
= ITypeInfo_Invoke( typeinfo
, &services
->ISWbemServices_iface
, member
, flags
,
1574 params
, result
, excep_info
, arg_err
);
1575 ITypeInfo_Release( typeinfo
);
1580 static HRESULT WINAPI
services_Get(
1581 ISWbemServices
*iface
,
1584 IDispatch
*objWbemNamedValueSet
,
1585 ISWbemObject
**objWbemObject
)
1587 struct services
*services
= impl_from_ISWbemServices( iface
);
1588 IWbemClassObject
*obj
;
1591 TRACE( "%p, %s, %d, %p, %p\n", iface
, debugstr_w(strObjectPath
), iFlags
, objWbemNamedValueSet
,
1594 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
1596 hr
= IWbemServices_GetObject( services
->services
, strObjectPath
, iFlags
, NULL
, &obj
, NULL
);
1597 if (hr
!= S_OK
) return hr
;
1599 hr
= SWbemObject_create( obj
, objWbemObject
);
1600 IWbemClassObject_Release( obj
);
1604 static HRESULT WINAPI
services_GetAsync(
1605 ISWbemServices
*iface
,
1606 IDispatch
*objWbemSink
,
1609 IDispatch
*objWbemNamedValueSet
,
1610 IDispatch
*objWbemAsyncContext
)
1616 static HRESULT WINAPI
services_Delete(
1617 ISWbemServices
*iface
,
1620 IDispatch
*objWbemNamedValueSet
)
1626 static HRESULT WINAPI
services_DeleteAsync(
1627 ISWbemServices
* This
,
1628 IDispatch
*objWbemSink
,
1631 IDispatch
*objWbemNamedValueSet
,
1632 IDispatch
*objWbemAsyncContext
)
1638 static BSTR
build_query_string( const WCHAR
*class )
1640 static const WCHAR selectW
[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
1641 UINT len
= strlenW(class) + sizeof(selectW
) / sizeof(selectW
[0]);
1644 if (!(ret
= SysAllocStringLen( NULL
, len
))) return NULL
;
1645 strcpyW( ret
, selectW
);
1646 strcatW( ret
, class );
1650 static HRESULT WINAPI
services_InstancesOf(
1651 ISWbemServices
*iface
,
1654 IDispatch
*objWbemNamedValueSet
,
1655 ISWbemObjectSet
**objWbemObjectSet
)
1657 static const WCHAR wqlW
[] = {'W','Q','L',0};
1658 BSTR query
, wql
= SysAllocString( wqlW
);
1661 TRACE( "%p, %s, %x, %p, %p\n", iface
, debugstr_w(strClass
), iFlags
, objWbemNamedValueSet
,
1664 if (!(query
= build_query_string( strClass
)))
1666 SysFreeString( wql
);
1667 return E_OUTOFMEMORY
;
1669 hr
= ISWbemServices_ExecQuery( iface
, query
, wql
, iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
1670 SysFreeString( wql
);
1671 SysFreeString( query
);
1675 static HRESULT WINAPI
services_InstancesOfAsync(
1676 ISWbemServices
*iface
,
1677 IDispatch
*objWbemSink
,
1680 IDispatch
*objWbemNamedValueSet
,
1681 IDispatch
*objWbemAsyncContext
)
1687 static HRESULT WINAPI
services_SubclassesOf(
1688 ISWbemServices
*iface
,
1691 IDispatch
*objWbemNamedValueSet
,
1692 ISWbemObjectSet
**objWbemObjectSet
)
1698 static HRESULT WINAPI
services_SubclassesOfAsync(
1699 ISWbemServices
*iface
,
1700 IDispatch
*objWbemSink
,
1703 IDispatch
*objWbemNamedValueSet
,
1704 IDispatch
*objWbemAsyncContext
)
1710 static HRESULT WINAPI
services_ExecQuery(
1711 ISWbemServices
*iface
,
1713 BSTR strQueryLanguage
,
1715 IDispatch
*objWbemNamedValueSet
,
1716 ISWbemObjectSet
**objWbemObjectSet
)
1718 struct services
*services
= impl_from_ISWbemServices( iface
);
1719 IEnumWbemClassObject
*iter
;
1722 TRACE( "%p, %s, %s, %x, %p, %p\n", iface
, debugstr_w(strQuery
), debugstr_w(strQueryLanguage
),
1723 iFlags
, objWbemNamedValueSet
, objWbemObjectSet
);
1725 if (objWbemNamedValueSet
) FIXME( "ignoring context\n" );
1727 hr
= IWbemServices_ExecQuery( services
->services
, strQueryLanguage
, strQuery
, iFlags
, NULL
, &iter
);
1728 if (hr
!= S_OK
) return hr
;
1730 hr
= SWbemObjectSet_create( iter
, objWbemObjectSet
);
1731 IEnumWbemClassObject_Release( iter
);
1735 static HRESULT WINAPI
services_ExecQueryAsync(
1736 ISWbemServices
*iface
,
1737 IDispatch
*objWbemSink
,
1739 BSTR strQueryLanguage
,
1741 IDispatch
*objWbemNamedValueSet
,
1742 IDispatch
*objWbemAsyncContext
)
1748 static HRESULT WINAPI
services_AssociatorsOf(
1749 ISWbemServices
*iface
,
1752 BSTR strResultClass
,
1755 VARIANT_BOOL bClassesOnly
,
1756 VARIANT_BOOL bSchemaOnly
,
1757 BSTR strRequiredAssocQualifier
,
1758 BSTR strRequiredQualifier
,
1760 IDispatch
*objWbemNamedValueSet
,
1761 ISWbemObjectSet
**objWbemObjectSet
)
1767 static HRESULT WINAPI
services_AssociatorsOfAsync(
1768 ISWbemServices
*iface
,
1769 IDispatch
*objWbemSink
,
1772 BSTR strResultClass
,
1775 VARIANT_BOOL bClassesOnly
,
1776 VARIANT_BOOL bSchemaOnly
,
1777 BSTR strRequiredAssocQualifier
,
1778 BSTR strRequiredQualifier
,
1780 IDispatch
*objWbemNamedValueSet
,
1781 IDispatch
*objWbemAsyncContext
)
1787 static HRESULT WINAPI
services_ReferencesTo(
1788 ISWbemServices
*iface
,
1790 BSTR strResultClass
,
1792 VARIANT_BOOL bClassesOnly
,
1793 VARIANT_BOOL bSchemaOnly
,
1794 BSTR strRequiredQualifier
,
1796 IDispatch
*objWbemNamedValueSet
,
1797 ISWbemObjectSet
**objWbemObjectSet
)
1803 static HRESULT WINAPI
services_ReferencesToAsync(
1804 ISWbemServices
*iface
,
1805 IDispatch
*objWbemSink
,
1807 BSTR strResultClass
,
1809 VARIANT_BOOL bClassesOnly
,
1810 VARIANT_BOOL bSchemaOnly
,
1811 BSTR strRequiredQualifier
,
1813 IDispatch
*objWbemNamedValueSet
,
1814 IDispatch
*objWbemAsyncContext
)
1820 static HRESULT WINAPI
services_ExecNotificationQuery(
1821 ISWbemServices
*iface
,
1823 BSTR strQueryLanguage
,
1825 IDispatch
*objWbemNamedValueSet
,
1826 ISWbemEventSource
**objWbemEventSource
)
1832 static HRESULT WINAPI
services_ExecNotificationQueryAsync(
1833 ISWbemServices
*iface
,
1834 IDispatch
*objWbemSink
,
1836 BSTR strQueryLanguage
,
1838 IDispatch
*objWbemNamedValueSet
,
1839 IDispatch
*objWbemAsyncContext
)
1845 static HRESULT WINAPI
services_ExecMethod(
1846 ISWbemServices
*iface
,
1849 IDispatch
*objWbemInParameters
,
1851 IDispatch
*objWbemNamedValueSet
,
1852 ISWbemObject
**objWbemOutParameters
)
1858 static HRESULT WINAPI
services_ExecMethodAsync(
1859 ISWbemServices
*iface
,
1860 IDispatch
*objWbemSink
,
1863 IDispatch
*objWbemInParameters
,
1865 IDispatch
*objWbemNamedValueSet
,
1866 IDispatch
*objWbemAsyncContext
)
1872 static HRESULT WINAPI
services_get_Security_(
1873 ISWbemServices
*iface
,
1874 ISWbemSecurity
**objWbemSecurity
)
1880 static const ISWbemServicesVtbl services_vtbl
=
1882 services_QueryInterface
,
1885 services_GetTypeInfoCount
,
1886 services_GetTypeInfo
,
1887 services_GetIDsOfNames
,
1892 services_DeleteAsync
,
1893 services_InstancesOf
,
1894 services_InstancesOfAsync
,
1895 services_SubclassesOf
,
1896 services_SubclassesOfAsync
,
1898 services_ExecQueryAsync
,
1899 services_AssociatorsOf
,
1900 services_AssociatorsOfAsync
,
1901 services_ReferencesTo
,
1902 services_ReferencesToAsync
,
1903 services_ExecNotificationQuery
,
1904 services_ExecNotificationQueryAsync
,
1905 services_ExecMethod
,
1906 services_ExecMethodAsync
,
1907 services_get_Security_
1910 static HRESULT
SWbemServices_create( IWbemServices
*wbem_services
, ISWbemServices
**obj
)
1912 struct services
*services
;
1914 TRACE( "%p, %p\n", obj
, wbem_services
);
1916 if (!(services
= heap_alloc( sizeof(*services
) ))) return E_OUTOFMEMORY
;
1917 services
->ISWbemServices_iface
.lpVtbl
= &services_vtbl
;
1919 services
->services
= wbem_services
;
1920 IWbemServices_AddRef( services
->services
);
1922 *obj
= &services
->ISWbemServices_iface
;
1923 TRACE( "returning iface %p\n", *obj
);
1929 ISWbemLocator ISWbemLocator_iface
;
1931 IWbemLocator
*locator
;
1934 static inline struct locator
*impl_from_ISWbemLocator( ISWbemLocator
*iface
)
1936 return CONTAINING_RECORD( iface
, struct locator
, ISWbemLocator_iface
);
1939 static ULONG WINAPI
locator_AddRef(
1940 ISWbemLocator
*iface
)
1942 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1943 return InterlockedIncrement( &locator
->refs
);
1946 static ULONG WINAPI
locator_Release(
1947 ISWbemLocator
*iface
)
1949 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1950 LONG refs
= InterlockedDecrement( &locator
->refs
);
1953 TRACE( "destroying %p\n", locator
);
1954 if (locator
->locator
)
1955 IWbemLocator_Release( locator
->locator
);
1956 heap_free( locator
);
1961 static HRESULT WINAPI
locator_QueryInterface(
1962 ISWbemLocator
*iface
,
1966 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1968 TRACE( "%p, %s, %p\n", locator
, debugstr_guid( riid
), ppvObject
);
1970 if (IsEqualGUID( riid
, &IID_ISWbemLocator
) ||
1971 IsEqualGUID( riid
, &IID_IDispatch
) ||
1972 IsEqualGUID( riid
, &IID_IUnknown
))
1978 FIXME( "interface %s not implemented\n", debugstr_guid(riid
) );
1979 return E_NOINTERFACE
;
1981 ISWbemLocator_AddRef( iface
);
1985 static HRESULT WINAPI
locator_GetTypeInfoCount(
1986 ISWbemLocator
*iface
,
1989 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
1991 TRACE( "%p, %p\n", locator
, count
);
1996 static HRESULT WINAPI
locator_GetTypeInfo(
1997 ISWbemLocator
*iface
,
2002 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2003 TRACE( "%p, %u, %u, %p\n", locator
, index
, lcid
, info
);
2005 return get_typeinfo( ISWbemLocator_tid
, info
);
2008 static HRESULT WINAPI
locator_GetIDsOfNames(
2009 ISWbemLocator
*iface
,
2016 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2017 ITypeInfo
*typeinfo
;
2020 TRACE( "%p, %s, %p, %u, %u, %p\n", locator
, debugstr_guid(riid
), names
, count
, lcid
, dispid
);
2022 if (!names
|| !count
|| !dispid
) return E_INVALIDARG
;
2024 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
2027 hr
= ITypeInfo_GetIDsOfNames( typeinfo
, names
, count
, dispid
);
2028 ITypeInfo_Release( typeinfo
);
2033 static HRESULT WINAPI
locator_Invoke(
2034 ISWbemLocator
*iface
,
2041 EXCEPINFO
*excep_info
,
2044 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2045 ITypeInfo
*typeinfo
;
2048 TRACE( "%p, %d, %s, %d, %d, %p, %p, %p, %p\n", locator
, member
, debugstr_guid(riid
),
2049 lcid
, flags
, params
, result
, excep_info
, arg_err
);
2051 hr
= get_typeinfo( ISWbemLocator_tid
, &typeinfo
);
2054 hr
= ITypeInfo_Invoke( typeinfo
, &locator
->ISWbemLocator_iface
, member
, flags
,
2055 params
, result
, excep_info
, arg_err
);
2056 ITypeInfo_Release( typeinfo
);
2061 static BSTR
build_resource_string( BSTR server
, BSTR
namespace )
2063 static const WCHAR defaultW
[] = {'r','o','o','t','\\','d','e','f','a','u','l','t',0};
2064 ULONG len
, len_server
= 0, len_namespace
= 0;
2067 if (server
&& *server
) len_server
= strlenW( server
);
2068 else len_server
= 1;
2069 if (namespace && *namespace) len_namespace
= strlenW( namespace );
2070 else len_namespace
= sizeof(defaultW
) / sizeof(defaultW
[0]) - 1;
2072 if (!(ret
= SysAllocStringLen( NULL
, 2 + len_server
+ 1 + len_namespace
))) return NULL
;
2074 ret
[0] = ret
[1] = '\\';
2075 if (server
&& *server
) strcpyW( ret
+ 2, server
);
2078 len
= len_server
+ 2;
2081 if (namespace && *namespace) strcpyW( ret
+ len
, namespace );
2082 else strcpyW( ret
+ len
, defaultW
);
2086 static HRESULT WINAPI
locator_ConnectServer(
2087 ISWbemLocator
*iface
,
2094 LONG iSecurityFlags
,
2095 IDispatch
*objWbemNamedValueSet
,
2096 ISWbemServices
**objWbemServices
)
2098 struct locator
*locator
= impl_from_ISWbemLocator( iface
);
2099 IWbemServices
*services
;
2103 TRACE( "%p, %s, %s, %s, %p, %s, %s, 0x%08x, %p, %p\n", iface
, debugstr_w(strServer
),
2104 debugstr_w(strNamespace
), debugstr_w(strUser
), strPassword
, debugstr_w(strLocale
),
2105 debugstr_w(strAuthority
), iSecurityFlags
, objWbemNamedValueSet
, objWbemServices
);
2107 if (objWbemNamedValueSet
) FIXME( "context not supported\n" );
2109 if (!locator
->locator
)
2111 hr
= CoCreateInstance( &CLSID_WbemLocator
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IWbemLocator
,
2112 (void **)&locator
->locator
);
2113 if (hr
!= S_OK
) return hr
;
2116 if (!(resource
= build_resource_string( strServer
, strNamespace
))) return E_OUTOFMEMORY
;
2117 hr
= IWbemLocator_ConnectServer( locator
->locator
, resource
, strUser
, strPassword
, strLocale
,
2118 iSecurityFlags
, strAuthority
, NULL
, &services
);
2119 SysFreeString( resource
);
2120 if (hr
!= S_OK
) return hr
;
2122 hr
= SWbemServices_create( services
, objWbemServices
);
2123 IWbemServices_Release( services
);
2127 static HRESULT WINAPI
locator_get_Security_(
2128 ISWbemLocator
*iface
,
2129 ISWbemSecurity
**objWbemSecurity
)
2131 FIXME( "%p, %p\n", iface
, objWbemSecurity
);
2135 static const ISWbemLocatorVtbl locator_vtbl
=
2137 locator_QueryInterface
,
2140 locator_GetTypeInfoCount
,
2141 locator_GetTypeInfo
,
2142 locator_GetIDsOfNames
,
2144 locator_ConnectServer
,
2145 locator_get_Security_
2148 HRESULT
SWbemLocator_create( void **obj
)
2150 struct locator
*locator
;
2152 TRACE( "%p\n", obj
);
2154 if (!(locator
= heap_alloc( sizeof(*locator
) ))) return E_OUTOFMEMORY
;
2155 locator
->ISWbemLocator_iface
.lpVtbl
= &locator_vtbl
;
2157 locator
->locator
= NULL
;
2159 *obj
= &locator
->ISWbemLocator_iface
;
2160 TRACE( "returning iface %p\n", *obj
);