212 lines
6.0 KiB
C++
212 lines
6.0 KiB
C++
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
asyncio.hxx
|
|
|
|
Abstract:
|
|
|
|
This module declares a class for handling Asynchronous IO using
|
|
ATQs and overlapped IO structures
|
|
|
|
Author:
|
|
|
|
Murali R. Krishnan ( MuraliK ) 27-March-1995
|
|
|
|
Environment:
|
|
|
|
User Mode -- Win32
|
|
|
|
Project:
|
|
|
|
Internet Services DLL
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
# ifndef _ASYNCIO_HXX_
|
|
# define _ASYNCIO_HXX_
|
|
|
|
/************************************************************
|
|
* Include Headers
|
|
************************************************************/
|
|
//
|
|
// Include NT/Windows headers
|
|
//
|
|
|
|
# include "atq.h"
|
|
|
|
# define DEFAULT_CONNECTION_IO_TIMEOUT ( 60) // 1 minutes
|
|
|
|
/************************************************************
|
|
* Type Definitions
|
|
************************************************************/
|
|
|
|
class ASYNC_IO_CONNECTION;
|
|
typedef ASYNC_IO_CONNECTION * LPASYNC_IO_CONNECTION;
|
|
|
|
|
|
extern VOID
|
|
ProcessAtqCompletion(IN LPVOID pContext,
|
|
IN DWORD cbIo,
|
|
IN DWORD dwCompletionStatus,
|
|
IN OVERLAPPED * lpo);
|
|
|
|
|
|
/*++
|
|
PFN_ASYNC_IO_COMPLETION:
|
|
|
|
Call back function to be called at completion of the IO using
|
|
ASYNC_IO_CONNECTION object.
|
|
|
|
Parameters:
|
|
pContext pointer to Context information for call back.
|
|
cbIo count of bytes involved in IO
|
|
dwCompletionStatus DWORD containing the Error code ( if any errors)
|
|
for last IO operation.
|
|
pAic pointer to the Asynchronous IO object involved in
|
|
processing last request.
|
|
fTimedOut indicates if the request was timed out.
|
|
--*/
|
|
typedef VOID ( * PFN_ASYNC_IO_COMPLETION)(
|
|
IN LPVOID pContext,
|
|
IN DWORD cbIo,
|
|
IN DWORD dwCompletionStatus,
|
|
IN LPASYNC_IO_CONNECTION pAic,
|
|
IN BOOL fTimedOut
|
|
);
|
|
|
|
|
|
/*++
|
|
class ASYNC_IO_CONNECTION:
|
|
|
|
This class maintains state of an asynchronous IO operation.
|
|
It supports async Read, Write and TransmitFile operations
|
|
for the user of its objects.
|
|
|
|
It also maintains state regarding timeout, user context
|
|
|
|
--*/
|
|
class ASYNC_IO_CONNECTION {
|
|
|
|
public:
|
|
|
|
enum ASYNC_IO_OPERATION {
|
|
AioNone,
|
|
AioRead,
|
|
AioWrite,
|
|
AioTransmitFile,
|
|
AioError
|
|
};
|
|
|
|
ASYNC_IO_CONNECTION( IN PFN_ASYNC_IO_COMPLETION pfnCompletion,
|
|
IN SOCKET sClient = INVALID_SOCKET);
|
|
|
|
virtual ~ASYNC_IO_CONNECTION( VOID);
|
|
|
|
VOID SetAioContext(IN LPVOID pContext) { m_pAioContext = pContext; }
|
|
|
|
SOCKET QuerySocket( VOID) const { return ( m_sClient); }
|
|
HANDLE QueryFile( VOID) const { return (HANDLE) QuerySocket(); }
|
|
LPVOID QueryAioContext( VOID) const { return ( m_pAioContext); }
|
|
PFN_ASYNC_IO_COMPLETION QueryPfnAioCompletion( VOID) const
|
|
{ return ( m_pfnAioCompletion); }
|
|
|
|
PATQ_CONTEXT QueryAtqContext(VOID) const { return ( m_pAtqContext); }
|
|
|
|
DWORD QueryIoTimeout( VOID) const { return (m_sTimeout);}
|
|
VOID SetIoTimeout(IN DWORD sTimeout) { m_sTimeout = sTimeout; }
|
|
|
|
// This function should be called once per object for new socket.
|
|
VOID SetAioInformation( IN LPVOID pContext, IN DWORD sTimeout)
|
|
{
|
|
m_pAioContext = pContext;
|
|
m_sTimeout = sTimeout;
|
|
}
|
|
|
|
// returns the timetilltimeout value from atq or locally.
|
|
DWORD ResumeIoOperation(VOID)
|
|
{
|
|
if ( m_pAtqContext != NULL) {
|
|
|
|
// no valid 3rd parameter required for setting this info.
|
|
// just to satisfy compiler send 0 as 3rd param
|
|
|
|
return (DWORD)AtqContextSetInfo( m_pAtqContext, ATQ_INFO_RESUME_IO, 0);
|
|
}
|
|
|
|
return ( INFINITE); // No Outstanding IO; so send INFINITE.
|
|
}
|
|
|
|
BOOL SetNewSocket(IN SOCKET sNewSocket,
|
|
IN PATQ_CONTEXT pAtqContext = NULL,
|
|
IN PVOID EndpointObject = NULL);
|
|
|
|
BOOL SetNewFile(IN HANDLE hNewFile);
|
|
|
|
BOOL ReadFile(
|
|
OUT LPVOID pvBuffer,
|
|
IN DWORD cbSize,
|
|
IN LONGLONG liOffset = 0);
|
|
|
|
BOOL WriteFile(
|
|
IN LPVOID pvBuffer,
|
|
IN DWORD cbSize,
|
|
IN LONGLONG liOffset = 0);
|
|
|
|
BOOL TransmitFile(
|
|
IN HANDLE hFile,
|
|
IN LARGE_INTEGER & liSize,
|
|
IN LONGLONG llOffset,
|
|
IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers = NULL
|
|
);
|
|
|
|
BOOL TransmitFileTs(
|
|
IN TS_OPEN_FILE_INFO * pOpenFile,
|
|
IN LARGE_INTEGER & liSize,
|
|
IN LONGLONG llOffset,
|
|
IN BOOL fDisconnectSocket
|
|
);
|
|
|
|
BOOL StopIo( IN DWORD dwErrorCode = NO_ERROR);
|
|
|
|
# if DBG
|
|
|
|
VOID Print( VOID) const;
|
|
# endif // DBG
|
|
|
|
|
|
private:
|
|
|
|
// data required for callback and establishing Atq connection.
|
|
LPVOID m_pAioContext;
|
|
PFN_ASYNC_IO_COMPLETION m_pfnAioCompletion;
|
|
DWORD m_sTimeout; // timeout in seconds
|
|
|
|
// data related to Async io.
|
|
SOCKET m_sClient; // this can also be a file handle
|
|
BOOL m_fFileIO; // indicates the m_sClient has a file handle
|
|
PATQ_CONTEXT m_pAtqContext;
|
|
PVOID m_endpointObject;
|
|
|
|
BOOL AddToAtqHandles( VOID)
|
|
{
|
|
return ( AtqAddAsyncHandle( &m_pAtqContext,
|
|
m_endpointObject,
|
|
this,
|
|
ProcessAtqCompletion,
|
|
QueryIoTimeout(),
|
|
(HANDLE)m_sClient)
|
|
);
|
|
} // AddToAtqHandles()
|
|
|
|
}; // class ASYNC_IO_CONNECTION:
|
|
|
|
|
|
# endif // _ASYNCIO_HXX_
|
|
|
|
/************************ End of File ***********************/
|