📄 clientpackethandler.cpp
字号:
/*
This file is part of SWAIN (http://sourceforge.net/projects/swain).
Copyright (C) 2006 Daniel Lindstr鰉 and Daniel Nilsson
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "StdAfx.h"
#include "ClientPacketHandler.h"
#include "packetid.h"
// Include packets this handler needs to send
#include "PacketSetStatus.h"
#include "network.h"
#include "common_drawing.h"
#include "common_client.h"
ClientPacketHandler::ClientPacketHandler(void){
this->incoming = new Queue();
this->run = false;
this->handle_thread = NULL;
}
ClientPacketHandler::~ClientPacketHandler(void){
this->run = false;
while(!this->incoming->isEmpty()){
delete(this->incoming->dequeue());
}
delete(this->incoming);
}
void ClientPacketHandler::setBuddyList(BuddyList *bl){
this->buddyList = bl;
}
void ClientPacketHandler::setConnectionHandler(ConnectionHandler *ch){
this->ch = ch;
}
void ClientPacketHandler::handle(Packet *p){
this->incoming->enqueue(p);
}
void ClientPacketHandler::newConnection(int cid) {
printf("New connection (cid = %d)\n", cid);
}
void ClientPacketHandler::closedConnection(int cid) {
printf("Closed connection (cid = %d)\n", cid);
handleClosedConnection(cid);
}
void ClientPacketHandler::startHandle(void){
LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
SIZE_T threadStackSize = 0;
this->run = true;
this->handle_thread = CreateThread(lpThreadAttributes, threadStackSize, handleinc, (LPVOID)this, 0, NULL);
}
void ClientPacketHandler::stopHandle(){
this->run = false;
}
DWORD WINAPI ClientPacketHandler::handleinc(LPVOID lpParameter){
ClientPacketHandler *cph = (ClientPacketHandler *)lpParameter;
Packet *packet = NULL;
while(cph->run){
packet = (Packet *)cph->incoming->dequeue();
if(packet == NULL)
continue;
switch(packet->getId()){
case(PACKET_WELCOME): cph->handlePacketWelcome((PacketWelcome *)packet); break;
case(PACKET_ANSWER): cph->handlePacketAnswer((PacketAnswer *)packet); break;
case(PACKET_NAME): cph->handlePacketName((PacketName *)packet); break;
case(PACKET_STATUS): cph->handlePacketStatus((PacketStatus *)packet); break;
case(PACKET_ERROR): cph->handlePacketError((PacketError *)packet); break;
case(PACKET_CONNECTTO): cph->handlePacketConnectTo((PacketConnectTo *)packet); break;
case(PACKET_FILE): cph->handlePacketFile((PacketFile *)packet); break;
case(PACKET_READY): cph->handlePacketReady((PacketReady *)packet); break;
case(PACKET_BYE): cph->handlePacketBye((PacketBye *)packet); break;
case(PACKET_ARROW): cph->handlePacketArrow((PacketArrow *)packet); break;
case(PACKET_POLYLINE): cph->handlePacketPolyline((PacketPolyline *)packet); break;
case(PACKET_CLEAR): cph->handlePacketClear((PacketClear *)packet); break;
case(PACKET_BOUNDS): cph->handlePacketBounds((PacketBounds *)packet); break;
default: break;
}
delete(packet);
packet = NULL;
}
return(NULL);
}
void ClientPacketHandler::handlePacketWelcome(PacketWelcome *packet){
PacketSetStatus *pss;
printf("packet welcome received from cid %d...\n", packet->getCId());
setLoginStatus(true);
pss = new PacketSetStatus(STATUS_ONLINE);
pss->setCId(packet->getCId());
ch->sendPacket(pss);
}
void ClientPacketHandler::handlePacketAnswer(PacketAnswer *packet){
if(packet->getFlag() & QUERY_GET_GROUPS)
buddyList->newGroupList(packet->getResult(), packet->getResultSize());
else
buddyList->newUserList(packet->getResult(), packet->getResultSize());
}
void ClientPacketHandler::handlePacketName(PacketName *packet) {
WCHAR name[NAME_BUF_SIZE];
if (packet->isGroup()) { // Group
mbstowcs(name, packet->getName(), NAME_BUF_SIZE-1);
buddyList->setGroupName(packet->getTheId(), name);
} else { // User
mbstowcs(name, packet->getName(), NAME_BUF_SIZE-1);
buddyList->setUserName(packet->getTheId(), name);
}
}
void ClientPacketHandler::handlePacketStatus(PacketStatus *packet) {
if (packet->isGroup()) { // Group
buddyList->setGroupStatus(packet->getTheId(), packet->getStatus());
} else { // User
buddyList->setUserStatus(packet->getTheId(), packet->getStatus());
}
}
void ClientPacketHandler::handlePacketError(PacketError *packet){
switch(packet->getError()){
case(ERROR_PASSWORD):
this->ch->closeConnection(packet->getCId());
setLoginStatus(false);
break;
case ERROR_NOTONLINE:
setSessionReady(-1, false);
break;
default: break;
}
}
void ClientPacketHandler::handlePacketConnectTo(PacketConnectTo *packet){
incomingConnection(packet->getAddress());
}
void ClientPacketHandler::handlePacketFile(PacketFile *packet){
wprintf(L"Incoming file. %s\n.", packet->getFilename());
joinSession(packet->getCId(), packet->getFilename(), packet->getRotate());
}
void ClientPacketHandler::handlePacketReady(PacketReady *packet){
setSessionReady(packet->getCId(), true);
}
void ClientPacketHandler::handlePacketBye(PacketBye *packet){
closeSession();
this->ch->closeConnection(packet->getCId());
}
void ClientPacketHandler::handlePacketArrow(PacketArrow *packet){
PacketArrow *tmp = new PacketArrow(*packet);
PostMessage(g_hWndDrawingWindow, WM_PACKET_ARROW, 0, (LPARAM)tmp);
}
void ClientPacketHandler::handlePacketPolyline(PacketPolyline *packet){
PacketPolyline *tmp = new PacketPolyline(*packet);
PostMessage(g_hWndDrawingWindow, WM_PACKET_POLYLINE, 0, (LPARAM)tmp);
}
void ClientPacketHandler::handlePacketClear(PacketClear *packet){
PacketClear *tmp = new PacketClear(*packet);
PostMessage(g_hWndDrawingWindow, WM_PACKET_CLEAR, 0, (LPARAM)tmp);
}
void ClientPacketHandler::handlePacketBounds(PacketBounds *packet){
PacketBounds *tmp = new PacketBounds(*packet);
PostMessage(g_hWndDrawingWindow, WM_PACKET_BOUNDS, 0, (LPARAM)tmp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -