//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1995 - 2000.
//
//  File:       CIOPLOCK.HXX
//
//  Contents:   Oplock support for filtering documents
//
//  Classes:    CFilterOplock
//
//  History:    03-Jul-95    DwightKr   Created.
//
//----------------------------------------------------------------------------

#pragma once

//+---------------------------------------------------------------------------
//
//  Class:      CFilterOplock
//
//  Purpose:    Takes oplock on file object
//
//  History:    03-Jul-95   DwightKr    Created.
//
//----------------------------------------------------------------------------

class CFilterOplock
{
public:

    CFilterOplock( CFunnyPath const & funnyFileName, BOOL fTakeOplock = TRUE );
   ~CFilterOplock();

    BOOL IsOplockBroken() const;
    BOOL IsDirectory() const { return _fDirectory; }

    HANDLE GetFileHandle() { return _hFileNormal; }
    inline void CloseFileHandle();

    BOOL IsOffline() const { return (0 != (_BasicInfo.FileAttributes & FILE_ATTRIBUTE_OFFLINE) ); }

    void MaybeSetLastAccessTime( ULONG ulDelay );

    BOOL IsNotContentIndexed() const
    {
        return ( 0 != ( _BasicInfo.FileAttributes &
                        FILE_ATTRIBUTE_NOT_CONTENT_INDEXED ) );
    }

private:

    FILE_BASIC_INFORMATION  _BasicInfo;      // Used to store last-access time, etc.
    HANDLE                  _hFileOplock;    // File handle for oplock
    HANDLE                  _hFileNormal;    // File handle for NtQueryInfo, etc.
    HANDLE                  _hLockEvent;     // Event signaled when lock broken
    IO_STATUS_BLOCK         _IoStatus;       // Asynchronous I/O status block
    BOOL                    _fDirectory;     // no oplocks on directories
    BOOL                    _fWriteAccess;   // FALSE if _hFileNormal has no
                                             // attribute write access
    CFunnyPath const &      _funnyFileName;  // Filename, for MaybeSetLastAccessTime
};


inline void CFilterOplock::CloseFileHandle ()
{
    if ( INVALID_HANDLE_VALUE != _hFileNormal )
    {
        NtClose( _hFileNormal );
        _hFileNormal = INVALID_HANDLE_VALUE;
    }
}