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 = "";
}