/* * RequestManager.cpp * * Copyright (C) 2008 Matthias Schiffer * * 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 3 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, see . */ #include "RequestManager.h" #include namespace Mad { namespace Common { void RequestManager::receiveHandler(Net::Connection *connection, const Net::Packet &packet) { std::map::iterator it = requestMaps.find(connection); if(it == requestMaps.end()) { // TODO: Error std::cerr << "Received a packet from an unregistered connection." << std::endl; return; } RequestMap *requestMap = it->second; Request::Request *request = requestMap->findRequest(packet.getRequestId()); if(request) { request->handlePacket(connection, packet); if(request->isFinished()) requestMap->deleteRequest(packet.getRequestId()); return; } switch(packet.getType()) { case Net::Packet::TYPE_DISCONNECT: connection->send(Net::Packet(Net::Packet::TYPE_OK, packet.getRequestId())); connection->disconnect(); break; case Net::Packet::TYPE_IDENTIFY_REQ: std::cout << "Received identify request from '" << std::string((char*)packet.getData(), packet.getLength()) << "'." << std::endl; connection->send(Net::Packet(Net::Packet::TYPE_IDENTIFY_REP, packet.getRequestId(), packet.getData(), packet.getLength())); break; default: std::cerr << "Received an unexpected packet." << std::endl; } } bool RequestManager::sendRequest(Net::Connection *connection, Request::Request *request) { std::map::iterator it = requestMaps.find(connection); if(it == requestMaps.end()) return false; RequestMap *requestMap = it->second; unsigned short id; do { id = getRequestId(); } while(requestMap->findRequest(id)); if(!request->sendRequest(connection, id)) return false; requestMap->addRequest(id, request); return true; } } }