/*************************************************************
/* Copyright (C), 2014-2020, lyfz. Co., Ltd.
/* �ļ���:		IClientImpl.h  
/* ����:		Jeff.w			 
/* ��������:	2014-08-07
/* �汾��:		V1.0
/* ����:		���IJ��,�ͻ���������ͨ�Žӿ�
/* ����:  
/* ��Ҫ��ģ��: 
/* ��ʷ�޸ļ�¼: 
/*		����           ʱ��              �汾           ����
/*	    Jeff.w         14/08/07          1.0	      �������ģ��
***************************************************************/
#ifndef __ICLIENT_IMPL_HEADER__
#define __ICLIENT_IMPL_HEADER__
#pragma once

#include <afxwin.h>
#include <atlbase.h>
//#pragma warning(push)
//#pragma warning(disable:4995)
//#pragma warning(pop)
#include "CritSection.h"
#include "SocketHandle.h"
#include "SocketClientImpl.h"


#include "Global.h"

// �궨��:�������ݰ��ܳ���;
#define CALCDATALEN(x) (x+sizeof(STProtocolheader)+sizeof(STProtocoltail))
//const int TCPCLIENTNUM = 10;

class IClientImpl :	public ISocketClientHandler
{
	typedef SocketClientImpl<ISocketClientHandler> CSocketClient;
	friend CSocketClient;

public:
	IClientImpl();
	~IClientImpl();
	
	//static IClientImpl* GetInstancePtr( int iTCPIndex );
	void StartReConnectSrvThread();
	static DWORD WINAPI ReConnectSrvThread(LPVOID pInstance);

protected:
	virtual void OnThreadBegin(CSocketHandle* pSH);
	virtual void OnThreadExit(CSocketHandle* pSH);
	virtual void OnDataReceived(CSocketHandle* pSH, const BYTE* pbData, DWORD dwCount, const SockAddrIn& addr);
	virtual void OnConnectionDropped(CSocketHandle* pSH);
	virtual void OnConnectionError(CSocketHandle* pSH, DWORD dwError);

protected:
	CString m_strPort;
	int m_nMode;		// IPV4 �� IPV6
	int m_nSockType;	// UDP �� TCP

	// �߳̾��;
	HANDLE m_hReConnectSrvThreadHandle;

	// �߳��˳����;
	HANDLE m_hRunObject;

	//static IClientImpl *m_pTcpClient[TCPCLIENTNUM];

	void _cdecl AppendText(LPCTSTR lpszFormat, ...);
	void GetAddress(const SockAddrIn& addrIn, CString& rString) const;
	bool GetDestination(SockAddrIn& addrIn) const;
	bool SetupMCAST();

	// Jeff.�����о������Ĵ�������;
	// ���쳣����Ҫ��������,��1�����ڳ��ֶ����쳣��ʱ,��Ҫ����������;
	//unsigned int VerityIntegrityPacket(IN void *pIntegrityPacket,unsigned int nPacketSize);
	void ToprocessRecivebuf(IN CSocketHandle *sockHandle, IN const BYTE* pReceivebuf, IN DWORD dwReceiveSize);
	int  OnIntegrityPacket(IN CSocketHandle *sockHandle, IN void *pIntegrityPacket);

public:
	BOOL m_bStopbeat;	// �Ƿ�������;
	BOOL m_bSocket;
	CSocketClient m_SocketClient;
	BOOL Initialize();
	BOOL ConnectServer(LPCTSTR strAddr, LPCTSTR strPort);
	void DisConnectServer();
	void SendMsg(void *pMsg,const int nLen);
	void SendFile(LPCTSTR lpzFileName,LPCTSTR strPort);
};

#endif