windows-nt/Source/XPSP1/NT/net/wlbs/wmi/wlbs_clusclussetting.cpp
2020-09-26 16:20:57 +08:00

300 lines
6.9 KiB
C++

#include "WLBS_Provider.h"
#include "WLBS_ClusClusSetting.h"
#include "ClusterWrapper.h"
#include "ControlWrapper.h"
#include "utils.h"
////////////////////////////////////////////////////////////////////////////////
//
// CWLBS_ClusClusSetting::CWLBS_ClusClusSetting
//
// Purpose: Constructor
//
////////////////////////////////////////////////////////////////////////////////
CWLBS_ClusClusSetting::CWLBS_ClusClusSetting(CWbemServices* a_pNameSpace,
IWbemObjectSink* a_pResponseHandler)
: CWlbs_Root( a_pNameSpace, a_pResponseHandler )
{
}
////////////////////////////////////////////////////////////////////////////////
//
// CWLBS_ClusClusSetting::Create
//
// Purpose: This instantiates this class and is invoked from an array of
// function pointers.
//
////////////////////////////////////////////////////////////////////////////////
CWlbs_Root* CWLBS_ClusClusSetting::Create
(
CWbemServices* a_pNameSpace,
IWbemObjectSink* a_pResponseHandler
)
{
g_pWlbsControl->CheckMembership();
CWlbs_Root* pRoot = new CWLBS_ClusClusSetting( a_pNameSpace, a_pResponseHandler );
if( !pRoot )
throw _com_error( WBEM_E_OUT_OF_MEMORY );
return pRoot;
}
////////////////////////////////////////////////////////////////////////////////
//
// CWLBS_ClusClusSetting::GetInstance
//
// Purpose:
//
// TODO: Implement later
// Not critical
//
////////////////////////////////////////////////////////////////////////////////
HRESULT CWLBS_ClusClusSetting::GetInstance
(
const ParsedObjectPath* a_pParsedPath,
long a_lFlags,
IWbemContext* a_pIContex
)
{
IWbemClassObject* pWlbsInstance = NULL;
try {
//TODO: remove
throw _com_error( WBEM_E_NOT_SUPPORTED );
/*
//get the node
FindInstance( &pWlbsInstance, a_pParsedPath );
//send the results back to WinMgMt
m_pResponseHandler->Indicate( 1, &pWlbsInstance );
if( pWlbsInstance ) {
pWlbsInstance->Release();
pWlbsInstance = NULL;
}
*/
return WBEM_S_NO_ERROR;
}
catch(...) {
if( pWlbsInstance ) {
pWlbsInstance->Release();
pWlbsInstance = NULL;
}
throw;
}
}
////////////////////////////////////////////////////////////////////////////////
//
// CWLBS_ClusClusSetting::EnumInstances
//
// Purpose: This verifies cluster existence and constructs associator.
//
////////////////////////////////////////////////////////////////////////////////
HRESULT CWLBS_ClusClusSetting::EnumInstances
(
BSTR a_bstrClass,
long a_lFlags,
IWbemContext* a_pIContex
)
{
IWbemClassObject* pWlbsInstance = NULL;
HRESULT hRes = 0;
try {
DWORD dwNumClusters = 0;
CWlbsClusterWrapper** ppCluster = NULL;
g_pWlbsControl->EnumClusters(ppCluster, &dwNumClusters);
if (dwNumClusters == 0)
{
throw _com_error( WBEM_E_NOT_FOUND );
}
for (DWORD i=0; i < dwNumClusters; i++)
{
//spawn an instance of the associator
SpawnInstance(MOF_CLUSCLUSSETTING::szName, &pWlbsInstance );
FillWbemInstance(ppCluster[i], pWlbsInstance);
//send the results back to WinMgMt
hRes= m_pResponseHandler->Indicate( 1, &pWlbsInstance );
if( FAILED( hRes ) ) {
throw _com_error( hRes );
}
if( pWlbsInstance )
pWlbsInstance->Release();
}
m_pResponseHandler->SetStatus( 0, WBEM_S_NO_ERROR, NULL, NULL );
hRes = WBEM_S_NO_ERROR;
}
catch(CErrorWlbsControl Err) {
IWbemClassObject* pWbemExtStat = NULL;
CreateExtendedStatus( m_pNameSpace,
&pWbemExtStat,
Err.Error(),
(PWCHAR)(Err.Description()) );
m_pResponseHandler->SetStatus(0, WBEM_E_FAILED, NULL, pWbemExtStat);
if( pWbemExtStat )
pWbemExtStat->Release();
if( pWlbsInstance )
pWlbsInstance->Release();
//do not return WBEM_E_FAILED, this causes a race condition
hRes = WBEM_S_NO_ERROR;
}
catch( _com_error HResErr ) {
m_pResponseHandler->SetStatus(0, HResErr.Error(), NULL, NULL);
if( pWlbsInstance )
pWlbsInstance->Release();
hRes = HResErr.Error();
}
catch(...) {
if( pWlbsInstance )
pWlbsInstance->Release();
throw;
}
return hRes;
}
////////////////////////////////////////////////////////////////////////////////
//
// CWLBS_ClusClusSetting::FillWbemInstance
//
// Purpose: This constructs the wbem associator.
//
////////////////////////////////////////////////////////////////////////////////
void CWLBS_ClusClusSetting::FillWbemInstance
(
CWlbsClusterWrapper* pCluster,
IWbemClassObject* a_pWbemInstance
)
{
namespace CCS = MOF_CLUSCLUSSETTING;
ASSERT( a_pWbemInstance );
ParsedObjectPath ClusSetPath;
ParsedObjectPath ClusterPath;
LPWSTR szClusSetPath = NULL;
LPWSTR szClusterPath = NULL;
try {
//set the names of the classes
if( !ClusSetPath.SetClassName( MOF_CLUSTERSETTING::szName ) )
throw _com_error( WBEM_E_FAILED );
if( !ClusterPath.SetClassName( MOF_CLUSTER::szName ) )
throw _com_error( WBEM_E_FAILED );
//Get the cluster name
DWORD dwClusterIpOrIndex = pCluster->GetClusterIpOrIndex(g_pWlbsControl);
wstring wstrHostName;
ConstructHostName( wstrHostName, dwClusterIpOrIndex, pCluster->GetHostID());
_variant_t vString;
//set the keys for the node and cluster
vString = wstrHostName.c_str();
if( !ClusSetPath.AddKeyRef( MOF_CLUSTERSETTING::pProperties[MOF_CLUSTERSETTING::NAME],
&vString ) )
throw _com_error( WBEM_E_FAILED );
wstring wstrClusterIndex;
AddressToString( dwClusterIpOrIndex, wstrClusterIndex );
vString = wstrClusterIndex.c_str();
if( !ClusterPath.AddKeyRef( MOF_CLUSTER::pProperties[MOF_CLUSTER::NAME],
&vString ) )
throw _com_error( WBEM_E_FAILED );
//convert parsed object paths to strings
if (CObjectPathParser::Unparse(&ClusSetPath, &szClusSetPath) != CObjectPathParser::NoError)
throw _com_error( WBEM_E_FAILED );
if (CObjectPathParser::Unparse(&ClusterPath, &szClusterPath) != CObjectPathParser::NoError)
throw _com_error( WBEM_E_FAILED );
//Node reference
vString = szClusSetPath;
HRESULT hRes = a_pWbemInstance->Put
(
_bstr_t( CCS::pProperties[CCS::CLUSSET] ),
0,
&vString,
NULL
);
if( FAILED( hRes ) )
throw _com_error( hRes );
//Cluster reference
vString = szClusterPath;
hRes = a_pWbemInstance->Put
(
_bstr_t( CCS::pProperties[CCS::CLUSTER] ),
0,
&vString,
NULL
);
if( FAILED( hRes ) )
throw _com_error( hRes );
//free resources
ClusterPath.ClearKeys();
ClusSetPath.ClearKeys();
if( szClusSetPath )
delete (szClusSetPath);
if( szClusterPath )
delete (szClusterPath);
} catch (...) {
ClusterPath.ClearKeys();
ClusSetPath.ClearKeys();
if( szClusSetPath )
delete (szClusSetPath);
if( szClusterPath )
delete (szClusterPath);
throw;
}
}