// OverLapped.h: interface for the COverLapped class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_OVERLAPPED_H__750A9089_8275_4B71_929E_CC4D70C926E6__INCLUDED_)
#define AFX_OVERLAPPED_H__750A9089_8275_4B71_929E_CC4D70C926E6__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class EXPORT_DLL COverLapped : public OVERLAPPED
{
public:

    // Definitions.

    typedef enum tagOPERATION
    {
        operationInvalid            = -1, 
        operationReadFile,
        operationWriteFile,
        operationReadFileEx,
        operationWriteFileEx
    }
    EOPERATION;

    // Construction and destruction.

                    COverLapped             (   HANDLE                  hNewEvent   = NULL, 
                                                HANDLE                  hNewFile    = INVALID_HANDLE_VALUE,
                                                LPVOID                  lpNewBuffer = NULL );

                    COverLapped             (   BOOL                    bCreateEvent,
                                                HANDLE                  hNewFile    = INVALID_HANDLE_VALUE,
                                                LPVOID                  lpNewBuffer = NULL);

                    COverLapped             (   LPOVERLAPPED            lpOverlapped, 
                                                HANDLE                  hFile       = INVALID_HANDLE_VALUE,
                                                LPVOID                  lpBuffer    = NULL);

                    COverLapped             (   const COverLapped       &rRhs );

    // Access methods.

                    operator OVERLAPPED * () const;


    VOID            SetFile                 (   HANDLE                  hFile);
    LPVOID          GetBuffer               (   void );

    VOID            SetBuffer               (   LPVOID                  lpBuffer);
    EOPERATION      GetPreviousOperation    (   void ) const;

    VOID            SetPreviousOperation    (   const EOPERATION       &reOperation );

    HANDLE          GetEventHandle          (   void );
    VOID            SetEventHandle          (   HANDLE                  hEvent);

    DWORD           GetOffset               (   void );
    VOID            SetOffset               (   DWORD                   dwOffset );

    DWORD  &        FileOffset              (   void );
    DWORD  &        FileOffsetHigh          (   void );

    BOOL            GetResult               (   LPDWORD                 lpdwBytes,
                                                BOOL                    bBlock = TRUE );

    BOOL            Recycle                 (   DWORD                   dwBytesToTransfer,
                                                LPDWORD                 lpdwBytesTransferred,
                                                LPOVERLAPPED_COMPLETION_ROUTINE
                                                                        lpCompletion = NULL);

protected:

    HANDLE          m_hFile;
    LPVOID          m_lpBuffer;
    EOPERATION      m_eLastOperation;

};

#endif // !defined(AFX_OVERLAPPED_H__750A9089_8275_4B71_929E_CC4D70C926E6__INCLUDED_)
