|
|
/////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2000 Microsoft Corporation
//
// Module Name:
// NtRkComm.cpp
//
// Description:
// Implementation of CWbemServices, CImpersonatedProvider, CInstanceMgr
// class.
//
// Author:
// Henry Wang (HenryWa) 24-AUG-1999
//
//////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "NtRkComm.h"
#include "ObjectPath.h"
//****************************************************************************
//
// CWbemServices
//
//****************************************************************************
/////////////////////////////////////////////////////////////////////////////
//++
//
// CWbemServices::CWbemServices(
// IWbemServices * pNamespace
// )
//
// Description:
// Constructor.
//
// Arguments:
// pNamespace --
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CWbemServices::CWbemServices( IWbemServices * pNamespace ) : m_pWbemServices( NULL ) { m_pWbemServices = pNamespace; if ( m_pWbemServices != NULL ) { m_pWbemServices->AddRef( ); }
} //*** CWbemServices::CWbemServices()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CWbemServices::~CWbemServices( void )
//
// Description:
// Destructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CWbemServices::~CWbemServices( void ) { if ( m_pWbemServices != NULL ) { m_pWbemServices->Release(); }
} //*** CWbemServices::~CWbemServices()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::CreateClassEnum(
// BSTR bstrSuperclassIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IEnumWbemClassObject ** ppEnumOut
// )
//
// Description:
// Returns an enumerator for all classes satisfying the
// selection criteria
//
// Arguments:
// bstrSuperclassIn
// Specifies a superclass name
//
// lFlagsIn
// accepts WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_
// RETURN_IMMEDIATELY, WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_
// BIDIRECTIONAL
//
// pCtxIn
// Typically NULL
//
// ppEnumOut
// Receives the pointer to the enumerator
//
// Return Value:
// WBEM stand error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::CreateClassEnum( BSTR bstrSuperclassIn, long lFlagsIn, IWbemContext * pCtxIn, IEnumWbemClassObject ** ppEnumOut ) { HRESULT hr;
hr = m_pWbemServices->CreateClassEnum( bstrSuperclassIn, lFlagsIn, pCtxIn, ppEnumOut ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::CreateClassEnum()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::CreateInstanceEnum(
// BSTR bstrClassIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IEnumWbemClassObject ** ppEnumOut
// )
//
// Description:
// creates an enumerator that returns the instances of a
// specified class according to user-specified selection
// criteria
//
// Arguments:
// bstrClassIn
// Specifies a superclass name
//
// lFlagsIn
// accepts WBEM_FLAG_DEEP, WBEM_FLAG_SHALLOW, WBEM_FLAG_
// RETURN_IMMEDIATELY, WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_
// BIDIRECTIONAL
//
// pCtxIn
// Typically NULL
//
// ppEnumOut
// Receives the pointer to the enumerator
//
// Return Value:
// WBEM standard error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::CreateInstanceEnum( BSTR bstrClassIn, long lFlagsIn, IWbemContext * pCtxIn, IEnumWbemClassObject ** ppEnumOut ) { HRESULT hr;
hr = m_pWbemServices->CreateInstanceEnum( bstrClassIn, lFlagsIn, pCtxIn, ppEnumOut ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::CreateInstanceEnum()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::DeleteClass(
// BSTR bstrClassIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemCallResult ** ppCallResultInout
// )
//
// Description:
// Deletes the specified class from the current namespace.
//
// Arguments:
// bstrClassIn
// The name of the class targeted for deletion.
//
// lFlagsIn
// accepts WBEM_FLAG_RETURN_IMMEDIATELY, WBEM_FLAG_
// OWNER_UPDATE
//
// pCtxIn
// Typically NULL
//
// ppCallResultInout
// Receives the call result
//
// Return Value:
// WBEM stand error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::DeleteClass( BSTR bstrClassIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemCallResult ** ppCallResultInout ) { HRESULT hr;
hr = m_pWbemServices->DeleteClass( bstrClassIn, lFlagsIn, pCtxIn, ppCallResultInout ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::DeleteClass()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::DeleteInstance(
// BSTR bstrObjectPathIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemCallResult ** ppCallResultInout
// )
//
// Description:
// deletes an instance of an existing class in the current namespace
//
// Arguments:
// bstrObjectPathIn
// object path to the instance to be deleted.
//
// lFlagsIn
// accepts WBEM_FLAG_RETURN_IMMEDIATELY
//
// pCtxIn
// Typically NULL
//
// ppCallResultInout
// Receives the call result
//
// Return Value:
// WBEM standard error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::DeleteInstance( BSTR bstrObjectPathIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemCallResult ** ppCallResultInout ) { HRESULT hr;
hr = m_pWbemServices->DeleteInstance( bstrObjectPathIn, lFlagsIn, pCtxIn, ppCallResultInout ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::DeleteInstance()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::ExecMethod(
// BSTR bstrObjectPathIn,
// BSTR bstrMethodNameIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemClassObject * pInParamsIn,
// IWbemClassObject ** ppOurParamsOut,
// IWbemCallResult ** ppCallResultOut
// )
//
// Description:
// execute methods for the given object
//
// Arguments:
// bstrObjectPathIn
// object path of the object for which the method is executed
//
// bstrMethodNameIn
// name of the method to be invoked
//
// lFlagsIn
// zero to make this a synchronous call
//
// pCtxIn
// Typically NULL
//
// pInParamsIn
// Input parameters for the method
//
// ppOurParamsOut
// output parameters for the method
//
// ppCallResultOut
// To receive call result
//
// Return Value:
// WBEM standard error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::ExecMethod( BSTR bstrObjectPathIn, BSTR bstrMethodNameIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemClassObject * pInParamsIn, IWbemClassObject ** ppOurParamsOut, IWbemCallResult ** ppCallResultOut ) { HRESULT hr;
hr = m_pWbemServices->ExecMethod( bstrObjectPathIn, bstrMethodNameIn, lFlagsIn, pCtxIn, pInParamsIn, ppOurParamsOut, ppCallResultOut ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::ExecMethod()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::ExecNotificationQuery(
// BSTR bstrQueryLanguageIn,
// BSTR bstrQueryIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IEnumWbemClassObject ** ppEnumOut
// )
//
// Description:
// Executes a query to receive events.
//
// Arguments:
// bstrQueryLanguageIn
// BSTR containing one of the query languages supported by WMI
//
// bstrQueryIn
// text of the event-related query
//
// lFlagsIn
// WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_RETURN_IMMEDIATELY
//
// pCtxIn
// Typically NULL
//
// ppEnumOut
// Receives the enumerator
//
// Return Value:
// WBEM standard error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::ExecNotificationQuery( BSTR bstrQueryLanguageIn, BSTR bstrQueryIn, long lFlagsIn, IWbemContext * pCtxIn, IEnumWbemClassObject ** ppEnumOut ) { HRESULT hr;
hr = m_pWbemServices->ExecNotificationQuery( bstrQueryLanguageIn, bstrQueryIn, lFlagsIn, pCtxIn, ppEnumOut ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::ExecNotificationQuery()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::ExecQuery(
// BSTR bstrQueryLanguageIn,
// BSTR bstrQueryIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IEnumWbemClassObject ** ppEnumOut
// )
//
// Description:
// executes a query to retrieve objects.
//
// Arguments:
// bstrQueryLanguageIn
// BSTR containing one of the query languages supported by WMI
//
// bstrQueryIn
// containing the text of the query
//
// lFllFlagsIn
// WBEM_FLAG_FORWARD_ONLY, WBEM_FLAG_RETURN_IMMEDIATELY
// WBEM_FLAG_BIDIRECTIONAL, WBEM_FLAG_ENSURE_LOCATABLE
// WBEM_FLAG_PROTOTYPE
//
// pCtxIn
// Typically NULL
//
// ppEnumOut
// receives the enumerator
//
// Return Value:
// WBEM standard error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::ExecQuery( BSTR bstrQueryLanguageIn, BSTR bstrQueryIn, long lFlagsIn, IWbemContext * pCtxIn, IEnumWbemClassObject ** ppEnumOut ) { HRESULT hr;
hr = m_pWbemServices->ExecQuery( bstrQueryLanguageIn, bstrQueryIn, lFlagsIn, pCtxIn, ppEnumOut ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::ExecQuery()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::GetObject(
// BSTR bstrObjectPathIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemClassObject ** ppObjectInout,
// IWbemCallResult ** ppCallResultInout
// )
//
// Description:
// retrieves a class or instance
//
// Arguments:
// bstrObjectPathIn
// The object path of the object to retrieve
//
// lFlagsIn
// 0
//
// pCtxIn
// Typically NULL
//
// ppObjectInout
// If not NULL, this receives the object
//
// ppCallResultInout
// If the lFlags parameter contains WBEM_FLAG_RETURN_IMMEDIATELY,
// this call will return immediately with WBEM_S_NO_ERROR. The
// ppCallResult parameter will receive a pointer to a new
// IWbemCallResult object
//
// Return Value:
// WBEM standard error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::GetObject( BSTR bstrObjectPathIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemClassObject ** ppObjectInout, IWbemCallResult ** ppCallResultInout ) { HRESULT hr;
hr = m_pWbemServices->GetObject( bstrObjectPathIn, lFlagsIn, pCtxIn, ppObjectInout, ppCallResultInout ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::GetObject()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::PutClass(
// IWbemClassObject * pObjectIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemCallResult ** ppCallResultInout
// )
//
// Description:
// Creates a new class or updates an existing one
//
// Arguments:
// pObjectIn
// point to a valid class definition
//
// lFlagsIn
// WBEM_FLAG_CREATE_OR_UPDATE,WBEM_FLAG_UPDATE_ONLY,
// WBEM_FLAG_CREATE_ONLY, WBEM_FLAG_RETURN_IMMEDIATELY,
// WBEM_FLAG_OWNER_UPDATE, WBEM_FLAG_UPDATE_COMPATIBLE,
// WBEM_FLAG_UPDATE_SAFE_MODE, WBEM_FLAG_UPDATE_FORCE_MODE
//
// pCtxIn
// Typically NULL
//
// ppCallResultInout
// If the lFlags parameter contains WBEM_FLAG_RETURN_IMMEDIATELY,
// this call will return immediately with WBEM_S_NO_ERROR. The
// ppCallResult parameter will receive a pointer to a new
// IWbemCallResult object
//
// Return Value:
// WBEM standard error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::PutClass( IWbemClassObject * pObjectIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemCallResult ** ppCallResultInout ) { HRESULT hr;
hr = m_pWbemServices->PutClass( pObjectIn, lFlagsIn, pCtxIn, ppCallResultInout ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::PutClass()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CWbemServices::PutInstance(
// IWbemClassObject * pInstIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemCallResult ** ppCallResultInout
// )
//
// Description:
// Creates or updates an instance of an existing class.
//
// Arguments:
// pInstIn
// Points to the instance to be written
//
// lFlagsIn
// WBEM_FLAG_CREATE_OR_UPDATE,WBEM_FLAG_UPDATE_ONLY,
// WBEM_FLAG_CREATE_ONLY, WBEM_FLAG_RETURN_IMMEDIATELY,
//
// pCtxIn
// Typically NULL
//
// ppCallResultInout
// If the lFlags parameter contains WBEM_FLAG_RETURN_IMMEDIATELY,
// this call will return immediately with WBEM_S_NO_ERROR. The
// ppCallResult parameter will receive a pointer to a new
// IWbemCallResult object
//
// Return Value:
// WBEM standard error
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CWbemServices::PutInstance( IWbemClassObject * pInstIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemCallResult ** ppCallResultInout ) { HRESULT hr;
hr = m_pWbemServices->PutInstance( pInstIn, lFlagsIn, pCtxIn, ppCallResultInout ); if ( SUCCEEDED( hr ) ) { hr = CoImpersonateClient(); } // if:
return hr;
} //*** CWbemServices::PutInstance()
//****************************************************************************
//
// CImpersonatedProvider
//
//****************************************************************************
/////////////////////////////////////////////////////////////////////////////
//++
//
// CImpersonatedProvider::CImpersonatedProvider(
// BSTR bstrObjectPathIn = NULL,
// BSTR bstrUserIn = NULL,
// BSTR bstrPasswordIn = NULL,
// IWbemContext * pCtxIn = NULL
// )
//
// Description:
// Constructor.
//
// Arguments:
// bstrObjectPathIn --
// bstrUserIn --
// bstrPasswordIn --
// pCtxIn --
//
// Return Values:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CImpersonatedProvider::CImpersonatedProvider( BSTR ,// bstrObjectPathIn.
BSTR ,// bstrUserIn,
BSTR ,// bstrPasswordIn,
IWbemContext * // pCtxIn
) : m_cRef( 0 ), m_pNamespace( NULL ) {
} //*** CImpersonatedProvider::CImpersonatedProvider()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CImpersonatedProvider::~CImpersonatedProvider( void )
//
// Description:
// Destructor.
//
// Arguments:
// None.
//
// Return Values:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CImpersonatedProvider::~CImpersonatedProvider( void ) { delete m_pNamespace;
} //*** CImpersonatedProvider::~CImpersonatedProvider()
/////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP_( ULONG )
// CImpersonatedProvider::AddRef( void )
//
// Description:
// Increment the reference count on the COM object.
//
// Arguments:
// None.
//
// Return Values:
// New reference count.
//
//--
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG ) CImpersonatedProvider::AddRef( void ) { return InterlockedIncrement( ( long * ) & m_cRef );
} //*** CImpersonatedProvider::AddRef()
/////////////////////////////////////////////////////////////////////////////
//++
//
// STDMETHODIMP_( ULONG )
// CImpersonatedProvider::Release( void )
//
// Description:
// Release a reference on the COM object.
//
// Arguments:
// None.
//
// Return Value:
// New reference count.
//
//--
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG ) CImpersonatedProvider::Release( void ) { ULONG nNewCount = InterlockedDecrement( ( long * ) & m_cRef ); if ( 0L == nNewCount ) delete this;
return nNewCount;
} //*** CImpersonatedProvider::Release()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CImpersonatedProvider::QueryInterface(
// REFIID riid,
// PPVOID ppv
// )
//
// Description:
// Initialize the provider.
//
// Arguments:
// riidIn -- Interface ID being queried.
// ppvOut -- Pointer in which to return interface pointer.
//
// Return Value:
// NOERROR
// E_NOINTERFACE
//
//--
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpersonatedProvider::QueryInterface( REFIID riid, PPVOID ppv ) { *ppv = NULL;
// Since we have dual inheritance, it is necessary to cast the return type
if ( riid == IID_IWbemServices ) { *ppv = static_cast< IWbemServices * >( this ); }
if ( IID_IUnknown == riid || riid == IID_IWbemProviderInit ) { *ppv = static_cast< IWbemProviderInit * >( this ); }
if ( NULL != *ppv ) { AddRef(); return NOERROR; } else { return E_NOINTERFACE; }
} //*** CImpersonatedProvider::QueryInterface()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CImpersonatedProvider::Initialize(
// LPWSTR pszUserIn,
// LONG lFlagsIn,
// LPWSTR pszNamespaceIn,
// LPWSTR pszLocaleIn,
// IWbemServices * pNamespaceIn,
// IWbemContext * pCtxIn,
// IWbemProviderInitSink * pInitSinkIn
// )
//
// Description:
// Initialize the provider.
//
// Arguments:
// pszUserIn --
// lFlagsIn --
// pszNamespaeIn --
// pszLocaleIn --
// pNamespaceIn --
// pCtxIn --
// pInitSinkIn --
//
// Return Value:
// WBEM_S_NO_ERROR
// WBEM_E_OUT_OF_MEMORY
//
//--
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpersonatedProvider::Initialize( LPWSTR ,// pszUserIn,
LONG ,// lFlagsIn,
LPWSTR ,// pszNamespaceIn,
LPWSTR ,// pszLocaleIn,
IWbemServices * pNamespaceIn, IWbemContext * ,// pCtxIn,
IWbemProviderInitSink * pInitSinkIn ) { HRESULT hr = WBEM_S_NO_ERROR; LONG lStatus = WBEM_S_INITIALIZED;
m_pNamespace = new CWbemServices( pNamespaceIn ); if ( m_pNamespace == NULL ) { hr = WBEM_E_OUT_OF_MEMORY; lStatus = WBEM_E_FAILED; } // if: error allocating memory
//Let CIMOM know you are initialized
//==================================
pInitSinkIn->SetStatus( lStatus, 0 ); return hr;
} //*** CImpersonatedProvider::Initialize()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CImpersonatedProvider::CreateInstanceEnumAsync(
// const BSTR bstrClassIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pResponseHandlerIn
// )
//
// Description:
// Create an instance asynchronously.
//
// Arguments:
// bstrClassIn --
// lFlagsIn --
// pCtxIn --
// pResonseHandlerIn --
//
// Return Value:
// Any return values fro DoCreateInstanceEnumAsync().
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CImpersonatedProvider::CreateInstanceEnumAsync( const BSTR bstrClassIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pResponseHandlerIn ) { HRESULT hr;
hr = CoImpersonateClient(); if ( SUCCEEDED( hr ) ) { hr = DoCreateInstanceEnumAsync( bstrClassIn, lFlagsIn, pCtxIn, pResponseHandlerIn ); } // if:
return hr;
} //*** CImpersonatedProvider::CreateInstanceEnumAsync()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CImpersonatedProvider::DeleteInstanceAsync(
// const BSTR bstrObjectPathIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pResponseHandlerIn
// )
//
// Description:
// Delete an instance asynchronously.
//
// Arguments:
// bstrObjectPathIn --
// lFlagsIn --
// pCtxIn --
// pResonseHandlerIn --
//
// Return Value:
// Any return values fro DoDeleteInstanceAsync().
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CImpersonatedProvider::DeleteInstanceAsync( const BSTR bstrObjectPathIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pResponseHandlerIn ) { HRESULT hr;
hr = CoImpersonateClient(); if ( SUCCEEDED( hr ) ) { hr = DoDeleteInstanceAsync( bstrObjectPathIn, lFlagsIn, pCtxIn, pResponseHandlerIn ); } // if:
return hr;
} //*** CImpersonatedProvider::DeleteInstanceAsync()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CImpersonatedProvider::ExecMethodAsync(
// const BSTR bstrObjectPathIn,
// const BSTR bstrMethodNameIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemClassObject * pInParamsIn,
// IWbemObjectSink * pResponseHandlerIn
// )
//
// Description:
// Execute a method asynchronously.
//
// Arguments:
// bstrObjectPathIn --
// bstrMethodNameIn --
// lFlagsIn --
// pCtxIn --
// pInParamsIn --
// pResonseHandlerIn --
//
// Return Value:
// Any return values fro DoExecMethodAsync().
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CImpersonatedProvider::ExecMethodAsync( const BSTR bstrObjectPathIn, const BSTR bstrMethodNameIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemClassObject * pInParamsIn, IWbemObjectSink * pResponseHandlerIn ) { HRESULT hr;
hr = CoImpersonateClient(); if ( SUCCEEDED( hr ) ) { hr = DoExecMethodAsync( bstrObjectPathIn, bstrMethodNameIn, lFlagsIn, pCtxIn, pInParamsIn, pResponseHandlerIn ); } // if:
return hr;
} //*** CImpersonatedProvider::ExecMethodAsync()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CImpersonatedProvider::ExecQueryAsync(
// const BSTR bstrQueryLanguageIn,
// const BSTR bstrQueryIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pResponseHandlerIn
// )
//
// Description:
// Execute a query asynchronously.
//
// Arguments:
// bstrQueryLanguageIn --
// bstrQueryIn --
// lFlagsIn --
// pCtxIn --
// pResonseHandlerIn --
//
// Return Value:
// Any return values fro DoExecQueryAsync().
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CImpersonatedProvider::ExecQueryAsync( const BSTR bstrQueryLanguageIn, const BSTR bstrQueryIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pResponseHandlerIn ) { HRESULT hr;
hr = CoImpersonateClient(); if ( SUCCEEDED( hr ) ) { hr = DoExecQueryAsync( bstrQueryLanguageIn, bstrQueryIn, lFlagsIn, pCtxIn, pResponseHandlerIn ); } // if:
return hr;
} //*** CImpersonatedProvider::ExecQueryAsync()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CImpersonatedProvider::GetObjectAsync(
// const BSTR bstrObjectPathIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pResponseHandlerIn
// )
//
// Description:
// Get an instance asynchronously.
//
// Arguments:
// bstrObjectPathIn --
// lFlagsIn --
// pCtxIn --
// pResonseHandlerIn --
//
// Return Value:
// Any return values fro DoGetObjectAsync().
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CImpersonatedProvider::GetObjectAsync( const BSTR bstrObjectPathIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pResponseHandlerIn ) { HRESULT hr;
hr = CoImpersonateClient(); if ( SUCCEEDED( hr ) ) { hr = DoGetObjectAsync( bstrObjectPathIn, lFlagsIn, pCtxIn, pResponseHandlerIn ); } // if:
return hr;
} //*** CImpersonatedProvider::GetObjectAsync()
/////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CImpersonatedProvider::PutInstanceAsync(
// IWbemClassObject * pInstIn,
// long lFlagsIn,
// IWbemContext * pCtxIn,
// IWbemObjectSink * pResponseHandlerIn
// )
//
// Description:
// Save an instance asynchronously.
//
// Arguments:
// pInstIn --
// lFlagsIn --
// pCtxIn --
// pResonseHandlerIn --
//
// Return Value:
// Any return values fro DoPutInstanceAsync().
//
//--
/////////////////////////////////////////////////////////////////////////////
HRESULT CImpersonatedProvider::PutInstanceAsync( IWbemClassObject * pInstIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pResponseHandlerIn ) { HRESULT hr;
hr = CoImpersonateClient(); if ( SUCCEEDED( hr ) ) { hr = DoPutInstanceAsync( pInstIn, lFlagsIn, pCtxIn, pResponseHandlerIn ); } // if:
return hr;
} //*** CImpersonatedProvider::PutInstanceAsync()
//****************************************************************************
//
// CWbemInstanceMgr
//
//****************************************************************************
/////////////////////////////////////////////////////////////////////////////
//++
//
// CWbemInstanceMgr::CWbemInstanceMgr(
// IWbemObjectSink * pHandlerIn,
// DWORD dwSizeIn
// )
//
// Description:
// Constructor.
//
// Arguments:
// pHandlerIn -- WMI sink.
// dwSizeIn --
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CWbemInstanceMgr::CWbemInstanceMgr( IWbemObjectSink * pHandlerIn, DWORD dwSizeIn // = 50
) : m_pSink( NULL ) , m_ppInst( NULL ) , m_dwIndex( 0 ) { DWORD dwIndex = 0;
m_pSink = pHandlerIn; if ( m_pSink == NULL ) { throw static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER ); } // if: no sink specified
m_pSink->AddRef( ); m_dwThreshHold = dwSizeIn; m_ppInst = new IWbemClassObject*[ dwSizeIn ]; for ( dwIndex = 0 ; dwIndex < dwSizeIn ; dwIndex++ ) { m_ppInst[ dwIndex ] = NULL; } // for each in m_ppInst
} //*** CWbemInstanceMgr::CWbemInstanceMgr()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CWbemInstanceMgr::CWbemInstanceMgr( void )
//
// Description:
// Destructor.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CWbemInstanceMgr::~CWbemInstanceMgr( void ) { if ( m_ppInst != NULL ) { if ( m_dwIndex > 0 ) { m_pSink->Indicate( m_dwIndex, m_ppInst ); } DWORD dwIndex = 0; for ( dwIndex = 0; dwIndex < m_dwIndex; dwIndex++ ) { if ( m_ppInst[ dwIndex ] != NULL ) { ( m_ppInst[ dwIndex ] )->Release( ); } } delete [] m_ppInst; }
m_pSink->Release( );
} //*** CWbemInstanceMgr::~CWbemInstanceMgr()
/////////////////////////////////////////////////////////////////////////////
//++
//
// void
// CWbemInstanceMgr::Indicate(
// IN IWbemClassObject * pInstIn
// )
//
// Description:
// Notify an instance to WMI sink
//
// Arguments:
// pInstIn -- Instance to send to WMI
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CWbemInstanceMgr::Indicate( IN IWbemClassObject * pInstIn ) { if ( pInstIn == NULL ) { throw static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER ); }
m_ppInst[ m_dwIndex++ ] = pInstIn; pInstIn->AddRef( ); if ( m_dwIndex == m_dwThreshHold ) { HRESULT sc = WBEM_S_NO_ERROR; sc = m_pSink->Indicate( m_dwIndex, m_ppInst ); if( FAILED( sc ) ) { if ( sc == WBEM_E_CALL_CANCELLED ) { sc = WBEM_S_NO_ERROR; } throw CProvException( sc ); }
// reset state
DWORD dwIndex = 0; for ( dwIndex = 0; dwIndex < m_dwThreshHold; dwIndex++ ) { if ( m_ppInst[ dwIndex ] != NULL ) { ( m_ppInst[ dwIndex ] )->Release( ); } //*** if m_ppInst[ _dwIndex ] != NULL
m_ppInst[ dwIndex ] = NULL;
} //*** for each in m_ppInst
m_dwIndex = 0;
} //*** if( m_dwIndex == m_dwThreshHold )
return;
} //*** CWbemInstanceMgr::Indicate()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CWbemInstanceMgr::SetStatus
//
// Description:
// send status to WMI sink
//
// Arguments:
// lFlagsIn -- WMI flag
// hrIn -- HResult
// bstrParamIn -- Message
// pObjParamIn -- WMI extended error object
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CWbemInstanceMgr::SetStatus( LONG lFlagsIn, HRESULT hrIn, BSTR bstrParamIn, IWbemClassObject * pObjParamIn ) { m_pSink->SetStatus( lFlagsIn, hrIn, bstrParamIn, pObjParamIn );
} //*** CWbemInstanceMgr::SetStatus()
|