//////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2000 Microsoft Corporation
//
//  Module Name:
//      CClusterResource.h
//
//  Description:
//      This file contains the declaration of the CClusterResource
//      class.
//
//      The class CClusterResource represents a cluster resource.
//      It implements the IClusCfgManagaedResourceInfo interface.
//
//  Documentation:
//
//  Implementation Files:
//      CClusterResource.cpp
//
//  Maintained By:
//      Galen Barbee (GalenB) 13-JUN-2000
//
//////////////////////////////////////////////////////////////////////////////


// Make sure that this file is included only once per compile path.
#pragma once


//////////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////////
#include "PrivateInterfaces.h"


//////////////////////////////////////////////////////////////////////////////
// Constant Declarations
//////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////
//++
//
//  class CClusterResource
//
//  Description:
//      The class CClusterResource represents a cluster storage
//      device.
//
//  Interfaces:
//      IClusCfgManagedResourceInfo
//      IClusCfgInitialize
//      IClusCfgLoadResource
//--
//////////////////////////////////////////////////////////////////////////////
class CClusterResource
    : public IClusCfgManagedResourceInfo
    , public IClusCfgInitialize
    , public IClusCfgLoadResource
{
private:

    enum EStates
    {
        eIsQuorumDevice     = 1,
        eIsQuorumCapable    = 2,
        eIsQuorumJoinable   = 4
    };

    //
    // Private member functions and data
    //

    LONG                m_cRef;
    LCID                m_lcid;
    IClusCfgCallback *  m_picccCallback;
    DWORD               m_dwFlags;
    BSTR                m_bstrName;
    BSTR                m_bstrDescription;
    BSTR                m_bstrType;

    // Private constructors and destructors
    CClusterResource( void );
    ~CClusterResource( void );

    // Private copy constructor to prevent copying.
    CClusterResource( const CClusterResource & nodeSrc );

    // Private assignment operator to prevent copying.
    const CClusterResource & operator = ( const CClusterResource & nodeSrc );

    HRESULT HrInit( void );
    HRESULT HrIsResourceQuorumCapabile( HRESOURCE hResourceIn );
    HRESULT HrDetermineQuorumJoinable( HRESOURCE hResourceIn );

public:

    //
    // Public, non interface methods.
    //

    static HRESULT S_HrCreateInstance( IUnknown ** ppunkOut );

    //
    // IUnknown Interface
    //

    STDMETHOD( QueryInterface )( REFIID riid, void ** ppvObject );

    STDMETHOD_( ULONG, AddRef )( void );

    STDMETHOD_( ULONG, Release )( void );

    //
    // IClusCfgInitialize Interfaces
    //

    // Register callbacks, locale id, etc.
    STDMETHOD( Initialize )( IUnknown * punkCallbackIn, LCID lcidIn );

    //
    // IClusCfgLoadResoruce Interfaces
    //

    STDMETHOD( LoadResource )( HCLUSTER hClusterIn, HRESOURCE hResourceIn );

    //
    // IClusCfgManagedResourceInfo Interface
    //

    STDMETHOD( GetUID )( BSTR * pbstrUIDOut );

    STDMETHOD( GetName )( BSTR * pbstrNameOut );

    STDMETHOD( SetName )( BSTR bstrNameIn );

    STDMETHOD( IsManaged )( void );

    STDMETHOD( SetManaged )( BOOL fIsManagedIn );

    STDMETHOD( IsQuorumDevice )( void );

    STDMETHOD( SetQuorumedDevice )( BOOL fIsQuorumDeviceIn );

    STDMETHOD( IsQuorumCapable )( void );

    STDMETHOD( GetDriveLetterMappings )( SDriveLetterMapping * pdlmDriveLetterMappingOut );

    STDMETHOD( SetDriveLetterMappings )( SDriveLetterMapping dlmDriveLetterMappings );

    STDMETHOD( IsDeviceJoinable )( void );

    STDMETHOD( SetDeviceJoinable )( BOOL fIsJoinableIn );

}; //*** Class CClusterResource