]> git.llucax.com Git - z.facultad/75.42/plaqui.git/commitdiff
- Se agrega una version basica de la respuesta XML.
authorLeandro Lucarella <llucax@gmail.com>
Fri, 28 Nov 2003 05:33:31 +0000 (05:33 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Fri, 28 Nov 2003 05:33:31 +0000 (05:33 +0000)
- 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.

14 files changed:
Client/src/principal.cpp
Server/configure.in
Server/include/plaqui/server/controlserver.h
Server/include/plaqui/server/documentacion.h
Server/include/plaqui/server/response.h [new file with mode: 0644]
Server/include/plaqui/server/server.h
Server/src/Makefile.am
Server/src/controlclient.cpp
Server/src/controlserver.cpp
Server/src/plant.cpp
Server/src/response.cpp [new file with mode: 0644]
Server/src/server.cpp
configure.in
docs/mainpage.h

index 6a085837e561b16f0909ba4910992379fb16dd2a..46ec40b3cb913471c37403fb829c9e620a916f80 100644 (file)
@@ -3,7 +3,6 @@
 #include <iostream>
 #include <sstream>
 #include <string>
-#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 <unistd.h>
+#include <glibmm/thread.h>
 
 Principal::Principal(BaseObjectType *co, const Glib::RefPtr<Gnome::Glade::Xml> &rg):Gtk::Window(co),refXml(rg)
 {
index f1a1e26d05e5e73768abe57eff4905a722b5b438..ade0191a6b1d34b32d2dca928096bfa8cc1bf684 100644 (file)
@@ -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)
index c954cb1c8eb6b14ad9c5dd6eeda2744995662210..a6d24f08608267ee8808c9ba17544d53c241f0d1 100644 (file)
@@ -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 <socket++/sockinet.h>
 #include <sigc++/signal.h>
 
@@ -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.
index f2a47090c9285f58e8600f99586b153cc3786ab9..36eddb0055f13b9821a9b40e53f9f3ba1d47c07c 100644 (file)
@@ -78,8 +78,8 @@
                <table>
                        <tr><th>Comando</th><th>Descripción</th><th>Respuesta</th></tr>
                        <tr>
-                               <td><tt>status</tt></td>
-                               <td>Obtiene estado general del servidor.</td>
+                               <td><tt>info</tt></td>
+                               <td>Obtiene información sobre el servidor.</td>
                                <td>Cantidad de plantas, conexiones, transmisiones, versión,
                                    uptime, etc.</td>
                        </tr>
diff --git a/Server/include/plaqui/server/response.h b/Server/include/plaqui/server/response.h
new file mode 100644 (file)
index 0000000..3acd2cd
--- /dev/null
@@ -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 <llucare@fi.uba.ar>
+//----------------------------------------------------------------------------
+//
+// $Id$
+//
+
+#ifndef PLAQUI_RESPONSE_H
+#define PLAQUI_RESPONSE_H
+
+#include "plaqui/server/httpresponse.h"
+#include <libxml++/libxml++.h>
+#include <string>
+
+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 
index 611ac232c54401cf6522d9c332cb853d0ee0ad1f..20458bbcd6e7693a56df4d37fb1e6264bf3a7ae5 100644 (file)
 
 #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 <socket++/sockinet.h>
 #include <string>
 #include <map>
@@ -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:
 
index 7b874b5ac10bfe0cb3ab4f257ebee969b65bec28..7238456ae68b8991ffbf45ee7449a0f97c03ba45 100644 (file)
@@ -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 \
index 130282d5a0824cd405279eba6a7ca0d7f9803611..ac8886aa966f8804c3f8450b49b1f1d38fb321c4 100644 (file)
@@ -25,7 +25,7 @@
 // $Id$
 //
 
-#include "plaqui/server/httpresponse.h"
+#include "plaqui/server/response.h"
 #include "plaqui/server/controlclient.h"
 #ifdef DEBUG
 #      include <iostream>
@@ -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;
                }
        }
index 2fd7652d4d3dfda30da0ec3972caa86e8ec1d2dd..1c253c5e012496521a03072c831a7a8936a80be6 100644 (file)
@@ -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
index de4e6c17f3b04208a606072fe2967b4c4b509625..1187c517533840a389d7db58ef29802ef7ceed4c 100644 (file)
@@ -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 (<?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 (file)
index 0000000..b39aaea
--- /dev/null
@@ -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 <llucare@fi.uba.ar>
+//----------------------------------------------------------------------------
+//
+// $Id$
+//
+
+#include "plaqui/server/response.h"
+#include "plaqui/server/string.h"
+#include <sstream>
+#ifdef DEBUG
+#      include <iostream>
+#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<HTTPResponse&>(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("<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n"
+                       "<plaqui-response code=\"") + b + "\" version=\""
+                       + resp.xml_version + "\" ";
+       if (resp.xml_description.length()) {
+               b += "description=\"" + resp.xml_description + "\" ";
+       }
+       if (resp.xml_body.length()) {
+               b += ">\n" + resp.xml_body + "\n</plaqui-response>\n";
+       } else {
+               b += "/>\n";
+       }
+       HTTPResponse r(resp);
+       r.set_body(b);
+       os << static_cast<const HTTPResponse&>(r);
+       return os;
+}
+
+} // namespace Server
+
+} // namespace PlaQui
+
index fac84190fd31f51a2b90667ccd0a93028b56b5de..ca1f763a5883513b275db1a13ba94048c45e80fe 100644 (file)
@@ -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 <sigc++/class_slot.h>
@@ -33,7 +34,6 @@
 #include <sstream>
 #include <exception>
 #ifdef DEBUG
