//+----------------------------------------------------------------------------
//
//  Copyright (C) 2000, Microsoft Corporation
//
//  File:       DfsISTGSupport.hxx
//
//  Contents:   Support for ISTG handles and other calls to the Ds for Site Cost info.
//
//  Classes:    DfsReferralData
//
//  History:    Dec. 8 2000,   Author: udayh
//
//-----------------------------------------------------------------------------

#ifndef __DFS_ISTG_SUP__
#define __DFS_ISTG_SUP__

#include "DfsGeneric.hxx"
#include "DfsInit.hxx"

//+----------------------------------------------------------------------------
//
//  Class:      DfsISTGHandle
//
//  Synopsis:   This class implements encapsulates the Dfs notion of a handle to an
//             ISTG.
//
//-----------------------------------------------------------------------------

class DfsISTGHandle : public DfsGeneric 
{
    public:
        HANDLE           DsHandle; // Handle from the Ds
        BOOLEAN         IsInitialized; // Is the Handle valid
        ULONG           DsTimeOut;
    private:
        ~DfsISTGHandle();
        
    public:
        DfsISTGHandle( VOID ) 
        : DfsGeneric( DFS_OBJECT_TYPE_ISTG_HANDLE )
        {
            IsInitialized = FALSE;
            DsTimeOut = DfsServerGlobalData.QuerySiteCostTimeoutInSeconds;
        }

        DFSSTATUS
        Bind( VOID );
        
};

class DfsISTGHandleSupport 
{
public:
    DfsISTGHandle      *_GlobalHandle;
    CRITICAL_SECTION  _HandleLock;
    ULONG             _CreationTime; // time the global handle was created.
    ULONG             _LastRetryTime;
    ULONG             _NumberOfBinds; // Counter
    
    ~DfsISTGHandleSupport( VOID ) 
    {
        // This is a global instance and is not supposed to destruct
    }   
    
    DfsISTGHandleSupport( VOID ) 
    {
        _GlobalHandle = NULL;
        _LastRetryTime = 0;
        _NumberOfBinds = 0;
        _CreationTime = 0;
    }
    
public:

    static DFSSTATUS 
    DfsCreateISTGHandleSupport( 
        DfsISTGHandleSupport **ppSup );
    
    DFSSTATUS
    Initialize( VOID );

    DFSSTATUS
    Acquire( DfsISTGHandle **ppHdl );
    
    //
    // Just release the reference we acquired in Acquire.
    // If the handle is invalid now and it's refcount is 0,
    // it'll just get deleted.
    //
    VOID
    Release( DfsISTGHandle *pHdl )
    {
        if (pHdl != NULL)
        {
            pHdl->ReleaseReference();
        }
    }

    BOOLEAN
    IsTimeToRetry()
    {
        return TRUE; // xxxdfsdev
    }

    DFSSTATUS
    ReBind( VOID );
};

DfsISTGHandle * 
DfsAcquireISTGHandle( VOID );

VOID
DfsReleaseISTGHandle( 
    DfsISTGHandle *pHdl );
    
DFSSTATUS
DfsReBindISTGHandle( VOID );



HANDLE 
DfsGetISTGHandle_Bogus( VOID );

#endif