]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/include/plaqui/server/server.h
cambio la sintaxis XML de las compuertas
[z.facultad/75.42/plaqui.git] / Server / include / plaqui / server / server.h
index 6265b6fe757113c2ffcb7097a9e1f6a5c8f3fb71..cae6f7cc7eb2de37bf2cc567dfa93d78f4d15e0a 100644 (file)
 #ifndef PLAQUI_SERVER_H
 #define PLAQUI_SERVER_H
 
+#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 <list>
+#include <map>
 
 namespace PlaQui {
 
@@ -40,75 +44,146 @@ namespace Server {
 
        /**
         * Servidor de plantas químicas.
-        * Maneja muchas conexiones, de control o de transmisión.
+        * Maneja múltiples conexiones, de control o de transmisión.
         */
-       class Server: public Runnable {
+       class Server: public TCPServer {
+
+               /////////////////////////////////////////////////////////////////////
+               // Tipos.
 
                private:
 
-                       /// Lista de conexiones de control.
-                       typedef std::list<ControlServer*> ControllerList;
+                       /// Lista de plantas químicas.
+                       typedef std::map<std::string, Plant*> PlantList;
+
+               /////////////////////////////////////////////////////////////////////
+               // Atributos.
+
+               private:
+
+                       // Plantas disponibles en el servidor.
+                       PlantList plants;
+
+                       /// Mutex para las plantas.
+                       Glib::Mutex plants_mutex;
+
+               /////////////////////////////////////////////////////////////////////
+               // Métodos.
+
+               protected:
+
+                       /**
+                        * Obtiene una nueva \ref Connection "conexión".
+                        *
+                        * \param sd Descriptor del socket de la nueva conexión.
+                        *
+                        * \return Nueva conexión.
+                        */
+                       virtual Connection* new_connection(const sockbuf::sockdesc& sd);
+
+                       /**
+                        * Maneja el comando server/info.
+                        */
+                       Response* cmd_server_info(void) const;
+
+                       /**
+                        * Maneja el comando connection/list.
+                        */
+                       Response* cmd_connection_list(void);
+
+                       /**
+                        * Maneja el comando connection/stop.
+                        */
+                       Response* cmd_connection_stop(const Command& command);
+
+                       /**
+                        * Maneja el comando transmission/list.
+                        */
+                       Response* cmd_transmission_list(void);
+
+                       /**
+                        * Maneja el comando transmission/start.
+                        */
+                       Response* cmd_transmission_start(const Command& command);
 
-                       /// Lista de conexiones de control.
-                       typedef std::list<Transmitter*> TransmitterList;
+                       /**
+                        * Maneja el comando transmission/stop.
+                        */
+                       Response* cmd_transmission_stop(const Command& command);
+
+                       /**
+                        * Maneja el comando plant/list.
+                        */
+                       Response* cmd_plant_list(void);
+
+                       /**
+                        * Maneja el comando plant/get.
+                        */
+                       Response* cmd_plant_get(const Command& command);
+
+                       /**
+                        * Maneja el comando plant/set.
+                        */
+                       Response* cmd_plant_set(const Command& command);
 
-                       /// Socket para escuchar conexiones.
-                       sockinetbuf socket;
+                       /**
+                        * Maneja el comando plant/set_frequency.
+                        */
+                       Response* cmd_plant_set_frequency(const Command& command);
 
-                       /// Conexiones de control.
-                       ControllerList controllers;
+                       /**
+                        * Maneja el comando plant/start.
+                        */
+                       Response* cmd_plant_start(const Command& command);
 
-                       /// Transmisiones del estado de las plantas.
-                       TransmitterList transmissions;
+                       /**
+                        * Maneja el comando plant/stop.
+                        */
+                       Response* cmd_plant_stop(const Command& command);
 
                        /**
-                        * Entra en el loop para atender conexiones.
+                        * Maneja el comando plant/remove.
                         */
-                       virtual void real_run(void);
+                       Response* cmd_plant_remove(const Command& command);
 
                public:
 
                        /**
                         * Destructor.
                         */
-                       virtual ~Server(void) {}
+                       virtual ~Server(void);
 
                        /**
                         * Constructor.
                         *
                         * \param port Puerto en el cual escuchar.
                         */
-                       Server(int port = 7522);
+                       Server(const Connection::Port& port = 7522) throw(sockerr);
 
                        /**
-                        * Comienza la transimisión del estado de una planta.
-                        *
-                        * \param host Host al cual se quiere transmitir.
-                        * \param port Puerto al cual transmitir.
+                        * Agrega una planta al servidor.
                         *
-                        * \return true si se pudo empezar a transmitir, false si no.
-                        *
-                        * \todo Ver si es necesario que devuelva algo y si devuelve ver si
-                        *       no sería mejor que dé más información (si no se pudo abrir
-                        *       o si ya estaba abierto por ejemplo.
+                        * \param name     Nombre que utilizará el servidor para identificar
+                        *                 a la planta.
+                        * \param filename Nombre del archivo con la planta a cargar.
+                        * \return true si se agregó la planta, false si ya existía una
+                        *         planta con ese nombre.
                         */
-                       bool start_transmission(std::string host = "localhost",
-                                       int port = 7528);
+                       bool add_plant(const std::string& name,
+                                       const std::string& filename);
 
                        /**
-                        * Finaliza la transimisión del estado de una planta.
-                        *
-                        * \param host Host al cual se quiere dejar de transmitir.
-                        * \param port Puerto al cual dejar de transmitir.
-                        *
-                        * \return true si se pudo empezar a transmitir, false si no.
+                        * Maneja los comandos recibidos por las conexiones.
+                        */
+                       void on_control_command_received(const Command& command,
+                                       ControlServer* controlserver);
+
+                       /**
+                        * Se encarga de borrar una planta de la lista cuando finaliza.
                         *
-                        * \todo Ver si es necesario que devuelva algo y si devuelve ver si
-                        *       no sería mejor que dé más información (si no se pudo abrir
-                        *       o si ya estaba abierto por ejemplo.
+                        * \param plant Nombre de la planta a elminar.
                         */
-                       bool stop_transmission(std::string host = "localhost",
-                                       int port = 7528);
+                       void on_plant_finished(const char* plant);
 
        };