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 free_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;
203 *ppObj = &ec->IEnumWbemClassObject_iface;
205 TRACE("returning iface %p\n", *ppObj);
211 IWbemClassObject IWbemClassObject_iface;
213 IEnumWbemClassObject *iter;
217 static inline struct class_object *impl_from_IWbemClassObject(
218 IWbemClassObject *iface )
220 return CONTAINING_RECORD(iface, struct class_object, IWbemClassObject_iface);
223 static ULONG WINAPI class_object_AddRef(
224 IWbemClassObject *iface )
226 struct class_object *co = impl_from_IWbemClassObject( iface );
227 return InterlockedIncrement( &co->refs );
230 static ULONG WINAPI class_object_Release(
231 IWbemClassObject *iface )
233 struct class_object *co = impl_from_IWbemClassObject( iface );
234 LONG refs = InterlockedDecrement( &co->refs );
237 TRACE("destroying %p\n", co);
238 if (co->iter) IEnumWbemClassObject_Release( co->iter );
244 static HRESULT WINAPI class_object_QueryInterface(
245 IWbemClassObject *iface,
249 struct class_object *co = impl_from_IWbemClassObject( iface );
251 TRACE("%p, %s, %p\n", co, debugstr_guid( riid ), ppvObject );
253 if ( IsEqualGUID( riid, &IID_IWbemClassObject ) ||
254 IsEqualGUID( riid, &IID_IUnknown ) )
260 FIXME("interface %s not implemented\n", debugstr_guid(riid));
261 return E_NOINTERFACE;
263 IWbemClassObject_AddRef( iface );
267 static HRESULT WINAPI class_object_GetQualifierSet(
268 IWbemClassObject *iface,
269 IWbemQualifierSet **ppQualSet )
271 FIXME("%p, %p\n", iface, ppQualSet);
275 static HRESULT WINAPI class_object_Get(
276 IWbemClassObject *iface,
283 struct class_object *co = impl_from_IWbemClassObject( iface );
284 struct enum_class_object *ec = impl_from_IEnumWbemClassObject( co->iter );
285 struct view *view = ec->query->view;
287 TRACE("%p, %s, %08x, %p, %p, %p\n", iface, debugstr_w(wszName), lFlags, pVal, pType, plFlavor);
291 FIXME("flavor parameter not supported\n");
294 return get_propval( view, co->index, wszName, pVal, pType );
297 static HRESULT WINAPI class_object_Put(
298 IWbemClassObject *iface,
304 FIXME("%p, %s, %08x, %p, %u\n", iface, debugstr_w(wszName), lFlags, pVal, Type);
308 static HRESULT WINAPI class_object_Delete(
309 IWbemClassObject *iface,
312 FIXME("%p, %s\n", iface, debugstr_w(wszName));
316 static HRESULT WINAPI class_object_GetNames(
317 IWbemClassObject *iface,
318 LPCWSTR wszQualifierName,
320 VARIANT *pQualifierVal,
323 struct class_object *co = impl_from_IWbemClassObject( iface );
324 struct enum_class_object *ec = impl_from_IEnumWbemClassObject( co->iter );
326 TRACE("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszQualifierName), lFlags, pQualifierVal, pNames);
328 if (wszQualifierName || pQualifierVal)
330 FIXME("qualifier not supported\n");
333 if (lFlags != WBEM_FLAG_ALWAYS)
335 FIXME("flags %08x not supported\n", lFlags);
338 return get_properties( ec->query->view, pNames );
341 static HRESULT WINAPI class_object_BeginEnumeration(
342 IWbemClassObject *iface,
345 FIXME("%p, %08x\n", iface, lEnumFlags);
349 static HRESULT WINAPI class_object_Next(
350 IWbemClassObject *iface,
357 FIXME("%p, %08x, %p, %p, %p, %p\n", iface, lFlags, strName, pVal, pType, plFlavor);
361 static HRESULT WINAPI class_object_EndEnumeration(
362 IWbemClassObject *iface )
364 FIXME("%p\n", iface);
368 static HRESULT WINAPI class_object_GetPropertyQualifierSet(
369 IWbemClassObject *iface,
371 IWbemQualifierSet **ppQualSet )
373 FIXME("%p, %s, %p\n", iface, debugstr_w(wszProperty), ppQualSet);
377 static HRESULT WINAPI class_object_Clone(
378 IWbemClassObject *iface,
379 IWbemClassObject **ppCopy )
381 FIXME("%p, %p\n", iface, ppCopy);
385 static HRESULT WINAPI class_object_GetObjectText(
386 IWbemClassObject *iface,
388 BSTR *pstrObjectText )
390 FIXME("%p, %08x, %p\n", iface, lFlags, pstrObjectText);
394 static HRESULT WINAPI class_object_SpawnDerivedClass(
395 IWbemClassObject *iface,
397 IWbemClassObject **ppNewClass )
399 FIXME("%p, %08x, %p\n", iface, lFlags, ppNewClass);
403 static HRESULT WINAPI class_object_SpawnInstance(
404 IWbemClassObject *iface,
406 IWbemClassObject **ppNewInstance )
408 FIXME("%p, %08x, %p\n", iface, lFlags, ppNewInstance);
412 static HRESULT WINAPI class_object_CompareTo(
413 IWbemClassObject *iface,
415 IWbemClassObject *pCompareTo )
417 FIXME("%p, %08x, %p\n", iface, lFlags, pCompareTo);
421 static HRESULT WINAPI class_object_GetPropertyOrigin(
422 IWbemClassObject *iface,
424 BSTR *pstrClassName )
426 FIXME("%p, %s, %p\n", iface, debugstr_w(wszName), pstrClassName);
430 static HRESULT WINAPI class_object_InheritsFrom(
431 IWbemClassObject *iface,
432 LPCWSTR strAncestor )
434 FIXME("%p, %s\n", iface, debugstr_w(strAncestor));
438 static HRESULT WINAPI class_object_GetMethod(
439 IWbemClassObject *iface,
442 IWbemClassObject **ppInSignature,
443 IWbemClassObject **ppOutSignature )
445 FIXME("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszName), lFlags, ppInSignature, ppOutSignature);
449 static HRESULT WINAPI class_object_PutMethod(
450 IWbemClassObject *iface,
453 IWbemClassObject *pInSignature,
454 IWbemClassObject *pOutSignature )
456 FIXME("%p, %s, %08x, %p, %p\n", iface, debugstr_w(wszName), lFlags, pInSignature, pOutSignature);
460 static HRESULT WINAPI class_object_DeleteMethod(
461 IWbemClassObject *iface,
464 FIXME("%p, %s\n", iface, debugstr_w(wszName));
468 static HRESULT WINAPI class_object_BeginMethodEnumeration(
469 IWbemClassObject *iface,
472 FIXME("%p, %08x\n", iface, lEnumFlags);
476 static HRESULT WINAPI class_object_NextMethod(
477 IWbemClassObject *iface,
480 IWbemClassObject **ppInSignature,
481 IWbemClassObject **ppOutSignature)
483 FIXME("%p, %08x, %p, %p, %p\n", iface, lFlags, pstrName, ppInSignature, ppOutSignature);
487 static HRESULT WINAPI class_object_EndMethodEnumeration(
488 IWbemClassObject *iface )
490 FIXME("%p\n", iface);
494 static HRESULT WINAPI class_object_GetMethodQualifierSet(
495 IWbemClassObject *iface,
497 IWbemQualifierSet **ppQualSet)
499 FIXME("%p, %s, %p\n", iface, debugstr_w(wszMethod), ppQualSet);
503 static HRESULT WINAPI class_object_GetMethodOrigin(
504 IWbemClassObject *iface,
505 LPCWSTR wszMethodName,
508 FIXME("%p, %s, %p\n", iface, debugstr_w(wszMethodName), pstrClassName);
512 static const IWbemClassObjectVtbl class_object_vtbl =
514 class_object_QueryInterface,
516 class_object_Release,
517 class_object_GetQualifierSet,
521 class_object_GetNames,
522 class_object_BeginEnumeration,
524 class_object_EndEnumeration,
525 class_object_GetPropertyQualifierSet,
527 class_object_GetObjectText,
528 class_object_SpawnDerivedClass,
529 class_object_SpawnInstance,
530 class_object_CompareTo,
531 class_object_GetPropertyOrigin,
532 class_object_InheritsFrom,
533 class_object_GetMethod,
534 class_object_PutMethod,
535 class_object_DeleteMethod,
536 class_object_BeginMethodEnumeration,
537 class_object_NextMethod,
538 class_object_EndMethodEnumeration,
539 class_object_GetMethodQualifierSet,
540 class_object_GetMethodOrigin
543 HRESULT WbemClassObject_create(
544 IUnknown *pUnkOuter, IEnumWbemClassObject *iter, UINT index, LPVOID *ppObj )
546 struct class_object *co;
548 TRACE("%p, %p\n", pUnkOuter, ppObj);
550 co = heap_alloc( sizeof(*co) );
551 if (!co) return E_OUTOFMEMORY;
553 co->IWbemClassObject_iface.lpVtbl = &class_object_vtbl;
557 if (iter) IEnumWbemClassObject_AddRef( iter );
559 *ppObj = &co->IWbemClassObject_iface;
561 TRACE("returning iface %p\n", *ppObj);