X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/802f79cdb0d688127b8a639cd3173d801a1466cd..0521515ee87033f2bcdce2cffcafbecc960a71a6:/Server/include/plaqui/server/server.h diff --git a/Server/include/plaqui/server/server.h b/Server/include/plaqui/server/server.h index 6265b6f..cae6f7c 100644 --- a/Server/include/plaqui/server/server.h +++ b/Server/include/plaqui/server/server.h @@ -28,11 +28,15 @@ #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 #include -#include +#include 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 ControllerList; + /// Lista de plantas químicas. + typedef std::map 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 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); };