diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2009-03-16 19:13:42 +0100 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2009-03-16 19:13:42 +0100 |
commit | 8f098fc3070f791302ec1f497588fab6ed409980 (patch) | |
tree | 6cff9f7bb973342344a22636a5d9ef26c7a0d940 | |
parent | aef0f2e7a5085b8da3aa2e97565215d182d3dd2d (diff) | |
download | mad-8f098fc3070f791302ec1f497588fab6ed409980.tar mad-8f098fc3070f791302ec1f497588fab6ed409980.zip |
Request- und RequestHandler-Interfaces vereinfacht
63 files changed, 387 insertions, 315 deletions
diff --git a/src/Client/CommandParser.cpp b/src/Client/CommandParser.cpp index 27aac78..7e3a90e 100644 --- a/src/Client/CommandParser.cpp +++ b/src/Client/CommandParser.cpp @@ -110,9 +110,9 @@ std::map<std::string, Common::HostInfo> CommandParser::parseHostList(const std:: void CommandParser::fsinfoCommand(const std::vector<std::string> &args) { if(args.size() == 1) - Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::Request>(new Common::Requests::FSInfoRequest(sigc::mem_fun(CommandManager::get(), &CommandManager::fsInfoRequestFinished)))); + Common::RequestManager::get()->sendRequest<Common::Requests::FSInfoRequest>(connection, sigc::mem_fun(CommandManager::get(), &CommandManager::fsInfoRequestFinished)); else if(args.size() == 2) - Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::Request>(new Requests::DaemonFSInfoRequest(args[1], sigc::mem_fun(CommandManager::get(), &CommandManager::daemonFSInfoRequestFinished)))); + Common::RequestManager::get()->sendRequest<Requests::DaemonFSInfoRequest>(connection, sigc::mem_fun(CommandManager::get(), &CommandManager::daemonFSInfoRequestFinished), args[1]); else { Common::Logger::logf(Common::Logger::ERROR, "%s: Too many arguments.", args[0].c_str()); printUsage("fsinfo"); @@ -213,9 +213,9 @@ void CommandParser::rebootCommand(const std::vector<std::string> &args) { std::map<std::string, Common::HostInfo> hosts = parseHostList(std::vector<std::string>(args.begin()+1, args.end()), true); for(std::map<std::string, Common::HostInfo>::iterator host = hosts.begin(); host != hosts.end(); ++host) { - Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::Request>( - new Requests::DaemonCommandRequest(host->first, true, sigc::mem_fun(CommandManager::get(), &CommandManager::daemonCommandRequestFinished)) - )); + Common::RequestManager::get()->sendRequest<Requests::DaemonCommandRequest>(connection, + sigc::mem_fun(CommandManager::get(), &CommandManager::daemonCommandRequestFinished), host->first, true + ); ++CommandManager::get()->activeRequests; } @@ -231,9 +231,9 @@ void CommandParser::shutdownCommand(const std::vector<std::string> &args) { std::map<std::string, Common::HostInfo> hosts = parseHostList(std::vector<std::string>(args.begin()+1, args.end()), true); for(std::map<std::string, Common::HostInfo>::iterator host = hosts.begin(); host != hosts.end(); ++host) { - Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::Request>( - new Requests::DaemonCommandRequest(host->first, false, sigc::mem_fun(CommandManager::get(), &CommandManager::daemonCommandRequestFinished)) - )); + Common::RequestManager::get()->sendRequest<Requests::DaemonCommandRequest>(connection, + sigc::mem_fun(CommandManager::get(), &CommandManager::daemonCommandRequestFinished), host->first, false + ); ++CommandManager::get()->activeRequests; } @@ -241,9 +241,11 @@ void CommandParser::shutdownCommand(const std::vector<std::string> &args) { void CommandParser::statusCommand(const std::vector<std::string> &args) { if(args.size() == 1) - Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::Request>(new Common::Requests::StatusRequest(sigc::mem_fun(CommandManager::get(), &CommandManager::statusRequestFinished)))); + Common::RequestManager::get()->sendRequest<Common::Requests::StatusRequest>(connection, + sigc::mem_fun(CommandManager::get(), &CommandManager::statusRequestFinished)); else if(args.size() == 2) - Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::Request>(new Requests::DaemonStatusRequest(args[1], sigc::mem_fun(CommandManager::get(), &CommandManager::daemonStatusRequestFinished)))); + Common::RequestManager::get()->sendRequest<Requests::DaemonStatusRequest>(connection, + sigc::mem_fun(CommandManager::get(), &CommandManager::daemonStatusRequestFinished), args[1]); else { Common::Logger::logf(Common::Logger::ERROR, "%s: Too many arguments.", args[0].c_str()); printUsage("status"); @@ -256,13 +258,15 @@ void CommandParser::statusCommand(const std::vector<std::string> &args) { void CommandParser::listUsersCommand(const std::vector<std::string>&) { ++CommandManager::get()->activeRequests; - Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::Request>(new Common::Requests::UserListRequest(sigc::mem_fun(CommandManager::get(), &CommandManager::userListRequestFinished)))); + Common::RequestManager::get()->sendRequest<Common::Requests::UserListRequest>(connection, + sigc::mem_fun(CommandManager::get(), &CommandManager::userListRequestFinished)); } void CommandParser::exitCommand(const std::vector<std::string>&) { ++CommandManager::get()->activeRequests; - Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::Request>(new Common::Requests::DisconnectRequest(sigc::mem_fun(CommandManager::get(), &CommandManager::disconnectRequestFinished)))); + Common::RequestManager::get()->sendRequest<Common::Requests::DisconnectRequest>(connection, + sigc::mem_fun(CommandManager::get(), &CommandManager::disconnectRequestFinished)); } bool CommandParser::parse(const std::string &cmd) { diff --git a/src/Client/InformationManager.cpp b/src/Client/InformationManager.cpp index cafe2fa..4c9800b 100644 --- a/src/Client/InformationManager.cpp +++ b/src/Client/InformationManager.cpp @@ -29,7 +29,7 @@ namespace Client { InformationManager InformationManager::informationManager; -void InformationManager::DaemonStateUpdateRequestHandler::handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet) { +void InformationManager::DaemonStateUpdateRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "UpdateHostState") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -37,7 +37,7 @@ void InformationManager::DaemonStateUpdateRequestHandler::handlePacket(Net::Conn ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -53,7 +53,7 @@ void InformationManager::DaemonStateUpdateRequestHandler::handlePacket(Net::Conn Common::XmlPacket ret; ret.setType("OK"); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); } @@ -71,11 +71,8 @@ void InformationManager::updateDaemonList(Net::Connection *con) { if(updating) return; - Common::RequestManager::get()->sendRequest(con, - std::auto_ptr<Common::Request>( - new Requests::DaemonListRequest(sigc::mem_fun(this, &InformationManager::daemonListRequestFinished)) - ) - ); + Common::RequestManager::get()->sendRequest<Requests::DaemonListRequest>(con, + sigc::mem_fun(this, &InformationManager::daemonListRequestFinished)); updating = true; } diff --git a/src/Client/InformationManager.h b/src/Client/InformationManager.h index 566eaf6..369eefd 100644 --- a/src/Client/InformationManager.h +++ b/src/Client/InformationManager.h @@ -32,10 +32,6 @@ namespace Mad { namespace Net { class Connection; -namespace Packets { -class HostListPacket; -} - } namespace Client { @@ -44,10 +40,11 @@ class InformationManager : public Common::Initializable { private: class DaemonStateUpdateRequestHandler : public Common::RequestHandler { protected: - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - DaemonStateUpdateRequestHandler() {} + DaemonStateUpdateRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; static InformationManager informationManager; diff --git a/src/Client/Requests/DaemonCommandRequest.cpp b/src/Client/Requests/DaemonCommandRequest.cpp index 7b444cd..45a346b 100644 --- a/src/Client/Requests/DaemonCommandRequest.cpp +++ b/src/Client/Requests/DaemonCommandRequest.cpp @@ -18,20 +18,18 @@ */ #include "DaemonCommandRequest.h" -#include <Common/XmlPacket.h> -#include <Net/Connection.h> namespace Mad { namespace Client { namespace Requests { -void DaemonCommandRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void DaemonCommandRequest::sendRequest() { Common::XmlPacket packet; packet.setType("DaemonCommand"); packet.add("command", reboot ? "reboot" : "shutdown"); packet.add("daemon", daemon); - connection->send(packet.encode(requestId)); + sendPacket(packet); } } diff --git a/src/Client/Requests/DaemonCommandRequest.h b/src/Client/Requests/DaemonCommandRequest.h index fa1e436..4e9e2d1 100644 --- a/src/Client/Requests/DaemonCommandRequest.h +++ b/src/Client/Requests/DaemonCommandRequest.h @@ -20,7 +20,7 @@ #ifndef MAD_CLIENT_REQUEST_DAEMONCOMMANDREQUEST_H_ #define MAD_CLIENT_REQUEST_DAEMONCOMMANDREQUEST_H_ -#include <Common/Requests/SimpleRequest.h> +#include <Common/Request.h> #include <string> namespace Mad { @@ -33,10 +33,11 @@ class DaemonCommandRequest : public Common::Request { bool reboot; protected: - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); + virtual void sendRequest(); public: - DaemonCommandRequest(const std::string &daemon0, bool reboot0, slot_type slot) : Common::Request(slot), daemon(daemon0), reboot(reboot0) {} + DaemonCommandRequest(Net::Connection *connection, uint16_t requestId, slot_type slot, const std::string &daemon0, bool reboot0) + : Common::Request(connection, requestId, slot), daemon(daemon0), reboot(reboot0) {} }; } diff --git a/src/Client/Requests/DaemonFSInfoRequest.cpp b/src/Client/Requests/DaemonFSInfoRequest.cpp index acd1179..5d77850 100644 --- a/src/Client/Requests/DaemonFSInfoRequest.cpp +++ b/src/Client/Requests/DaemonFSInfoRequest.cpp @@ -18,18 +18,17 @@ */ #include "DaemonFSInfoRequest.h" -#include <Net/Connection.h> namespace Mad { namespace Client { namespace Requests { -void DaemonFSInfoRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void DaemonFSInfoRequest::sendRequest() { Common::XmlPacket packet; packet.setType("DaemonFSInfo"); packet.add("daemon", daemon); - connection->send(packet.encode(requestId)); + sendPacket(packet); } } diff --git a/src/Client/Requests/DaemonFSInfoRequest.h b/src/Client/Requests/DaemonFSInfoRequest.h index ac29a8b..2e6a68f 100644 --- a/src/Client/Requests/DaemonFSInfoRequest.h +++ b/src/Client/Requests/DaemonFSInfoRequest.h @@ -33,10 +33,11 @@ class DaemonFSInfoRequest : public Common::Request { std::string daemon; protected: - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); + virtual void sendRequest(); public: - DaemonFSInfoRequest(const std::string &daemon0, slot_type slot) : Common::Request(slot), daemon(daemon0) {} + DaemonFSInfoRequest(Net::Connection *connection, uint16_t requestId, slot_type slot, const std::string &daemon0) + : Common::Request(connection, requestId, slot), daemon(daemon0) {} }; } diff --git a/src/Client/Requests/DaemonListRequest.h b/src/Client/Requests/DaemonListRequest.h index 2387387..017d355 100644 --- a/src/Client/Requests/DaemonListRequest.h +++ b/src/Client/Requests/DaemonListRequest.h @@ -28,7 +28,8 @@ namespace Requests { class DaemonListRequest : public Common::Requests::SimpleRequest { public: - DaemonListRequest(slot_type slot) : SimpleRequest("ListHosts", slot) {} + DaemonListRequest(Net::Connection *connection, uint16_t requestId, slot_type slot) + : SimpleRequest(connection, requestId, slot, "ListHosts") {} }; } diff --git a/src/Client/Requests/DaemonStatusRequest.cpp b/src/Client/Requests/DaemonStatusRequest.cpp index 7611d30..9f0a9a0 100644 --- a/src/Client/Requests/DaemonStatusRequest.cpp +++ b/src/Client/Requests/DaemonStatusRequest.cpp @@ -18,18 +18,17 @@ */ #include "DaemonStatusRequest.h" -#include <Net/Connection.h> namespace Mad { namespace Client { namespace Requests { -void DaemonStatusRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void DaemonStatusRequest::sendRequest() { Common::XmlPacket packet; packet.setType("GetDaemonStatus"); packet.add("daemonName", daemon); - connection->send(packet.encode(requestId)); + sendPacket(packet); } } diff --git a/src/Client/Requests/DaemonStatusRequest.h b/src/Client/Requests/DaemonStatusRequest.h index bf8b7bf..83cba67 100644 --- a/src/Client/Requests/DaemonStatusRequest.h +++ b/src/Client/Requests/DaemonStatusRequest.h @@ -33,10 +33,11 @@ class DaemonStatusRequest : public Common::Request { std::string daemon; protected: - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); + virtual void sendRequest(); public: - DaemonStatusRequest(const std::string &daemon0, slot_type slot) : Common::Request(slot), daemon(daemon0) {} + DaemonStatusRequest(Net::Connection *connection, uint16_t requestId, slot_type slot, const std::string &daemon0) + : Common::Request(connection, requestId, slot), daemon(daemon0) {} }; } diff --git a/src/Common/Makefile.am b/src/Common/Makefile.am index f0a0ad7..9f31371 100644 --- a/src/Common/Makefile.am +++ b/src/Common/Makefile.am @@ -2,11 +2,11 @@ SUBDIRS = Requests RequestHandlers noinst_LTLIBRARIES = libcommon.la libcommon_la_SOURCES = ActionManager.cpp ConfigEntry.cpp ConfigManager.cpp Exception.cpp Initializable.cpp \ - Logger.cpp LogManager.cpp ModuleManager.cpp Request.cpp RequestManager.cpp \ - SystemBackend.cpp Tokenizer.cpp XmlPacket.cpp + Logger.cpp LogManager.cpp ModuleManager.cpp Request.cpp RequestHandler.cpp \ + RequestManager.cpp SystemBackend.cpp Tokenizer.cpp XmlPacket.cpp libcommon_la_LIBADD = Requests/librequests.la RequestHandlers/librequesthandlers.la ../../lib/libgnu.la -noinst_HEADERS = ActionManager.h ConfigEntry.h ConfigManager.h Configurable.h Exception.h HostInfo.h \ - Initializable.h Logger.h LoggerBase.h LogManager.h ModuleManager.h \ - RemoteLogger.h Request.h RequestHandler.h RequestManager.h \ +noinst_HEADERS = ActionManager.h ConfigEntry.h ConfigManager.h Configurable.h \ + Exception.h HostInfo.h Initializable.h Logger.h LoggerBase.h LogManager.h \ + ModuleManager.h RemoteLogger.h Request.h RequestHandler.h RequestManager.h \ SystemBackend.h Tokenizer.h UserInfo.h XmlPacket.h diff --git a/src/Common/Makefile.in b/src/Common/Makefile.in index 9841291..6f2595f 100644 --- a/src/Common/Makefile.in +++ b/src/Common/Makefile.in @@ -55,8 +55,8 @@ libcommon_la_DEPENDENCIES = Requests/librequests.la \ RequestHandlers/librequesthandlers.la ../../lib/libgnu.la am_libcommon_la_OBJECTS = ActionManager.lo ConfigEntry.lo \ ConfigManager.lo Exception.lo Initializable.lo Logger.lo \ - LogManager.lo ModuleManager.lo Request.lo RequestManager.lo \ - SystemBackend.lo Tokenizer.lo XmlPacket.lo + LogManager.lo ModuleManager.lo Request.lo RequestHandler.lo \ + RequestManager.lo SystemBackend.lo Tokenizer.lo XmlPacket.lo libcommon_la_OBJECTS = $(am_libcommon_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/config/depcomp @@ -239,13 +239,13 @@ top_srcdir = @top_srcdir@ SUBDIRS = Requests RequestHandlers noinst_LTLIBRARIES = libcommon.la libcommon_la_SOURCES = ActionManager.cpp ConfigEntry.cpp ConfigManager.cpp Exception.cpp Initializable.cpp \ - Logger.cpp LogManager.cpp ModuleManager.cpp Request.cpp RequestManager.cpp \ - SystemBackend.cpp Tokenizer.cpp XmlPacket.cpp + Logger.cpp LogManager.cpp ModuleManager.cpp Request.cpp RequestHandler.cpp \ + RequestManager.cpp SystemBackend.cpp Tokenizer.cpp XmlPacket.cpp libcommon_la_LIBADD = Requests/librequests.la RequestHandlers/librequesthandlers.la ../../lib/libgnu.la -noinst_HEADERS = ActionManager.h ConfigEntry.h ConfigManager.h Configurable.h Exception.h HostInfo.h \ - Initializable.h Logger.h LoggerBase.h LogManager.h ModuleManager.h \ - RemoteLogger.h Request.h RequestHandler.h RequestManager.h \ +noinst_HEADERS = ActionManager.h ConfigEntry.h ConfigManager.h Configurable.h \ + Exception.h HostInfo.h Initializable.h Logger.h LoggerBase.h LogManager.h \ + ModuleManager.h RemoteLogger.h Request.h RequestHandler.h RequestManager.h \ SystemBackend.h Tokenizer.h UserInfo.h XmlPacket.h all: all-recursive @@ -308,6 +308,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Logger.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ModuleManager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Request.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestHandler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestManager.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SystemBackend.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Tokenizer.Plo@am__quote@ diff --git a/src/Common/Request.cpp b/src/Common/Request.cpp index 0b8715e..bc37708 100644 --- a/src/Common/Request.cpp +++ b/src/Common/Request.cpp @@ -17,19 +17,17 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <config.h> - #include "Request.h" namespace Mad { namespace Common { -void Request::handlePacket(Net::Connection *connection _UNUSED_PARAMETER_, uint16_t requestId _UNUSED_PARAMETER_, const XmlPacket &packet) { +void Request::handlePacket(const XmlPacket &packet) { if(packet.getType() == "Error") { finishWithError(Common::Exception(packet["Where"], packet["ErrorCode"], packet["SubCode"], packet["SubSubCode"])); return; } - if(packet.getType() != "OK") { + else if(packet.getType() != "OK") { finishWithError(Exception(Exception::UNEXPECTED_PACKET)); return; // TODO Logging } diff --git a/src/Common/Request.h b/src/Common/Request.h index ef84194..2c6c8d4 100644 --- a/src/Common/Request.h +++ b/src/Common/Request.h @@ -20,7 +20,6 @@ #ifndef MAD_COMMON_XMLREQUEST_H_ #define MAD_COMMON_XMLREQUEST_H_ -#include "XmlPacket.h" #include "RequestHandler.h" #include "Exception.h" @@ -43,7 +42,8 @@ class Request : public RequestHandler { typedef sigc::slot<void,const Request&> slot_type; protected: - Request(slot_type slot) : exp(Exception::NOT_FINISHED) { + Request(Net::Connection *connection, uint16_t requestId, slot_type slot) + : RequestHandler(connection, requestId), exp(Exception::NOT_FINISHED) { finished.connect(slot); finished.connect(sigc::hide(signalFinished().make_slot())); } @@ -52,8 +52,8 @@ class Request : public RequestHandler { void finish(const XmlPacket& result) {res.reset(new XmlPacket(result)); finished(*this);} void finishWithError(const Exception &e) {exp = e; finished(*this);} - virtual void sendRequest(Net::Connection *connection, uint16_t requestId) = 0; - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const XmlPacket &packet); + virtual void sendRequest() = 0; + virtual void handlePacket(const XmlPacket &packet); public: const XmlPacket& getResult() const throw(Exception) { diff --git a/src/Common/RequestHandler.cpp b/src/Common/RequestHandler.cpp new file mode 100644 index 0000000..3e0eabc --- /dev/null +++ b/src/Common/RequestHandler.cpp @@ -0,0 +1,31 @@ +/* + * RequestHandler.cpp + * + * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de> + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#include "RequestHandler.h" +#include <Net/Connection.h> + +namespace Mad { +namespace Common { + +bool RequestHandler::sendPacket(const XmlPacket &packet) { + return connection->send(packet.encode(requestId)); +} + +} +} diff --git a/src/Common/RequestHandler.h b/src/Common/RequestHandler.h index b909e81..f36aae5 100644 --- a/src/Common/RequestHandler.h +++ b/src/Common/RequestHandler.h @@ -20,6 +20,8 @@ #ifndef MAD_COMMON_XMLREQUESTHANDLER_H_ #define MAD_COMMON_XMLREQUESTHANDLER_H_ +#include "XmlPacket.h" + #include <sigc++/signal.h> #include <stdint.h> @@ -32,22 +34,34 @@ class Connection; namespace Common { class RequestManager; -class XmlPacket; class RequestHandler { private: sigc::signal<void> finished; + Net::Connection *connection; + uint16_t requestId; + // Prevent shallow copy RequestHandler(const RequestHandler &o); RequestHandler& operator=(const RequestHandler &o); protected: - RequestHandler() {} + RequestHandler(Net::Connection *connection0, uint16_t requestId0) : connection(connection0), requestId(requestId0) {} sigc::signal<void> signalFinished() {return finished;} - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const XmlPacket &packet) = 0; + Net::Connection* getConnection() const { + return connection; + } + + uint16_t getRequestId() const { + return requestId; + } + + bool sendPacket(const XmlPacket &packet); + + virtual void handlePacket(const XmlPacket &packet) = 0; public: virtual ~RequestHandler() {} diff --git a/src/Common/RequestHandlers/DisconnectRequestHandler.cpp b/src/Common/RequestHandlers/DisconnectRequestHandler.cpp index 346b6de..031853a 100644 --- a/src/Common/RequestHandlers/DisconnectRequestHandler.cpp +++ b/src/Common/RequestHandlers/DisconnectRequestHandler.cpp @@ -20,14 +20,13 @@ #include "DisconnectRequestHandler.h" #include "../Exception.h" #include "../Logger.h" -#include "../XmlPacket.h" #include <Net/Connection.h> namespace Mad { namespace Common { namespace RequestHandlers { -void DisconnectRequestHandler::handlePacket(Net::Connection *connection, uint16_t requestId, const XmlPacket &packet) { +void DisconnectRequestHandler::handlePacket(const XmlPacket &packet) { if(packet.getType() != "Disconnect") { Logger::log(Logger::ERROR, "Received an unexpected packet."); @@ -35,7 +34,7 @@ void DisconnectRequestHandler::handlePacket(Net::Connection *connection, uint16_ ret.setType("Error"); ret.add("ErrorCode", Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -44,9 +43,10 @@ void DisconnectRequestHandler::handlePacket(Net::Connection *connection, uint16_ XmlPacket ret; ret.setType("OK"); - connection->send(ret.encode(requestId)); + sendPacket(ret); - connection->disconnect(); + + getConnection()->disconnect(); signalFinished().emit(); } diff --git a/src/Common/RequestHandlers/DisconnectRequestHandler.h b/src/Common/RequestHandlers/DisconnectRequestHandler.h index 7544fd8..b90c96e 100644 --- a/src/Common/RequestHandlers/DisconnectRequestHandler.h +++ b/src/Common/RequestHandlers/DisconnectRequestHandler.h @@ -28,10 +28,11 @@ namespace RequestHandlers { class DisconnectRequestHandler : public RequestHandler { protected: - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const XmlPacket &packet); + virtual void handlePacket(const XmlPacket &packet); public: - DisconnectRequestHandler() {} + DisconnectRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Common/RequestHandlers/FSInfoRequestHandler.cpp b/src/Common/RequestHandlers/FSInfoRequestHandler.cpp index 878dd7c..aaa4d9e 100644 --- a/src/Common/RequestHandlers/FSInfoRequestHandler.cpp +++ b/src/Common/RequestHandlers/FSInfoRequestHandler.cpp @@ -20,14 +20,12 @@ #include "FSInfoRequestHandler.h" #include "../Exception.h" #include "../Logger.h" -#include "../XmlPacket.h" -#include <Net/Connection.h> namespace Mad { namespace Common { namespace RequestHandlers { -void FSInfoRequestHandler::handlePacket(Net::Connection *con, uint16_t rid, const XmlPacket &packet) { +void FSInfoRequestHandler::handlePacket(const XmlPacket &packet) { if(packet.getType() != "FSInfo") { Logger::log(Logger::ERROR, "Received an unexpected packet."); @@ -35,7 +33,7 @@ void FSInfoRequestHandler::handlePacket(Net::Connection *con, uint16_t rid, cons ret.setType("Error"); ret.add("ErrorCode", Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(rid)); + sendPacket(ret); signalFinished().emit(); return; @@ -43,15 +41,12 @@ void FSInfoRequestHandler::handlePacket(Net::Connection *con, uint16_t rid, cons // TODO Require authentication - connection = con; - requestId = rid; - if(!SystemBackend::getFSInfo(sigc::mem_fun(this, &FSInfoRequestHandler::fsInfoHandler))) { XmlPacket ret; ret.setType("Error"); ret.add("ErrorCode", Exception::NOT_IMPLEMENTED); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); } @@ -73,7 +68,7 @@ void FSInfoRequestHandler::fsInfoHandler(const std::vector<SystemBackend::FSInfo entry.add("availableSize", fs->available); } - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); } diff --git a/src/Common/RequestHandlers/FSInfoRequestHandler.h b/src/Common/RequestHandlers/FSInfoRequestHandler.h index a9ee120..6fcf524 100644 --- a/src/Common/RequestHandlers/FSInfoRequestHandler.h +++ b/src/Common/RequestHandlers/FSInfoRequestHandler.h @@ -31,16 +31,14 @@ namespace RequestHandlers { class FSInfoRequestHandler : public RequestHandler { private: - Net::Connection *connection; - uint16_t requestId; - void fsInfoHandler(const std::vector<SystemBackend::FSInfo> &info); protected: - virtual void handlePacket(Net::Connection *con, uint16_t rid, const XmlPacket &packet); + virtual void handlePacket(const XmlPacket &packet); public: - FSInfoRequestHandler() {} + FSInfoRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Common/RequestHandlers/StatusRequestHandler.cpp b/src/Common/RequestHandlers/StatusRequestHandler.cpp index 86ed970..e03c345 100644 --- a/src/Common/RequestHandlers/StatusRequestHandler.cpp +++ b/src/Common/RequestHandlers/StatusRequestHandler.cpp @@ -21,14 +21,12 @@ #include "../Exception.h" #include "../SystemBackend.h" #include "../Logger.h" -#include "../XmlPacket.h" -#include <Net/Connection.h> namespace Mad { namespace Common { namespace RequestHandlers { -void StatusRequestHandler::handlePacket(Net::Connection *con, uint16_t requestId, const XmlPacket &packet) { +void StatusRequestHandler::handlePacket(const XmlPacket &packet) { if(packet.getType() != "GetStatus") { Logger::log(Logger::ERROR, "Received an unexpected packet."); @@ -36,7 +34,7 @@ void StatusRequestHandler::handlePacket(Net::Connection *con, uint16_t requestId ret.setType("Error"); ret.add("ErrorCode", Exception::UNEXPECTED_PACKET); - con->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -44,9 +42,6 @@ void StatusRequestHandler::handlePacket(Net::Connection *con, uint16_t requestId // TODO Require authentication - connection = con; - rid = requestId; - if(!SystemBackend::getUptimeInfo(sigc::mem_fun(this, &StatusRequestHandler::uptimeHandler))) needUptime = false; if(!SystemBackend::getMemoryInfo(sigc::mem_fun(this, &StatusRequestHandler::memoryHandler))) @@ -77,7 +72,7 @@ void StatusRequestHandler::send() { packet.add("loadAvg5", loadAvg5); packet.add("loadAvg15", loadAvg15); - connection->send(packet.encode(rid)); + sendPacket(packet); sent = true; diff --git a/src/Common/RequestHandlers/StatusRequestHandler.h b/src/Common/RequestHandlers/StatusRequestHandler.h index ce7ae6d..ddaaae4 100644 --- a/src/Common/RequestHandlers/StatusRequestHandler.h +++ b/src/Common/RequestHandlers/StatusRequestHandler.h @@ -29,9 +29,6 @@ namespace RequestHandlers { class StatusRequestHandler : public RequestHandler { private: - Net::Connection *connection; - uint16_t rid; - bool needUptime, needMemory, needLoad, sent; unsigned long uptime, idleTime; @@ -60,10 +57,12 @@ class StatusRequestHandler : public RequestHandler { void send(); protected: - virtual void handlePacket(Net::Connection *con, uint16_t requestId, const XmlPacket &packet); + virtual void handlePacket(const XmlPacket &packet); public: - StatusRequestHandler() : needUptime(true), needMemory(true), needLoad(true), sent(false), + StatusRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId), + needUptime(true), needMemory(true), needLoad(true), sent(false), uptime(0), idleTime(0), totalMem(0), freeMem(0), totalSwap(0), freeSwap(0), currentLoad(0), nProcesses(0), loadAvg1(0), loadAvg5(0), loadAvg15(0) {} }; diff --git a/src/Common/RequestManager.cpp b/src/Common/RequestManager.cpp index ac1909b..9d50865 100644 --- a/src/Common/RequestManager.cpp +++ b/src/Common/RequestManager.cpp @@ -18,11 +18,11 @@ */ #include "RequestManager.h" -#include "Request.h" -#include "XmlPacket.h" #include "RequestHandlers/DisconnectRequestHandler.h" #include "Logger.h" +#include <Net/Connection.h> + #include <sigc++/bind.h> #include <sigc++/retype_return.h> @@ -81,48 +81,44 @@ void RequestManager::receiveHandler(Net::Connection *connection, const Net::Pack RequestHandler *request = requestMap->findRequest(packet.getRequestId()); if(request) { - request->handlePacket(connection, packet.getRequestId(), xmlPacket); + request->handlePacket(xmlPacket); return; } std::map<std::string,RequestHandlerFactory*>::iterator factoryIt = requestHandlerFactories.find(xmlPacket.getType()); if(factoryIt != requestHandlerFactories.end()) { - request = factoryIt->second->createRequestHandler(); + request = factoryIt->second->createRequestHandler(connection, packet.getRequestId()); + requestMap->addRequest(packet.getRequestId(), request); - request->handlePacket(connection, packet.getRequestId(), xmlPacket); + request->handlePacket(xmlPacket); return; } - Logger::log(Logger::ERROR, "Received an unexpected packet."); + Logger::logf(Logger::ERROR, "Received an unexpected packet with type '%s'.", xmlPacket.getType().c_str()); XmlPacket ret; ret.setType("Error"); ret.add("ErrorCode", Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(requestId)); + connection->send(ret.encode(packet.getRequestId())); } -bool RequestManager::sendRequest(Net::Connection *connection, std::auto_ptr<Request> request) { +RequestManager::RequestMap* RequestManager::getUnusedRequestId(Net::Connection *connection, uint16_t *requestId) { std::map<Net::Connection*,RequestMap*>::iterator it = requestMaps.find(connection); if(it == requestMaps.end()) { Logger::log(Logger::CRITICAL, "Trying to send a request over an unregistered connecion."); - return false; + return 0; } RequestMap *requestMap = it->second; - uint16_t id; do { - id = getRequestId(); - } while(requestMap->findRequest(id)); + *requestId = getRequestId(); + } while(requestMap->findRequest(*requestId)); - request->sendRequest(connection, id); - - requestMap->addRequest(id, request.release()); - - return true; + return requestMap; } void RequestManager::registerConnection(Net::Connection *connection) { @@ -151,7 +147,7 @@ void RequestManager::unregisterPacketType(const std::string &type) { requestHandlerFactories.erase(it); } -RequestManager::RequestManager() : core(false), requestId(-1) { +RequestManager::RequestManager() : core(false), lastRequestId(-1) { registerPacketType<RequestHandlers::DisconnectRequestHandler>("Disconnect"); } diff --git a/src/Common/RequestManager.h b/src/Common/RequestManager.h index ee4f4d1..c38435b 100644 --- a/src/Common/RequestManager.h +++ b/src/Common/RequestManager.h @@ -20,16 +20,22 @@ #ifndef MAD_COMMON_REQUESTMANAGER_H_ #define MAD_COMMON_REQUESTMANAGER_H_ -#include <Net/Connection.h> +#include "Request.h" #include <map> #include <memory> +#include <string> + +#include <stdint.h> namespace Mad { -namespace Common { -class Request; -class RequestHandler; +namespace Net { +class Connection; +class Packet; +} + +namespace Common { class RequestManager { private: @@ -53,14 +59,14 @@ class RequestManager { RequestHandlerFactory() {} public: - virtual RequestHandler* createRequestHandler() = 0; + virtual RequestHandler* createRequestHandler(Net::Connection *connection, int16_t requestId) = 0; virtual ~RequestHandlerFactory() {} }; template<class T> class SpecificRequestHandlerFactory : public RequestHandlerFactory { public: - virtual RequestHandler* createRequestHandler() { - return new T(); + virtual RequestHandler* createRequestHandler(Net::Connection *connection, int16_t requestId) { + return new T(connection, requestId); } }; @@ -68,12 +74,12 @@ class RequestManager { std::map<Net::Connection*,RequestMap*> requestMaps; bool core; - uint16_t requestId; + uint16_t lastRequestId; std::map<std::string,RequestHandlerFactory*> requestHandlerFactories; uint16_t getRequestId() { - return requestId+=2; + return lastRequestId+=2; } // Prevent shallow copy @@ -82,6 +88,10 @@ class RequestManager { void receiveHandler(Net::Connection *connection, const Net::Packet &packet); + RequestMap* getUnusedRequestId(Net::Connection *connection, uint16_t *requestId); + + bool send(Request *request); + RequestManager(); public: @@ -94,9 +104,9 @@ class RequestManager { core = newCore; if(core) - requestId &= ~0x01; + lastRequestId &= ~0x01; else - requestId |= 0x01; + lastRequestId |= 0x01; } void registerConnection(Net::Connection *connection); @@ -108,7 +118,90 @@ class RequestManager { void unregisterPacketType(const std::string &type); - bool sendRequest(Net::Connection *connection, std::auto_ptr<Request> request); + template <class T> + bool sendRequest(Net::Connection *connection, Request::slot_type slot) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } + + template <class T, typename T1> + bool sendRequest(Net::Connection *connection, Request::slot_type slot, T1 t1) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot, t1); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } + + template <class T, typename T1, typename T2> + bool sendRequest(Net::Connection *connection, Request::slot_type slot, T1 t1, T2 t2) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot, t1, t2); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } + + template <class T, typename T1, typename T2, typename T3> + bool sendRequest(Net::Connection *connection, Request::slot_type slot, T1 t1, T2 t2, T3 t3) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot, t1, t2, t3); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } + + template <class T, typename T1, typename T2, typename T3, typename T4> + bool sendRequest(Net::Connection *connection, Request::slot_type slot, T1 t1, T2 t2, T3 t3, T4 t4) { + RequestMap *requestMap; + uint16_t requestId; + + requestMap = getUnusedRequestId(connection, &requestId); + + if(!requestMap) + return false; + + Request *request = new T(connection, requestId, slot, t1, t2, t3, t4); + request->sendRequest(); + requestMap->addRequest(requestId, request); + + return true; + } virtual ~RequestManager(); }; diff --git a/src/Common/Requests/DisconnectRequest.cpp b/src/Common/Requests/DisconnectRequest.cpp index afab8ed..ec8719d 100644 --- a/src/Common/Requests/DisconnectRequest.cpp +++ b/src/Common/Requests/DisconnectRequest.cpp @@ -24,20 +24,24 @@ namespace Mad { namespace Common { namespace Requests { -void DisconnectRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void DisconnectRequest::sendRequest() { XmlPacket packet; packet.setType("Disconnect"); - connection->send(packet.encode(requestId)); + sendPacket(packet); } -void DisconnectRequest::handlePacket(Net::Connection *connection, uint16_t, const XmlPacket &packet) { - if(packet.getType() != "OK") { +void DisconnectRequest::handlePacket(const XmlPacket &packet) { + if(packet.getType() == "Error") { + finishWithError(Common::Exception(packet["Where"], packet["ErrorCode"], packet["SubCode"], packet["SubSubCode"])); + return; + } + else if(packet.getType() != "OK") { finishWithError(Exception(Exception::UNEXPECTED_PACKET)); return; // TODO Logging } - connection->disconnect(); + getConnection()->disconnect(); finish(packet); } diff --git a/src/Common/Requests/DisconnectRequest.h b/src/Common/Requests/DisconnectRequest.h index af7cca5..22ff16b 100644 --- a/src/Common/Requests/DisconnectRequest.h +++ b/src/Common/Requests/DisconnectRequest.h @@ -28,11 +28,12 @@ namespace Requests { class DisconnectRequest : public Request { protected: - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); - virtual void handlePacket(Net::Connection *connection, uint16_t, const XmlPacket &packet); + virtual void sendRequest(); + virtual void handlePacket(const XmlPacket &packet); public: - DisconnectRequest(slot_type slot) : Request(slot) {} + DisconnectRequest(Net::Connection *connection, uint16_t requestId, slot_type slot) + : Request(connection, requestId, slot) {} }; } diff --git a/src/Common/Requests/FSInfoRequest.h b/src/Common/Requests/FSInfoRequest.h index 27a38ed..285f662 100644 --- a/src/Common/Requests/FSInfoRequest.h +++ b/src/Common/Requests/FSInfoRequest.h @@ -28,7 +28,8 @@ namespace Requests { class FSInfoRequest : public SimpleRequest { public: - FSInfoRequest(slot_type slot) : SimpleRequest("FSInfo", slot) {} + FSInfoRequest(Net::Connection *connection, uint16_t requestId, slot_type slot) + : SimpleRequest(connection, requestId, slot, "FSInfo") {} }; } diff --git a/src/Common/Requests/GSSAPIAuthRequest.cpp b/src/Common/Requests/GSSAPIAuthRequest.cpp index 7f4617a..07e516f 100644 --- a/src/Common/Requests/GSSAPIAuthRequest.cpp +++ b/src/Common/Requests/GSSAPIAuthRequest.cpp @@ -19,7 +19,6 @@ #include "GSSAPIAuthRequest.h" #include "../Logger.h" -#include "../XmlPacket.h" #include <Net/Connection.h> #include <cstring> @@ -37,7 +36,7 @@ GSSAPIAuthRequest::~GSSAPIAuthRequest() { gss_release_name(&minStat, &gssServiceName); } -void GSSAPIAuthRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void GSSAPIAuthRequest::sendRequest() { OM_uint32 majStat, minStat; gss_buffer_desc buffer; @@ -70,7 +69,7 @@ void GSSAPIAuthRequest::sendRequest(Net::Connection *connection, uint16_t reques ret.setType("AuthGSSAPI"); ret.addBinary("authToken", buffer.value, buffer.length); - if(!connection->send(ret.encode(requestId))) { + if(!sendPacket(ret)) { gss_release_buffer(&minStat, &buffer); return; } @@ -78,7 +77,7 @@ void GSSAPIAuthRequest::sendRequest(Net::Connection *connection, uint16_t reques gss_release_buffer(&minStat, &buffer); } -void GSSAPIAuthRequest::handlePacket(Net::Connection *connection, uint16_t requestId, const XmlPacket &packet) { +void GSSAPIAuthRequest::handlePacket(const XmlPacket &packet) { if(packet.getType() != "AuthGSSAPI") { finishWithError(Exception(Exception::UNEXPECTED_PACKET)); return; // TODO Logging @@ -114,7 +113,7 @@ void GSSAPIAuthRequest::handlePacket(Net::Connection *connection, uint16_t reque ret.setType("AuthGSSAPI"); ret.addBinary("authToken", sendBuffer.value, sendBuffer.length); - if(!connection->send(ret.encode(requestId))) { + if(!sendPacket(ret)) { gss_release_buffer(&minStat, &sendBuffer); return; } @@ -128,7 +127,7 @@ void GSSAPIAuthRequest::handlePacket(Net::Connection *connection, uint16_t reque recvBuffer.value = std::malloc(recvBuffer.length); std::memcpy(recvBuffer.value, pkgData, recvBuffer.length); - const gnutls_datum_t *cert = connection->getPeerCertificate(); + const gnutls_datum_t *cert = getConnection()->getPeerCertificate(); sendBuffer.length = cert->size; sendBuffer.value = cert->data; @@ -140,7 +139,7 @@ void GSSAPIAuthRequest::handlePacket(Net::Connection *connection, uint16_t reque if(majStat != GSS_S_COMPLETE) return; - connection->setAuthenticated(); + getConnection()->setAuthenticated(); Logger::log(Logger::VERBOSE, "Authentication complete."); majStat = gss_delete_sec_context(&minStat, &gssContext, &sendBuffer); @@ -154,7 +153,7 @@ void GSSAPIAuthRequest::handlePacket(Net::Connection *connection, uint16_t reque ret.setType("AuthGSSAPI"); ret.addBinary("authToken", sendBuffer.value, sendBuffer.length); - if(!connection->send(ret.encode(requestId))) { + if(!sendPacket(ret)) { gss_release_buffer(&minStat, &sendBuffer); return; } diff --git a/src/Common/Requests/GSSAPIAuthRequest.h b/src/Common/Requests/GSSAPIAuthRequest.h index ca6195b..104af0c 100644 --- a/src/Common/Requests/GSSAPIAuthRequest.h +++ b/src/Common/Requests/GSSAPIAuthRequest.h @@ -38,12 +38,12 @@ class GSSAPIAuthRequest : public Request { bool gssContinue; - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const XmlPacket &packet); + virtual void sendRequest(); + virtual void handlePacket(const XmlPacket &packet); public: - GSSAPIAuthRequest(const std::string &serviceName0, slot_type slot) - : Request(slot), serviceName(serviceName0), gssServiceName(GSS_C_NO_NAME), gssContext(GSS_C_NO_CONTEXT), gssContinue(true) {} + GSSAPIAuthRequest(Net::Connection *connection, uint16_t requestId, slot_type slot, const std::string &serviceName0) + : Request(connection, requestId, slot), serviceName(serviceName0), gssServiceName(GSS_C_NO_NAME), gssContext(GSS_C_NO_CONTEXT), gssContinue(true) {} virtual ~GSSAPIAuthRequest(); }; diff --git a/src/Common/Requests/SimpleRequest.cpp b/src/Common/Requests/SimpleRequest.cpp index 018ac39..97426ae 100644 --- a/src/Common/Requests/SimpleRequest.cpp +++ b/src/Common/Requests/SimpleRequest.cpp @@ -19,17 +19,15 @@ #include "SimpleRequest.h" -#include <Net/Connection.h> - namespace Mad { namespace Common { namespace Requests { -void SimpleRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void SimpleRequest::sendRequest() { XmlPacket packet; packet.setType(type); - connection->send(packet.encode(requestId)); + sendPacket(packet); } } diff --git a/src/Common/Requests/SimpleRequest.h b/src/Common/Requests/SimpleRequest.h index 0426910..ca95eca 100644 --- a/src/Common/Requests/SimpleRequest.h +++ b/src/Common/Requests/SimpleRequest.h @@ -32,9 +32,10 @@ class SimpleRequest : public Request { protected: const std::string type; - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); + virtual void sendRequest(); - SimpleRequest(const std::string &type0, slot_type slot) : Request(slot), type(type0) {} + SimpleRequest(Net::Connection *connection, uint16_t requestId, slot_type slot, const std::string &type0) + : Request(connection, requestId, slot), type(type0) {} }; } diff --git a/src/Common/Requests/StatusRequest.h b/src/Common/Requests/StatusRequest.h index d557358..ad89ec4 100644 --- a/src/Common/Requests/StatusRequest.h +++ b/src/Common/Requests/StatusRequest.h @@ -28,7 +28,8 @@ namespace Requests { class StatusRequest : public SimpleRequest { public: - StatusRequest(slot_type slot) : SimpleRequest("GetStatus", slot) {} + StatusRequest(Net::Connection *connection, uint16_t requestId, slot_type slot) + : SimpleRequest(connection, requestId, slot, "GetStatus") {} }; } diff --git a/src/Common/Requests/UserListRequest.h b/src/Common/Requests/UserListRequest.h index 918925c..69b0f05 100644 --- a/src/Common/Requests/UserListRequest.h +++ b/src/Common/Requests/UserListRequest.h @@ -28,7 +28,8 @@ namespace Requests { class UserListRequest : public SimpleRequest { public: - UserListRequest(slot_type slot) : SimpleRequest("ListUsers", slot) {} + UserListRequest(Net::Connection *connection, uint16_t requestId, slot_type slot) + : SimpleRequest(connection, requestId, slot, "ListUsers") {} }; } diff --git a/src/Core/ConnectionManager.cpp b/src/Core/ConnectionManager.cpp index a6d80d0..3ce52fc 100644 --- a/src/Core/ConnectionManager.cpp +++ b/src/Core/ConnectionManager.cpp @@ -50,9 +50,7 @@ void ConnectionManager::updateState(const std::string &name, Common::HostInfo::S daemonInfo[name].setState(state); for(std::list<Net::ServerConnection*>::iterator con = clientConnections.begin(); con != clientConnections.end(); ++con) { - Common::RequestManager::get()->sendRequest(*con, std::auto_ptr<Common::Request>( - new Requests::DaemonStateUpdateRequest(name, state) - )); + Common::RequestManager::get()->sendRequest<Requests::DaemonStateUpdateRequest>(*con, Common::Request::slot_type(), name, state); } } diff --git a/src/Core/RequestHandlers/DaemonCommandRequestHandler.cpp b/src/Core/RequestHandlers/DaemonCommandRequestHandler.cpp index 1bfe3e4..c9a4530 100644 --- a/src/Core/RequestHandlers/DaemonCommandRequestHandler.cpp +++ b/src/Core/RequestHandlers/DaemonCommandRequestHandler.cpp @@ -26,7 +26,7 @@ namespace Mad { namespace Core { namespace RequestHandlers { -void DaemonCommandRequestHandler::handlePacket(Net::Connection *connection, uint16_t rid, const Common::XmlPacket &packet) { +void DaemonCommandRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "DaemonCommand") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -34,7 +34,7 @@ void DaemonCommandRequestHandler::handlePacket(Net::Connection *connection, uint ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(rid)); + sendPacket(ret); signalFinished().emit(); return; @@ -42,16 +42,12 @@ void DaemonCommandRequestHandler::handlePacket(Net::Connection *connection, uint // TODO Require authentication - con = connection; - requestId = rid; - std::string command = packet["command"]; try { Net::Connection *daemonCon = ConnectionManager::get()->getDaemonConnection(packet["daemon"]); - Common::RequestManager::get()->sendRequest(daemonCon, std::auto_ptr<Common::Request>( - new Requests::CommandRequest(command == "reboot", sigc::mem_fun(this, &DaemonCommandRequestHandler::requestFinished)) - )); + Common::RequestManager::get()->sendRequest<Requests::CommandRequest>(daemonCon, + sigc::mem_fun(this, &DaemonCommandRequestHandler::requestFinished), command == "reboot"); } catch(Common::Exception &e) { Common::XmlPacket ret; @@ -61,15 +57,13 @@ void DaemonCommandRequestHandler::handlePacket(Net::Connection *connection, uint ret.add("SubSubCode", e.getSubSubCode()); ret.add("Where", e.getWhere()); - con->send(ret.encode(requestId)); + sendPacket(ret); } } void DaemonCommandRequestHandler::requestFinished(const Common::Request &request) { try { - const Common::XmlPacket &packet = request.getResult(); - - con->send(packet.encode(requestId)); + sendPacket(request.getResult()); } catch(Common::Exception &e) { Common::XmlPacket ret; @@ -79,7 +73,7 @@ void DaemonCommandRequestHandler::requestFinished(const Common::Request &request ret.add("SubSubCode", e.getSubSubCode()); ret.add("Where", e.getWhere()); - con->send(ret.encode(requestId)); + sendPacket(ret); } signalFinished().emit(); diff --git a/src/Core/RequestHandlers/DaemonCommandRequestHandler.h b/src/Core/RequestHandlers/DaemonCommandRequestHandler.h index 4ab7a3f..9e089e3 100644 --- a/src/Core/RequestHandlers/DaemonCommandRequestHandler.h +++ b/src/Core/RequestHandlers/DaemonCommandRequestHandler.h @@ -30,16 +30,14 @@ namespace RequestHandlers { class DaemonCommandRequestHandler : public Common::RequestHandler { private: - Net::Connection *con; - uint16_t requestId; - void requestFinished(const Common::Request &request); protected: - virtual void handlePacket(Net::Connection *connection, uint16_t rid, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - DaemonCommandRequestHandler() {} + DaemonCommandRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Core/RequestHandlers/DaemonFSInfoRequestHandler.cpp b/src/Core/RequestHandlers/DaemonFSInfoRequestHandler.cpp index b9dc030..ae12a8e 100644 --- a/src/Core/RequestHandlers/DaemonFSInfoRequestHandler.cpp +++ b/src/Core/RequestHandlers/DaemonFSInfoRequestHandler.cpp @@ -27,7 +27,7 @@ namespace Mad { namespace Core { namespace RequestHandlers { -void DaemonFSInfoRequestHandler::handlePacket(Net::Connection *connection, uint16_t rid, const Common::XmlPacket &packet) { +void DaemonFSInfoRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "DaemonFSInfo") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -35,7 +35,7 @@ void DaemonFSInfoRequestHandler::handlePacket(Net::Connection *connection, uint1 ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(rid)); + sendPacket(ret); signalFinished().emit(); return; @@ -43,12 +43,10 @@ void DaemonFSInfoRequestHandler::handlePacket(Net::Connection *connection, uint1 // TODO Require authentication - con = connection; - requestId = rid; - try { Net::Connection *daemonCon = ConnectionManager::get()->getDaemonConnection(packet["daemon"]); - Common::RequestManager::get()->sendRequest(daemonCon, std::auto_ptr<Common::Request>(new Common::Requests::FSInfoRequest(sigc::mem_fun(this, &DaemonFSInfoRequestHandler::requestFinished)))); + Common::RequestManager::get()->sendRequest<Common::Requests::FSInfoRequest>(daemonCon, + sigc::mem_fun(this, &DaemonFSInfoRequestHandler::requestFinished)); } catch(Common::Exception &e) { Common::XmlPacket ret; @@ -58,14 +56,13 @@ void DaemonFSInfoRequestHandler::handlePacket(Net::Connection *connection, uint1 ret.add("SubSubCode", e.getSubSubCode()); ret.add("Where", e.getWhere()); - con->send(ret.encode(requestId)); + sendPacket(ret); } } void DaemonFSInfoRequestHandler::requestFinished(const Common::Request &request) { try { - const Common::XmlPacket &packet = request.getResult(); - con->send(packet.encode(requestId)); + sendPacket(request.getResult()); } catch(Common::Exception &e) { Common::XmlPacket ret; @@ -75,7 +72,7 @@ void DaemonFSInfoRequestHandler::requestFinished(const Common::Request &request) ret.add("SubSubCode", e.getSubSubCode()); ret.add("Where", e.getWhere()); - con->send(ret.encode(requestId)); + sendPacket(ret); } signalFinished().emit(); diff --git a/src/Core/RequestHandlers/DaemonFSInfoRequestHandler.h b/src/Core/RequestHandlers/DaemonFSInfoRequestHandler.h index 820ef69..6a70c5e 100644 --- a/src/Core/RequestHandlers/DaemonFSInfoRequestHandler.h +++ b/src/Core/RequestHandlers/DaemonFSInfoRequestHandler.h @@ -25,28 +25,19 @@ #include <stdint.h> namespace Mad { - -namespace Net { -namespace Packets { -class FSInfoPacket; -} -} - namespace Core { namespace RequestHandlers { class DaemonFSInfoRequestHandler : public Common::RequestHandler { private: - Net::Connection *con; - uint16_t requestId; - void requestFinished(const Common::Request &request); protected: - virtual void handlePacket(Net::Connection *connection, uint16_t rid, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - DaemonFSInfoRequestHandler() {} + DaemonFSInfoRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Core/RequestHandlers/DaemonListRequestHandler.cpp b/src/Core/RequestHandlers/DaemonListRequestHandler.cpp index c20627f..84d3207 100644 --- a/src/Core/RequestHandlers/DaemonListRequestHandler.cpp +++ b/src/Core/RequestHandlers/DaemonListRequestHandler.cpp @@ -20,14 +20,12 @@ #include "DaemonListRequestHandler.h" #include "../ConnectionManager.h" #include <Common/Logger.h> -#include <Common/XmlPacket.h> -#include <Net/Connection.h> namespace Mad { namespace Core { namespace RequestHandlers { -void DaemonListRequestHandler::handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet) { +void DaemonListRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "ListHosts") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -35,7 +33,7 @@ void DaemonListRequestHandler::handlePacket(Net::Connection *connection, uint16_ ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -57,7 +55,7 @@ void DaemonListRequestHandler::handlePacket(Net::Connection *connection, uint16_ ret["hosts"].back().add("state", daemon->getState()); } - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); } diff --git a/src/Core/RequestHandlers/DaemonListRequestHandler.h b/src/Core/RequestHandlers/DaemonListRequestHandler.h index 26c46f8..07badae 100644 --- a/src/Core/RequestHandlers/DaemonListRequestHandler.h +++ b/src/Core/RequestHandlers/DaemonListRequestHandler.h @@ -28,10 +28,11 @@ namespace RequestHandlers { class DaemonListRequestHandler : public Common::RequestHandler { protected: - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - DaemonListRequestHandler() {} + DaemonListRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Core/RequestHandlers/DaemonStatusRequestHandler.cpp b/src/Core/RequestHandlers/DaemonStatusRequestHandler.cpp index 35daae4..66c3aa1 100644 --- a/src/Core/RequestHandlers/DaemonStatusRequestHandler.cpp +++ b/src/Core/RequestHandlers/DaemonStatusRequestHandler.cpp @@ -27,7 +27,7 @@ namespace Mad { namespace Core { namespace RequestHandlers { -void DaemonStatusRequestHandler::handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet) { +void DaemonStatusRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "GetDaemonStatus") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -35,7 +35,7 @@ void DaemonStatusRequestHandler::handlePacket(Net::Connection *connection, uint1 ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - con->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -43,14 +43,12 @@ void DaemonStatusRequestHandler::handlePacket(Net::Connection *connection, uint1 // TODO Require authentication - con = connection; - rid = requestId; - std::string daemonName = packet["daemonName"]; try { Net::Connection *daemonCon = ConnectionManager::get()->getDaemonConnection(daemonName); - Common::RequestManager::get()->sendRequest(daemonCon, std::auto_ptr<Common::Request>(new Common::Requests::StatusRequest(sigc::mem_fun(this, &DaemonStatusRequestHandler::requestFinished)))); + Common::RequestManager::get()->sendRequest<Common::Requests::StatusRequest>(daemonCon, + sigc::mem_fun(this, &DaemonStatusRequestHandler::requestFinished)); } catch(Common::Exception &e) { Common::XmlPacket ret; @@ -60,14 +58,13 @@ void DaemonStatusRequestHandler::handlePacket(Net::Connection *connection, uint1 ret.add("SubSubCode", e.getSubSubCode()); ret.add("Where", e.getWhere()); - con->send(ret.encode(rid)); + sendPacket(ret); } } void DaemonStatusRequestHandler::requestFinished(const Common::Request &request) { try { - const Common::XmlPacket &packet = request.getResult(); - con->send(packet.encode(rid)); + sendPacket(request.getResult()); } catch(Common::Exception &e) { Common::XmlPacket ret; @@ -77,7 +74,7 @@ void DaemonStatusRequestHandler::requestFinished(const Common::Request &request) ret.add("SubSubCode", e.getSubSubCode()); ret.add("Where", e.getWhere()); - con->send(ret.encode(rid)); + sendPacket(ret); } signalFinished().emit(); diff --git a/src/Core/RequestHandlers/DaemonStatusRequestHandler.h b/src/Core/RequestHandlers/DaemonStatusRequestHandler.h index 92dac2f..f232649 100644 --- a/src/Core/RequestHandlers/DaemonStatusRequestHandler.h +++ b/src/Core/RequestHandlers/DaemonStatusRequestHandler.h @@ -25,28 +25,19 @@ #include <stdint.h> namespace Mad { - -namespace Net { -namespace Packets { -class HostStatusPacket; -} -} - namespace Core { namespace RequestHandlers { class DaemonStatusRequestHandler : public Common::RequestHandler { private: - Net::Connection *con; - uint16_t rid; - void requestFinished(const Common::Request &request); protected: - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - DaemonStatusRequestHandler() {} + DaemonStatusRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Core/RequestHandlers/GSSAPIAuthRequestHandler.cpp b/src/Core/RequestHandlers/GSSAPIAuthRequestHandler.cpp index d9694c8..ad0a293 100644 --- a/src/Core/RequestHandlers/GSSAPIAuthRequestHandler.cpp +++ b/src/Core/RequestHandlers/GSSAPIAuthRequestHandler.cpp @@ -20,7 +20,6 @@ #include "GSSAPIAuthRequestHandler.h" #include <Common/Exception.h> #include <Common/Logger.h> -#include <Common/XmlPacket.h> #include <Net/Connection.h> #include <cstring> @@ -31,7 +30,7 @@ namespace RequestHandlers { // TODO Error handling -void GSSAPIAuthRequestHandler::handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet) { +void GSSAPIAuthRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "AuthGSSAPI") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -39,7 +38,7 @@ void GSSAPIAuthRequestHandler::handlePacket(Net::Connection *connection, uint16_ ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -74,7 +73,7 @@ void GSSAPIAuthRequestHandler::handlePacket(Net::Connection *connection, uint16_ ret.setType("AuthGSSAPI"); ret.addBinary("authToken", sendBuffer.value, sendBuffer.length); - if(!connection->send(ret.encode(requestId))) { + if(!sendPacket(ret)) { gss_release_buffer(&minStat, &sendBuffer); return; } @@ -85,7 +84,7 @@ void GSSAPIAuthRequestHandler::handlePacket(Net::Connection *connection, uint16_ if(!packet["binary"].isEmpty()) return; - const gnutls_datum_t *cert = connection->getCertificate(); + const gnutls_datum_t *cert = getConnection()->getCertificate(); recvBuffer.length = cert->size; recvBuffer.value = cert->data; @@ -101,7 +100,7 @@ void GSSAPIAuthRequestHandler::handlePacket(Net::Connection *connection, uint16_ ret.setType("AuthGSSAPI"); ret.addBinary("certMic", sendBuffer.value, sendBuffer.length); - if(!connection->send(ret.encode(requestId))) { + if(!sendPacket(ret)) { gss_release_buffer(&minStat, &sendBuffer); return; } diff --git a/src/Core/RequestHandlers/GSSAPIAuthRequestHandler.h b/src/Core/RequestHandlers/GSSAPIAuthRequestHandler.h index 7f29804..06c1886 100644 --- a/src/Core/RequestHandlers/GSSAPIAuthRequestHandler.h +++ b/src/Core/RequestHandlers/GSSAPIAuthRequestHandler.h @@ -34,10 +34,11 @@ class GSSAPIAuthRequestHandler : public Common::RequestHandler { bool gssContinue, sentSignature; protected: - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - GSSAPIAuthRequestHandler() : gssContext(GSS_C_NO_CONTEXT), gssContinue(true), sentSignature(false) {} + GSSAPIAuthRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId), gssContext(GSS_C_NO_CONTEXT), gssContinue(true), sentSignature(false) {} }; } diff --git a/src/Core/RequestHandlers/IdentifyRequestHandler.cpp b/src/Core/RequestHandlers/IdentifyRequestHandler.cpp index 4bf921e..235569c 100644 --- a/src/Core/RequestHandlers/IdentifyRequestHandler.cpp +++ b/src/Core/RequestHandlers/IdentifyRequestHandler.cpp @@ -20,15 +20,13 @@ #include "IdentifyRequestHandler.h" #include "../ConnectionManager.h" #include <Common/Logger.h> -#include <Common/XmlPacket.h> -#include <Net/Connection.h> namespace Mad { namespace Core { namespace RequestHandlers { -void IdentifyRequestHandler::handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet) { +void IdentifyRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "Identify") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -36,7 +34,7 @@ void IdentifyRequestHandler::handlePacket(Net::Connection *connection, uint16_t ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -44,11 +42,11 @@ void IdentifyRequestHandler::handlePacket(Net::Connection *connection, uint16_t // TODO Require authentication try { - ConnectionManager::get()->identifyDaemonConnection(connection, packet["hostname"]); + ConnectionManager::get()->identifyDaemonConnection(getConnection(), packet["hostname"]); Common::XmlPacket ret; ret.setType("OK"); - connection->send(ret.encode(requestId)); + sendPacket(ret); } catch(Common::Exception &e) { Common::XmlPacket ret; @@ -58,7 +56,7 @@ void IdentifyRequestHandler::handlePacket(Net::Connection *connection, uint16_t ret.add("SubSubCode", e.getSubSubCode()); ret.add("Where", e.getWhere()); - connection->send(ret.encode(requestId)); + sendPacket(ret); } signalFinished().emit(); diff --git a/src/Core/RequestHandlers/IdentifyRequestHandler.h b/src/Core/RequestHandlers/IdentifyRequestHandler.h index 7bc5d7c..37aa74b 100644 --- a/src/Core/RequestHandlers/IdentifyRequestHandler.h +++ b/src/Core/RequestHandlers/IdentifyRequestHandler.h @@ -28,10 +28,11 @@ namespace RequestHandlers { class IdentifyRequestHandler : public Common::RequestHandler { protected: - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - IdentifyRequestHandler() {} + IdentifyRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Core/RequestHandlers/LogRequestHandler.cpp b/src/Core/RequestHandlers/LogRequestHandler.cpp index 77be876..aeec7da 100644 --- a/src/Core/RequestHandlers/LogRequestHandler.cpp +++ b/src/Core/RequestHandlers/LogRequestHandler.cpp @@ -20,15 +20,13 @@ #include "LogRequestHandler.h" #include <Common/Logger.h> #include <Common/LogManager.h> -#include <Common/XmlPacket.h> #include "../ConnectionManager.h" -#include <Net/Connection.h> namespace Mad { namespace Core { namespace RequestHandlers { -void LogRequestHandler::handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet) { +void LogRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "Log") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -36,7 +34,7 @@ void LogRequestHandler::handlePacket(Net::Connection *connection, uint16_t reque ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -46,7 +44,7 @@ void LogRequestHandler::handlePacket(Net::Connection *connection, uint16_t reque try { Common::LogManager::get()->log(packet["category"], packet["level"], packet["timestamp"], packet["message"], - ConnectionManager::get()->getDaemonName(connection)); + ConnectionManager::get()->getDaemonName(getConnection())); } catch(Common::Exception &e) { Common::Logger::logf(Common::Logger::ERROR, "Can't determine daemon name: %s", e.strerror().c_str()); @@ -55,7 +53,7 @@ void LogRequestHandler::handlePacket(Net::Connection *connection, uint16_t reque Common::XmlPacket ret; ret.setType("OK"); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); } diff --git a/src/Core/RequestHandlers/LogRequestHandler.h b/src/Core/RequestHandlers/LogRequestHandler.h index 4a0f9cb..9cf63ec 100644 --- a/src/Core/RequestHandlers/LogRequestHandler.h +++ b/src/Core/RequestHandlers/LogRequestHandler.h @@ -28,10 +28,11 @@ namespace RequestHandlers { class LogRequestHandler : public Common::RequestHandler { protected: - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - LogRequestHandler() {} + LogRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Core/RequestHandlers/UserListRequestHandler.cpp b/src/Core/RequestHandlers/UserListRequestHandler.cpp index 176fde9..bb67df9 100644 --- a/src/Core/RequestHandlers/UserListRequestHandler.cpp +++ b/src/Core/RequestHandlers/UserListRequestHandler.cpp @@ -21,14 +21,12 @@ #include "../UserBackend.h" #include <Common/Exception.h> #include <Common/Logger.h> -#include <Common/XmlPacket.h> -#include <Net/Connection.h> namespace Mad { namespace Core { namespace RequestHandlers { -void UserListRequestHandler::handlePacket(Net::Connection *con, uint16_t requestId, const Common::XmlPacket &packet) { +void UserListRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "ListUsers") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -36,7 +34,7 @@ void UserListRequestHandler::handlePacket(Net::Connection *con, uint16_t request ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - con->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -44,15 +42,12 @@ void UserListRequestHandler::handlePacket(Net::Connection *con, uint16_t request // TODO Require authentication - connection = con; - rid = requestId; - if(!UserBackend::getUserList(sigc::mem_fun(this, &UserListRequestHandler::userListHandler))) { Common::XmlPacket ret; ret.setType("Error"); ret.add("ErrorCode", Common::Exception::NOT_IMPLEMENTED); - con->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); } } @@ -72,7 +67,7 @@ void UserListRequestHandler::userListHandler(const std::map<unsigned long, Commo entry.add("fullName", user->second.getFullName()); } - connection->send(ret.encode(rid)); + sendPacket(ret); signalFinished().emit(); } diff --git a/src/Core/RequestHandlers/UserListRequestHandler.h b/src/Core/RequestHandlers/UserListRequestHandler.h index a9c8ac6..8eae11e 100644 --- a/src/Core/RequestHandlers/UserListRequestHandler.h +++ b/src/Core/RequestHandlers/UserListRequestHandler.h @@ -32,16 +32,14 @@ namespace RequestHandlers { class UserListRequestHandler : public Common::RequestHandler { private: - Net::Connection *connection; - uint16_t rid; - void userListHandler(const std::map<unsigned long, Common::UserInfo> &info); protected: - virtual void handlePacket(Net::Connection *con, uint16_t requestId, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - UserListRequestHandler() {} + UserListRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Core/Requests/CommandRequest.cpp b/src/Core/Requests/CommandRequest.cpp index a280bc5..78bb650 100644 --- a/src/Core/Requests/CommandRequest.cpp +++ b/src/Core/Requests/CommandRequest.cpp @@ -18,18 +18,17 @@ */ #include "CommandRequest.h" -#include <Net/Connection.h> namespace Mad { namespace Core { namespace Requests { -void CommandRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void CommandRequest::sendRequest() { Common::XmlPacket packet; packet.setType("Command"); packet.add("command", reboot ? "reboot" : "shutdown"); - connection->send(packet.encode(requestId)); + sendPacket(packet); } } diff --git a/src/Core/Requests/CommandRequest.h b/src/Core/Requests/CommandRequest.h index aece5ae..2214a29 100644 --- a/src/Core/Requests/CommandRequest.h +++ b/src/Core/Requests/CommandRequest.h @@ -31,10 +31,11 @@ class CommandRequest : public Common::Request { bool reboot; protected: - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); + virtual void sendRequest(); public: - CommandRequest(bool reboot0, slot_type slot) : Common::Request(slot), reboot(reboot0) {} + CommandRequest(Net::Connection *connection, uint16_t requestId, slot_type slot, bool reboot0) + : Common::Request(connection, requestId, slot), reboot(reboot0) {} }; } diff --git a/src/Core/Requests/DaemonStateUpdateRequest.cpp b/src/Core/Requests/DaemonStateUpdateRequest.cpp index abf51de..c8a813b 100644 --- a/src/Core/Requests/DaemonStateUpdateRequest.cpp +++ b/src/Core/Requests/DaemonStateUpdateRequest.cpp @@ -18,19 +18,18 @@ */ #include "DaemonStateUpdateRequest.h" -#include <Net/Connection.h> namespace Mad { namespace Core { namespace Requests { -void DaemonStateUpdateRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void DaemonStateUpdateRequest::sendRequest() { Common::XmlPacket packet; packet.setType("UpdateHostState"); packet.add("name", name); packet.add("state", state); - connection->send(packet.encode(requestId)); + sendPacket(packet); } } diff --git a/src/Core/Requests/DaemonStateUpdateRequest.h b/src/Core/Requests/DaemonStateUpdateRequest.h index 3f15e9b..f310119 100644 --- a/src/Core/Requests/DaemonStateUpdateRequest.h +++ b/src/Core/Requests/DaemonStateUpdateRequest.h @@ -33,10 +33,11 @@ class DaemonStateUpdateRequest : public Common::Request { Common::HostInfo::State state; protected: - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); + virtual void sendRequest(); public: - DaemonStateUpdateRequest(const std::string &name0, Common::HostInfo::State state0) : Common::Request(slot_type()), name(name0), state(state0) {} + DaemonStateUpdateRequest(Net::Connection *connection, uint16_t requestId, slot_type slot, const std::string &name0, Common::HostInfo::State state0) + : Common::Request(connection, requestId, slot), name(name0), state(state0) {} }; } diff --git a/src/Daemon/Backends/NetworkLogger.h b/src/Daemon/Backends/NetworkLogger.h index 857d27c..8dc34b9 100644 --- a/src/Daemon/Backends/NetworkLogger.h +++ b/src/Daemon/Backends/NetworkLogger.h @@ -23,7 +23,6 @@ #include <Common/Logger.h> #include <Common/RequestManager.h> #include <Daemon/Requests/LogRequest.h> -#include <Net/Connection.h> #include <ctime> namespace Mad { @@ -36,9 +35,8 @@ class NetworkLogger : public Common::Logger { protected: virtual void logMessage(Common::Logger::MessageCategory category, Common::Logger::MessageLevel level, time_t messageTimestamp, const std::string &message) { - Common::RequestManager::get()->sendRequest(connection, - std::auto_ptr<Common::Request>(new Requests::LogRequest(category, level, messageTimestamp, message, Requests::LogRequest::slot_type())) - ); + Common::RequestManager::get()->sendRequest<Requests::LogRequest>(connection, Common::Request::slot_type(), + category, level, messageTimestamp, message); } public: diff --git a/src/Daemon/RequestHandlers/CommandRequestHandler.cpp b/src/Daemon/RequestHandlers/CommandRequestHandler.cpp index 3f4ef17..b0856c1 100644 --- a/src/Daemon/RequestHandlers/CommandRequestHandler.cpp +++ b/src/Daemon/RequestHandlers/CommandRequestHandler.cpp @@ -21,16 +21,12 @@ #include <Common/Exception.h> #include <Common/Logger.h> #include <Common/SystemBackend.h> -#include <Common/XmlPacket.h> -#include <Net/Connection.h> - -#include <sigc++/bind.h> namespace Mad { namespace Daemon { namespace RequestHandlers { -void CommandRequestHandler::handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet) { +void CommandRequestHandler::handlePacket(const Common::XmlPacket &packet) { if(packet.getType() != "Command") { Common::Logger::log(Common::Logger::ERROR, "Received an unexpected packet."); @@ -38,7 +34,7 @@ void CommandRequestHandler::handlePacket(Net::Connection *connection, uint16_t r ret.setType("Error"); ret.add("ErrorCode", Common::Exception::UNEXPECTED_PACKET); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); return; @@ -50,11 +46,11 @@ void CommandRequestHandler::handlePacket(Net::Connection *connection, uint16_t r std::string command = packet["command"]; if(command == "reboot") { - if(Common::SystemBackend::shutdown(sigc::bind(sigc::mem_fun(this, &CommandRequestHandler::sendReply), connection, requestId))) + if(Common::SystemBackend::shutdown(sigc::mem_fun(this, &CommandRequestHandler::sendReply))) return; } else { - if(Common::SystemBackend::reboot(sigc::bind(sigc::mem_fun(this, &CommandRequestHandler::sendReply), connection, requestId))) + if(Common::SystemBackend::reboot(sigc::mem_fun(this, &CommandRequestHandler::sendReply))) return; } @@ -62,16 +58,16 @@ void CommandRequestHandler::handlePacket(Net::Connection *connection, uint16_t r ret.setType("Error"); ret.add("ErrorCode", Common::Exception::NOT_IMPLEMENTED); - connection->send(ret.encode(requestId)); + sendPacket(ret); signalFinished().emit(); } -void CommandRequestHandler::sendReply(Net::Connection *connection, uint16_t requestId) { +void CommandRequestHandler::sendReply() { Common::XmlPacket packet; packet.setType("OK"); - connection->send(packet.encode(requestId)); + sendPacket(packet); signalFinished().emit(); } diff --git a/src/Daemon/RequestHandlers/CommandRequestHandler.h b/src/Daemon/RequestHandlers/CommandRequestHandler.h index 408dbcf..230a8f5 100644 --- a/src/Daemon/RequestHandlers/CommandRequestHandler.h +++ b/src/Daemon/RequestHandlers/CommandRequestHandler.h @@ -29,13 +29,14 @@ namespace RequestHandlers { class CommandRequestHandler : public Common::RequestHandler { private: - void sendReply(Net::Connection *connection, uint16_t requestId); + void sendReply(); protected: - virtual void handlePacket(Net::Connection *connection, uint16_t requestId, const Common::XmlPacket &packet); + virtual void handlePacket(const Common::XmlPacket &packet); public: - CommandRequestHandler() {} + CommandRequestHandler(Net::Connection *connection, uint16_t requestId) + : RequestHandler(connection, requestId) {} }; } diff --git a/src/Daemon/Requests/IdentifyRequest.cpp b/src/Daemon/Requests/IdentifyRequest.cpp index 1ae9372..ba0adef 100644 --- a/src/Daemon/Requests/IdentifyRequest.cpp +++ b/src/Daemon/Requests/IdentifyRequest.cpp @@ -18,19 +18,17 @@ */ #include "IdentifyRequest.h" -#include <Net/Connection.h> -#include <Common/XmlPacket.h> namespace Mad { namespace Daemon { namespace Requests { -void IdentifyRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void IdentifyRequest::sendRequest() { Common::XmlPacket packet; packet.setType("Identify"); packet.add("hostname", hostname); - connection->send(packet.encode(requestId)); + sendPacket(packet); } } diff --git a/src/Daemon/Requests/IdentifyRequest.h b/src/Daemon/Requests/IdentifyRequest.h index b3f48ab..75ecd6e 100644 --- a/src/Daemon/Requests/IdentifyRequest.h +++ b/src/Daemon/Requests/IdentifyRequest.h @@ -32,10 +32,11 @@ class IdentifyRequest : public Common::Request { std::string hostname; protected: - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); + virtual void sendRequest(); public: - IdentifyRequest(const std::string &hostname0, slot_type slot) : Common::Request(slot), hostname(hostname0) {} + IdentifyRequest(Net::Connection *connection, uint16_t requestId, slot_type slot, const std::string &hostname0) + : Common::Request(connection, requestId, slot), hostname(hostname0) {} }; } diff --git a/src/Daemon/Requests/LogRequest.cpp b/src/Daemon/Requests/LogRequest.cpp index a7c4d03..0741168 100644 --- a/src/Daemon/Requests/LogRequest.cpp +++ b/src/Daemon/Requests/LogRequest.cpp @@ -18,13 +18,12 @@ */ #include "LogRequest.h" -#include <Net/Connection.h> namespace Mad { namespace Daemon { namespace Requests { -void LogRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { +void LogRequest::sendRequest() { Common::XmlPacket packet; packet.setType("Log"); @@ -34,7 +33,7 @@ void LogRequest::sendRequest(Net::Connection *connection, uint16_t requestId) { packet.add("timestamp", messageTimestamp); packet.add("message", message); - connection->send(packet.encode(requestId)); + sendPacket(packet); } } diff --git a/src/Daemon/Requests/LogRequest.h b/src/Daemon/Requests/LogRequest.h index 7cceade..9e22b64 100644 --- a/src/Daemon/Requests/LogRequest.h +++ b/src/Daemon/Requests/LogRequest.h @@ -36,11 +36,11 @@ class LogRequest : public Common::Request { std::string message; protected: - virtual void sendRequest(Net::Connection *connection, uint16_t requestId); + virtual void sendRequest(); public: - LogRequest(Common::Logger::MessageCategory category0, Common::Logger::MessageLevel level0, time_t messageTimestamp0, const std::string &message0, slot_type slot) - : Common::Request(slot), category(category0), level(level0), messageTimestamp(messageTimestamp0), message(message0) {} + LogRequest(Net::Connection *connection, uint16_t requestId, slot_type slot, Common::Logger::MessageCategory category0, Common::Logger::MessageLevel level0, time_t messageTimestamp0, const std::string &message0) + : Common::Request(connection, requestId, slot), category(category0), level(level0), messageTimestamp(messageTimestamp0), message(message0) {} }; } diff --git a/src/mad-core.cpp b/src/mad-core.cpp index b5f6999..d5693ea 100644 --- a/src/mad-core.cpp +++ b/src/mad-core.cpp @@ -23,8 +23,6 @@ #include "Common/ModuleManager.h" #include "Core/ConnectionManager.h" -#include "Common/XmlPacket.h" - #include <signal.h> using namespace Mad; diff --git a/src/mad.cpp b/src/mad.cpp index 3dfe379..eba4125 100644 --- a/src/mad.cpp +++ b/src/mad.cpp @@ -69,8 +69,8 @@ int main() { //char hostname[256]; //gethostname(hostname, sizeof(hostname)); - //Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::XmlRequest>(new Daemon::Requests::IdentifyRequest(hostname, sigc::ptr_fun(requestFinished)))); - Common::RequestManager::get()->sendRequest(connection, std::auto_ptr<Common::Request>(new Daemon::Requests::IdentifyRequest("test", sigc::ptr_fun(requestFinished)))); + //Common::RequestManager::get()->sendRequest<Daemon::Requests::IdentifyRequest>(connection, sigc::ptr_fun(requestFinished), hostname); + Common::RequestManager::get()->sendRequest<Daemon::Requests::IdentifyRequest>(connection, sigc::ptr_fun(requestFinished), "test"); while(connection->isConnected()) Net::FdManager::get()->run(); |