////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 1999-2001 Microsoft Corporation // // Module Name: // PostCfgManager.h // // Description: // CPostCfgManager implementation. // // Maintained By: // Galen Barbee (GalenB) 09-JUN-2000 // ////////////////////////////////////////////////////////////////////////////// // Make sure that this file is included only once per compile path. #pragma once ////////////////////////////////////////////////////////////////////////////// // Include Files ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // Constant Declarations ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //++ // // class CPostCfgManager // // Description: // The class CPostCfgManager inplements the PostCfgManager // interface. // // Interfaces: // IPostCfgManager // IClusCfgInitialize // IClusCfgCallback // //-- ////////////////////////////////////////////////////////////////////////////// class CPostCfgManager : public IPostCfgManager // private , public IClusCfgInitialize , public IClusCfgCallback { private: // // Private types // // Stucture for one entry in the resource type GUID to resource type name map. struct SResTypeGUIDAndName { GUID m_guidTypeGUID; WCHAR * m_pszTypeName; }; //*** SResTypeGUIDAndName // IUnknown LONG m_cRef; // Reference counter // Pointer to the callback interface. IClusCfgCallback * m_pcccb; // Callback to the client // The locale id LCID m_lcid; // Local ID of the client // IPostCfgManager IEnumClusCfgManagedResources * m_peccmr; // Enumer of managed resources IClusCfgClusterInfo * m_pccci; // Cluster configuration list ULONG m_cResources; // Count of resources in list ULONG m_cAllocedResources; // Count of alloc'ed resources CResourceEntry ** m_rgpResources; // List of pointers to Resource Entries ULONG m_idxIPAddress; // Cluster IP Address resource index ULONG m_idxClusterName; // Cluster Name resource index ULONG m_idxQuorumResource; // Quorum resource index ULONG m_idxLastStorage; // Last storage resource examined HCLUSTER m_hCluster; // Cluster handle ULONG m_cNetName; // Net Name instance counter ULONG m_cIPAddress; // IP Address instance counter SResTypeGUIDAndName * m_pgnResTypeGUIDNameMap; // Map between resource type GUID and its name ULONG m_idxNextMapEntry; // Index of the first free map entry ULONG m_cMapSize; // Count of the number of elements in the map buffer. DWORD m_dwLocalQuorumStatusMax; // The max of the status report range for local quorum deletion. ECommitMode m_ecmCommitChangesMode; // What are we doing, create cluster, adding nodes, or cleaning up? BOOL m_isQuorumChanged:1; // Set this flag if a better quorum resource has been found. BSTR m_bstrNodeName; private: // Methods CPostCfgManager( void ); ~CPostCfgManager( void ); // Private copy constructor to prevent copying. CPostCfgManager( const CPostCfgManager & nodeSrc ); // Private assignment operator to prevent copying. const CPostCfgManager & operator = ( const CPostCfgManager & nodeSrc ); HRESULT HrInit( void ); HRESULT HrPreCreateResources( void ); HRESULT HrCreateGroups( void ); HRESULT HrCreateResources( void ); HRESULT HrPostCreateResources( void ); HRESULT HrFindNextSharedStorage( ULONG * pidxInout ); HRESULT HrAttemptToAssignStorageToResource( ULONG idxResourceIn, EDependencyFlags dfResourceFlagsIn ); HRESULT HrMovedDependentsToAnotherResource( ULONG idxSourceIn, ULONG idxDestIn ); HRESULT HrSetGroupOnResourceAndItsDependents( ULONG idxResourceIn, CGroupHandle * pghIn ); HRESULT HrFindGroupFromResourceOrItsDependents( ULONG idxResourceIn, CGroupHandle ** pghOut ); HRESULT HrCreateResourceAndDependents( ULONG idxResourceIn ); HRESULT HrPostCreateResourceAndDependents( ULONG idxResourceIn ); HRESULT HrPreInitializeExistingResources( void ); HRESULT HrAddSpecialResource( BSTR bstrNameIn, const CLSID * pclsidTypeIn, const CLSID * pclsidClassTypeIn ); HRESULT HrCreateResourceInstance( ULONG idxResourceIn, HGROUP hGroupIn, LPCWSTR pszResTypeIn, HRESOURCE * phResourceOut ); HRESULT HrGetCoreClusterResourceNames( BSTR * pbstrClusterNameResourceNameOut , HRESOURCE * phClusterNameResourceOut , BSTR * pbstrClusterIPAddressNameOut , HRESOURCE * phClusterIPAddressResourceOut , BSTR * pbstrClusterQuorumResourceNameOut , HRESOURCE * phClusterQuorumResourceOut ); //HRESULT HrIsLocalQuorum( BSTR bstrNameIn ); // Enumerate all components on the local computer registered for resource type // configuration. HRESULT HrConfigureResTypes( IUnknown * punkResTypeServicesIn ); // Instantiates a resource type configuration component and calls the appropriate methods. HRESULT HrProcessResType( const CLSID & rclsidResTypeCLSIDIn, IUnknown * punkResTypeServicesIn ); // Notify all components on the local computer registered to get // notification of cluster member set change (create, add node or evict). HRESULT HrNotifyMemberSetChangeListeners( void ); // Instantiates cluster member set change listener and notifies it. HRESULT HrProcessMemberSetChangeListener( const CLSID & rclsidListenerClsidIn ); // Create a mapping between a resource type GUID and a resource type name. HRESULT HrMapResTypeGUIDToName( const GUID & rcguidTypeGuidIn, const WCHAR * pcszTypeNameIn ); // Given a resource type GUID this function finds the resource type name if any. const WCHAR * PcszLookupTypeNameByGUID( const GUID & rcguidTypeGuidIn ); // Callback function used to delete the local quorum resource. static DWORD S_DwDeleteLocalQuorumResource( HCLUSTER hClusterIn , HRESOURCE hSelfIn, HRESOURCE hCurrentResourceIn, PVOID pvParamIn ); #if defined(DEBUG) void DebugDumpDepencyTree( void ); #endif // DEBUG public: // Methods static HRESULT S_HrCreateInstance( IUnknown ** ppunkOut ); // IUnknown STDMETHOD( QueryInterface )( REFIID riid, LPVOID *ppv ); STDMETHOD_( ULONG, AddRef )( void ); STDMETHOD_( ULONG, Release )( void ); // IPostCfgManager - private STDMETHOD( CommitChanges )( IEnumClusCfgManagedResources * peccmrIn, IClusCfgClusterInfo * pccciIn ); // IClusCfgInitialize STDMETHOD( Initialize )( IUnknown * punkCallbackIn, LCID lcidIn ); // IClusCfgCallback STDMETHOD( SendStatusReport )( LPCWSTR pcszNodeNameIn , CLSID clsidTaskMajorIn , CLSID clsidTaskMinorIn , ULONG ulMinIn , ULONG ulMaxIn , ULONG ulCurrentIn , HRESULT hrStatusIn , LPCWSTR pcszDescriptionIn , FILETIME * pftTimeIn , LPCWSTR pcszReferenceIn ); }; //*** Class CPostCfgManager