www.pudn.com > ChatUseIOCP.rar > ChatServerClient.cpp


#include "StdAfx.h" 
#include ".\chatserverclient.h" 
 
CChatServerClient::CChatServerClient(void) 
{ 
	m_bLoggedIn = false; 
	m_strUserName = ""; 
} 
 
CChatServerClient::~CChatServerClient(void) 
{ 
} 
 
void CChatServerClient::HandlePacket(ChatProtocol::Packet* pInPacket)  
{ 
	Packet OutPacket(pInPacket->nFunctionCode); 
 
	switch (pInPacket->nFunctionCode) 
	{ 
		case ChatProtocol::TC_LOGIN: 
			Login(*pInPacket, OutPacket); 
			break; 
 
		case ChatProtocol::TC_LIST_USERS: 
			ListUsers(*pInPacket, OutPacket); 
			break; 
 
		case ChatProtocol::TC_SEND_MESSAGE: 
			SendMessage(*pInPacket, OutPacket); 
			break; 
 
		default: 
			OutPacket.Status = ChatProtocol::TS_ERROR; 
			break; 
 
	} 
 
	ChatProtocol::Send(OutPacket); 
} 
 
void CChatServerClient::Login(Packet &InPacket, Packet &OutPacket) 
{ 
 
	if (!strlen(InPacket.pData)) 
	{ 
		OutPacket.Status = ChatProtocol::TS_INVALID; //gotto specify a username, right? 
		char szTemp[128]; 
		strcpy(szTemp, "How about specifiying your name?"); 
		SetPacketBuffer(OutPacket, szTemp, (DWORD)strlen(szTemp)); 
		return; 
	} 
 
	m_bLoggedIn = true; 
	char szMsg[512]; 
	char* pToken = NULL; 
	pToken = strtok(InPacket.pData, "\04"); 
	m_strUserName = pToken; 
 
	// Send a updated userlist to everyone but me. 
	((CChatServerSocket*)m_pServer)->SendUserList(this); 
 
	strcpy(szMsg, "Welcome to our little chatserver, you may do whatever you want"); 
	SetPacketBuffer(OutPacket, szMsg, (DWORD)strlen(szMsg)); 
} 
 
/// List all users that currently are logged in. 
void CChatServerClient::ListUsers(Packet &InPacket, Packet &OutPacket) 
{ 
 
	if (!m_bLoggedIn) 
	{ 
		OutPacket.Status = ChatProtocol::TS_NO_ACCESS; //gotto specify a username, right? 
		char szTemp[128]; 
		strcpy(szTemp, "How about logging in first?"); 
		SetPacketBuffer(OutPacket, szTemp, (DWORD)strlen(szTemp)); 
		return; 
	} 
 
 
	char szBuffer[1024]; 
 
	/// Need to upcast the server, else we wont get over nice routines. 
	((CChatServerSocket*)m_pServer)->GetUserList(szBuffer, 1024); 
	SetPacketBuffer(OutPacket, szBuffer, (DWORD)strlen(szBuffer)); 
} 
 
/// Sends a message to a user (incomming) 
void CChatServerClient::SendMessage(Packet &InPacket, Packet &OutPacket) 
{ 
 
	if (!m_bLoggedIn) 
	{ 
		OutPacket.Status = ChatProtocol::TS_NO_ACCESS; //gotto specify a username, right? 
		char szTemp[128]; 
		strcpy(szTemp, "How about logging in first?"); 
		SetPacketBuffer(OutPacket, szTemp, (DWORD)strlen(szTemp)); 
		return; 
	} 
 
 
	char *pszToken; 
	int nCount = 0; 
	char szFrom[64], szTo[64], szMessage[512]; 
 
	pszToken = strtok( InPacket.pData, "\04" ); 
	while( pszToken != NULL ) 
	{ 
		switch (nCount++) 
		{ 
			case 0: 
				strcpy(szFrom, pszToken); 
				break; 
 
			case 1: 
				strcpy(szTo, pszToken); 
				break; 
 
			case 2: 
				strcpy(szMessage, pszToken); 
				break; 
 
		} 
		pszToken = strtok( NULL , "\04" ); 
	} 
 
	if (strcmp(szTo, "all") == 0) 
		((CChatServerSocket*)m_pServer)->SendMessage(szFrom, szMessage); 
	else 
		((CChatServerSocket*)m_pServer)->SendMessage(szFrom, szTo, szMessage); 
} 
 
/// Sends a message to this client (outgoing) 
void CChatServerClient::SendMessage(const char* pszFrom, const char* pszTo, const char* pszMessage) 
{ 
	char szBuffer[1024]; 
	sprintf(szBuffer, "%s%c%s%c%s", pszFrom, 4, pszTo, 4, pszMessage); 
	Packet OutPacket(ChatProtocol::TC_SEND_MESSAGE_OUT); 
	SetPacketBuffer(OutPacket, szBuffer, (DWORD)strlen(szBuffer)); 
	Send(OutPacket); 
} 
 
 
 
const std::string& CChatServerClient::GetUserName() const 
{ 
	return m_strUserName; 
} 
 
void CChatServerClient::OnDisconnect() 
{ 
	// Send userlist to all clients. 
	((CChatServerSocket*)m_pServer)->SendUserList(); 
 
	m_bLoggedIn = false; 
	m_strUserName = ""; 
}