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
30 #include "wine/debug.h"
31 #include "wine/unicode.h"
32 #include "wbemprox_private.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(wbemprox);
36 struct client_security
38 IClientSecurity IClientSecurity_iface;
41 static inline struct client_security *impl_from_IClientSecurity( IClientSecurity *iface )
43 return CONTAINING_RECORD( iface, struct client_security, IClientSecurity_iface );
46 static HRESULT WINAPI client_security_QueryInterface(
47 IClientSecurity *iface,
51 struct client_security *cs = impl_from_IClientSecurity( iface );
53 TRACE("%p %s %p\n", cs, debugstr_guid( riid ), ppvObject );
55 if ( IsEqualGUID( riid, &IID_IClientSecurity ) ||
56 IsEqualGUID( riid, &IID_IUnknown ) )
62 FIXME("interface %s not implemented\n", debugstr_guid(riid));
65 IClientSecurity_AddRef( iface );
69 static ULONG WINAPI client_security_AddRef(
70 IClientSecurity *iface )
76 static ULONG WINAPI client_security_Release(
77 IClientSecurity *iface )
83 static HRESULT WINAPI client_security_QueryBlanket(
84 IClientSecurity *iface,
88 OLECHAR **pServerPrincName,
92 DWORD *pCapabilities )
98 static HRESULT WINAPI client_security_SetBlanket(
99 IClientSecurity *iface,
103 OLECHAR *pServerPrincName,
109 static const OLECHAR defaultW[] =
110 {'<','C','O','L','E','_','D','E','F','A','U','L','T','_','P','R','I','N','C','I','P','A','L','>',0};
111 const OLECHAR *princname = (pServerPrincName == COLE_DEFAULT_PRINCIPAL) ? defaultW : pServerPrincName;
113 FIXME("%p, %p, %u, %u, %s, %u, %u, %p, 0x%08x\n", iface, pProxy, AuthnSvc, AuthzSvc,
114 debugstr_w(princname), AuthnLevel, ImpLevel, pAuthInfo, Capabilities);
115 return WBEM_NO_ERROR;
118 static HRESULT WINAPI client_security_CopyProxy(
119 IClientSecurity *iface,
124 return WBEM_E_FAILED;
127 static const IClientSecurityVtbl client_security_vtbl =
129 client_security_QueryInterface,
130 client_security_AddRef,
131 client_security_Release,
132 client_security_QueryBlanket,
133 client_security_SetBlanket,
134 client_security_CopyProxy
137 IClientSecurity client_security = { &client_security_vtbl };
141 IWbemServices IWbemServices_iface;
146 static inline struct wbem_services *impl_from_IWbemServices( IWbemServices *iface )
148 return CONTAINING_RECORD( iface, struct wbem_services, IWbemServices_iface );
151 static ULONG WINAPI wbem_services_AddRef(
152 IWbemServices *iface )
154 struct wbem_services *ws = impl_from_IWbemServices( iface );
155 return InterlockedIncrement( &ws->refs );
158 static ULONG WINAPI wbem_services_Release(
159 IWbemServices *iface )
161 struct wbem_services *ws = impl_from_IWbemServices( iface );
162 LONG refs = InterlockedDecrement( &ws->refs );
165 TRACE("destroying %p\n", ws);
166 heap_free( ws->namespace );
172 static HRESULT WINAPI wbem_services_QueryInterface(
173 IWbemServices *iface,
177 struct wbem_services *ws = impl_from_IWbemServices( iface );
179 TRACE("%p %s %p\n", ws, debugstr_guid( riid ), ppvObject );
181 if ( IsEqualGUID( riid, &IID_IWbemServices ) ||
182 IsEqualGUID( riid, &IID_IUnknown ) )
186 else if ( IsEqualGUID( riid, &IID_IClientSecurity ) )
188 *ppvObject = &client_security;
193 FIXME("interface %s not implemented\n", debugstr_guid(riid));
194 return E_NOINTERFACE;
196 IWbemServices_AddRef( iface );
200 static HRESULT WINAPI wbem_services_OpenNamespace(
201 IWbemServices *iface,
202 const BSTR strNamespace,
205 IWbemServices **ppWorkingNamespace,
206 IWbemCallResult **ppResult )
208 static const WCHAR cimv2W[] = {'c','i','m','v','2',0};
209 static const WCHAR defaultW[] = {'d','e','f','a','u','l','t',0};
210 struct wbem_services *ws = impl_from_IWbemServices( iface );
212 TRACE("%p, %s, 0x%08x, %p, %p, %p\n", iface, debugstr_w(strNamespace), lFlags,
213 pCtx, ppWorkingNamespace, ppResult);
215 if ((strcmpiW( strNamespace, cimv2W ) && strcmpiW( strNamespace, defaultW )) || ws->namespace)
216 return WBEM_E_INVALID_NAMESPACE;
218 return WbemServices_create( NULL, cimv2W, (void **)ppWorkingNamespace );
221 static HRESULT WINAPI wbem_services_CancelAsyncCall(
222 IWbemServices *iface,
223 IWbemObjectSink *pSink )
226 return WBEM_E_FAILED;
229 static HRESULT WINAPI wbem_services_QueryObjectSink(
230 IWbemServices *iface,
232 IWbemObjectSink **ppResponseHandler )
235 return WBEM_E_FAILED;
238 static HRESULT create_instance_enum( const WCHAR *class, IEnumWbemClassObject **iter )
240 static const WCHAR selectW[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',0};
244 query = heap_alloc( strlenW( class ) * sizeof(WCHAR) + sizeof(selectW) );
245 if (!query) return E_OUTOFMEMORY;
247 strcpyW( query, selectW );
248 strcatW( query, class );
250 hr = exec_query( query, iter );
255 HRESULT get_object( const WCHAR *path, IWbemClassObject **obj )
257 IEnumWbemClassObject *iter;
260 /* FIXME: parse path */
262 hr = create_instance_enum( path, &iter );
263 if (hr != S_OK) return hr;
265 hr = WbemClassObject_create( NULL, iter, 0, (void **)obj );
266 IEnumWbemClassObject_Release( iter );
270 static HRESULT WINAPI wbem_services_GetObject(
271 IWbemServices *iface,
272 const BSTR strObjectPath,
275 IWbemClassObject **ppObject,
276 IWbemCallResult **ppCallResult )
278 TRACE("%p, %s, 0x%08x, %p, %p, %p\n", iface, debugstr_w(strObjectPath), lFlags,
279 pCtx, ppObject, ppCallResult);
281 if (lFlags) FIXME("unsupported flags 0x%08x\n", lFlags);
283 return get_object( strObjectPath, ppObject );
286 static HRESULT WINAPI wbem_services_GetObjectAsync(
287 IWbemServices *iface,
288 const BSTR strObjectPath,
291 IWbemObjectSink *pResponseHandler )
294 return WBEM_E_FAILED;
297 static HRESULT WINAPI wbem_services_PutClass(
298 IWbemServices *iface,
299 IWbemClassObject *pObject,
302 IWbemCallResult **ppCallResult )
305 return WBEM_E_FAILED;
308 static HRESULT WINAPI wbem_services_PutClassAsync(
309 IWbemServices *iface,
310 IWbemClassObject *pObject,
313 IWbemObjectSink *pResponseHandler )
316 return WBEM_E_FAILED;
319 static HRESULT WINAPI wbem_services_DeleteClass(
320 IWbemServices *iface,
324 IWbemCallResult **ppCallResult )
327 return WBEM_E_FAILED;
330 static HRESULT WINAPI wbem_services_DeleteClassAsync(
331 IWbemServices *iface,
335 IWbemObjectSink *pResponseHandler )
338 return WBEM_E_FAILED;
341 static HRESULT WINAPI wbem_services_CreateClassEnum(
342 IWbemServices *iface,
343 const BSTR strSuperclass,
346 IEnumWbemClassObject **ppEnum )
349 return WBEM_E_FAILED;
352 static HRESULT WINAPI wbem_services_CreateClassEnumAsync(
353 IWbemServices *iface,
354 const BSTR strSuperclass,
357 IWbemObjectSink *pResponseHandler )
360 return WBEM_E_FAILED;
363 static HRESULT WINAPI wbem_services_PutInstance(
364 IWbemServices *iface,
365 IWbemClassObject *pInst,
368 IWbemCallResult **ppCallResult )
371 return WBEM_E_FAILED;
374 static HRESULT WINAPI wbem_services_PutInstanceAsync(
375 IWbemServices *iface,
376 IWbemClassObject *pInst,
379 IWbemObjectSink *pResponseHandler )
382 return WBEM_E_FAILED;
385 static HRESULT WINAPI wbem_services_DeleteInstance(
386 IWbemServices *iface,
387 const BSTR strObjectPath,
390 IWbemCallResult **ppCallResult )
393 return WBEM_E_FAILED;
396 static HRESULT WINAPI wbem_services_DeleteInstanceAsync(
397 IWbemServices *iface,
398 const BSTR strObjectPath,
401 IWbemObjectSink *pResponseHandler )
404 return WBEM_E_FAILED;
407 static HRESULT WINAPI wbem_services_CreateInstanceEnum(
408 IWbemServices *iface,
412 IEnumWbemClassObject **ppEnum )
414 TRACE("%p, %s, 0%08x, %p, %p\n", iface, debugstr_w(strClass), lFlags, pCtx, ppEnum);
416 if (lFlags) FIXME("unsupported flags 0x%08x\n", lFlags);
418 return create_instance_enum( strClass, ppEnum );
421 static HRESULT WINAPI wbem_services_CreateInstanceEnumAsync(
422 IWbemServices *iface,
423 const BSTR strFilter,
426 IWbemObjectSink *pResponseHandler )
429 return WBEM_E_FAILED;
432 static HRESULT WINAPI wbem_services_ExecQuery(
433 IWbemServices *iface,
434 const BSTR strQueryLanguage,
438 IEnumWbemClassObject **ppEnum )
440 static const WCHAR wqlW[] = {'W','Q','L',0};
442 TRACE("%p, %s, %s, 0x%08x, %p, %p\n", iface, debugstr_w(strQueryLanguage),
443 debugstr_w(strQuery), lFlags, pCtx, ppEnum);
445 if (!strQueryLanguage || !strQuery) return WBEM_E_INVALID_PARAMETER;
446 if (strcmpiW( strQueryLanguage, wqlW )) return WBEM_E_INVALID_QUERY_TYPE;
447 return exec_query( strQuery, ppEnum );
450 static HRESULT WINAPI wbem_services_ExecQueryAsync(
451 IWbemServices *iface,
452 const BSTR strQueryLanguage,
456 IWbemObjectSink *pResponseHandler )
459 return WBEM_E_FAILED;
462 static HRESULT WINAPI wbem_services_ExecNotificationQuery(
463 IWbemServices *iface,
464 const BSTR strQueryLanguage,
468 IEnumWbemClassObject **ppEnum )
471 return WBEM_E_FAILED;
474 static HRESULT WINAPI wbem_services_ExecNotificationQueryAsync(
475 IWbemServices *iface,
476 const BSTR strQueryLanguage,
480 IWbemObjectSink *pResponseHandler )
483 return WBEM_E_FAILED;
486 static HRESULT WINAPI wbem_services_ExecMethod(
487 IWbemServices *iface,
488 const BSTR strObjectPath,
489 const BSTR strMethodName,
492 IWbemClassObject *pInParams,
493 IWbemClassObject **ppOutParams,
494 IWbemCallResult **ppCallResult )
497 return WBEM_E_FAILED;
500 static HRESULT WINAPI wbem_services_ExecMethodAsync(
501 IWbemServices *iface,
502 const BSTR strObjectPath,
503 const BSTR strMethodName,
506 IWbemClassObject *pInParams,
507 IWbemObjectSink *pResponseHandler )
510 return WBEM_E_FAILED;
513 static const IWbemServicesVtbl wbem_services_vtbl =
515 wbem_services_QueryInterface,
516 wbem_services_AddRef,
517 wbem_services_Release,
518 wbem_services_OpenNamespace,
519 wbem_services_CancelAsyncCall,
520 wbem_services_QueryObjectSink,
521 wbem_services_GetObject,
522 wbem_services_GetObjectAsync,
523 wbem_services_PutClass,
524 wbem_services_PutClassAsync,
525 wbem_services_DeleteClass,
526 wbem_services_DeleteClassAsync,
527 wbem_services_CreateClassEnum,
528 wbem_services_CreateClassEnumAsync,
529 wbem_services_PutInstance,
530 wbem_services_PutInstanceAsync,
531 wbem_services_DeleteInstance,
532 wbem_services_DeleteInstanceAsync,
533 wbem_services_CreateInstanceEnum,
534 wbem_services_CreateInstanceEnumAsync,
535 wbem_services_ExecQuery,
536 wbem_services_ExecQueryAsync,
537 wbem_services_ExecNotificationQuery,
538 wbem_services_ExecNotificationQueryAsync,
539 wbem_services_ExecMethod,
540 wbem_services_ExecMethodAsync
543 HRESULT WbemServices_create( IUnknown *pUnkOuter, const WCHAR *namespace, LPVOID *ppObj )
545 struct wbem_services *ws;
547 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
549 ws = heap_alloc( sizeof(*ws) );
550 if (!ws) return E_OUTOFMEMORY;
552 ws->IWbemServices_iface.lpVtbl = &wbem_services_vtbl;
554 ws->namespace = heap_strdupW( namespace );
556 *ppObj = &ws->IWbemServices_iface;
558 TRACE("returning iface %p\n", *ppObj);