#pragma once
#include <string.h>
#include <HPSocket.h>
#include <iostream>

#pragma comment(lib,"Ws2_32.lib")
using namespace std;

char* TCHAR2char(const TCHAR* STR)
{
	//�����ַ����ij���
	int size = WideCharToMultiByte(CP_ACP, 0, STR, -1, NULL, 0, NULL, FALSE);
	//����һ�����ֽڵ��ַ�������
	char* str = new char[sizeof(char) * size];
	//��STRת��str
	WideCharToMultiByte(CP_ACP, 0, STR, -1, str, size, NULL, FALSE);
	return str;
}

TCHAR* char2TCAHR(char* str)
{
	int size = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
	TCHAR* retStr = new TCHAR[size * sizeof(TCHAR)];
	MultiByteToWideChar(CP_ACP, 0, str, -1, retStr, size);
	return retStr;
}

bool GetIp(char* ip)
{
	char szText[256];
	//��ȡ������������
	int iRet;
	iRet = gethostname(szText, 256);
	int a = WSAGetLastError();
	if (iRet != 0)
	{
		printf("gethostname()  Failed!");
		return FALSE;
	}
	//ͨ����������ȡ����ַ��Ϣ
	HOSTENT* host = gethostbyname(szText);
	if (NULL == host)
	{
		printf("gethostbyname() Failed!");
		return false;
	}
	in_addr PcAddr;
	for (int i = 0;; i++)
	{
		char* p = host->h_addr_list[i];
		if (NULL == p)
		{
			break;
		}
		memcpy(&(PcAddr.S_un.S_addr), p, host->h_length);
		char* szIP = ::inet_ntoa(PcAddr);
		sprintf(ip, "%s", szIP);
	}
	return true;
}

class ServerListenerImpl : public ITcpServerListener
{

public:
	// 5. process network events
	virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen);
	virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient);
	virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID);
	virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength);
	virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
	virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
	virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
	virtual EnHandleResult OnShutdown(ITcpServer* pSender);
};

EnHandleResult ServerListenerImpl::OnPrepareListen(ITcpServer* pSender, SOCKET soListen)
{
	return EnHandleResult();
}

EnHandleResult ServerListenerImpl::OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient)
{
	return EnHandleResult();
}

EnHandleResult ServerListenerImpl::OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength)
{
	return EnHandleResult();
}

EnHandleResult ServerListenerImpl::OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength)
{
	return EnHandleResult();
}

EnHandleResult ServerListenerImpl::OnShutdown(ITcpServer* pSender)
{
	return EnHandleResult();
}