//////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2000 Microsoft Corporation
//
//  Module Name:
//      ClusCfgPostCfg.idl
//
//  Description:
//      This file describes the interfaces used during post configuration of
//      resources / applications after the initial local quorum cluster has
//      been configured.
//
//  Maintained By:
//      Geoff Pease  (GPease)   06-JUN-2000
//
//////////////////////////////////////////////////////////////////////////////


// Comments for generated files
cpp_quote( "//////////////////////////////////////////////////////////////////////////////" )
cpp_quote( "//" )
cpp_quote( "// Copyright (c) 2000 Microsoft Corporation" )
cpp_quote( "//" )
cpp_quote( "// Remarks:" )
cpp_quote( "//     Generated file. See file ClusCfgPostCfg.idl for more details." )
cpp_quote( "//" )
cpp_quote( "//////////////////////////////////////////////////////////////////////////////" )


//////////////////////////////////////////////////////////////////////////////
// Imported Files
//////////////////////////////////////////////////////////////////////////////

import "unknwn.idl";


//////////////////////////////////////////////////////////////////////////////
// Forward Declarations
//////////////////////////////////////////////////////////////////////////////

interface IClusCfgManagedResourceCfg;
interface IClusCfgResourcePreCreate;
interface IClusCfgResourceCreate;
interface IClusCfgResourcePostCreate;
interface IClusCfgResourceEvict;
interface IClusCfgGroupCfg;

//////////////////////////////////////////////////////////////////////////////
// Type Definitions
//////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
// Interface Definitions
//////////////////////////////////////////////////////////////////////////////


//****************************************************************************
//++
//
//  interface IClusCfgManagedResourceCfg
//
//  Description:
//      TODO:   gpease  06-JUN-2000
//      Write a description.
//
//--
//****************************************************************************
[
    object,
    uuid( 60300A0F-77E1-440c-BD94-6BFB0DBFDB3A ),
    local,
    pointer_default( unique )
]
interface IClusCfgManagedResourceCfg : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgManagedResourceCfg::PreCreate(
    //      IUnknown * punkServicesIn
    //      )
    //
    // Description:
    //      This method is called by the post configuration manager to 
    //      determine the requirements of the resource. Querying the 
    //      punkServicesIn allows the managed resource to use services
    //      provided by the manager.
    //
    // Arguments:
    //      punkServicesIn
    //          The resource should QI this interface for services provided
    //          by the post configuration manager and to set its dependencies.
    //
    // Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT PreCreate( IUnknown * punkServicesIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgManagedResourceCfg::Create(
    //      IUnknown * punkServicesIn
    //      )
    //
    // Description:
    //      This method is called by the post configuration manager to 
    //      have the resource create an instance of itself. Querying the 
    //      punkServicesIn allows the managed resource to use services
    //      provided by the manager.
    //
    // Arguments:
    //      punkServicesIn
    //          The resource should QI this interface for services provided
    //          by the post configuration manager and to create itself.
    //
    // Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT Create( IUnknown * punkServicesIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgManagedResourceCfg::PostCreate(
    //      IUnknown * punkServicesIn
    //      )
    //
    // Description:
    //      This method is called by the post configuration manager to allow
    //      resources to perform any post-creation configuration that may be
    //      needed. At this point the cluster is fully configured. Querying
    //      the punkServicesIn allows the managed resource to use services
    //      provided by the manager.
    //
    // Arguments:
    //      punkServicesIn
    //          The resource should QI this interface for services provided
    //          by the post configuration manager.
    //
    // Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT PostCreate( IUnknown * punkServicesIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgManagedResourceCfg::Evict(
    //      IUnknown * punkServicesIn
    //      )
    //
    // Description:
    //      This method is called by the post configuration manager to alert
    //      the resource that this node was evicted from the cluster. The
    //      resource should do whatever cleanup it needs to do revert to a
    //      non-clustered state. Querying the  punkServicesIn allows the
    //      managed resource to uses services provided by the post
    //      configuration manager.
    //
    // Arguments:
    //      punkServicesIn
    //          The resource should QI this interface for services provided
    //          by the post configuration manager.
    //
    // Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed. Errors are ignored and do not prevent a node
    //          from being evicted.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT Evict( IUnknown * punkServicesIn );

}; //*** interface IClusCfgManagedResourceCfg

