/* ==========================================================================
* 파    일 : Network.h
* 목    적 : 
* 작 성 자 : 박경희
* 작 성 일 : 2007-03-30
* 주의사항 :
*===========================================================================*/
#pragma once
#include "../GameSrv/MapServer/IndexGenerator.h"
#include "../Common/Packet.h"

#define WM_ASYNC (WM_APP +1)
#define WM_ASYNC_WRC WM_APP+2

#pragma pack(1) // 1Byte 정렬 설정

class CServerToolDlg;

const int BUFFER_SIZE = 65535;
const int QUEUE_BUFFER_SIZE = BUFFER_SIZE * 10;

const int PING_CHECK_TIME = 3000;
const int RECONN_CHECK_TIME = 1000;

/// recv 반환값
enum eRECV_RETURN
{
	eERROR, 			/// 오류
	eINCOMPLETION,		/// 데이타 전체 길이만큼 받지 못한 상태
	eCOMPLETION,		/// 메세지 크기만큼 딱 다받고 다음 받을것 없음
	eCONTINUE,			/// 1개 이상의 메세지 크기
};

/// on/off
enum eAGENT_ONOFF
{
	eAGENT_NONE,
	eAGENT_ON,
	eAGENT_OFF,
};

struct MSGROOT;

class cNetwork
{
public:
	cNetwork(void);
	virtual ~cNetwork(void);

public:

	/// 네트워크 연결 처리 
	virtual bool			Init( HWND hwnd, unsigned long number, char* ip, int port, CServerToolDlg* pDlg );	/// 초기화
	virtual bool			Connect();									/// 네트웍 접속 시도
	virtual bool			FDConnect( WPARAM wParam );								/// 접속 성공여부 확인
	virtual bool			SuccessConnect() = 0;
	virtual bool			DisConnect( WPARAM wParam );				/// 네트웍 종료 처리

	/// 메세지 처리
	virtual bool			Send( char* msg, unsigned long length );	/// 전송할 데이터를 send queue에 넣음
	virtual void			RetrySend( WPARAM wParam );					/// fd_write 성공시 쌓인 메세지 재전송
	virtual eRECV_RETURN	Recv( char* msg, int* size );				/// 네트웍으로 전송받은 데이타를 알려줌

	/// 공지 메세지 처리
	virtual void			NoticeSend( LPCTSTR chatmsg );

	virtual void			Process() = 0;

	///	network msg parser
	virtual bool			NetworkMsgParser( WPARAM wParam, char* pMsg );


	/// 핑 메세지 발송
	virtual void			PingSend();

private:

	virtual bool			QSend();									/// queue에 있는 send데이타를 전송

	/// ping 시간 계산
	virtual void			CalcPing( MSGROOT* pMsg );

protected:

	/// 메세지 입출력
	char			*mSendMsg;			/// send버퍼
	char			*mSendMsgTemp;		/// send임시버퍼
	char			*mRecvMsg;			/// recv버퍼
	char			*mRecvMsgTemp;		/// recv임시버퍼
	int				mRecvMsgPos;		/// recv버퍼의 데이터 끝위치

	typedef tQueue<char*> cSendQueue;	/// send버퍼를 보관하고 있는 queue
	cSendQueue		mSendQueue;

protected:

	/// 접속 경로
	HWND			mHwnd;
	char			mIp[16];
	int				mPort;


	/// 접속 상태
	bool			mIsConnect;			

    /// 핑 체크
	cIndexGenerator	mIGen;

	/// 핑 지연시간
	unsigned long	mPingDelayTime;

	/// 접속수
	unsigned long	mUserCnt;

	/// 프로세스 체크시간
	unsigned long	mPingCheckTime;
	unsigned long	mConnectCheckTime;

	/// 연결 번호
	unsigned long	mNumber;

	CServerToolDlg* mpDlg;	

	bool			mIsSubInfo;
	unsigned long	mSubInfoTime;

public:

	SOCKET			mSocket;
	SOCKADDR_IN		mSockaddr;

};

#pragma pack( ) // 1Byte 정렬 해제