⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientpackethandler.cpp

📁 swain-0.5.2.zip的源代码,比较好用,希望大家喜欢.
💻 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 + -