//****************************************************************************
//++
//
//  interface IClusCfgResourcePreCreate
//
//  Description:
//      TODO:   gpease  06-JUN-2000
//      Write a description.
//
//--
//****************************************************************************
[
    object,
    uuid( 4240F6A1-9D49-427e-8F3D-09384E1F59E4 ),
    local,
    pointer_default( unique )
]
interface IClusCfgResourcePreCreate : IUnknown
{
    typedef
    [
        uuid( 1DAF9692-6662-43b1-AD45-D50F7849B0CD ),
        helpstring("Resource dependency flags")
    ]
    enum EDependencyFlags {
        [helpstring("Unknown access")]              dfUNKNOWN   = 0,
        [helpstring("Shared access resource")]      dfSHARED    = 1,
        [helpstring("Exclusive access resource")]   dfEXCLUSIVE = 2,
    } EDependencyFlags;

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourcePreCreate::SetDependency(
    //      LPCLSID             pclsidDepResTypeIn,
    //      EDependencyFlags    dflagIn
    //      )
    //
    // Description:
    //      Informs the post configuration manager that a resource has a 
    //      dependency on another type of resource and if the resource needs
    //      the resource for shared access or exclusive access.
    //
    // Arguments:
    //      pclsidDepResTypeIn
    //          The CLSID of the type of resource that a resource is 
    //          requesting a dependency on. These are documented in the SDK
    //          or by the 3rd party resource.
    //
    //      dfIn
    //          Flags to modify the dependency relationship. The following 
    //          are defined flags:
    //
    //          dfSHARED       - the dependent resource can be shared.
    //          dfEXCLUSIVE    - the dependent resource can not be shared.
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetDependency( LPCLSID pclsidDepResTypeIn, DWORD dfIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourcePreCreate::GetType(
    //      CLSID * pclsidIn
    //      )
    //
    // Description:
    //      A managed resource MUST call this to indicate its resource type.
    //      Failure to call this during PreCreate will result in your 
    //      resource not being created.
    //
    // Arguments:
    //      pclsidIn
    //          Pointer to the GUID of the resource type.
    //
    // Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetType( CLSID * pclsidIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourcePreCreate::SetClassType(
    //      CLSID * pclsidIn
    //      )
    //
    // Description:
    //      A managed resource sets this to indicate that its resource type
    //      can be considered to be of a class of resource. You may call this
    //      multiple times to indicate all the classes you belong to.
    //
    // Arguments:
    //      pclsidIn
    //          Pointer to the GUID of the resource class type.
    //
    // Return Values:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetClassType( CLSID * pclsidIn );

}; //*** interface IClusCfgResourcePreCreate

//****************************************************************************
//++
//
//  interface IClusCfgResourceCreate
//
//  Description:
//      TODO:   gpease  06-JUN-2000
//      Write a description.
//
//--
//****************************************************************************
[
    object,
    uuid( 0647B41A-C777-443c-9432-02CCCF4FF443 ),
    local,
    pointer_default( unique )
]
interface IClusCfgResourceCreate : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SetPropertyBinary( 
    //      LPCWSTR      pcszNameIn, 
    //      const DWORD  cbSizeIn, 
    //      const BYTE * pbyteIn 
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetPropertyBinary( LPCWSTR pcszNameIn, const DWORD cbSizeIn, const BYTE * pbyteIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SetPropertyDWORD( 
    //      LPCWSTR     pcszNameIn, 
    //      const DWORD dwDWORDIn
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetPropertyDWORD( LPCWSTR pcszNameIn, const DWORD dwDWORDIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SetPropertyString( 
    //      LPCWSTR pcszNameIn, 
    //      LPCWSTR pcszStringIn
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetPropertyString( LPCWSTR pcszNameIn, LPCWSTR pcszStringIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SetPropertyExpandString( 
    //      LPCWSTR pcszNameIn, 
    //      LPCWSTR pcszStringIn
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetPropertyExpandString( LPCWSTR pcszNameIn, LPCWSTR pcszStringIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SetPropertyMultiString( 
    //      LPCWSTR     pcszNameIn, 
    //      const DWORD cbMultiStringIn,
    //      LPCWSTR     pcszMultiStringIn
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetPropertyMultiString( LPCWSTR pcszNameIn, const DWORD cbMultiStringIn, LPCWSTR pcszMultiStringIn );
    
    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SetPropertyUnsignedLargeInt( 
    //      LPCWSTR pcszNameIn, 
    //      const ULARGE_INTEGER   ulIntIn
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetPropertyUnsignedLargeInt( LPCWSTR pcszNameIn, const ULARGE_INTEGER  ulIntIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SetPropertyLong( 
    //      LPCWSTR     pcszNameIn,
    //      const LONG  lLongIn
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetPropertyLong( LPCWSTR pcszNameIn, const LONG lLongIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SetPropertySecurityDescriptor( 
    //      LPCWSTR                     pcszNameIn, 
    //      const SECURITY_DESCRIPTOR * pcsdIn 
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetPropertySecurityDescriptor( LPCWSTR pcszNameIn, const SECURITY_DESCRIPTOR * pcsdIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SetPropertyLargeInt( 
    //      LPCWSTR pcszNameIn, 
    //      const LARGE_INTEGER lIntIn
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetPropertyLargeInt( LPCWSTR pcszNameIn, const LARGE_INTEGER lIntIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SendResourceControl( 
    //      DWORD   dwControlCode,
    //      LPVOID  lpInBuffer,
    //      DWORD   cbInBufferSize,
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SendResourceControl( DWORD   dwControlCode,
                                 LPVOID  lpInBuffer,
                                 DWORD   cbInBufferSize
                                 );

}; //*** interface IClusCfgResourceCreate

//****************************************************************************
//++
//
//  interface IClusCfgResourcePostCreate
//
//  Description:
//      TODO:   gpease  06-JUN-2000
//      Write a description.
//
//--
//****************************************************************************
[
    object,
    uuid( 72A9BF54-13B6-451f-910D-6913EBF025AB ),
    local,
    pointer_default( unique )
]
interface IClusCfgResourcePostCreate : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourcePostCreate::ChangeName(
    //      LPCWSTR pcszNameIn
    //      )
    //
    // Description:
    //      Changes the name of the resource.
    //
    // Arguments:
    //      pcszNameIn
    //          The name to assign the group.
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT ChangeName( LPCWSTR pcszNameIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgResourceCreate::SendResourceControl( 
    //      DWORD   dwControlCode,
    //      LPVOID  lpInBuffer,
    //      DWORD   cbInBufferSize,
    //      LPVOID  lpOutBuffer,
    //      DWORD   cbOutBufferSize,
    //      LPDWORD lpcbBytesReturned
    //      )
    //
    // Description:
    //
    // Arguments:
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SendResourceControl( DWORD   dwControlCode,
                                 LPVOID  lpInBuffer,
                                 DWORD   cbInBufferSize,
                                 LPVOID  lpOutBuffer,
                                 DWORD   cbOutBufferSize,
                                 LPDWORD lpcbBytesReturned
                                 );

}; //*** interface IClusCfgResourcePostCreate

//****************************************************************************
//++
//
//  interface IClusCfgGroupCfg
//
//  Description:
//      TODO:   gpease  06-JUN-2000
//      Write a description.
//
//--
//****************************************************************************
[
    object,
    uuid( DCB6D3D2-A55F-49e5-A64A-0CCFEB01ED3A ),
    local,
    pointer_default( unique )
]
interface IClusCfgGroupCfg : IUnknown
{
    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgGroupCfg::SetName(
    //      LPCWSTR pcszNameIn
    //      )
    //
    // Description:
    //      Changes the name of the group in which the resource was created.
    //      Note that the last resource to set the name wins. The ordering
    //      of the last resource is the resource that doesn't have anything
    //      depending on it.
    //
    // Arguments:
    //      pcszNameIn
    //          The name to assign the group.
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT SetName( LPCWSTR pcszNameIn );

    //////////////////////////////////////////////////////////////////////////
    //
    // STDMETHOD
    // IClusCfgGroupCfg::GetName(
    //      DWORD * pcbSizeInout,
    //      LPWSTR  pszNameOut
    //      )
    //
    // Description:
    //      Retrieves the name of the group in which the resource was created.
    //      Note that the last resource to set the name wins. The ordering
    //      of the last resource is the resource that doesn't have anything
    //      depending on it. Do not cache this value as the name may change
    //      after control has been returned to the manager.
    //
    // Arguments:
    //      pcbSizeInout
    //          Size of the pszNameOut buffer. On return, it is the size
    //          of the sting in bytes (not WCHARs). If the buffer is too
    //          small, the required buffer size will be returned.
    //
    //      bstrNameIn
    //          The name to assign the group.
    //
    // Return Value:
    //      S_OK
    //          Success.
    //
    //      HRESULT_FROM_WIN32( ERROR_MORE_DATA )
    //          The buffer size specified is too small.
    //
    //      other HRESULTs.
    //          The call failed.
    //
    //////////////////////////////////////////////////////////////////////////
    HRESULT GetName( DWORD * pcbSizeInout, LPWSTR pszNameOut );

}; //*** interface IClusCfgGroupCfg