#if !defined(AFX_PROCESSSOCKET_H__DA328461_864B_4C42_9F2C_024819E95360__INCLUDED_)
#define AFX_PROCESSSOCKET_H__DA328461_864B_4C42_9F2C_024819E95360__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// processsocket.h : header file
//

#include "..\public\ProxySocket\AsyncProxySocket.h"

#ifdef _M_X64
#include "..\public\lzo_64\lzo.h"
#else
#include "..\public\lzo\lzo.h"
#endif


/////////////////////////////////////////////////////////////////////////////
// CProcessSocket command target

#define PROCESSSOCKET_ERROR       WM_USER + 200    //socket的错误通知
#define PROCESSSOCKET_FRAME       WM_USER + 201    //socket收到帧的通知

#define PROCESSSOCKET_ERROR_CONNECT  1             //socket连接错误
#define PROCESSSOCKET_ERROR_PROXY    2             //socket代理错误




typedef CTypedPtrList<CPtrList, Socket_Head*>  CFrameList;

class CProcessSocket : public CAsyncProxySocket
{
protected:
	SM_Setup  m_Setup;
	CWnd    * m_pWnd;    //通知消息的Wnd
	BOOL      m_bSend;   //是否已可以登录
	BOOL      m_bConnect;//是否已连接
	CLzo      lzo;


	CFrameList  m_Frame;
	ULONG       m_lID;
	long        m_lUserID;
	unsigned char m_ucUserType;
	unsigned long m_ulVer;

	Socket_Head m_RecvHead;   //用于接收Head
	ULONG       m_lRecvHead;  //已收到的Head字节数
	BOOL        m_bRecvFrame; //是否正在收Frame;
	ULONG       m_lRecvFrame; //已收到的Frame字节数
	BYTE      * m_pRecvFrame; //收到的Frame

	//超透网关用到
	HINTERNET   m_hInternet;
	HINTERNET   m_hConnection;

	int        m_lCompress;
	HANDLE     m_hHttp;
// Attributes
public:

// Operations
public:
	CProcessSocket();
	virtual ~CProcessSocket();

// Overrides
public:
	void SetCompressType(int lCompressType);
	static int CharHex(TCHAR ch);
	static void HexToAscii( char *pszOrgRandom , char *pszDesRandom );
	static void AsciiToHex( char *pszOrgRandom , char *pszDesRandom , long lLen);
	static DWORD WINAPI Http_Socket( LPVOID lParam );
	void SetUserID(long lUserID);
	void NotifyMainWnd( UINT nMsg , WPARAM wParam , LPARAM lParam );
	BOOL SendFrame( unsigned char lFuncType , unsigned char * pFrame , unsigned long lFrameLen );
	BOOL SendFrameEx( DWORD lFuncType , unsigned char * pFrame , unsigned long lFrameLen );
	void Close();
	BOOL ConnectToServer( SM_Setup setup,BOOL bReConnect=false);
	void SetParent( CWnd * pWnd );
	void SetUserType(unsigned char ucUserType);
	void SetVer(unsigned long ulVer);
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CProcessSocket)
	public:
	virtual void OnConnect(int nErrorCode);
	virtual void OnSend(int nErrorCode);
	virtual void OnClose(int nErrorCode);
	virtual void OnReceive(int nErrorCode);
	virtual void OnProxyOperationFailed(int nOpID);
	virtual void OnListenFinished(unsigned long &retProxyIp,int &retProxyPort);
	virtual int Send(const void* lpBuf, int nBufLen, int nFlags = 0);
	//}}AFX_VIRTUAL

	// Generated message map functions
	//{{AFX_MSG(CProcessSocket)
		// NOTE - the ClassWizard will add and remove member functions here.
	//}}AFX_MSG

// Implementation
protected:
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_PROCESSSOCKET_H__DA328461_864B_4C42_9F2C_024819E95360__INCLUDED_)