/*++ Copyright (c) 1995 Microsoft Corporation Module Name: buffer.hxx Abstract: Contains types, manifests, prototypes for double buffering object (in buffer.cxx) Author: Arthur L Bierer (arthurbi) 20-March-1996 Revision History: 20-March-1996 arthurbi Created --*/ #ifndef BUFFER_H_ #define BUFFER_H_ // // DBLBUFFER Class // #define DBLBUFFER_DEFAULT_SIZE 1500 #define DBLBUFFER_MAX_SIZE (32*1024) class DBLBUFFER { private: // // _lpBuffer - pointer to allocated buffer. // LPBYTE _lpBuffer; // // _dwBufferLength - current allocated size of the buffer // DWORD _dwBufferLength; // // _lpBufferIn - pointer where Input Buffer starts // LPBYTE _lpBufferIn; // // _dwBufferIn - size of input buffer in bytes. // DWORD _dwBufferIn; // // _lpBufferOut - pointer to where output buffer starts // LPBYTE _lpBufferOut; // // _dwBufferOut - size of output buffer. // DWORD _dwBufferOut; // // _dwInitDefaultBufferSize - default initial size of main buffer. // DWORD _dwInitDefaultBufferSize; // // Internal Varibles ----------------------------- // // // _lpEndOfBuffer - points to end of the buffer. // LPBYTE _lpEndOfBuffer; // // fDblBufferMode - TRUE if we maintain an input buffer seperate from an output buffer // otherwise the input/output is considered the same (ie input buffer is not used) // BOOL _fDblBufferMode; VOID UpdateVars() { INET_ASSERT(_lpBuffer); _lpEndOfBuffer = _lpBuffer + _dwBufferLength; // // Dock Pointers at end of buffer for sanity checking later on // if ( _dwBufferOut == 0 ) _lpBufferOut = _lpEndOfBuffer; if ( _dwBufferIn == 0 ) _lpBufferIn = _lpEndOfBuffer; } public: DBLBUFFER( DWORD dwInitBufferSize) { _dwInitDefaultBufferSize = dwInitBufferSize; _dwBufferOut = 0; _dwBufferIn = 0; _lpBufferOut = NULL; _lpBufferIn = NULL; _lpBuffer = NULL; _dwBufferLength = 0; _fDblBufferMode = FALSE; } DBLBUFFER( VOID) { _dwInitDefaultBufferSize = DBLBUFFER_DEFAULT_SIZE; _dwBufferOut = 0; _dwBufferIn = 0; _lpBufferOut = NULL; _lpBufferIn = NULL; _lpBuffer = NULL; _dwBufferLength = 0; _fDblBufferMode = FALSE; } ~DBLBUFFER() { if ( _lpBuffer ) { FREE_MEMORY(_lpBuffer); } } LPBYTE GetInputBufferPointer( VOID ) { DEBUG_ENTER((DBG_INET, Pointer, "DBLBUFFER::GetInputBufferPointer", NULL )); if ( _fDblBufferMode ) { DEBUG_LEAVE((( _lpBufferIn == _lpEndOfBuffer ) ? _lpBuffer : _lpBufferIn)); return ( _lpBufferIn == _lpEndOfBuffer ) ? _lpBuffer : _lpBufferIn; } else { DEBUG_LEAVE((( _lpBufferOut == _lpEndOfBuffer ) ? _lpBuffer : _lpBufferOut)); return ( _lpBufferOut == _lpEndOfBuffer ) ? _lpBuffer : _lpBufferOut; } } DWORD GetInputBufferSize( VOID ) { DEBUG_ENTER((DBG_INET, Int, "DBLBUFFER::GetInputBufferSize", NULL )); if ( _fDblBufferMode ) { DEBUG_LEAVE(_dwBufferIn); return _dwBufferIn; } else { DEBUG_LEAVE(_dwBufferOut); return _dwBufferOut; } } VOID SetInputBufferSize( IN DWORD dwNewInputBufferSize ) { DEBUG_ENTER((DBG_INET, None, "DBLBUFFER::SetInputBufferSize", "%u", dwNewInputBufferSize )); if ( _fDblBufferMode ) { _dwBufferIn = dwNewInputBufferSize; } else { _dwBufferOut = dwNewInputBufferSize; } DEBUG_LEAVE(0); } DWORD GetOutputBufferSize( VOID ) { DEBUG_ENTER((DBG_INET, Int, "DBLBUFFER::GetOutputBufferSize", NULL )); DEBUG_LEAVE(_dwBufferOut); return _dwBufferOut; } BOOL InitBuffer( BOOL fDblBufferMode ); DWORD GetInputBufferRemaining( VOID ); BOOL CopyOut( OUT LPBYTE lpBuffer, IN OUT LPDWORD lpdwBufferRemaining, IN OUT LPDWORD lpdwBytesReceived, IN OUT LPDWORD lpdwBytesRead ); BOOL CopyIn( IN LPBYTE lpBuffer, IN DWORD dwBufferSize ); BOOL CompressInputBufferUsage( VOID ); BOOL ConcatenateOutputBufferUsage( IN LPBYTE lpSecondOutputBuffer, IN DWORD dwSecondOutputBufferSize ); BOOL ResizeBufferIfNeeded( IN DWORD dwAddlBufferNeeded ); BOOL SetOutputInputBuffer( IN LPBYTE lpNewOutputBuffer, IN DWORD dwNewOutputBufferSize, IN LPBYTE lpNewInputBuffer, IN DWORD dwNewInputBufferSize, IN BOOL fConcatenatePreviousOutput ); }; #endif