From ffc9f02ea0544d4b1aa86e29afe12a2b4bace953 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Fri, 28 Nov 2003 05:33:31 +0000 Subject: [PATCH 1/1] - Se agrega una version basica de la respuesta XML. - Se actualizan AC y AM. - Se actualiza documentacion. - Se cambia el comando /server/status por /server/info. - Se cambia el formato de las listas XML. Known bugs: - Cuando la respuesta va vacia, me da un parse error el parseo de la respuesta. No encuentro por que. --- Client/src/principal.cpp | 2 +- Server/configure.in | 5 +- Server/include/plaqui/server/controlserver.h | 4 +- Server/include/plaqui/server/documentacion.h | 4 +- Server/include/plaqui/server/response.h | 205 ++++++++++++++++ Server/include/plaqui/server/server.h | 31 +-- Server/src/Makefile.am | 5 + Server/src/controlclient.cpp | 12 +- Server/src/controlserver.cpp | 2 +- Server/src/plant.cpp | 3 + Server/src/response.cpp | 120 ++++++++++ Server/src/server.cpp | 231 ++++++++++--------- configure.in | 1 + docs/mainpage.h | 4 + 14 files changed, 490 insertions(+), 139 deletions(-) create mode 100644 Server/include/plaqui/server/response.h create mode 100644 Server/src/response.cpp diff --git a/Client/src/principal.cpp b/Client/src/principal.cpp index 6a08583..46ec40b 100644 --- a/Client/src/principal.cpp +++ b/Client/src/principal.cpp @@ -3,7 +3,6 @@ #include #include #include -#include "plaqui/server/string.h" #include "item_codo.h" #include "item_conduct.h" #include "item_exclusa.h" @@ -15,6 +14,7 @@ #include "item_or.h" #include "item_and.h" #include +#include Principal::Principal(BaseObjectType *co, const Glib::RefPtr &rg):Gtk::Window(co),refXml(rg) { diff --git a/Server/configure.in b/Server/configure.in index f1a1e26..ade0191 100644 --- a/Server/configure.in +++ b/Server/configure.in @@ -26,7 +26,7 @@ ## AC_INIT(configure.in) -AM_INIT_AUTOMAKE(plaqui_server, 0.10) +AM_INIT_AUTOMAKE(plaqui_server, 0.11) AM_MAINTAINER_MODE AC_ISC_POSIX @@ -36,7 +36,8 @@ AC_PROG_RANLIB AC_HEADER_STDC PKG_CHECK_MODULES(PACKAGE, - libxml-2.0 \ + libxml-2.0 >= 0.15.0 \ + libxml++-1.0 >= 0.15.0 \ sigc++-1.2 \ glibmm-2.0 \ gthread-2.0) diff --git a/Server/include/plaqui/server/controlserver.h b/Server/include/plaqui/server/controlserver.h index c954cb1..a6d24f0 100644 --- a/Server/include/plaqui/server/controlserver.h +++ b/Server/include/plaqui/server/controlserver.h @@ -30,7 +30,7 @@ #include "plaqui/server/connection.h" #include "plaqui/server/command.h" -#include "plaqui/server/httpresponse.h" +#include "plaqui/server/response.h" #include #include @@ -84,7 +84,7 @@ namespace Server { /** * Envia una respuesta. */ - void send(const HTTPResponse& response); + void send(const Response& response); /** * Obtiene la señal que avisa cuando se recibió un comando. diff --git a/Server/include/plaqui/server/documentacion.h b/Server/include/plaqui/server/documentacion.h index f2a4709..36eddb0 100644 --- a/Server/include/plaqui/server/documentacion.h +++ b/Server/include/plaqui/server/documentacion.h @@ -78,8 +78,8 @@ - - + + diff --git a/Server/include/plaqui/server/response.h b/Server/include/plaqui/server/response.h new file mode 100644 index 0000000..3acd2cd --- /dev/null +++ b/Server/include/plaqui/server/response.h @@ -0,0 +1,205 @@ +// vim: set noexpandtab tabstop=4 shiftwidth=4: +//---------------------------------------------------------------------------- +// PlaQui +//---------------------------------------------------------------------------- +// This file is part of PlaQui. +// +// PlaQui 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. +// +// PlaQui 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 PlaQui; if not, write to the Free Software Foundation, Inc., 59 Temple +// Place, Suite 330, Boston, MA 02111-1307 USA +//---------------------------------------------------------------------------- +// Creado: lun nov 17 20:35:08 ART 2003 +// Autores: Leandro Lucarella +//---------------------------------------------------------------------------- +// +// $Id$ +// + +#ifndef PLAQUI_RESPONSE_H +#define PLAQUI_RESPONSE_H + +#include "plaqui/server/httpresponse.h" +#include +#include + +namespace PlaQui { + +namespace Server { + + /// Respuesta del servidor. + class Response: private HTTPResponse { + + ///////////////////////////////////////////////////////////////////// + // Tipos. + + public: + + /// Código de respuesta. + typedef enum { + OK = 0, + UNKNOWN_ERROR, + INVALID_TARGET, + INVALID_COMMAND, + ARGUMENT_MISSING, + ALLREADY_EXISTS, + CONNECTION_NOT_FOUND, + TRANSMISSION_NOT_FOUND, + PLANT_NOT_FOUND, + ELEMENT_NOT_FOUND, + ELEMENT_INPUT_NOT_FOUND, + ERROR_STARTING_TRANSMISSION, + ERROR_GETING_PLANT_XML, + ERROR_CHANGING_ELEMENT_INPUT + } Code; + + private: + + /// Parser XML. + class Parser: public xmlpp::SaxParser { + + ///////////////////////////////////////////////////////////// + // Atributos. + + private: + + /// Respuesta en la cual se dejan los datos. + Response* response; + + /// Indica si está en el nivel raíz del XML. + bool root; + + ///////////////////////////////////////////////////////////// + // Métodos. + + protected: + + //virtual void on_start_document(void); + + //virtual void on_end_document(void); + + virtual void on_start_element(const std::string& name, + const AttributeMap& attrs); + + virtual void on_end_element(const std::string& name); + + virtual void on_characters(const std::string& chars); + + //virtual void on_comment(const std::string& text); + + //virtual void on_warning(const std::string& error); + + //virtual void on_error(const std::string& error); + + //virtual void on_fatal_error(const std::string& error); + + //virtual void on_validity_error(const std::string& error); + + //virtual void on_validity_warning(const std::string& error); + + public: + + /// Destructor. + virtual ~Parser(void); + + /** + * Constructor. + * + * \param resp Respuesta en la cual dejar los datos. + */ + Parser(Response& resp); + + }; + + ///////////////////////////////////////////////////////////////////// + // Atributos. + + // FIXME private: hacer get/set y build tipo command. + + public: + + /// Version de la respuesta (del formato XML usado en la respuesta). + std::string xml_version; + + /// Código de respuesta. + Code xml_code; + + /// Descripción de la respuesta. + std::string xml_description; + + /// Cuerpo del mensaje XML. + std::string xml_body; + + ///////////////////////////////////////////////////////////////////// + // Métodos. + + public: + + /** + * Destructor. + */ + virtual ~Response(void); + + /** + * Constructor. + */ + Response(const Code& code = OK, const std::string& desc = ""); + + /** + * Constructor. + */ + Response(const std::string& body, const std::string& desc = "", + const Code& code = OK); + + /** + * Obtiene el cuerpo del mensaje. + */ + //std::string body(void) const; + + /** + * Establece el cuerpo del mensaje. + * + * \param body_ Cuerpo del mensaje. + */ + //const std::string& body(const std::string& body_); + + /** + * Obtiene el cuerpo del mensaje. + */ + //Code code(void) const; + + /** + * Establece el código de respuesta. + * + * \param _code Código de respuesta nuevo. + */ + //const Code& code(const Code& code_); + + /** + * Obtiene los datos de la respuesta HTTP desde un texto. + */ + friend std::istream& operator>>(std::istream& is, Response& resp) + /*throw(HTTPResponse::Error, std::ios::failure, sockerr)*/; + + /** + * Convierte la respuesta HTTP en texto. + */ + friend std::ostream& operator<<(std::ostream& os, + const Response& resp); + + }; + +} + +} + +#endif // PLAQUI_RESPONSE_H diff --git a/Server/include/plaqui/server/server.h b/Server/include/plaqui/server/server.h index 611ac23..20458bb 100644 --- a/Server/include/plaqui/server/server.h +++ b/Server/include/plaqui/server/server.h @@ -30,9 +30,10 @@ #include "plaqui/server/tcpserver.h" #include "plaqui/server/controlserver.h" -#include "plaqui/server/transmitter.h" +//#include "plaqui/server/transmitter.h" #include "plaqui/server/plant.h" #include "plaqui/server/command.h" +#include "plaqui/server/response.h" #include #include #include @@ -81,69 +82,69 @@ namespace Server { virtual Connection* new_connection(const sockbuf::sockdesc& sd); /** - * Maneja el comando server/status. + * Maneja el comando server/info. */ - HTTPResponse* cmd_server_status(void) const; + Response* cmd_server_info(void) const; /** * Maneja el comando connection/list. */ - HTTPResponse* cmd_connection_list(void); + Response* cmd_connection_list(void); /** * Maneja el comando connection/stop. */ - HTTPResponse* cmd_connection_stop(const Command& command); + Response* cmd_connection_stop(const Command& command); /** * Maneja el comando transmission/list. */ - HTTPResponse* cmd_transmission_list(void); + Response* cmd_transmission_list(void); /** * Maneja el comando transmission/start. */ - HTTPResponse* cmd_transmission_start(const Command& command); + Response* cmd_transmission_start(const Command& command); /** * Maneja el comando transmission/stop. */ - HTTPResponse* cmd_transmission_stop(const Command& command); + Response* cmd_transmission_stop(const Command& command); /** * Maneja el comando plant/list. */ - HTTPResponse* cmd_plant_list(void); + Response* cmd_plant_list(void); /** * Maneja el comando plant/get. */ - HTTPResponse* cmd_plant_get(const Command& command); + Response* cmd_plant_get(const Command& command); /** * Maneja el comando plant/set. */ - HTTPResponse* cmd_plant_set(const Command& command); + Response* cmd_plant_set(const Command& command); /** * Maneja el comando plant/set_frequency. */ - HTTPResponse* cmd_plant_set_frequency(const Command& command); + Response* cmd_plant_set_frequency(const Command& command); /** * Maneja el comando plant/start. */ - HTTPResponse* cmd_plant_start(const Command& command); + Response* cmd_plant_start(const Command& command); /** * Maneja el comando plant/stop. */ - HTTPResponse* cmd_plant_stop(const Command& command); + Response* cmd_plant_stop(const Command& command); /** * Maneja el comando plant/remove. */ - HTTPResponse* cmd_plant_remove(const Command& command); + Response* cmd_plant_remove(const Command& command); public: diff --git a/Server/src/Makefile.am b/Server/src/Makefile.am index 7b874b5..7238456 100644 --- a/Server/src/Makefile.am +++ b/Server/src/Makefile.am @@ -50,6 +50,8 @@ plaqui_server_SOURCES = \ httpresponse.cpp \ plant.cpp \ receiver.cpp \ + response.cpp \ + response_parser.cpp \ runnable.cpp \ server.cpp \ string.cpp \ @@ -66,6 +68,7 @@ plaqui_server_SOURCES = \ httpresponse.h \ plant.h \ receiver.h \ + response.h \ runnable.h \ server.h \ string.h \ @@ -84,6 +87,8 @@ libplaquiserver_a_SOURCES = \ httpresponse.cpp \ plant.cpp \ receiver.cpp \ + response.cpp \ + response_parser.cpp \ runnable.cpp \ server.cpp \ string.cpp \ diff --git a/Server/src/controlclient.cpp b/Server/src/controlclient.cpp index 130282d..ac8886a 100644 --- a/Server/src/controlclient.cpp +++ b/Server/src/controlclient.cpp @@ -25,7 +25,7 @@ // $Id$ // -#include "plaqui/server/httpresponse.h" +#include "plaqui/server/response.h" #include "plaqui/server/controlclient.h" #ifdef DEBUG # include @@ -72,7 +72,7 @@ void ControlClient::real_run(void) throw() { // TODO Temporal: el receiver empieza a escuchar. receiver->run(); while (!stop()) { - HTTPResponse response; + Response response; try { //Glib::Mutex::Lock lock(socket_mutex); socket >> response; @@ -94,12 +94,12 @@ void ControlClient::real_run(void) throw() { error_received(e); continue; } - switch (response.status_code) { - case HTTPMessage::OK: - ok_received(response.get_body()); + switch (response.xml_code) { + case Response::OK: + ok_received(response.xml_body); break; default: - error_received(response.status_code); + error_received(response.xml_code); break; } } diff --git a/Server/src/controlserver.cpp b/Server/src/controlserver.cpp index 2fd7652..1c253c5 100644 --- a/Server/src/controlserver.cpp +++ b/Server/src/controlserver.cpp @@ -142,7 +142,7 @@ void ControlServer::real_run(void) throw() { } } -void ControlServer::send(const HTTPResponse& response) { +void ControlServer::send(const Response& response) { //Glib::Mutex::Lock lock(socket_mutex); socket << response << flush; #ifdef DEBUG diff --git a/Server/src/plant.cpp b/Server/src/plant.cpp index de4e6c1..1187c51 100644 --- a/Server/src/plant.cpp +++ b/Server/src/plant.cpp @@ -210,6 +210,9 @@ const string Plant::get_xml(void) const { #endif // DEBUG ostringstream oss; ifstream ifs(filename.c_str()); + // XXX Saco la línea de definición de XML (), ver si esta hecho muy + // feo. + ifs.ignore(50, '\n'); // Ignora 50 caracteres o hasta un enter. ifs >> oss.rdbuf(); return oss.str(); } diff --git a/Server/src/response.cpp b/Server/src/response.cpp new file mode 100644 index 0000000..b39aaea --- /dev/null +++ b/Server/src/response.cpp @@ -0,0 +1,120 @@ +// vim: set noexpandtab tabstop=4 shiftwidth=4: +//---------------------------------------------------------------------------- +// PlaQui +//---------------------------------------------------------------------------- +// This file is part of PlaQui. +// +// PlaQui 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. +// +// PlaQui 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 PlaQui; if not, write to the Free Software Foundation, Inc., 59 Temple +// Place, Suite 330, Boston, MA 02111-1307 USA +//---------------------------------------------------------------------------- +// Creado: lun nov 17 21:02:22 ART 2003 +// Autores: Leandro Lucarella +//---------------------------------------------------------------------------- +// +// $Id$ +// + +#include "plaqui/server/response.h" +#include "plaqui/server/string.h" +#include +#ifdef DEBUG +# include +#endif // DEBUG + +using namespace std; + +namespace PlaQui { + +namespace Server { + +Response::~Response(void) { +#ifdef DEBUG + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": destructor." << endl; +#endif // DEBUG +} + +Response::Response(const Code& code, const string& desc): + xml_version("1.0"), xml_code(code), xml_description(desc) { +#ifdef DEBUG + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": constructor(code = " << code << ", desc = " << desc << ");" + << endl; +#endif // DEBUG + headers["Content-Type"] = "text/xml; charset=iso-8859-1"; + status_code = HTTPMessage::OK; +} + +Response::Response(const string& body, const string& desc, const Code& code): + xml_version("1.0"), xml_code(code), xml_description(desc), + xml_body(body) { +#ifdef DEBUG + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": constructor(body.length = " << body.length() + << ", desc = " << desc << ", code = " << code << ");" << endl; +#endif // DEBUG + headers["Content-Type"] = "text/xml; charset=iso-8859-1"; + status_code = HTTPMessage::OK; +} + +istream& operator>>(istream& is, Response& resp) + /*throw (HTTPResponse::Error, ios::failure, sockerr)*/ { +#ifdef DEBUG + cerr << __FILE__ << "(" << __LINE__ << ")" << ": operator>>()" << endl; +#endif // DEBUG + is >> static_cast(resp); + if (resp.get_body().length()) { + // TODO parseo XML del body para buscar las cosas basicas de la respuesta. + Response::Parser parser(resp); + try { + parser.parse_memory(resp.get_body()); + } catch (const xmlpp::parse_error& e) { + // TODO - ver gravedad. +#ifdef DEBUG + cerr << __FILE__ << "(" << __LINE__ << ")" + << " : operator>>() error de parseo: " << e.what() << endl; +#endif // DEBUG + } + } + return is; +} + +/// \todo TODO hacer el metodo build como en command. +ostream& operator<<(ostream& os, const Response& resp) { +#ifdef DEBUG + cerr << __FILE__ << "(" << __LINE__ << ")" << ": operator<<()" << endl; +#endif // DEBUG + String b; + b.from(resp.xml_code); + b = string("\n" + "\n"; + } else { + b += "/>\n"; + } + HTTPResponse r(resp); + r.set_body(b); + os << static_cast(r); + return os; +} + +} // namespace Server + +} // namespace PlaQui + diff --git a/Server/src/server.cpp b/Server/src/server.cpp index fac8419..ca1f763 100644 --- a/Server/src/server.cpp +++ b/Server/src/server.cpp @@ -26,6 +26,7 @@ // #include "plaqui/server/server.h" +#include "plaqui/server/string.h" #include "plaqui/server/connection.h" #include "plaqui/server/controlserver.h" #include @@ -33,7 +34,6 @@ #include #include #ifdef DEBUG -# include "plaqui/server/string.h" # include #endif // DEBUG @@ -113,14 +113,14 @@ void Server::on_control_command_received(const Command& command, << ", args = [" << String::join(command.get_args(), ", ") << "])" << endl; #endif // DEBUG - HTTPResponse* response; + Response* response; //bool stop_controlserver = false; if (command.get_target() == "server") { - if (command.get_command() == "status") { - response = cmd_server_status(); + if (command.get_command() == "info") { + response = cmd_server_info(); } else if (command.get_command() == "stop") { - response = new HTTPResponse(HTTPMessage::OK, - ""); + response = new Response(Response::OK, + "El server se cerrará en instantes"); // XXX - Sin mandar la respuesta enseguida podría ser que el server // cierre la conexión antes de mandar la respuesta. //response->headers["Content-Type"] = "text/xml; charset=iso-8859-1"; @@ -129,8 +129,9 @@ void Server::on_control_command_received(const Command& command, finish(); //return; } else { - response = new HTTPResponse(HTTPMessage::NOT_FOUND, - ""); + response = new Response(Response::INVALID_COMMAND, + command.get_command() + " es un comando inválido para " + + "el destino 'server'"); } } else if (command.get_target() == "connection") { if (command.get_command() == "list") { @@ -138,8 +139,9 @@ void Server::on_control_command_received(const Command& command, } else if (command.get_command() == "stop") { response = cmd_connection_stop(command); } else { - response = new HTTPResponse(HTTPMessage::NOT_FOUND, - ""); + response = new Response(Response::INVALID_COMMAND, + command.get_command() + " es un comando inválido para " + + "el destino 'connection'"); } } else if (command.get_target() == "transmission") { if (command.get_command() == "list") { @@ -149,8 +151,9 @@ void Server::on_control_command_received(const Command& command, } else if (command.get_command() == "stop") { response = cmd_transmission_stop(command); } else { - response = new HTTPResponse(HTTPMessage::NOT_FOUND, - ""); + response = new Response(Response::INVALID_COMMAND, + command.get_command() + " es un comando inválido para " + + "el destino 'transmission'"); } } else if (command.get_target() == "plant") { if (command.get_command() == "list") { @@ -165,16 +168,18 @@ void Server::on_control_command_received(const Command& command, response = cmd_plant_start(command); } else if (command.get_command() == "stop") { response = cmd_plant_stop(command); + } else if (command.get_command() == "remove") { + response = cmd_plant_remove(command); } else { - response = new HTTPResponse(HTTPMessage::NOT_FOUND, - ""); + response = new Response(Response::INVALID_COMMAND, + command.get_command() + " es un comando inválido para " + + "el destino 'plant'"); } } else { - response = new HTTPResponse(HTTPMessage::NOT_FOUND, - ""); + response = new Response(Response::INVALID_TARGET, command.get_target() + + " es un destino inválido"); } // FIXME - response->headers["Content-Type"] = "text/xml; charset=iso-8859-1"; //response->headers["Connection"] = "close"; controlserver->send(*response); delete response; @@ -185,7 +190,7 @@ void Server::on_control_command_received(const Command& command, //} } -HTTPResponse* Server::cmd_server_status(void) const { +Response* Server::cmd_server_info(void) const { // FIXME stringstream xml; xml << "" << endl; @@ -196,10 +201,10 @@ HTTPResponse* Server::cmd_server_status(void) const { xml << "\t\tRicardo Markiewicz" << endl; xml << "\t" << endl; xml << "" << endl; - return new HTTPResponse(HTTPMessage::OK, xml.str()); + return new Response(xml.str()); } -HTTPResponse* Server::cmd_connection_list(void) { +Response* Server::cmd_connection_list(void) { // FIXME TCPServer::ConnectionInfoList cil = get_connected(); stringstream xml; @@ -207,32 +212,30 @@ HTTPResponse* Server::cmd_connection_list(void) { for (TCPServer::ConnectionInfoList::const_iterator i = cil.begin(); i != cil.end(); i++) { xml << "\t" << endl; - xml << "\t\t" << i->host << "" << endl; - xml << "\t\t" << i->port << "" << endl; + xml << "\t\t" << i->host << "" << endl; + xml << "\t\t" << i->port << "" << endl; xml << "\t" << endl; } xml << "" << endl; - return new HTTPResponse(HTTPMessage::OK, xml.str()); + return new Response(xml.str()); } -HTTPResponse* Server::cmd_connection_stop(const Command& command) { +Response* Server::cmd_connection_stop(const Command& command) { const Command::Arguments& args = command.get_args(); Connection::Port port; if (args.size() < 2) { - return new HTTPResponse(HTTPMessage::CONFLICT, - ""); + return new Response(Response::ARGUMENT_MISSING, "Faltan argumentos " + " para el comando 'stop' del destino 'connection'"); } else if (disconnect(args[0], to(args[1], port))) { - return new HTTPResponse(HTTPMessage::OK, - string(""); + return new Response(Response::OK, string("La conexión a ") + args[0] + + ":" + args[1] + " se cerrará en instantes"); } else { - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); + return new Response(Response::CONNECTION_NOT_FOUND, + string("No existe una conexión a ") + args[0] + ":" + args[1]); } } -HTTPResponse* Server::cmd_transmission_list(void) { +Response* Server::cmd_transmission_list(void) { // FIXME stringstream xml; xml << "" << endl; @@ -247,14 +250,14 @@ HTTPResponse* Server::cmd_transmission_list(void) { } transmissions_mutex.unlock();*/ xml << "" << endl; - return new HTTPResponse(HTTPMessage::OK, xml.str()); + return new Response(xml.str()); } -HTTPResponse* Server::cmd_transmission_start(const Command& command) { +Response* Server::cmd_transmission_start(const Command& command) { const Command::Arguments& args = command.get_args(); if (args.size() < 3) { - return new HTTPResponse(HTTPMessage::CONFLICT, - ""); + return new Response(Response::ARGUMENT_MISSING, "Faltan argumentos " + " para el comando 'start' del destino 'transmission'"); } else { string plant = args[0]; string host = args[1]; @@ -262,27 +265,27 @@ HTTPResponse* Server::cmd_transmission_start(const Command& command) { Glib::Mutex::Lock lock(plants_mutex); PlantList::iterator p = plants.find(plant); if (p == plants.end()) { - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); - // TODO - agregar chequeo de que la transmision a ese host:port no - // exista para otra planta? + return new Response(Response::PLANT_NOT_FOUND, + string("No existe la planta '") + plant + "'"); + // FIXME - agregar chequeo de que la transmision a ese host:port no exista. + // que use respuesta ALLREADY_EXISTS } else if (plants[plant]->transmission_start(host, port)) { - return new HTTPResponse(HTTPMessage::OK, - string(""); + return new Response(Response::OK, + string("Se empieza a transmitir la planta '") + plant + + "' a " + host + ":" + String().from(port)); } else { - return new HTTPResponse(HTTPMessage::INTERNAL_SERVER_ERROR, - string(""); + return new Response(Response::ERROR_STARTING_TRANSMISSION, + string("Error al crear la transmisión a de la planta '") + + plant + "' a " + host + ":" + args[2]); } } } -HTTPResponse* Server::cmd_transmission_stop(const Command& command) { +Response* Server::cmd_transmission_stop(const Command& command) { const Command::Arguments& args = command.get_args(); if (args.size() < 2) { - return new HTTPResponse(HTTPMessage::CONFLICT, - ""); + return new Response(Response::ARGUMENT_MISSING, "Faltan argumentos " + " para el comando 'stop' del destino 'transmission'"); } else { const string& host = args[0]; Connection::Port port = to(args[1], port); @@ -291,73 +294,74 @@ HTTPResponse* Server::cmd_transmission_stop(const Command& command) { // tirar error de que no hay conexion o de que no se pudo // desconectar. if (i->second->transmission_stop(host, port)) { - return new HTTPResponse(HTTPMessage::OK, - string("first + "' a " + host + ":" + args[1] + ".\" />"); + return new Response(Response::OK, + string("La transmisión de la planta '") + i->first + + "' a " + host + ":" + args[1] + + " se cerrará en instantes"); } } - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); + return new Response(Response::TRANSMISSION_NOT_FOUND, + string("No existe una transmisión a ") + host + ":" + args[1]); } } -HTTPResponse* Server::cmd_plant_list(void) { - // FIXME +Response* Server::cmd_plant_list(void) { + // FIXME hacer con ResponseList stringstream xml; xml << "" << endl; plants_mutex.lock(); for (PlantList::const_iterator i = plants.begin(); i != plants.end(); i++) { xml << "\t" << endl; - xml << "\t\t" << i->first << "" << endl; + xml << "\t\t" << i->first << "" << endl; xml << "\t" << endl; } plants_mutex.unlock(); xml << "" << endl; - return new HTTPResponse(HTTPMessage::OK, xml.str()); + return new Response(xml.str()); } -HTTPResponse* Server::cmd_plant_get(const Command& command) { +Response* Server::cmd_plant_get(const Command& command) { if (!command.get_args().size()) { - return new HTTPResponse(HTTPMessage::CONFLICT, - ""); + return new Response(Response::ARGUMENT_MISSING, "Faltan argumentos " + " para el comando 'get' del destino 'plant'"); } Glib::Mutex::Lock lock(plants_mutex); string plant = command.get_args()[0]; if (plants.find(plant) == plants.end()) { - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); + return new Response(Response::PLANT_NOT_FOUND, + string("No existe la planta '") + plant + "'"); } // TODO try/catch? string xml = plants[plant]->get_xml(); if (xml.length()) { - return new HTTPResponse(HTTPMessage::OK, xml); + return new Response(xml); } else { - return new HTTPResponse(HTTPMessage::INTERNAL_SERVER_ERROR, - (""); + return new Response(Response::ERROR_GETING_PLANT_XML, + ("No se pudo obtener el XML de la planta '") + plant + "'"); } } -HTTPResponse* Server::cmd_plant_set(const Command& command) { +Response* Server::cmd_plant_set(const Command& command) { const Command::Arguments& args = command.get_args(); if (args.size() < 4) { - return new HTTPResponse(HTTPMessage::CONFLICT, - ""); + return new Response(Response::ARGUMENT_MISSING, "Faltan argumentos " + " para el comando 'set' del destino 'plant'"); } string plant = args[0]; string element = args[1]; - string key = args[2]; - if (key != "open") { - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); + string input = args[2]; + if (input != "open") { + return new Response(Response::ELEMENT_INPUT_NOT_FOUND, + string("El elemento '") + element + "' de la planta '" + plant + + "' no tiene una entrada '" + input + "'"); } string value = args[3]; Glib::Mutex::Lock lock(plants_mutex); PlantList::iterator p = plants.find(plant); if (p == plants.end()) { - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); + return new Response(Response::PLANT_NOT_FOUND, + string("No existe la planta '") + plant + "'"); } bool open = true; if ((value == "false") || (value == "0") || (value == "off") @@ -365,77 +369,84 @@ HTTPResponse* Server::cmd_plant_set(const Command& command) { open = false; } if (!plants[plant]->set_open(element, open)) { - return new HTTPResponse(HTTPMessage::CONFLICT, - string(""); + return new Response(Response::ERROR_CHANGING_ELEMENT_INPUT, + string("No se pudo cambiar la entrada '") + input + + "' del elemento '" + element + "' de la planta '" + + plant + "'"); } - return new HTTPResponse(HTTPMessage::OK, - string(""); + return new Response(Response::OK, + string("Se cambió la entrada '") + input + "' del elemento '" + + element + "' de la planta '" + plant + "' a '" + value + "'"); } -HTTPResponse* Server::cmd_plant_set_frequency(const Command& command) { +Response* Server::cmd_plant_set_frequency(const Command& command) { if (command.get_args().size() < 2) { - return new HTTPResponse(HTTPMessage::CONFLICT, - ""); + return new Response(Response::ARGUMENT_MISSING, "Faltan argumentos " + " para el comando 'set_frequency' del destino 'plant'"); } Glib::Mutex::Lock lock(plants_mutex); const string name = command.get_args()[0]; if (plants.find(name) == plants.end()) { - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); + return new Response(Response::PLANT_NOT_FOUND, + string("No existe la planta '") + name + "'"); } unsigned hz; to(command.get_args()[1], hz); - plants[name]->set_frequency(hz); - return new HTTPResponse(HTTPMessage::OK, - string(""); + /* TODO poner cantidad real que tomó: hz = */plants[name]->set_frequency(hz); + String shz; + shz.from(hz); + return new Response(Response::OK, + string("Se cambió la frecuencia de refresco de la planta '") + name + + "' a '" + shz + "' veces por segundo"); } -HTTPResponse* Server::cmd_plant_start(const Command& command) { +Response* Server::cmd_plant_start(const Command& command) { if (!command.get_args().size()) { - return new HTTPResponse(HTTPMessage::CONFLICT, - ""); + return new Response(Response::ARGUMENT_MISSING, "Faltan argumentos " + " para el comando 'start' del destino 'plant'"); } Glib::Mutex::Lock lock(plants_mutex); const string name = command.get_args()[0]; if (plants.find(name) == plants.end()) { - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); + return new Response(Response::PLANT_NOT_FOUND, + string("No existe la planta '") + name + "'"); } plants[name]->set_paused(false); - return new HTTPResponse(HTTPMessage::OK, - string(""); + return new Response(Response::OK, + string("La planta '") + name + "' fue reanudada"); } -HTTPResponse* Server::cmd_plant_stop(const Command& command) { +Response* Server::cmd_plant_stop(const Command& command) { if (!command.get_args().size()) { - return new HTTPResponse(HTTPMessage::CONFLICT, - ""); + return new Response(Response::ARGUMENT_MISSING, "Faltan argumentos " + " para el comando 'stop' del destino 'plant'"); } Glib::Mutex::Lock lock(plants_mutex); const string name = command.get_args()[0]; if (plants.find(name) == plants.end()) { - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); + return new Response(Response::PLANT_NOT_FOUND, + string("No existe la planta '") + name + "'"); } plants[name]->set_paused(true); - return new HTTPResponse(HTTPMessage::OK, - string(""); + return new Response(Response::OK, + string("La planta '") + name + "' fue pausada"); } -HTTPResponse* Server::cmd_plant_remove(const Command& command) { +Response* Server::cmd_plant_remove(const Command& command) { if (!command.get_args().size()) { - return new HTTPResponse(HTTPMessage::CONFLICT, - ""); + return new Response(Response::ARGUMENT_MISSING, "Faltan argumentos " + " para el comando 'remove' del destino 'plant'"); } Glib::Mutex::Lock lock(plants_mutex); const string name = command.get_args()[0]; if (plants.find(name) == plants.end()) { - return new HTTPResponse(HTTPMessage::NOT_FOUND, - string(""); + return new Response(Response::PLANT_NOT_FOUND, + string("No existe la planta '") + name + "'"); } plants[name]->finish(); - return new HTTPResponse(HTTPMessage::OK, - string(""); + return new Response(Response::OK, + string("La planta '") + name + "' fue será removida del servidor " + "en instantes"); } } // namespace Server diff --git a/configure.in b/configure.in index ea53651..44d05fc 100644 --- a/configure.in +++ b/configure.in @@ -38,6 +38,7 @@ AC_HEADER_STDC ## pkg_modules="libgnomeui-2.0" PKG_CHECK_MODULES(PACKAGE, libxml-2.0 >= 0.15.0 \ + libxml++-1.0 >= 0.15.0 \ gthread-2.0 \ sigc++-1.2 \ gtkmm-2.0 >= 2.0.0 \ diff --git a/docs/mainpage.h b/docs/mainpage.h index 4a4b903..9f7eddf 100644 --- a/docs/mainpage.h +++ b/docs/mainpage.h @@ -31,6 +31,10 @@ [http://www.gtkmm.org/] - sigc++ ( >= 1.2.5): Sistema de señales para C++ [http://libsigc.sourceforge.net/] + - libxml2 ( >= 0.15.0): Parser de XML. + [http://xmlsoft.org/] + - libxm++ ( >= 0.15.0): Wrapper de libxml2 para C++. + [http://libxmlplusplus.sourceforge.net/] - socket++ ( >= 1.12.10): Wrapper de socket portables en C++ streams [http://members.aon.at/hstraub/linux/socket++/] -- 2.43.0
ComandoDescripciónRespuesta
statusObtiene estado general del servidor.infoObtiene información sobre el servidor. Cantidad de plantas, conexiones, transmisiones, versión, uptime, etc.