windows-nt/Source/XPSP1/NT/net/upnp/host/upnphost/inc/buffio.h

96 lines
3 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*--
Copyright (c) 1995-1998 Microsoft Corporation
Module Name: BUFFIO.H
Author: Arul Menezes
Abstract: Buffer handling class & socket IO helpers
--*/
// returned from the socket IO functions
typedef enum
{
INPUT_OK = 0,
INPUT_TIMEOUT = 1,
INPUT_ERROR = 2,
INPUT_NOCHANGE = 3
//INPUT_EOF = 2,
}
HRINPUT;
class CHttpRequest; // forward declaration
int MySelect(SOCKET sock, DWORD dwMillisecs);
//
// There is one such buffer for all the headers of a request and another for the POST-body if any
//
class CBuffer
{
private:
PSTR m_pszBuf;
int m_iSize;
int m_iNextOut;
int m_iNextIn;
int m_iNextInFollow; // next place to read, needed by raw read filters.
CHAR m_chSaved; // Used by the parser
BOOL AllocMem(DWORD dwLen);
BOOL NextToken(PSTR* ppszTok, int* piLen, BOOL fWS, BOOL fColon = FALSE);
public:
CBuffer() {
memset(this, 0, sizeof(*this));
}
~CBuffer() {
MyFree(m_pszBuf);
}
// Used to reset a buffer through the course of 1 session, uses
// same allocated mem block. (don't change m_iSize)
void Reset()
{
m_iNextInFollow = m_iNextOut = m_iNextIn = m_chSaved = 0;
}
// accessors
DWORD Count() { return m_iNextIn - m_iNextOut; }
BOOL HasPostData() { return (m_iNextIn > m_iNextOut); }
PBYTE Data() { return (PBYTE)(m_pszBuf + m_iNextOut); }
DWORD UnaccessedCount() { return m_iNextIn - m_iNextInFollow; } // this is data that hasn't been modified yet, for filters
DWORD AvailableBufferSize() { return m_iSize - m_iNextInFollow; } // size of buffer, used by filters
PBYTE FilterRawData() { return (PBYTE)(m_pszBuf + m_iNextInFollow); }
PSTR Headers() { return m_pszBuf; } // Http headers are at beginning of buf
DWORD GetINextOut() { return m_iNextOut; }
BOOL TrimWhiteSpace();
// input functions
HRINPUT RecvToBuf(SOCKET sock, DWORD dwLength, DWORD dwTimeout,BOOL fFromFilter=FALSE);
HRINPUT RecvHeaders(SOCKET sock)
{
DEBUGCHK(!m_iNextOut && !m_iNextIn);
return RecvToBuf(sock, (DWORD)-1, KEEPALIVETIMEOUT);
};
HRINPUT RecvBody(SOCKET sock, DWORD dwLength, BOOL fFromFilter = FALSE)
{
DEBUGCHK(m_pszBuf && m_iSize);
DEBUGCHK(m_iNextOut <= m_iNextIn);
DEBUGCHK(m_iNextInFollow <= m_iNextIn);
return RecvToBuf(sock, dwLength, RECVTIMEOUT,fFromFilter);
};
BOOL NextTokenWS(PSTR* ppszTok, int * piLen) { return NextToken(ppszTok, piLen, TRUE); }
BOOL NextTokenEOL(PSTR* ppszTok, int * piLen) { return NextToken(ppszTok, piLen, FALSE); }
BOOL NextTokenColon(PSTR* ppszTok, int * piLen) { return NextToken(ppszTok, piLen, TRUE, TRUE); }
BOOL NextLine();
BOOL AddHeader(PSTR pszName, PSTR pszValue, BOOL fAddColon=FALSE);
// output functions
BOOL AppendData(PSTR pszData, int iLen);
BOOL SendBuffer(SOCKET sock, CHttpRequest *pRequest);
BOOL FilterDataUpdate(PVOID pvData, DWORD cbData, BOOL fModifiedPointer);
};