Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

96 lines
2.3 KiB

#include "precomp.h"
#include <assert.h>
#include <sync.h>
#include <arrtempl.h>
#include <wstring.h>
#include <comutl.h>
#include <statsync.h>
#include <map>
#include <wstlallc.h>
#include "fconprov.h"
#include "fconnspc.h"
#include "fconsink.h"
LPCWSTR g_wszNamespace = L"__NAMESPACE";
LPCWSTR g_wszClass = L"__CLASS";
LPCWSTR g_wszEventFwdCons = L"MSFT_EventForwardingConsumer";
LPCWSTR g_wszDataFwdCons = L"MSFT_DataForwardingConsumer";
static CStaticCritSec g_cs;
typedef CWbemPtr<CFwdConsNamespace> CFwdConsNamespaceP;
typedef std::map<WString,CFwdConsNamespaceP,WSiless,wbem_allocator<CFwdConsNamespaceP> > NamespaceMap;
NamespaceMap* g_pNamespaces;
HRESULT CFwdConsProv::InitializeModule()
{
g_pNamespaces = new NamespaceMap;
if ( g_pNamespaces == NULL )
{
return WBEM_E_OUT_OF_MEMORY;
}
return WBEM_S_NO_ERROR;
}
void CFwdConsProv::UninitializeModule()
{
delete g_pNamespaces;
}
HRESULT CFwdConsProv::FindConsumer( IWbemClassObject* pCons,
IWbemUnboundObjectSink** ppSink )
{
ENTER_API_CALL
HRESULT hr;
//
// workaround for bogus context object left on thread by wmi.
// just remove it. shouldn't leak because this call doesn't addref it.
//
IUnknown* pCtx;
CoSwitchCallContext( NULL, &pCtx );
//
// first obtain the namespace object. we derive the namespace from
// the consumer object. If no namespace obj is there, create one.
//
CPropVar vNamespace;
hr = pCons->Get( g_wszNamespace, 0, &vNamespace, NULL, NULL );
if ( FAILED(hr) || FAILED(hr=vNamespace.SetType(VT_BSTR)) )
{
return hr;
}
CInCritSec ics( &g_cs );
CWbemPtr<CFwdConsNamespace> pNspc = (*g_pNamespaces)[V_BSTR(&vNamespace)];
if ( pNspc == NULL )
{
pNspc = new CFwdConsNamespace;
if ( pNspc == NULL )
{
return WBEM_E_OUT_OF_MEMORY;
}
hr = pNspc->Initialize( V_BSTR(&vNamespace) );
if ( FAILED(hr) )
{
return hr;
}
(*g_pNamespaces)[V_BSTR(&vNamespace)] = pNspc;
}
return CFwdConsSink::Create( m_pControl, pNspc, pCons, ppSink );
EXIT_API_CALL
}