wbemprox: Implement IEnumWbemClassObject::Skip.
[wine/multimedia.git] / dlls / wbemprox / class.c
blobb31dcbb569d1f66ca0e3da2ccb8cd505bed3a005
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;
41 static inline struct enum_class_object *impl_from_IEnumWbemClassObject(
42 IEnumWbemClassObject *iface )
44 return CONTAINING_RECORD(iface, struct enum_class_object, IEnumWbemClassObject_iface);
47 static ULONG WINAPI enum_class_object_AddRef(
48 IEnumWbemClassObject *iface )
50 struct enum_class_object *ec = impl_from_IEnumWbemClassObject( iface );
51 return InterlockedIncrement( &ec->refs );
54 static ULONG WINAPI enum_class_object_Release(
55 IEnumWbemClassObject *iface )
57 struct enum_class_object *ec = impl_from_IEnumWbemClassObject( iface );
58 LONG refs = InterlockedDecrement( &ec->refs );
59 if (!refs)
61 TRACE("destroying %p\n", ec);
62 free_query( ec->query );
63 heap_free( ec );
65 return refs;
68 static HRESULT WINAPI enum_class_object_QueryInterface(
69 IEnumWbemClassObject *iface,
70 REFIID riid,
71 void **ppvObject )
73 struct enum_class_object *ec = impl_from_IEnumWbemClassObject( iface );
75 TRACE("%p, %s, %p\n", ec, debugstr_guid( riid ), ppvObject );
77 if ( IsEqualGUID( riid, &IID_IEnumWbemClassObject ) ||
78 IsEqualGUID( riid, &IID_IUnknown ) )
80 *ppvObject = ec;
82 else
84 FIXME("interface %s not implemented\n", debugstr_guid(riid));
85 return E_NOINTERFACE;
87 IEnumWbemClassObject_AddRef( iface );
88 return S_OK;
91 static HRESULT WINAPI enum_class_object_Reset(
92 IEnumWbemClassObject *iface )
94 struct enum_class_object *ec = impl_from_IEnumWbemClassObject( iface );
95 struct view *view = ec->query->view;
97 TRACE("%p\n", iface);
99 view->index = 0;
100 return WBEM_S_NO_ERROR;
103 static HRESULT WINAPI enum_class_object_Next(
104 IEnumWbemClassObject *iface,
105 LONG lTimeout,
106 ULONG uCount,
107 IWbemClassObject **apObjects,
108 ULONG *puReturned )
110 struct enum_class_object *ec = impl_from_IEnumWbemClassObject( iface );
111 struct view *view = ec->query->view;
112 HRESULT hr;
114 TRACE("%p, %d, %u, %p, %p\n", iface, lTimeout, uCount, apObjects, puReturned);
116 if (!uCount) return WBEM_S_FALSE;
117 if (!apObjects || !puReturned) return WBEM_E_INVALID_PARAMETER;
118 if (lTimeout != WBEM_INFINITE) FIXME("timeout not supported\n");
120 *puReturned = 0;
121 if (view->index + uCount > view->count) return WBEM_S_FALSE;
123 hr = WbemClassObject_create( NULL, iface, view->index, (void **)apObjects );
124 if (hr != S_OK) return hr;
126 view->index++;
127 *puReturned = 1;
128 if (view->index == view->count) return WBEM_S_FALSE;
129 if (uCount > 1) return WBEM_S_TIMEDOUT;
130 return WBEM_S_NO_ERROR;
133 static HRESULT WINAPI enum_class_object_NextAsync(
134 IEnumWbemClassObject *iface,
135 ULONG uCount,
136 IWbemObjectSink *pSink )
138 FIXME("%p, %u, %p\n", iface, uCount, pSink);
139 return E_NOTIMPL;
142 static HRESULT WINAPI enum_class_object_Clone(
143 IEnumWbemClassObject *iface,
144 IEnumWbemClassObject **ppEnum )
146 FIXME("%p, %p\n", iface, ppEnum);
147 return E_NOTIMPL;
150 static HRESULT WINAPI enum_class_object_Skip(
151 IEnumWbemClassObject *iface,
152 LONG lTimeout,
153 ULONG nCount )
155 struct enum_class_object *ec = impl_from_IEnumWbemClassObject( iface );
156 struct view *view = ec->query->view;
158 TRACE("%p, %d, %u\n", iface, lTimeout, nCount);
160 if (lTimeout != WBEM_INFINITE) FIXME("timeout not supported\n");
162 if (view->index + nCount >= view->count)
164 view->index = view->count - 1;
165 return WBEM_S_FALSE;
167 view->index += nCount;
168 return WBEM_S_NO_ERROR;
171 static const IEnumWbemClassObjectVtbl enum_class_object_vtbl =
173 enum_class_object_QueryInterface,
174 enum_class_object_AddRef,
175 enum_class_object_Release,
176 enum_class_object_Reset,
177 enum_class_object_Next,
178 enum_class_object_NextAsync,
179 enum_class_object_Clone,
180 enum_class_object_Skip
183 HRESULT EnumWbemClassObject_create(
184 IUnknown *pUnkOuter, struct query *query, LPVOID *ppObj )
186 struct enum_class_object *ec;
188 TRACE("%p, %p\n", pUnkOuter, ppObj);
190 ec = heap_alloc( sizeof(*ec) );
191 if (!ec) return E_OUTOFMEMORY;
193 ec->IEnumWbemClassObject_iface.lpVtbl = &enum_class_object_vtbl;
194 ec->refs = 1;
195 ec->query = query;
197 *ppObj = &ec->IEnumWbemClassObject_iface;
199 TRACE("returning iface %p\n", *ppObj);
200 return S_OK;
203 struct class_object
205 IWbemClassObject IWbemClassObject_iface;
206 LONG refs;
207 IEnumWbemClassObject *iter;
208 UINT index;
211 static inline struct class_object *impl_from_IWbemClassObject(
212 IWbemClassObject *iface )
214 return CONTAINING_RECORD(iface, struct class_object, IWbemClassObject_iface);
217 static ULONG WINAPI class_object_AddRef(
218 IWbemClassObject *iface )
220 struct class_object *co = impl_from_IWbemClassObject( iface );
221 return InterlockedIncrement( &co->refs );
224 static ULONG WINAPI class_object_Release(
225 IWbemClassObject *iface )
227 struct class_object *co = impl_from_IWbemClassObject( iface );
228 LONG refs = InterlockedDecrement( &co->refs );
229 if (!refs)
231 TRACE("destroying %p\n", co);
232 if (co->iter) IEnumWbemClassObject_Release( co->iter );
233 heap_free( co );
235 return refs;
238 static HRESULT WINAPI class_object_QueryInterface(
239 IWbemClassObject *iface,
240 REFIID riid,
241 void **ppvObject )
243 struct class_object *co = impl_from_IWbemClassObject( iface );
245 TRACE("%p, %s, %p\n", co, debugstr_guid( riid ), ppvObject );
247 if ( IsEqualGUID( riid, &IID_IWbemClassObject ) ||
248 IsEqualGUID( riid, &IID_IUnknown ) )
250 *ppvObject = co;
252 else
254 FIXME("interface %s not implemented\n", debugstr_guid(riid));
255 return E_NOINTERFACE;
257 IWbemClassObject_AddRef( iface );
258 return S_OK;
261 static HRESULT WINAPI class_object_GetQualifierSet(
262 IWbemClassObject *iface,
263 IWbemQualifierSet **ppQualSet )
265 FIXME("%p, %p\n", iface, ppQualSet);
266 return E_NOTIMPL;
269 static HRESULT WINAPI class_object_Get(
270 IWbemClassObject *iface,
271 LPCWSTR wszName,
272 LONG lFlags,
273 VARIANT *pVal,
274 CIMTYPE *pType,
275 LONG *plFlavor )
277 FIXME("%p, %s, %08x, %p, %p, %p\n", iface, debugstr_w(wszName), lFlags, pVal, pType, plFlavor);
278 return E_NOTIMPL;
281 static HRESULT WINAPI class_object_Put(
282 IWbemClassObject *iface,
283 LPCWSTR wszName,
284 LONG lFlags,
285 VARIANT *pVal,
286 CIMTYPE Type )
288 FIXME("%p, %s, %08x, %p, %u\n", iface, debugstr_w(wszName), lFlags, pVal, Type);
289 return E_NOTIMPL;
292 static HRESULT WINAPI class_object_Delete(
293 IWbemClassObject *iface,
294 LPCWSTR wszName )
296 FIXME("%p, %s\n", iface, debugstr_w(wszName));
297 return E_NOTIMPL;
300 static HRESULT WINAPI class_object_GetNames(
301 IWbemClassObject *iface,
302 LPCWSTR wszQualifierName,
303 LONG lFlags,
304 VARIANT *pQualifierVal,
305 SAFEARRAY *pNames )
307 FIXME("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszQualifierName), lFlags, pQualifierVal, pNames);
308 return E_NOTIMPL;
311 static HRESULT WINAPI class_object_BeginEnumeration(
312 IWbemClassObject *iface,
313 LONG lEnumFlags )
315 FIXME("%p, %08x\n", iface, lEnumFlags);
316 return E_NOTIMPL;
319 static HRESULT WINAPI class_object_Next(
320 IWbemClassObject *iface,
321 LONG lFlags,
322 BSTR *strName,
323 VARIANT *pVal,
324 CIMTYPE *pType,
325 LONG *plFlavor )
327 FIXME("%p, %08x, %p, %p, %p, %p\n", iface, lFlags, strName, pVal, pType, plFlavor);
328 return E_NOTIMPL;
331 static HRESULT WINAPI class_object_EndEnumeration(
332 IWbemClassObject *iface )
334 FIXME("%p\n", iface);
335 return E_NOTIMPL;
338 static HRESULT WINAPI class_object_GetPropertyQualifierSet(
339 IWbemClassObject *iface,
340 LPCWSTR wszProperty,
341 IWbemQualifierSet **ppQualSet )
343 FIXME("%p, %s, %p\n", iface, debugstr_w(wszProperty), ppQualSet);
344 return E_NOTIMPL;
347 static HRESULT WINAPI class_object_Clone(
348 IWbemClassObject *iface,
349 IWbemClassObject **ppCopy )
351 FIXME("%p, %p\n", iface, ppCopy);
352 return E_NOTIMPL;
355 static HRESULT WINAPI class_object_GetObjectText(
356 IWbemClassObject *iface,
357 LONG lFlags,
358 BSTR *pstrObjectText )
360 FIXME("%p, %08x, %p\n", iface, lFlags, pstrObjectText);
361 return E_NOTIMPL;
364 static HRESULT WINAPI class_object_SpawnDerivedClass(
365 IWbemClassObject *iface,
366 LONG lFlags,
367 IWbemClassObject **ppNewClass )
369 FIXME("%p, %08x, %p\n", iface, lFlags, ppNewClass);
370 return E_NOTIMPL;
373 static HRESULT WINAPI class_object_SpawnInstance(
374 IWbemClassObject *iface,
375 LONG lFlags,
376 IWbemClassObject **ppNewInstance )
378 FIXME("%p, %08x, %p\n", iface, lFlags, ppNewInstance);
379 return E_NOTIMPL;
382 static HRESULT WINAPI class_object_CompareTo(
383 IWbemClassObject *iface,
384 LONG lFlags,
385 IWbemClassObject *pCompareTo )
387 FIXME("%p, %08x, %p\n", iface, lFlags, pCompareTo);
388 return E_NOTIMPL;
391 static HRESULT WINAPI class_object_GetPropertyOrigin(
392 IWbemClassObject *iface,
393 LPCWSTR wszName,
394 BSTR *pstrClassName )
396 FIXME("%p, %s, %p\n", iface, debugstr_w(wszName), pstrClassName);
397 return E_NOTIMPL;
400 static HRESULT WINAPI class_object_InheritsFrom(
401 IWbemClassObject *iface,
402 LPCWSTR strAncestor )
404 FIXME("%p, %s\n", iface, debugstr_w(strAncestor));
405 return E_NOTIMPL;
408 static HRESULT WINAPI class_object_GetMethod(
409 IWbemClassObject *iface,
410 LPCWSTR wszName,
411 LONG lFlags,
412 IWbemClassObject **ppInSignature,
413 IWbemClassObject **ppOutSignature )
415 FIXME("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszName), lFlags, ppInSignature, ppOutSignature);
416 return E_NOTIMPL;
419 static HRESULT WINAPI class_object_PutMethod(
420 IWbemClassObject *iface,
421 LPCWSTR wszName,
422 LONG lFlags,
423 IWbemClassObject *pInSignature,
424 IWbemClassObject *pOutSignature )
426 FIXME("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszName), lFlags, pInSignature, pOutSignature);
427 return E_NOTIMPL;
430 static HRESULT WINAPI class_object_DeleteMethod(
431 IWbemClassObject *iface,
432 LPCWSTR wszName )
434 FIXME("%p, %s\n", iface, debugstr_w(wszName));
435 return E_NOTIMPL;
438 static HRESULT WINAPI class_object_BeginMethodEnumeration(
439 IWbemClassObject *iface,
440 LONG lEnumFlags)
442 FIXME("%p, %08x\n", iface, lEnumFlags);
443 return E_NOTIMPL;
446 static HRESULT WINAPI class_object_NextMethod(
447 IWbemClassObject *iface,
448 LONG lFlags,
449 BSTR *pstrName,
450 IWbemClassObject **ppInSignature,
451 IWbemClassObject **ppOutSignature)
453 FIXME("%p, %08x, %p, %p, %p\n", iface, lFlags, pstrName, ppInSignature, ppOutSignature);
454 return E_NOTIMPL;
457 static HRESULT WINAPI class_object_EndMethodEnumeration(
458 IWbemClassObject *iface )
460 FIXME("%p\n", iface);
461 return E_NOTIMPL;
464 static HRESULT WINAPI class_object_GetMethodQualifierSet(
465 IWbemClassObject *iface,
466 LPCWSTR wszMethod,
467 IWbemQualifierSet **ppQualSet)
469 FIXME("%p, %s, %p\n", iface, debugstr_w(wszMethod), ppQualSet);
470 return E_NOTIMPL;
473 static HRESULT WINAPI class_object_GetMethodOrigin(
474 IWbemClassObject *iface,
475 LPCWSTR wszMethodName,
476 BSTR *pstrClassName)
478 FIXME("%p, %s, %p\n", iface, debugstr_w(wszMethodName), pstrClassName);
479 return E_NOTIMPL;
482 static const IWbemClassObjectVtbl class_object_vtbl =
484 class_object_QueryInterface,
485 class_object_AddRef,
486 class_object_Release,
487 class_object_GetQualifierSet,
488 class_object_Get,
489 class_object_Put,
490 class_object_Delete,
491 class_object_GetNames,
492 class_object_BeginEnumeration,
493 class_object_Next,
494 class_object_EndEnumeration,
495 class_object_GetPropertyQualifierSet,
496 class_object_Clone,
497 class_object_GetObjectText,
498 class_object_SpawnDerivedClass,
499 class_object_SpawnInstance,
500 class_object_CompareTo,
501 class_object_GetPropertyOrigin,
502 class_object_InheritsFrom,
503 class_object_GetMethod,
504 class_object_PutMethod,
505 class_object_DeleteMethod,
506 class_object_BeginMethodEnumeration,
507 class_object_NextMethod,
508 class_object_EndMethodEnumeration,
509 class_object_GetMethodQualifierSet,
510 class_object_GetMethodOrigin
513 HRESULT WbemClassObject_create(
514 IUnknown *pUnkOuter, IEnumWbemClassObject *iter, UINT index, LPVOID *ppObj )
516 struct class_object *co;
518 TRACE("%p, %p\n", pUnkOuter, ppObj);
520 co = heap_alloc( sizeof(*co) );
521 if (!co) return E_OUTOFMEMORY;
523 co->IWbemClassObject_iface.lpVtbl = &class_object_vtbl;
524 co->refs = 1;
525 co->iter = iter;
526 co->index = index;
527 if (iter) IEnumWbemClassObject_AddRef( iter );
529 *ppObj = &co->IWbemClassObject_iface;
531 TRACE("returning iface %p\n", *ppObj);
532 return S_OK;