www.pudn.com > NetPaw.rar > HttpSocket.h


#pragma once 
#include "iocpsocket.h" 
#include "httpreqheader.h" 
#include "httpresponsehdr.h" 
 
#define MAX_BUFF_SIZE      4096 
 
enum _ERRORS 
{ 
	ERR_FINISHED = -1, 
	ERR_OK = 0, 
	ERR_STATUSCODE, 
	ERR_DATALEN, 
	ERR_GENERAL = 100, 
	ERR_MAX 
}; 
 
// This is a just sample class for how to use CIocpSocket in client socket, 
// so it isn't implemented perfectly 
class CMainFrame; 
class CNetPawDoc; 
class CDownloadFile; 
 
class CHttpSocket : public CIocpSocket 
{ 
public: 
	CHttpSocket(CDownloadFile *pDlFile); 
	~CHttpSocket(void); 
 
	virtual void OnConnect(BOOL bSuccess, CEventCallback * /*pc*/) throw(); 
	virtual void OnReceive(BOOL bSuccess, LPWSABUF pBuf, DWORD dwBuffers, DWORD dwBytesRecvd, DWORD dwFlags, CEventCallback *pc) throw(); 
	virtual void OnReceiveFrom(BOOL bSuccess, LPWSABUF pBuf, DWORD dwBuffers, DWORD dwBytesRecvd, DWORD dwFlags, LPSOCKADDR pAddrFrom, INT nFromLen, CEventCallback *pc) throw(); 
	virtual void OnSend(BOOL bSuccess, LPWSABUF pBuf, DWORD dwBuffers, DWORD dwBytesSent, CEventCallback *pc) throw(); 
 
protected: 
	BYTE *m_pbRecvBuf; 
	BYTE *m_pbSendBuf; 
	LONGLONG m_nDataToWrite; 
	UINT m_nSendFailed; 
	BOOL m_bProcessHeader; 
	CDownloadFile* m_pDownldFile; 
 
	// http request and response 
	CHttpReqHeader m_HttpRequest; 
	CHttpResponseHdr m_HttpResponseHdr; 
 
protected: 
	BOOL ProcessRcvData(char* pBuffer, DWORD dwBytesRecvd); 
	BOOL ProcResponseHdr(char* pBuffer, DWORD dwBytesRecvd); 
	BOOL ProcStatusCode(int nCode); 
 
public: 
	// connection parameter of the socket 
	CString m_sHostName; 
	CString m_sFileObj; 
	UINT m_nPort; 
 
	// protect sockets public data 
	CCriticalSection m_csSockAccess; 
 
	// current socket writing position in the file, 
	// should be protected by LOCK 
	BOOL m_bConnected; 
	volatile LONGLONG m_nFileOffset; 
	volatile LONGLONG m_nDataToRead; 
	volatile LONGLONG m_nRequestTo; 
	list m_lstSegments; 
 
	BOOL ParseUrl(LPCTSTR szUrl); 
	BOOL Redirect( LPCTSTR szNewUrl ); 
	BOOL Connect(void); 
	BOOL SendHttpRequest(); 
	void NewSegment(SEGMENT_S* pstSeg); 
};