wbemprox: Add reference counting to the query object.
[wine/multimedia.git] / dlls / wbemprox / class.c
blobe82620281bfd6749a6f489f62a073d493d530d97
1 /*
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
19 #define COBJMACROS
21 #include "config.h"
22 #include <stdarg.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "objbase.h"
27 #include "wbemcli.h"
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;
37 LONG refs;
38 struct query *query;
39 UINT index;
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 );
60 if (!refs)
62 TRACE("destroying %p\n", ec);
63 release_query( ec->query );
64 heap_free( ec );
66 return refs;
69 static HRESULT WINAPI enum_class_object_QueryInterface(
70 IEnumWbemClassObject *iface,
71 REFIID riid,
72 void **ppvObject )
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 ) )
81 *ppvObject = ec;
83 else if ( IsEqualGUID( riid, &IID_IClientSecurity ) )
85 *ppvObject = &client_security;
86 return S_OK;
88 else
90 FIXME("interface %s not implemented\n", debugstr_guid(riid));
91 return E_NOINTERFACE;
93 IEnumWbemClassObject_AddRef( iface );
94 return S_OK;
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);
104 ec->index = 0;
105 return WBEM_S_NO_ERROR;
108 static HRESULT WINAPI enum_class_object_Next(
109 IEnumWbemClassObject *iface,
110 LONG lTimeout,
111 ULONG uCount,
112 IWbemClassObject **apObjects,
113 ULONG *puReturned )
115 struct enum_class_object *ec = impl_from_IEnumWbemClassObject( iface );
116 struct view *view = ec->query->view;
117 HRESULT hr;
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");
125 *puReturned = 0;
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;
131 ec->index++;
132 *puReturned = 1;
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,
140 ULONG uCount,
141 IWbemObjectSink *pSink )
143 FIXME("%p, %u, %p\n", iface, uCount, pSink);
144 return E_NOTIMPL;
147 static HRESULT WINAPI enum_class_object_Clone(
148 IEnumWbemClassObject *iface,
149 IEnumWbemClassObject **ppEnum )
151 FIXME("%p, %p\n", iface, ppEnum);
152 return E_NOTIMPL;
155 static HRESULT WINAPI enum_class_object_Skip(
156 IEnumWbemClassObject *iface,
157 LONG lTimeout,
158 ULONG nCount )
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;
170 return WBEM_S_FALSE;
172 ec->index += nCount;
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;
199 ec->refs = 1;
200 ec->query = query;
201 addref_query( query );
202 ec->index = 0;
204 *ppObj = &ec->IEnumWbemClassObject_iface;
206 TRACE("returning iface %p\n", *ppObj);
207 return S_OK;
210 struct class_object
212 IWbemClassObject IWbemClassObject_iface;
213 LONG refs;
214 IEnumWbemClassObject *iter;
215 UINT index;
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 );
236 if (!refs)
238 TRACE("destroying %p\n", co);
239 if (co->iter) IEnumWbemClassObject_Release( co->iter );
240 heap_free( co );
242 return refs;
245 static HRESULT WINAPI class_object_QueryInterface(
246 IWbemClassObject *iface,
247 REFIID riid,
248 void **ppvObject )
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 ) )
257 *ppvObject = co;
259 else
261 FIXME("interface %s not implemented\n", debugstr_guid(riid));
262 return E_NOINTERFACE;
264 IWbemClassObject_AddRef( iface );
265 return S_OK;
268 static HRESULT WINAPI class_object_GetQualifierSet(
269 IWbemClassObject *iface,
270 IWbemQualifierSet **ppQualSet )
272 FIXME("%p, %p\n", iface, ppQualSet);
273 return E_NOTIMPL;
276 static HRESULT WINAPI class_object_Get(
277 IWbemClassObject *iface,
278 LPCWSTR wszName,
279 LONG lFlags,
280 VARIANT *pVal,
281 CIMTYPE *pType,
282 LONG *plFlavor )
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);
290 if (plFlavor)
292 FIXME("flavor parameter not supported\n");
293 *plFlavor = 0;
295 return get_propval( view, co->index, wszName, pVal, pType );
298 static HRESULT WINAPI class_object_Put(
299 IWbemClassObject *iface,
300 LPCWSTR wszName,
301 LONG lFlags,
302 VARIANT *pVal,
303 CIMTYPE Type )
305 FIXME("%p, %s, %08x, %p, %u\n", iface, debugstr_w(wszName), lFlags, pVal, Type);
306 return E_NOTIMPL;
309 static HRESULT WINAPI class_object_Delete(
310 IWbemClassObject *iface,
311 LPCWSTR wszName )
313 FIXME("%p, %s\n", iface, debugstr_w(wszName));
314 return E_NOTIMPL;
317 static HRESULT WINAPI class_object_GetNames(
318 IWbemClassObject *iface,
319 LPCWSTR wszQualifierName,
320 LONG lFlags,
321 VARIANT *pQualifierVal,
322 SAFEARRAY **pNames )
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");
332 return E_NOTIMPL;
334 if (lFlags != WBEM_FLAG_ALWAYS)
336 FIXME("flags %08x not supported\n", lFlags);
337 return E_NOTIMPL;
339 return get_properties( ec->query->view, pNames );
342 static HRESULT WINAPI class_object_BeginEnumeration(
343 IWbemClassObject *iface,
344 LONG lEnumFlags )
346 FIXME("%p, %08x\n", iface, lEnumFlags);
347 return E_NOTIMPL;
350 static HRESULT WINAPI class_object_Next(
351 IWbemClassObject *iface,
352 LONG lFlags,
353 BSTR *strName,
354 VARIANT *pVal,
355 CIMTYPE *pType,
356 LONG *plFlavor )
358 FIXME("%p, %08x, %p, %p, %p, %p\n", iface, lFlags, strName, pVal, pType, plFlavor);
359 return E_NOTIMPL;
362 static HRESULT WINAPI class_object_EndEnumeration(
363 IWbemClassObject *iface )
365 FIXME("%p\n", iface);
366 return E_NOTIMPL;
369 static HRESULT WINAPI class_object_GetPropertyQualifierSet(
370 IWbemClassObject *iface,
371 LPCWSTR wszProperty,
372 IWbemQualifierSet **ppQualSet )
374 FIXME("%p, %s, %p\n", iface, debugstr_w(wszProperty), ppQualSet);
375 return E_NOTIMPL;
378 static HRESULT WINAPI class_object_Clone(
379 IWbemClassObject *iface,
380 IWbemClassObject **ppCopy )
382 FIXME("%p, %p\n", iface, ppCopy);
383 return E_NOTIMPL;
386 static HRESULT WINAPI class_object_GetObjectText(
387 IWbemClassObject *iface,
388 LONG lFlags,
389 BSTR *pstrObjectText )
391 FIXME("%p, %08x, %p\n", iface, lFlags, pstrObjectText);
392 return E_NOTIMPL;
395 static HRESULT WINAPI class_object_SpawnDerivedClass(
396 IWbemClassObject *iface,
397 LONG lFlags,
398 IWbemClassObject **ppNewClass )
400 FIXME("%p, %08x, %p\n", iface, lFlags, ppNewClass);
401 return E_NOTIMPL;
404 static HRESULT WINAPI class_object_SpawnInstance(
405 IWbemClassObject *iface,
406 LONG lFlags,
407 IWbemClassObject **ppNewInstance )
409 FIXME("%p, %08x, %p\n", iface, lFlags, ppNewInstance);
410 return E_NOTIMPL;
413 static HRESULT WINAPI class_object_CompareTo(
414 IWbemClassObject *iface,
415 LONG lFlags,
416 IWbemClassObject *pCompareTo )
418 FIXME("%p, %08x, %p\n", iface, lFlags, pCompareTo);
419 return E_NOTIMPL;
422 static HRESULT WINAPI class_object_GetPropertyOrigin(
423 IWbemClassObject *iface,
424 LPCWSTR wszName,
425 BSTR *pstrClassName )
427 FIXME("%p, %s, %p\n", iface, debugstr_w(wszName), pstrClassName);
428 return E_NOTIMPL;
431 static HRESULT WINAPI class_object_InheritsFrom(
432 IWbemClassObject *iface,
433 LPCWSTR strAncestor )
435 FIXME("%p, %s\n", iface, debugstr_w(strAncestor));
436 return E_NOTIMPL;
439 static HRESULT WINAPI class_object_GetMethod(
440 IWbemClassObject *iface,
441 LPCWSTR wszName,
442 LONG lFlags,
443 IWbemClassObject **ppInSignature,
444 IWbemClassObject **ppOutSignature )
446 FIXME("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszName), lFlags, ppInSignature, ppOutSignature);
447 return E_NOTIMPL;
450 static HRESULT WINAPI class_object_PutMethod(
451 IWbemClassObject *iface,
452 LPCWSTR wszName,
453 LONG lFlags,
454 IWbemClassObject *pInSignature,
455 IWbemClassObject *pOutSignature )
457 FIXME("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszName), lFlags, pInSignature, pOutSignature);
458 return E_NOTIMPL;
461 static HRESULT WINAPI class_object_DeleteMethod(
462 IWbemClassObject *iface,
463 LPCWSTR wszName )
465 FIXME("%p, %s\n", iface, debugstr_w(wszName));
466 return E_NOTIMPL;
469 static HRESULT WINAPI class_object_BeginMethodEnumeration(
470 IWbemClassObject *iface,
471 LONG lEnumFlags)
473 FIXME("%p, %08x\n", iface, lEnumFlags);
474 return E_NOTIMPL;
477 static HRESULT WINAPI class_object_NextMethod(
478 IWbemClassObject *iface,
479 LONG lFlags,
480 BSTR *pstrName,
481 IWbemClassObject **ppInSignature,
482 IWbemClassObject **ppOutSignature)
484 FIXME("%p, %08x, %p, %p, %p\n", iface, lFlags, pstrName, ppInSignature, ppOutSignature);
485 return E_NOTIMPL;
488 static HRESULT WINAPI class_object_EndMethodEnumeration(
489 IWbemClassObject *iface )
491 FIXME("%p\n", iface);
492 return E_NOTIMPL;
495 static HRESULT WINAPI class_object_GetMethodQualifierSet(
496 IWbemClassObject *iface,
497 LPCWSTR wszMethod,
498 IWbemQualifierSet **ppQualSet)
500 FIXME("%p, %s, %p\n", iface, debugstr_w(wszMethod), ppQualSet);
501 return E_NOTIMPL;
504 static HRESULT WINAPI class_object_GetMethodOrigin(
505 IWbemClassObject *iface,
506 LPCWSTR wszMethodName,
507 BSTR *pstrClassName)
509 FIXME("%p, %s, %p\n", iface, debugstr_w(wszMethodName), pstrClassName);
510 return E_NOTIMPL;
513 static const IWbemClassObjectVtbl class_object_vtbl =
515 class_object_QueryInterface,
516 class_object_AddRef,
517 class_object_Release,
518 class_object_GetQualifierSet,
519 class_object_Get,
520 class_object_Put,
521 class_object_Delete,
522 class_object_GetNames,
523 class_object_BeginEnumeration,
524 class_object_Next,
525 class_object_EndEnumeration,
526 class_object_GetPropertyQualifierSet,
527 class_object_Clone,
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;
555 co->refs = 1;
556 co->iter = iter;
557 co->index = index;
558 if (iter) IEnumWbemClassObject_AddRef( iter );
560 *ppObj = &co->IWbemClassObject_iface;
562 TRACE("returning iface %p\n", *ppObj);
563 return S_OK;