|
|
#include "WLBS_Provider.h"
#include "WLBS_Root.h"
#include "utils.h"
#include "controlwrapper.h"
#include "param.h"
////////////////////////////////////////////////////////////////////////////////
//
// CWlbs_Root::CWlbs_Root
//
// Purpose: Constructor
//
////////////////////////////////////////////////////////////////////////////////
CWlbs_Root::CWlbs_Root(CWbemServices* a_pNameSpace, IWbemObjectSink* a_pResponseHandler) : m_pNameSpace(NULL), m_pResponseHandler(NULL) {
//m_pNameSpace and m_pResponseHandler are initialized to NULL
//by CWlbs_Root
if(!a_pNameSpace || !a_pResponseHandler) throw _com_error( WBEM_E_INVALID_PARAMETER );
m_pNameSpace = a_pNameSpace;
m_pResponseHandler = a_pResponseHandler; m_pResponseHandler->AddRef();
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbs_Root::~CWlbs_Root
//
// Purpose: Destructor
//
////////////////////////////////////////////////////////////////////////////////
CWlbs_Root::~CWlbs_Root() {
if( m_pNameSpace ) m_pNameSpace = NULL;
if( m_pResponseHandler ) { m_pResponseHandler->Release(); m_pResponseHandler = NULL; }
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbs_Root::SpawnInstance
//
// Purpose: This obtains an instance of a WBEM class.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbs_Root::SpawnInstance ( LPCWSTR a_szClassName, IWbemClassObject** a_ppWbemInstance ) { HRESULT hResult; IWbemClassObjectPtr pWlbsClass;
//get the MOF class object
hResult = m_pNameSpace->GetObject( _bstr_t( a_szClassName ), 0, NULL, &pWlbsClass, NULL);
if( FAILED(hResult) ) { throw _com_error(hResult); }
//spawn an instance
hResult = pWlbsClass->SpawnInstance( 0, a_ppWbemInstance );
if( FAILED( hResult ) ) throw _com_error( hResult );
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbs_Root::GetMethodOutputInstance
//
// Purpose: This obtains an IWbemClassObject that is used to store the
// output parameters for a method call. The caller is responsible for
// releasing the output object.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbs_Root::GetMethodOutputInstance ( LPCWSTR a_szMethodClass, const BSTR a_strMethodName, IWbemClassObject** a_ppOutputInstance ) {
IWbemClassObjectPtr pMethClass; IWbemClassObjectPtr pOutputClass; IWbemClassObjectPtr pOutParams; BSTR strMethodClass = NULL;
HRESULT hResult;
ASSERT( a_szMethodClass );
try {
strMethodClass = SysAllocString( a_szMethodClass );
if( !strMethodClass ) throw _com_error( WBEM_E_OUT_OF_MEMORY );
hResult = m_pNameSpace->GetObject ( strMethodClass, 0, NULL, &pMethClass, NULL );
if( FAILED( hResult ) ) throw _com_error( hResult );
hResult = pMethClass->GetMethod( a_strMethodName, 0, NULL, &pOutputClass );
if( FAILED( hResult ) ) throw _com_error( hResult );
hResult = pOutputClass->SpawnInstance( 0, a_ppOutputInstance );
if( FAILED( hResult ) ) { throw _com_error(hResult); }
if( strMethodClass ) {
SysFreeString( strMethodClass ); strMethodClass = NULL;
}
} catch(...) {
if( strMethodClass ) {
SysFreeString( strMethodClass ); strMethodClass = NULL;
}
throw; }
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbs_Root::UpdateConfigProp
//
// Purpose: This extracts the propery name and value from the WBEM object and if
// the property is not set to VT_NULL then the configuration is updated
// else the original configuration, the Src parameter, is used.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbs_Root::UpdateConfigProp ( wstring& a_szDest, const wstring& a_szSrc, LPCWSTR a_szPropName, IWbemClassObject* a_pNodeInstance ) {
HRESULT hRes = NULL; VARIANT vNewValue;
try { VariantInit( &vNewValue );
hRes = a_pNodeInstance->Get( _bstr_t( a_szPropName ), 0, &vNewValue, NULL, NULL );
if( FAILED( hRes ) ) throw _com_error( hRes );
if( vNewValue.vt != VT_NULL ) a_szDest.assign( vNewValue.bstrVal ); //update to new value
else a_szDest = a_szSrc; //keep original value
// CLD: Need to check return code for error
if (S_OK != VariantClear( &vNewValue )) throw _com_error( WBEM_E_FAILED ); } catch(...) {
// CLD: Need to check return code for error
// No throw here since we are already throwing an exception.
VariantClear( &vNewValue );
throw; }
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbs_Root::UpdateConfigProp
//
// Purpose: This extracts the propery name and value from the WBEM object and if
// the property is not set to VT_NULL then the configuration is updated
// else the original configuration, the Src parameter, is used.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbs_Root::UpdateConfigProp ( bool& a_bDest, bool a_bSrc, LPCWSTR a_szPropName, IWbemClassObject* a_pNodeInstance ) {
BSTR strPropName = NULL; HRESULT hRes = NULL; VARIANT vNewValue;
try {
VariantInit( &vNewValue );
hRes = a_pNodeInstance->Get ( _bstr_t( a_szPropName ), 0, &vNewValue, NULL, NULL );
if( FAILED( hRes ) ) throw _com_error( hRes );
if( vNewValue.vt != VT_NULL ) a_bDest = (vNewValue.boolVal != 0); //update to new value
else a_bDest = a_bSrc; //keep original value
// CLD: Need to check return code for error
if (S_OK != VariantClear( &vNewValue )) throw _com_error( WBEM_E_FAILED ); SysFreeString( strPropName );
} catch(...) { // CLD: Need to check return code for error
// No throw here since we are already throwing an exception.
VariantClear( &vNewValue );
throw; }
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbs_Root::UpdateConfigProp
//
// Purpose: This extracts the propery name and value from the WBEM object and if
// the property is not set to VT_NULL then the configuration is updated
// else the original configuration, the Src parameter, is used.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbs_Root::UpdateConfigProp ( DWORD& a_dwDest, DWORD a_dwSrc, LPCWSTR a_szPropName, IWbemClassObject* a_pNodeInstance ) {
HRESULT hRes = NULL; VARIANT vNewValue;
try { VariantInit( &vNewValue );
hRes = a_pNodeInstance->Get( _bstr_t( a_szPropName ), 0, &vNewValue, NULL, NULL );
if( FAILED( hRes ) ) throw _com_error( hRes );
if( vNewValue.vt != VT_NULL ) a_dwDest = vNewValue.lVal; else a_dwDest = a_dwSrc;
// CLD: Need to check return code for error
if (S_OK != VariantClear( &vNewValue )) throw _com_error( WBEM_E_FAILED ); } catch(...) {
// CLD: Need to check return code for error
// No throw here since we are already throwing an exception.
VariantClear( &vNewValue );
throw; }
}
////////////////////////////////////////////////////////////////////////////////
//
// CWlbs_Root::CreateExtendedStatus
//
// Purpose: Spawn and fill a Wbem extended status object with error
// information.
//
////////////////////////////////////////////////////////////////////////////////
void CWlbs_Root::CreateExtendedStatus ( CWbemServices* a_pNameSpace, IWbemClassObject** a_ppWbemInstance, DWORD a_dwErrorCode, LPCWSTR /*a_szDescription*/ ) { HRESULT hResult; IWbemClassObjectPtr pWlbsExtendedObject;
try { ASSERT(a_ppWbemInstance); ASSERT(a_pNameSpace );
//this is the only routine that references
//the MicrosoftNLB_ExtendedStatus object
//if other routines start to use the class,
//or if it adds additional properties, then
//is should be added to the MOF data files
//along with the other classes
//get the MOF class object
hResult = a_pNameSpace->GetObject( _bstr_t( L"MicrosoftNLB_ExtendedStatus" ), 0, NULL, &pWlbsExtendedObject, NULL);
if( FAILED(hResult) ) { throw _com_error(hResult); }
//spawn an instance
hResult = pWlbsExtendedObject->SpawnInstance( 0, a_ppWbemInstance );
if( FAILED( hResult ) ) throw _com_error( hResult );
//this is omitted in release due to internationalization concerns
/*
#if 0
//fill instance with data
//add description
hResult = (*a_ppWbemInstance)->Put ( _bstr_t( L"Description" ) , 0 , &( _variant_t( a_szDescription ) ) , NULL );
#endif
*/ if( FAILED( hResult ) ) throw _com_error( hResult );
//add status code
hResult = (*a_ppWbemInstance)->Put ( _bstr_t( L"StatusCode" ) , 0 , &( _variant_t( (long)a_dwErrorCode ) ) , NULL );
if( FAILED( hResult ) ) throw _com_error( hResult ); } catch(...) { if( *a_ppWbemInstance ) (*a_ppWbemInstance)->Release();
throw; } }
//+----------------------------------------------------------------------------
//
// Function: CWlbs_Root::ExtractHostID
//
// Description: Extract the Host ID from name "clusterIp:HostId"
//
// Arguments: const wstring& a_wstrName -
//
//
// Returns: DWORD - Host ID, or -1 if failed
//
// History: fengsun Created Header 7/13/00
//
//+----------------------------------------------------------------------------
DWORD CWlbs_Root::ExtractHostID(const wstring& a_wstrName) { long nColPos;
nColPos = a_wstrName.find( L":" );
if (nColPos == wstring::npos) { //
// Not found
//
TRACE_ERROR1("CWlbs_Root::ExtractHostID invalid name %ws", a_wstrName.c_str()); return (DWORD)-1; }
wstring wstrHostID = a_wstrName.substr( nColPos+1, a_wstrName.size()-1 ); return _wtol( wstrHostID.c_str() ); }
//+----------------------------------------------------------------------------
//
// Function: CWlbs_Root::ExtractClusterIP
//
// Description: Extract the cluster IP address from name "clusterIp:HostId"
//
// Arguments: const wstring& a_wstrName -
//
//
// Returns: DWORD - Cluster IP, or INADDR_NONE (-1) if falied
//
// History: fengsun Created Header 7/13/00
//
//+----------------------------------------------------------------------------
DWORD CWlbs_Root::ExtractClusterIP(const wstring& a_wstrName) { long nColPos;
nColPos = a_wstrName.find( L":" );
if (nColPos == wstring::npos) { //
// Not found
//
TRACE_ERROR1("CWlbs_Root::ExtractClusterIP invalid name %ws", a_wstrName.c_str()); return (DWORD)-1; }
wstring wstrClusterIP = a_wstrName.substr( 0, nColPos );
return WlbsResolve( wstrClusterIP.c_str() ); }
////////////////////////////////////////////////////////////////////////////////
//
// CWlbs_Root::ConstructHostName
//
// Purpose:
//
////////////////////////////////////////////////////////////////////////////////
void CWlbs_Root::ConstructHostName ( wstring& a_wstrHostName, DWORD a_dwClusIP, DWORD a_dwHostID ) { WCHAR wszHostID[40]; AddressToString( a_dwClusIP, a_wstrHostName ); a_wstrHostName += L':'; a_wstrHostName += _ltow( a_dwHostID, wszHostID, 10 );
}
CWlbsClusterWrapper* GetClusterFromHostName(CWlbsControlWrapper* pControl, wstring wstrHostName) { DWORD dwClusterIpOrIndex = CWlbs_Root::ExtractClusterIP(wstrHostName);
return pControl->GetClusterFromIpOrIndex(dwClusterIpOrIndex); }
|