-#      include "plaqui/server/string.h"
 #      include <iostream>
 #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 desc=\"El server se apagará en instantes...\" />");
+                       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 desc=\"Invalid command for 'server' taget!\" />");
+                       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 desc=\"Invalid command for 'connection' taget!\" />");
+                       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 desc=\"Invalid command for 'transmission' taget!\" />");
+                       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 desc=\"Invalid command for 'plant' taget!\" />");
+                       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 desc=\"Invalid taget!\" />");
+               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 << "<serverstatus>" << endl;
@@ -196,10 +201,10 @@ HTTPResponse* Server::cmd_server_status(void) const {
        xml << "\t\t<author>Ricardo Markiewicz</author>" << endl;
        xml << "\t</authors>" << endl;
        xml << "</serverstatus>" << 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<row>" << endl;
-               xml << "\t\t<cell>" << i->host << "</cell>" << endl;
-               xml << "\t\t<cell>" << i->port << "</cell>" << endl;
+               xml << "\t\t<host>" << i->host << "</host>" << endl;
+               xml << "\t\t<port>" << i->port << "</port>" << endl;
                xml << "\t</row>" << endl;
        }
        xml << "</list>" << 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,
-                               "<response desc=\"Faltan argumentos.\" />");
+               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("<response desc=\"La conexión a ") + args[0] + ":" + args[1]
-                               + " se cerrará en instantes...\" />");
+               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("<response desc=\"No existe una conexión a ") + args[0]
-                               + ":" + args[1] + "\" />");
+               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 << "<list type=\"transmission\">" << endl;
@@ -247,14 +250,14 @@ HTTPResponse* Server::cmd_transmission_list(void) {
        }
        transmissions_mutex.unlock();*/
        xml << "</list>" << 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,
-                               "<response desc=\"Faltan argumentos.\" />");
+               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("<response desc=\"No existe la planta '") + plant + "'.\" />");
-               // 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("<response desc=\"Se empieza a transmitir la planta '") + plant
-                                       + "' a " + host + ":" + String().from(port) + ".\" />");
+                       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("<response desc=\"Error al crear la transmisión a de la planta '")
-                                       + plant + "' a " + host + ":" + args[2] + ".\" />");
+                       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,
-                               "<response desc=\"Faltan argumentos.\" />");
+               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("<response desc=\"Se finaliza la transmisión de la planta '")
-                                               + i->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("<response desc=\"No se puede finalizar la transmisión a ")
-                               + host + ":" + args[1] + ".\" />");
+               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 << "<list type=\"plant\">" << endl;
        plants_mutex.lock();
        for (PlantList::const_iterator i = plants.begin();
                        i != plants.end(); i++) {
                xml << "\t<row>" << endl;
-               xml << "\t\t<cell>" << i->first << "</cell>" << endl;
+               xml << "\t\t<name>" << i->first << "</name>" << endl;
                xml << "\t</row>" << endl;
        }
        plants_mutex.unlock();
        xml << "</list>" << 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,
-                               "<response desc=\"Faltan argumentos.\" />");
+               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("<response desc=\"No existe la planta ") + plant + "\" />");
+               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,
-                               ("<response desc=\"No se pudo obtener el XML de la planta ") + plant + "\" />");
+               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,
-                               "<response desc=\"Faltan argumentos.\" />");
+               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("<response desc=\"La clave '") + key + "' es inválida.\" />");
+       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("<response desc=\"No existe la planta '") + plant + "'.\" />");
+               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("<response desc=\"No se pudo cambiar el estado del elemento '") + element + "'.\" />");
+               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("<response desc=\"Se cambió el estado del elemento '") + element + "'.\" />");
+       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,
-                               "<response desc=\"Faltan argumentos.\" />");
+               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("<response desc=\"No existe la planta ") + name + "\" />");
+               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("<response desc=\"La planta '") + name + "' fue pausada.\" />");
+       /* 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,
-                               "<response desc=\"Faltan argumentos.\" />");
+               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("<response desc=\"No existe la planta ") + name + "\" />");
+               return new Response(Response::PLANT_NOT_FOUND,
+                               string("No existe la planta '") + name + "'");
        }
        plants[name]->set_paused(false);
-       return new HTTPResponse(HTTPMessage::OK,
-                       string("<response desc=\"La planta '") + name + "' fue reanudada.\" />");
+       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,
-                               "<response desc=\"Faltan argumentos.\" />");
+               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("<response desc=\"No existe la planta ") + name + "\" />");
+               return new Response(Response::PLANT_NOT_FOUND,
+                               string("No existe la planta '") + name + "'");
        }
        plants[name]->set_paused(true);
-       return new HTTPResponse(HTTPMessage::OK,
-                       string("<response desc=\"La planta '") + name + "' fue pausada.\" />");
+       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,
-                               "<response desc=\"Faltan argumentos.\" />");
+               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("<response desc=\"No existe la planta ") + name + "\" />");
+               return new Response(Response::PLANT_NOT_FOUND,
+                               string("No existe la planta '") + name + "'");
        }
        plants[name]->finish();
-       return new HTTPResponse(HTTPMessage::OK,
-                       string("<response desc=\"La planta '") + name + "' se cerrará en instantes...\" />");
+       return new Response(Response::OK,
+                       string("La planta '") + name + "' fue será removida del servidor "
+                       "en instantes");
 }
 
 } // namespace Server
index ea53651ae9b66e8fad23794472d5183477336c63..44d05fcabba867e5c42ca6e034b3dbe9d8044cb6 100644 (file)
@@ -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 \
index 4a4b903cdd021a9892c5a15cce18f3704855d3e5..9f7eddf6186f248a362f3ab346fa6f7e41173128 100644 (file)
                  [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++/]