2 * Copyright 2012 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
29 #include "wine/debug.h"
30 #include "wbemprox_private.h"
32 WINE_DEFAULT_DEBUG_CHANNEL(wbemprox
);
34 struct enum_class_object
36 IEnumWbemClassObject IEnumWbemClassObject_iface
;
42 static inline struct enum_class_object
*impl_from_IEnumWbemClassObject(
43 IEnumWbemClassObject
*iface
)
45 return CONTAINING_RECORD(iface
, struct enum_class_object
, IEnumWbemClassObject_iface
);
48 static ULONG WINAPI
enum_class_object_AddRef(
49 IEnumWbemClassObject
*iface
)
51 struct enum_class_object
*ec
= impl_from_IEnumWbemClassObject( iface
);
52 return InterlockedIncrement( &ec
->refs
);
55 static ULONG WINAPI
enum_class_object_Release(
56 IEnumWbemClassObject
*iface
)
58 struct enum_class_object
*ec
= impl_from_IEnumWbemClassObject( iface
);
59 LONG refs
= InterlockedDecrement( &ec
->refs
);
62 TRACE("destroying %p\n", ec
);
63 release_query( ec
->query
);
69 static HRESULT WINAPI
enum_class_object_QueryInterface(
70 IEnumWbemClassObject
*iface
,
74 struct enum_class_object
*ec
= impl_from_IEnumWbemClassObject( iface
);
76 TRACE("%p, %s, %p\n", ec
, debugstr_guid( riid
), ppvObject
);
78 if ( IsEqualGUID( riid
, &IID_IEnumWbemClassObject
) ||
79 IsEqualGUID( riid
, &IID_IUnknown
) )
83 else if ( IsEqualGUID( riid
, &IID_IClientSecurity
) )
85 *ppvObject
= &client_security
;
90 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
93 IEnumWbemClassObject_AddRef( iface
);
97 static HRESULT WINAPI
enum_class_object_Reset(
98 IEnumWbemClassObject
*iface
)
100 struct enum_class_object
*ec
= impl_from_IEnumWbemClassObject( iface
);
102 TRACE("%p\n", iface
);
105 return WBEM_S_NO_ERROR
;
108 static HRESULT WINAPI
enum_class_object_Next(
109 IEnumWbemClassObject
*iface
,
112 IWbemClassObject
**apObjects
,
115 struct enum_class_object
*ec
= impl_from_IEnumWbemClassObject( iface
);
116 struct view
*view
= ec
->query
->view
;
119 TRACE("%p, %d, %u, %p, %p\n", iface
, lTimeout
, uCount
, apObjects
, puReturned
);
121 if (!uCount
) return WBEM_S_FALSE
;
122 if (!apObjects
|| !puReturned
) return WBEM_E_INVALID_PARAMETER
;
123 if (lTimeout
!= WBEM_INFINITE
) FIXME("timeout not supported\n");
126 if (ec
->index
+ uCount
> view
->count
) return WBEM_S_FALSE
;
128 hr
= WbemClassObject_create( NULL
, iface
, ec
->index
, (void **)apObjects
);
129 if (hr
!= S_OK
) return hr
;
133 if (ec
->index
== view
->count
) return WBEM_S_FALSE
;
134 if (uCount
> 1) return WBEM_S_TIMEDOUT
;
135 return WBEM_S_NO_ERROR
;
138 static HRESULT WINAPI
enum_class_object_NextAsync(
139 IEnumWbemClassObject
*iface
,
141 IWbemObjectSink
*pSink
)
143 FIXME("%p, %u, %p\n", iface
, uCount
, pSink
);
147 static HRESULT WINAPI
enum_class_object_Clone(
148 IEnumWbemClassObject
*iface
,
149 IEnumWbemClassObject
**ppEnum
)
151 FIXME("%p, %p\n", iface
, ppEnum
);
155 static HRESULT WINAPI
enum_class_object_Skip(
156 IEnumWbemClassObject
*iface
,
160 struct enum_class_object
*ec
= impl_from_IEnumWbemClassObject( iface
);
161 struct view
*view
= ec
->query
->view
;
163 TRACE("%p, %d, %u\n", iface
, lTimeout
, nCount
);
165 if (lTimeout
!= WBEM_INFINITE
) FIXME("timeout not supported\n");
167 if (ec
->index
+ nCount
>= view
->count
)
169 ec
->index
= view
->count
- 1;
173 return WBEM_S_NO_ERROR
;
176 static const IEnumWbemClassObjectVtbl enum_class_object_vtbl
=
178 enum_class_object_QueryInterface
,
179 enum_class_object_AddRef
,
180 enum_class_object_Release
,
181 enum_class_object_Reset
,
182 enum_class_object_Next
,
183 enum_class_object_NextAsync
,
184 enum_class_object_Clone
,
185 enum_class_object_Skip
188 HRESULT
EnumWbemClassObject_create(
189 IUnknown
*pUnkOuter
, struct query
*query
, LPVOID
*ppObj
)
191 struct enum_class_object
*ec
;
193 TRACE("%p, %p\n", pUnkOuter
, ppObj
);
195 ec
= heap_alloc( sizeof(*ec
) );
196 if (!ec
) return E_OUTOFMEMORY
;
198 ec
->IEnumWbemClassObject_iface
.lpVtbl
= &enum_class_object_vtbl
;
201 addref_query( query
);
204 *ppObj
= &ec
->IEnumWbemClassObject_iface
;
206 TRACE("returning iface %p\n", *ppObj
);
212 IWbemClassObject IWbemClassObject_iface
;
214 IEnumWbemClassObject
*iter
;
218 static inline struct class_object
*impl_from_IWbemClassObject(
219 IWbemClassObject
*iface
)
221 return CONTAINING_RECORD(iface
, struct class_object
, IWbemClassObject_iface
);
224 static ULONG WINAPI
class_object_AddRef(
225 IWbemClassObject
*iface
)
227 struct class_object
*co
= impl_from_IWbemClassObject( iface
);
228 return InterlockedIncrement( &co
->refs
);
231 static ULONG WINAPI
class_object_Release(
232 IWbemClassObject
*iface
)
234 struct class_object
*co
= impl_from_IWbemClassObject( iface
);
235 LONG refs
= InterlockedDecrement( &co
->refs
);
238 TRACE("destroying %p\n", co
);
239 if (co
->iter
) IEnumWbemClassObject_Release( co
->iter
);
245 static HRESULT WINAPI
class_object_QueryInterface(
246 IWbemClassObject
*iface
,
250 struct class_object
*co
= impl_from_IWbemClassObject( iface
);
252 TRACE("%p, %s, %p\n", co
, debugstr_guid( riid
), ppvObject
);
254 if ( IsEqualGUID( riid
, &IID_IWbemClassObject
) ||
255 IsEqualGUID( riid
, &IID_IUnknown
) )
261 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
262 return E_NOINTERFACE
;
264 IWbemClassObject_AddRef( iface
);
268 static HRESULT WINAPI
class_object_GetQualifierSet(
269 IWbemClassObject
*iface
,
270 IWbemQualifierSet
**ppQualSet
)
272 FIXME("%p, %p\n", iface
, ppQualSet
);
276 static HRESULT WINAPI
class_object_Get(
277 IWbemClassObject
*iface
,
284 struct class_object
*co
= impl_from_IWbemClassObject( iface
);
285 struct enum_class_object
*ec
= impl_from_IEnumWbemClassObject( co
->iter
);
286 struct view
*view
= ec
->query
->view
;
288 TRACE("%p, %s, %08x, %p, %p, %p\n", iface
, debugstr_w(wszName
), lFlags
, pVal
, pType
, plFlavor
);
292 FIXME("flavor parameter not supported\n");
295 return get_propval( view
, co
->index
, wszName
, pVal
, pType
);
298 static HRESULT WINAPI
class_object_Put(
299 IWbemClassObject
*iface
,
305 FIXME("%p, %s, %08x, %p, %u\n", iface
, debugstr_w(wszName
), lFlags
, pVal
, Type
);
309 static HRESULT WINAPI
class_object_Delete(
310 IWbemClassObject
*iface
,
313 FIXME("%p, %s\n", iface
, debugstr_w(wszName
));
317 static HRESULT WINAPI
class_object_GetNames(
318 IWbemClassObject
*iface
,
319 LPCWSTR wszQualifierName
,
321 VARIANT
*pQualifierVal
,
324 struct class_object
*co
= impl_from_IWbemClassObject( iface
);
325 struct enum_class_object
*ec
= impl_from_IEnumWbemClassObject( co
->iter
);
327 TRACE("%p, %s, %08x, %p, %p\n", iface
, debugstr_w(wszQualifierName
), lFlags
, pQualifierVal
, pNames
);
329 if (wszQualifierName
|| pQualifierVal
)
331 FIXME("qualifier not supported\n");
334 if (lFlags
!= WBEM_FLAG_ALWAYS
)
336 FIXME("flags %08x not supported\n", lFlags
);
339 return get_properties( ec
->query
->view
, pNames
);
342 static HRESULT WINAPI
class_object_BeginEnumeration(
343 IWbemClassObject
*iface
,
346 FIXME("%p, %08x\n", iface
, lEnumFlags
);
350 static HRESULT WINAPI
class_object_Next(
351 IWbemClassObject
*iface
,
358 FIXME("%p, %08x, %p, %p, %p, %p\n", iface
, lFlags
, strName
, pVal
, pType
, plFlavor
);
362 static HRESULT WINAPI
class_object_EndEnumeration(
363 IWbemClassObject
*iface
)
365 FIXME("%p\n", iface
);
369 static HRESULT WINAPI
class_object_GetPropertyQualifierSet(
370 IWbemClassObject
*iface
,
372 IWbemQualifierSet
**ppQualSet
)
374 FIXME("%p, %s, %p\n", iface
, debugstr_w(wszProperty
), ppQualSet
);
378 static HRESULT WINAPI
class_object_Clone(
379 IWbemClassObject
*iface
,
380 IWbemClassObject
**ppCopy
)
382 FIXME("%p, %p\n", iface
, ppCopy
);
386 static HRESULT WINAPI
class_object_GetObjectText(
387 IWbemClassObject
*iface
,
389 BSTR
*pstrObjectText
)
391 FIXME("%p, %08x, %p\n", iface
, lFlags
, pstrObjectText
);
395 static HRESULT WINAPI
class_object_SpawnDerivedClass(
396 IWbemClassObject
*iface
,
398 IWbemClassObject
**ppNewClass
)
400 FIXME("%p, %08x, %p\n", iface
, lFlags
, ppNewClass
);
404 static HRESULT WINAPI
class_object_SpawnInstance(
405 IWbemClassObject
*iface
,
407 IWbemClassObject
**ppNewInstance
)
409 FIXME("%p, %08x, %p\n", iface
, lFlags
, ppNewInstance
);
413 static HRESULT WINAPI
class_object_CompareTo(
414 IWbemClassObject
*iface
,
416 IWbemClassObject
*pCompareTo
)
418 FIXME("%p, %08x, %p\n", iface
, lFlags
, pCompareTo
);
422 static HRESULT WINAPI
class_object_GetPropertyOrigin(
423 IWbemClassObject
*iface
,
425 BSTR
*pstrClassName
)
427 FIXME("%p, %s, %p\n", iface
, debugstr_w(wszName
), pstrClassName
);
431 static HRESULT WINAPI
class_object_InheritsFrom(
432 IWbemClassObject
*iface
,
433 LPCWSTR strAncestor
)
435 FIXME("%p, %s\n", iface
, debugstr_w(strAncestor
));
439 static HRESULT WINAPI
class_object_GetMethod(
440 IWbemClassObject
*iface
,
443 IWbemClassObject
**ppInSignature
,
444 IWbemClassObject
**ppOutSignature
)
446 FIXME("%p, %s, %08x, %p, %p\n", iface
, debugstr_w(wszName
), lFlags
, ppInSignature
, ppOutSignature
);
450 static HRESULT WINAPI
class_object_PutMethod(
451 IWbemClassObject
*iface
,
454 IWbemClassObject
*pInSignature
,
455 IWbemClassObject
*pOutSignature
)
457 FIXME("%p, %s, %08x, %p, %p\n", iface
, debugstr_w(wszName
), lFlags
, pInSignature
, pOutSignature
);
461 static HRESULT WINAPI
class_object_DeleteMethod(
462 IWbemClassObject
*iface
,
465 FIXME("%p, %s\n", iface
, debugstr_w(wszName
));
469 static HRESULT WINAPI
class_object_BeginMethodEnumeration(
470 IWbemClassObject
*iface
,
473 FIXME("%p, %08x\n", iface
, lEnumFlags
);
477 static HRESULT WINAPI
class_object_NextMethod(
478 IWbemClassObject
*iface
,
481 IWbemClassObject
**ppInSignature
,
482 IWbemClassObject
**ppOutSignature
)
484 FIXME("%p, %08x, %p, %p, %p\n", iface
, lFlags
, pstrName
, ppInSignature
, ppOutSignature
);
488 static HRESULT WINAPI
class_object_EndMethodEnumeration(
489 IWbemClassObject
*iface
)
491 FIXME("%p\n", iface
);
495 static HRESULT WINAPI
class_object_GetMethodQualifierSet(
496 IWbemClassObject
*iface
,
498 IWbemQualifierSet
**ppQualSet
)
500 FIXME("%p, %s, %p\n", iface
, debugstr_w(wszMethod
), ppQualSet
);
504 static HRESULT WINAPI
class_object_GetMethodOrigin(
505 IWbemClassObject
*iface
,
506 LPCWSTR wszMethodName
,
509 FIXME("%p, %s, %p\n", iface
, debugstr_w(wszMethodName
), pstrClassName
);
513 static const IWbemClassObjectVtbl class_object_vtbl
=
515 class_object_QueryInterface
,
517 class_object_Release
,
518 class_object_GetQualifierSet
,
522 class_object_GetNames
,
523 class_object_BeginEnumeration
,
525 class_object_EndEnumeration
,
526 class_object_GetPropertyQualifierSet
,
528 class_object_GetObjectText
,
529 class_object_SpawnDerivedClass
,
530 class_object_SpawnInstance
,
531 class_object_CompareTo
,
532 class_object_GetPropertyOrigin
,
533 class_object_InheritsFrom
,
534 class_object_GetMethod
,
535 class_object_PutMethod
,
536 class_object_DeleteMethod
,
537 class_object_BeginMethodEnumeration
,
538 class_object_NextMethod
,
539 class_object_EndMethodEnumeration
,
540 class_object_GetMethodQualifierSet
,
541 class_object_GetMethodOrigin
544 HRESULT
WbemClassObject_create(
545 IUnknown
*pUnkOuter
, IEnumWbemClassObject
*iter
, UINT index
, LPVOID
*ppObj
)
547 struct class_object
*co
;
549 TRACE("%p, %p\n", pUnkOuter
, ppObj
);
551 co
= heap_alloc( sizeof(*co
) );
552 if (!co
) return E_OUTOFMEMORY
;
554 co
->IWbemClassObject_iface
.lpVtbl
= &class_object_vtbl
;
558 if (iter
) IEnumWbemClassObject_AddRef( iter
);
560 *ppObj
= &co
->IWbemClassObject_iface
;
562 TRACE("returning iface %p\n", *ppObj
);