windows-nt/Source/XPSP1/NT/base/cluster/mgmt/cluscfg/basecluster/cbaseclusterjoin.h
2020-09-26 16:20:57 +08:00

229 lines
6.8 KiB
C++

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000 Microsoft Corporation
//
// Module Name:
// CBaseClusterJoin.h
//
// Description:
// Header file for CBaseClusterJoin class.
//
// The CBaseClusterJoin class is a class that encapsulates the
// action of add a node to a cluster.
//
// Implementation Files:
// CBaseClusterJoin.cpp
//
// Maintained By:
// Vij Vasu (Vvasu) 03-MAR-2000
//
//////////////////////////////////////////////////////////////////////////////
// Make sure that this file is included only once per compile path.
#pragma once
//////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////
// For the base class of this class.
#include "CBaseClusterAddNode.h"
// For the CStr class.
#include "CStr.h"
// For a few smart classes
#include "SmartClasses.h"
// For the cluster API functions and types
#include "ClusAPI.h"
// For the CClusSvcAccountConfig action
#include "CClusSvcAccountConfig.h"
//////////////////////////////////////////////////////////////////////////
// Type definitions
//////////////////////////////////////////////////////////////////////////
// Class used to automatically release a RPC binding handle.
class CRPCBindingHandleTrait
{
public:
//////////////////////////////////////////////////////////////////////////
// Public types
//////////////////////////////////////////////////////////////////////////
typedef RPC_BINDING_HANDLE ResourceType;
//////////////////////////////////////////////////////////////////////////
// Public methods
//////////////////////////////////////////////////////////////////////////
// A routine used to close a handle.
static void CloseRoutine( ResourceType hResourceIn )
{
RpcBindingFree( &hResourceIn );
} //*** CloseRoutine()
// Get the null value for this type.
static ResourceType HGetNullValue()
{
return NULL;
} //*** HGetNullValue()
}; //*** class CRPCBindingHandleTrait
// A smart RPC binding handle
typedef CSmartResource< CRPCBindingHandleTrait > SmartRpcBinding;
// Smart handle to a cluster.
typedef CSmartResource<
CHandleTrait<
HCLUSTER
, BOOL
, CloseCluster
, reinterpret_cast< HCLUSTER >( NULL )
>
> SmartClusterHandle;
//////////////////////////////////////////////////////////////////////////////
//++
//
// class CBaseClusterJoin
//
// Description:
// The CBaseClusterJoin class is a class that encapsulates the
// action of add a node to a cluster.
//
//--
//////////////////////////////////////////////////////////////////////////////
class CBaseClusterJoin : public CBaseClusterAddNode
{
public:
//////////////////////////////////////////////////////////////////////////
// Constructors and destructors
//////////////////////////////////////////////////////////////////////////
// Constructor.
CBaseClusterJoin(
CBCAInterface * pbcaiInterfaceIn
, const WCHAR * pcszClusterNameIn
, const WCHAR * pcszClusterBindingStringIn
, const WCHAR * pcszClusterAccountNameIn
, const WCHAR * pcszClusterAccountPwdIn
, const WCHAR * pcszClusterAccountDomainIn
);
// Default destructor.
~CBaseClusterJoin( void ) throw();
//////////////////////////////////////////////////////////////////////////
// Public accessors
//////////////////////////////////////////////////////////////////////////
// Get the NodeId of this node.
virtual const WCHAR *
PszGetNodeIdString( void ) const throw() { return m_strNodeId.PszData(); }
// Set the NodeId of this node.
void
SetNodeIdString( const WCHAR * pcszNodeIdIn ) { m_strNodeId = pcszNodeIdIn; }
// Get a handle to the cluster service account token.
HANDLE
HGetClusterServiceAccountToken( void ) const throw() { return m_satServiceAccountToken.HHandle(); }
RPC_BINDING_HANDLE
RbhGetJoinBindingHandle( void ) const throw() { return m_srbJoinBinding.HHandle(); }
//////////////////////////////////////////////////////////////////////////
// Public member functions
//////////////////////////////////////////////////////////////////////////
// Join the cluster.
void
Commit( void );
// Rollback a created cluster.
void
Rollback( void );
// Returns the number of progress messages that this action will send.
UINT
UiGetMaxProgressTicks( void ) const throw()
{
// The extra tick if for the "Join starting" notification.
return BaseClass::UiGetMaxProgressTicks() + 1;
}
private:
//////////////////////////////////////////////////////////////////////////
// Private types
//////////////////////////////////////////////////////////////////////////
// The base class of this class
typedef CBaseClusterAddNode BaseClass;
// A smart handle to an account token.
typedef CSmartResource< CHandleTrait< HANDLE, BOOL, CloseHandle > > SmartAccountToken;
// A smart handle to an RPC string.
typedef CSmartResource<
CHandleTrait<
LPWSTR *
, RPC_STATUS
, RpcStringFreeW
, reinterpret_cast< LPWSTR * >( NULL )
>
>
SmartRpcString;
typedef CSmartGenericPtr< CPtrTrait< CClusSvcAccountConfig > > SmartAccountConfigPtr;
//////////////////////////////////////////////////////////////////////////
// Public member functions
//////////////////////////////////////////////////////////////////////////
// Get a handle to a an account token. Note, this token is an impersonation token.
HANDLE
HGetAccountToken(
const WCHAR * pcszAccountNameIn
, const WCHAR * pcszAccountPwdIn
, const WCHAR * pcszAccountDomainIn
);
// Check and see if this node can interoperate with the sponsor cluster.
void
CheckInteroperability( void );
// Get a binding handle to the extrocluster join interface and store it.
void
InitializeJoinBinding( void );
//////////////////////////////////////////////////////////////////////////
// Private data
//////////////////////////////////////////////////////////////////////////
// Node Id of this node.
CStr m_strNodeId;
// Token for the cluster service account.
SmartAccountToken m_satServiceAccountToken;
// Binding handle to the extrocluster join interface.
SmartRpcBinding m_srbJoinBinding;
// A smart pointer to a CClusSvcAccountConfig object.
SmartAccountConfigPtr m_spacAccountConfigAction;
}; //*** class CBaseClusterJoin