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
;
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
);
61 TRACE("destroying %p\n", ec
);
62 free_query( ec
->query
);
68 static HRESULT WINAPI
enum_class_object_QueryInterface(
69 IEnumWbemClassObject
*iface
,
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
) )
84 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
87 IEnumWbemClassObject_AddRef( iface
);
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
;
100 return WBEM_S_NO_ERROR
;
103 static HRESULT WINAPI
enum_class_object_Next(
104 IEnumWbemClassObject
*iface
,
107 IWbemClassObject
**apObjects
,
110 struct enum_class_object
*ec
= impl_from_IEnumWbemClassObject( iface
);
111 struct view
*view
= ec
->query
->view
;
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");
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
;
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
,
136 IWbemObjectSink
*pSink
)
138 FIXME("%p, %u, %p\n", iface
, uCount
, pSink
);
142 static HRESULT WINAPI
enum_class_object_Clone(
143 IEnumWbemClassObject
*iface
,
144 IEnumWbemClassObject
**ppEnum
)
146 FIXME("%p, %p\n", iface
, ppEnum
);
150 static HRESULT WINAPI
enum_class_object_Skip(
151 IEnumWbemClassObject
*iface
,
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;
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
;
197 *ppObj
= &ec
->IEnumWbemClassObject_iface
;
199 TRACE("returning iface %p\n", *ppObj
);
205 IWbemClassObject IWbemClassObject_iface
;
207 IEnumWbemClassObject
*iter
;
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
);
231 TRACE("destroying %p\n", co
);
232 if (co
->iter
) IEnumWbemClassObject_Release( co
->iter
);
238 static HRESULT WINAPI
class_object_QueryInterface(
239 IWbemClassObject
*iface
,
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
) )
254 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
255 return E_NOINTERFACE
;
257 IWbemClassObject_AddRef( iface
);
261 static HRESULT WINAPI
class_object_GetQualifierSet(
262 IWbemClassObject
*iface
,
263 IWbemQualifierSet
**ppQualSet
)
265 FIXME("%p, %p\n", iface
, ppQualSet
);
269 static HRESULT WINAPI
class_object_Get(
270 IWbemClassObject
*iface
,
277 FIXME("%p, %s, %08x, %p, %p, %p\n", iface
, debugstr_w(wszName
), lFlags
, pVal
, pType
, plFlavor
);
281 static HRESULT WINAPI
class_object_Put(
282 IWbemClassObject
*iface
,
288 FIXME("%p, %s, %08x, %p, %u\n", iface
, debugstr_w(wszName
), lFlags
, pVal
, Type
);
292 static HRESULT WINAPI
class_object_Delete(
293 IWbemClassObject
*iface
,
296 FIXME("%p, %s\n", iface
, debugstr_w(wszName
));
300 static HRESULT WINAPI
class_object_GetNames(
301 IWbemClassObject
*iface
,
302 LPCWSTR wszQualifierName
,
304 VARIANT
*pQualifierVal
,
307 FIXME("%p, %s, %08x, %p, %p\n", iface
, debugstr_w(wszQualifierName
), lFlags
, pQualifierVal
, pNames
);
311 static HRESULT WINAPI
class_object_BeginEnumeration(
312 IWbemClassObject
*iface
,
315 FIXME("%p, %08x\n", iface
, lEnumFlags
);
319 static HRESULT WINAPI
class_object_Next(
320 IWbemClassObject
*iface
,
327 FIXME("%p, %08x, %p, %p, %p, %p\n", iface
, lFlags
, strName
, pVal
, pType
, plFlavor
);
331 static HRESULT WINAPI
class_object_EndEnumeration(
332 IWbemClassObject
*iface
)
334 FIXME("%p\n", iface
);
338 static HRESULT WINAPI
class_object_GetPropertyQualifierSet(
339 IWbemClassObject
*iface
,
341 IWbemQualifierSet
**ppQualSet
)
343 FIXME("%p, %s, %p\n", iface
, debugstr_w(wszProperty
), ppQualSet
);
347 static HRESULT WINAPI
class_object_Clone(
348 IWbemClassObject
*iface
,
349 IWbemClassObject
**ppCopy
)
351 FIXME("%p, %p\n", iface
, ppCopy
);
355 static HRESULT WINAPI
class_object_GetObjectText(
356 IWbemClassObject
*iface
,
358 BSTR
*pstrObjectText
)
360 FIXME("%p, %08x, %p\n", iface
, lFlags
, pstrObjectText
);
364 static HRESULT WINAPI
class_object_SpawnDerivedClass(
365 IWbemClassObject
*iface
,
367 IWbemClassObject
**ppNewClass
)
369 FIXME("%p, %08x, %p\n", iface
, lFlags
, ppNewClass
);
373 static HRESULT WINAPI
class_object_SpawnInstance(
374 IWbemClassObject
*iface
,
376 IWbemClassObject
**ppNewInstance
)
378 FIXME("%p, %08x, %p\n", iface
, lFlags
, ppNewInstance
);
382 static HRESULT WINAPI
class_object_CompareTo(
383 IWbemClassObject
*iface
,
385 IWbemClassObject
*pCompareTo
)
387 FIXME("%p, %08x, %p\n", iface
, lFlags
, pCompareTo
);
391 static HRESULT WINAPI
class_object_GetPropertyOrigin(
392 IWbemClassObject
*iface
,
394 BSTR
*pstrClassName
)
396 FIXME("%p, %s, %p\n", iface
, debugstr_w(wszName
), pstrClassName
);
400 static HRESULT WINAPI
class_object_InheritsFrom(
401 IWbemClassObject
*iface
,
402 LPCWSTR strAncestor
)
404 FIXME("%p, %s\n", iface
, debugstr_w(strAncestor
));
408 static HRESULT WINAPI
class_object_GetMethod(
409 IWbemClassObject
*iface
,
412 IWbemClassObject
**ppInSignature
,
413 IWbemClassObject
**ppOutSignature
)
415 FIXME("%p, %s, %08x, %p, %p\n", iface
, debugstr_w(wszName
), lFlags
, ppInSignature
, ppOutSignature
);
419 static HRESULT WINAPI
class_object_PutMethod(
420 IWbemClassObject
*iface
,
423 IWbemClassObject
*pInSignature
,
424 IWbemClassObject
*pOutSignature
)
426 FIXME("%p, %s, %08x, %p, %p\n", iface
, debugstr_w(wszName
), lFlags
, pInSignature
, pOutSignature
);
430 static HRESULT WINAPI
class_object_DeleteMethod(
431 IWbemClassObject
*iface
,
434 FIXME("%p, %s\n", iface
, debugstr_w(wszName
));
438 static HRESULT WINAPI
class_object_BeginMethodEnumeration(
439 IWbemClassObject
*iface
,
442 FIXME("%p, %08x\n", iface
, lEnumFlags
);
446 static HRESULT WINAPI
class_object_NextMethod(
447 IWbemClassObject
*iface
,
450 IWbemClassObject
**ppInSignature
,
451 IWbemClassObject
**ppOutSignature
)
453 FIXME("%p, %08x, %p, %p, %p\n", iface
, lFlags
, pstrName
, ppInSignature
, ppOutSignature
);
457 static HRESULT WINAPI
class_object_EndMethodEnumeration(
458 IWbemClassObject
*iface
)
460 FIXME("%p\n", iface
);
464 static HRESULT WINAPI
class_object_GetMethodQualifierSet(
465 IWbemClassObject
*iface
,
467 IWbemQualifierSet
**ppQualSet
)
469 FIXME("%p, %s, %p\n", iface
, debugstr_w(wszMethod
), ppQualSet
);
473 static HRESULT WINAPI
class_object_GetMethodOrigin(
474 IWbemClassObject
*iface
,
475 LPCWSTR wszMethodName
,
478 FIXME("%p, %s, %p\n", iface
, debugstr_w(wszMethodName
), pstrClassName
);
482 static const IWbemClassObjectVtbl class_object_vtbl
=
484 class_object_QueryInterface
,
486 class_object_Release
,
487 class_object_GetQualifierSet
,
491 class_object_GetNames
,
492 class_object_BeginEnumeration
,
494 class_object_EndEnumeration
,
495 class_object_GetPropertyQualifierSet
,
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
;
527 if (iter
) IEnumWbemClassObject_AddRef( iter
);
529 *ppObj
= &co
->IWbemClassObject_iface
;
531 TRACE("returning iface %p\n", *ppObj
);