Commit 4a97c6b0 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

wbemprox: Keep context object per services instance.

parent 2ed34948
...@@ -210,6 +210,7 @@ struct wbem_services ...@@ -210,6 +210,7 @@ struct wbem_services
CRITICAL_SECTION cs; CRITICAL_SECTION cs;
WCHAR *namespace; WCHAR *namespace;
struct async_header *async; struct async_header *async;
IWbemContext *context;
}; };
static inline struct wbem_services *impl_from_IWbemServices( IWbemServices *iface ) static inline struct wbem_services *impl_from_IWbemServices( IWbemServices *iface )
...@@ -243,6 +244,8 @@ static ULONG WINAPI wbem_services_Release( ...@@ -243,6 +244,8 @@ static ULONG WINAPI wbem_services_Release(
} }
ws->cs.DebugInfo->Spare[0] = 0; ws->cs.DebugInfo->Spare[0] = 0;
DeleteCriticalSection( &ws->cs ); DeleteCriticalSection( &ws->cs );
if (ws->context)
IWbemContext_Release( ws->context );
heap_free( ws->namespace ); heap_free( ws->namespace );
heap_free( ws ); heap_free( ws );
} }
...@@ -293,7 +296,7 @@ static HRESULT WINAPI wbem_services_OpenNamespace( ...@@ -293,7 +296,7 @@ static HRESULT WINAPI wbem_services_OpenNamespace(
if ((wcsicmp( strNamespace, L"cimv2" ) && wcsicmp( strNamespace, L"default" )) || ws->namespace) if ((wcsicmp( strNamespace, L"cimv2" ) && wcsicmp( strNamespace, L"default" )) || ws->namespace)
return WBEM_E_INVALID_NAMESPACE; return WBEM_E_INVALID_NAMESPACE;
return WbemServices_create( L"cimv2", (void **)ppWorkingNamespace ); return WbemServices_create( L"cimv2", NULL, (void **)ppWorkingNamespace );
} }
static HRESULT WINAPI wbem_services_CancelAsyncCall( static HRESULT WINAPI wbem_services_CancelAsyncCall(
...@@ -933,21 +936,22 @@ static const IWbemServicesVtbl wbem_services_vtbl = ...@@ -933,21 +936,22 @@ static const IWbemServicesVtbl wbem_services_vtbl =
wbem_services_ExecMethodAsync wbem_services_ExecMethodAsync
}; };
HRESULT WbemServices_create( const WCHAR *namespace, LPVOID *ppObj ) HRESULT WbemServices_create( const WCHAR *namespace, IWbemContext *context, LPVOID *ppObj )
{ {
struct wbem_services *ws; struct wbem_services *ws;
TRACE("(%p)\n", ppObj); TRACE("(%p)\n", ppObj);
ws = heap_alloc( sizeof(*ws) ); ws = heap_alloc_zero( sizeof(*ws) );
if (!ws) return E_OUTOFMEMORY; if (!ws) return E_OUTOFMEMORY;
ws->IWbemServices_iface.lpVtbl = &wbem_services_vtbl; ws->IWbemServices_iface.lpVtbl = &wbem_services_vtbl;
ws->refs = 1; ws->refs = 1;
ws->namespace = heap_strdupW( namespace ); ws->namespace = heap_strdupW( namespace );
ws->async = NULL;
InitializeCriticalSection( &ws->cs ); InitializeCriticalSection( &ws->cs );
ws->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": wbemprox_services.cs"); ws->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": wbemprox_services.cs");
if (context)
IWbemContext_Clone( context, &ws->context );
*ppObj = &ws->IWbemServices_iface; *ppObj = &ws->IWbemServices_iface;
......
...@@ -24,6 +24,15 @@ ...@@ -24,6 +24,15 @@
#include "wbemcli.h" #include "wbemcli.h"
#include "wine/test.h" #include "wine/test.h"
#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
static void _expect_ref(IUnknown* obj, ULONG ref, int line)
{
ULONG rc;
IUnknown_AddRef(obj);
rc = IUnknown_Release(obj);
ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc);
}
static void test_IClientSecurity(void) static void test_IClientSecurity(void)
{ {
HRESULT hr; HRESULT hr;
...@@ -124,6 +133,7 @@ static void test_IWbemLocator(void) ...@@ -124,6 +133,7 @@ static void test_IWbemLocator(void)
}; };
IWbemLocator *locator; IWbemLocator *locator;
IWbemServices *services; IWbemServices *services;
IWbemContext *context;
unsigned int i; unsigned int i;
HRESULT hr; HRESULT hr;
BSTR resource; BSTR resource;
...@@ -146,6 +156,20 @@ static void test_IWbemLocator(void) ...@@ -146,6 +156,20 @@ static void test_IWbemLocator(void)
SysFreeString( resource ); SysFreeString( resource );
if (hr == S_OK) IWbemServices_Release( services ); if (hr == S_OK) IWbemServices_Release( services );
} }
hr = CoCreateInstance( &CLSID_WbemContext, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemContext, (void **)&context );
ok(hr == S_OK, "Failed to create context object, hr %#x.\n", hr);
EXPECT_REF(context, 1);
resource = SysAllocString( L"root\\default" );
hr = IWbemLocator_ConnectServer( locator, resource, NULL, NULL, NULL, 0, NULL, context, &services );
ok(hr == S_OK, "Failed to connect, hr %#x.\n", hr);
SysFreeString( resource );
EXPECT_REF(context, 1);
IWbemServices_Release( services );
IWbemContext_Release( context );
IWbemLocator_Release( locator ); IWbemLocator_Release( locator );
} }
......
...@@ -161,14 +161,14 @@ static HRESULT WINAPI wbem_locator_ConnectServer( ...@@ -161,14 +161,14 @@ static HRESULT WINAPI wbem_locator_ConnectServer(
const BSTR Locale, const BSTR Locale,
LONG SecurityFlags, LONG SecurityFlags,
const BSTR Authority, const BSTR Authority,
IWbemContext *pCtx, IWbemContext *context,
IWbemServices **ppNamespace) IWbemServices **ppNamespace)
{ {
HRESULT hr; HRESULT hr;
WCHAR *server, *namespace; WCHAR *server, *namespace;
TRACE("%p, %s, %s, %s, %s, 0x%08x, %s, %p, %p)\n", iface, debugstr_w(NetworkResource), debugstr_w(User), TRACE("%p, %s, %s, %s, %s, 0x%08x, %s, %p, %p)\n", iface, debugstr_w(NetworkResource), debugstr_w(User),
debugstr_w(Password), debugstr_w(Locale), SecurityFlags, debugstr_w(Authority), pCtx, ppNamespace); debugstr_w(Password), debugstr_w(Locale), SecurityFlags, debugstr_w(Authority), context, ppNamespace);
hr = parse_resource( NetworkResource, &server, &namespace ); hr = parse_resource( NetworkResource, &server, &namespace );
if (hr != S_OK) return hr; if (hr != S_OK) return hr;
...@@ -187,7 +187,7 @@ static HRESULT WINAPI wbem_locator_ConnectServer( ...@@ -187,7 +187,7 @@ static HRESULT WINAPI wbem_locator_ConnectServer(
if (SecurityFlags) if (SecurityFlags)
FIXME("unsupported flags\n"); FIXME("unsupported flags\n");
hr = WbemServices_create( namespace, (void **)ppNamespace ); hr = WbemServices_create( namespace, context, (void **)ppNamespace );
heap_free( namespace ); heap_free( namespace );
heap_free( server ); heap_free( server );
if (SUCCEEDED( hr )) if (SUCCEEDED( hr ))
......
...@@ -236,7 +236,7 @@ HRESULT create_signature( const WCHAR *, const WCHAR *, enum param_direction, ...@@ -236,7 +236,7 @@ HRESULT create_signature( const WCHAR *, const WCHAR *, enum param_direction,
IWbemClassObject ** ) DECLSPEC_HIDDEN; IWbemClassObject ** ) DECLSPEC_HIDDEN;
HRESULT WbemLocator_create(LPVOID *) DECLSPEC_HIDDEN; HRESULT WbemLocator_create(LPVOID *) DECLSPEC_HIDDEN;
HRESULT WbemServices_create(const WCHAR *, LPVOID *) DECLSPEC_HIDDEN; HRESULT WbemServices_create(const WCHAR *, IWbemContext *, LPVOID *) DECLSPEC_HIDDEN;
HRESULT WbemContext_create(void **) DECLSPEC_HIDDEN; HRESULT WbemContext_create(void **) DECLSPEC_HIDDEN;
HRESULT create_class_object(const WCHAR *, IEnumWbemClassObject *, UINT, HRESULT create_class_object(const WCHAR *, IEnumWbemClassObject *, UINT,
struct record *, IWbemClassObject **) DECLSPEC_HIDDEN; struct record *, IWbemClassObject **) DECLSPEC_HIDDEN;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment