|
|
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2002 Microsoft Corporation
//
// Module Name:
// ClusterService.cpp
//
// Description:
// Implementation of CClusterService class
//
// Author:
// Henry Wang (HenryWa) 24-AUG-1999
//
//////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "ClusterService.h"
//****************************************************************************
//
// CClusterService
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterService::CClusterService
//
// Description:
// Constructor.
//
// Arguments:
// pwszNameIn -- Class name
// pNamespaceIn -- Namespace
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
CClusterService::CClusterService( LPCWSTR pwszNameIn, CWbemServices * pNamespaceIn ) : CProvBase( pwszNameIn, pNamespaceIn ) {
} //*** CClusterService::CClusterService()
//////////////////////////////////////////////////////////////////////////////
//++
//
// static
// CClusterService::S_CreateThis
//
// Description:
// Create a cluster node object
//
// Arguments:
// pwszNameIn -- Class name
// pNamespaceIn -- Namespace
// dwEnumTypeIn -- Type id
//
// Return Values:
// pointer to the CProvBase
//
//--
//////////////////////////////////////////////////////////////////////////////
CProvBase * CClusterService::S_CreateThis( LPCWSTR pwszNameIn, CWbemServices * pNamespaceIn, DWORD // dwEnumTypeIn
) { return new CClusterService( pwszNameIn, pNamespaceIn );
} //*** CClusterService::S_CreateThis()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterService::RgGetPropMap
//
// Description:
// Retrieve the property mapping table of the cluster node.
//
// Arguments:
// None.
//
// Return Values:
// Reference to the array of property maping table.
//
//--
//////////////////////////////////////////////////////////////////////////////
const SPropMapEntryArray * CClusterService::RgGetPropMap( void ) { static SPropMapEntry s_rgpm[] = { { PVD_PROP_SERVICE_SYSTEMNAME, CLUSREG_NAME_NODE_NAME, SZ_TYPE, READONLY }, { NULL, CLUSREG_NAME_NODE_DESC, SZ_TYPE, READWRITE }, { NULL, CLUSREG_NAME_NODE_MAJOR_VERSION, DWORD_TYPE, READWRITE }, { NULL, CLUSREG_NAME_NODE_MINOR_VERSION, DWORD_TYPE, READWRITE }, { NULL, CLUSREG_NAME_NODE_BUILD_NUMBER, DWORD_TYPE, READWRITE }, { NULL, CLUSREG_NAME_NODE_CSDVERSION, DWORD_TYPE, READWRITE } };
static SPropMapEntryArray s_pmea( sizeof( s_rgpm ) / sizeof( SPropMapEntry ), s_rgpm );
return &s_pmea;
} //*** CClusterService::RgGetPropMap()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterService::EnumInstance
//
// Description:
// Enumerate cluster instance.
//
// Arguments:
// lFlagsIn -- WMI flag
// pCtxIn -- WMI context
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterService::EnumInstance( long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pHandlerIn ) { SAFECLUSTER shCluster; SAFENODE shNode; LPCWSTR pwszNode;
shCluster = OpenCluster( NULL ); CClusterEnum cluEnum( shCluster, CLUSTER_ENUM_NODE );
while ( ( pwszNode = cluEnum.GetNext() ) != NULL ) { shNode = OpenClusterNode( shCluster, pwszNode );
ClusterToWMI( shNode, pHandlerIn );
} // while: more nodes
return WBEM_S_NO_ERROR;
} //*** CClusterService::EnumInstance()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterService::ClusterToWMI
//
// Description:
// Translate a cluster node object to WMI object.
//
// Arguments:
// hNodeIn -- Handle to node.
// pHandlerIn -- WMI sink
//
// Return Values:
// None.
//
//--
//////////////////////////////////////////////////////////////////////////////
void CClusterService::ClusterToWMI( HNODE hNodeIn, IWbemObjectSink * pHandlerIn ) { static SGetControl s_rgControl[] = { { CLUSCTL_NODE_GET_RO_COMMON_PROPERTIES, FALSE }, { CLUSCTL_NODE_GET_COMMON_PROPERTIES, FALSE }, { CLUSCTL_NODE_GET_RO_PRIVATE_PROPERTIES, TRUE }, { CLUSCTL_NODE_GET_PRIVATE_PROPERTIES, TRUE } }; static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetControl );
CWbemClassObject wco; UINT idx; CError er;
m_pClass->SpawnInstance( 0, & wco ); for ( idx = 0 ; idx < s_cControl ; idx ++ ) { CClusPropList pl; er = pl.ScGetNodeProperties( hNodeIn, s_rgControl[ idx ].dwControl, NULL, 0 );
CClusterApi::GetObjectProperties( RgGetPropMap(), pl, wco, s_rgControl[ idx ].fPrivate ); } // for: each control code
wco.SetProperty( L"ClusterService", PVD_PROP_SERVICE_NAME );
pHandlerIn->Indicate( 1, & wco ); return;
} //*** CClusterResource::ClusterToWMI()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterService::GetObject
//
// Description:
// Retrieve cluster node object based given object path.
//
// Arguments:
// rObjPathIn -- Object path to cluster object
// lFlagsIn -- WMI flag
// pCtxIn -- WMI context
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterService::GetObject( CObjPath & rObjPathIn, long lFlagsIn, IWbemContext * pCtxIn, IWbemObjectSink * pHandlerIn ) { SAFECLUSTER shCluster; SAFENODE shNode;
shCluster = OpenCluster( NULL ); shNode = OpenClusterNode( shCluster, rObjPathIn.GetStringValueForProperty( PVD_PROP_SERVICE_SYSTEMNAME ) );
ClusterToWMI( shNode, pHandlerIn );
return WBEM_S_NO_ERROR;
} //*** CClusterService::GetObject()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterService::ExecuteMethod
//
// Description:
// Execute methods defined in the mof for cluster node.
//
// Arguments:
// rObjPathIn -- Object path to cluster object
// pwszMethodNameIn -- Name of the method to be invoked
// lFlagIn -- WMI flag
// pParamsIn -- Input parameters for the method
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterService::ExecuteMethod( CObjPath & rObjPathIn, WCHAR * pwszMethodNameIn, long lFlagIn, IWbemClassObject * pParamsIn, IWbemObjectSink * pHandlerIn ) { SAFECLUSTER shCluster; SAFENODE shNode; CError er; shCluster = OpenCluster( NULL ); shNode = OpenClusterNode( shCluster, rObjPathIn.GetStringValueForProperty( PVD_PROP_SERVICE_SYSTEMNAME ) );
if ( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_SERVICE_PAUSE ) == 0 ) { er = PauseClusterNode( shNode ); } // if: PAUSE
else if( ClRtlStrICmp( pwszMethodNameIn, PVD_MTH_SERVICE_RESUME ) == 0 ) { er = ResumeClusterNode( shNode ); } // else if: RESUME
else { er = static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER ); }
return WBEM_S_NO_ERROR;
} //*** CClusterService::ExecuteMethod()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterService::PutInstance
//
// Description:
// Save this instance.
//
// Arguments:
// rInstToPutIn -- WMI object to be saved
// lFlagIn -- WMI flag
// pCtxIn -- WMI context
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_S_NO_ERROR
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterService::PutInstance( CWbemClassObject & rInstToPutIn, long lFlagIn, IWbemContext * pCtxIn, IWbemObjectSink * pHandlerIn ) { static SGetSetControl s_rgControl[] = { { CLUSCTL_NODE_GET_COMMON_PROPERTIES, CLUSCTL_NODE_SET_COMMON_PROPERTIES, FALSE }, { CLUSCTL_NODE_GET_PRIVATE_PROPERTIES, CLUSCTL_NODE_SET_PRIVATE_PROPERTIES, TRUE } }; static DWORD s_cControl = sizeof( s_rgControl ) / sizeof( SGetSetControl );
_bstr_t bstrName; SAFECLUSTER shCluster; SAFENODE shNode; CError er; UINT idx;
rInstToPutIn.GetProperty( bstrName, PVD_PROP_SERVICE_SYSTEMNAME );
shCluster = OpenCluster( NULL ); shNode = OpenClusterNode( shCluster, bstrName );
for ( idx = 0 ; idx < s_cControl ; idx ++ ) { CClusPropList plOld; CClusPropList plNew; er = plOld.ScGetNodeProperties( shNode, s_rgControl[ idx ].dwGetControl, NULL, NULL, 0 );
CClusterApi::SetObjectProperties( RgGetPropMap(), plNew, plOld, rInstToPutIn, s_rgControl[ idx ].fPrivate );
if ( plNew.Cprops() > 0 ) { er = ClusterNodeControl( shNode, NULL, s_rgControl[ idx ].dwSetControl, plNew.PbPropList(), static_cast< DWORD >( plNew.CbPropList() ), NULL, 0, NULL ); } } // for: each control code
return WBEM_S_NO_ERROR;
} //*** CClusterService::PutInstance()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CClusterService::DeleteInstance
//
// Description:
// Delete the object specified in rObjPathIn.
//
// Arguments:
// rObjPathIn -- ObjPath for the instance to be deleted
// lFlagIn -- WMI flag
// pCtxIn -- WMI context
// pHandlerIn -- WMI sink pointer
//
// Return Values:
// WBEM_E_NOT_SUPPORTED
//
//--
//////////////////////////////////////////////////////////////////////////////
SCODE CClusterService::DeleteInstance( CObjPath & rObjPathIn, long lFlagIn, IWbemContext * pCtxIn, IWbemObjectSink * pHandlerIn ) { return WBEM_E_NOT_SUPPORTED;
} //*** CClusterService::DeleteInstance()
|