From: Leandro Lucarella Date: Wed, 22 Oct 2003 03:16:55 +0000 (+0000) Subject: Se empieza a implementar las modificaciones hechas en el diagrama del server. X-Git-Tag: svn_import~387 X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/commitdiff_plain/43203fc1132e402ab5751167ed64196f10f5dedf?ds=inline Se empieza a implementar las modificaciones hechas en el diagrama del server. No compila. --- diff --git a/Server/include/plaqui/server/controlserver.h b/Server/include/plaqui/server/controlserver.h index 7ad14cb..8a646c6 100644 --- a/Server/include/plaqui/server/controlserver.h +++ b/Server/include/plaqui/server/controlserver.h @@ -28,7 +28,7 @@ #ifndef PLAQUI_CONTROLSERVER_H #define PLAQUI_CONTROLSERVER_H -#include "plaqui/server/connection.h" +#include "plaqui/server/serverconnection.h" #include namespace PlaQui { @@ -36,7 +36,7 @@ namespace PlaQui { namespace Server { /// Conexión para recibir comandos de control para una planta. - class ControlServer: public Connection { + class ControlServer: public ServerConnection { protected: diff --git a/Server/include/plaqui/server/receiver.h b/Server/include/plaqui/server/receiver.h index 4bfda77..aa06544 100644 --- a/Server/include/plaqui/server/receiver.h +++ b/Server/include/plaqui/server/receiver.h @@ -28,7 +28,7 @@ #ifndef PLAQUI_RECEIVER_H #define PLAQUI_RECEIVER_H -#include "plaqui/server/connection.h" +#include "plaqui/server/serverconnection.h" #include #include @@ -37,7 +37,7 @@ namespace PlaQui { namespace Server { /// Conexión para recibir el estado de una planta. - class Receiver: public Connection { + class Receiver: public ServerConnection { public: diff --git a/Server/include/plaqui/server/runnable.h b/Server/include/plaqui/server/runnable.h index 145a231..2d34e6c 100644 --- a/Server/include/plaqui/server/runnable.h +++ b/Server/include/plaqui/server/runnable.h @@ -100,16 +100,15 @@ namespace Server { * \param attach Si es true, la función no retorna hasta que no * finalice la tearea (no recomendable). * - * \see Para saber cuando la tarea fue finalizada puede utilizar - * la señal signal_finished(). + * \note Para saber cuando la tarea fue finalizada puede utilizar + * la señal signal_finished(). */ virtual void finish(bool attach = false); /** * Obtiene la señal que avisa cuando la tarea es finalizada. * - * \see Para saber cuando la tarea fue finalizada puede utilizar - * la señal signal_finished(). + * \see finish(). */ SignalFinished& signal_finished(void); diff --git a/Server/include/plaqui/server/server.h b/Server/include/plaqui/server/server.h index 6265b6f..f16e2df 100644 --- a/Server/include/plaqui/server/server.h +++ b/Server/include/plaqui/server/server.h @@ -28,6 +28,7 @@ #ifndef PLAQUI_SERVER_H #define PLAQUI_SERVER_H +#include "plaqui/server/tcpserver.h" #include "plaqui/server/controlserver.h" #include "plaqui/server/transmitter.h" #include @@ -40,27 +41,34 @@ 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 { - private: + // Tipos. - /// Lista de conexiones de control. - typedef std::list ControllerList; + private: /// Lista de conexiones de control. typedef std::list TransmitterList; - /// Socket para escuchar conexiones. - sockinetbuf socket; + // TODO: + // typedef std::list PlantList; - /// Conexiones de control. - ControllerList controllers; + // Atributos. + + private: /// Transmisiones del estado de las plantas. TransmitterList transmissions; + // TODO: + // PlantList plants; + + // Métodos. + + private: + /** * Entra en el loop para atender conexiones. */ @@ -103,12 +111,16 @@ namespace Server { * * \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. + * \todo Ver de hacer un TransmissionManager. */ - bool stop_transmission(std::string host = "localhost", - int port = 7528); + bool stop_transmission(std::string host, int port); + + /** + * Maneja los comandos recibidos por las conexiones. + * + * \todo Hacer un tipo Command abstracto o algo así. + */ + void on_connection_command_received(void* command); }; diff --git a/Server/include/plaqui/server/tcpserver.h b/Server/include/plaqui/server/tcpserver.h new file mode 100644 index 0000000..b379844 --- /dev/null +++ b/Server/include/plaqui/server/tcpserver.h @@ -0,0 +1,111 @@ +// 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: Tue Oct 21 23:42:46 ART 2003 +// Autores: Leandro Lucarella +//---------------------------------------------------------------------------- +// +// $Id$ +// + +#ifndef PLAQUI_TCPSERVER_H +#define PLAQUI_TCPSERVER_H + +#include "plaqui/server/controlserver.h" +#include "plaqui/server/transmitter.h" +#include +#include +#include + +namespace PlaQui { + +namespace Server { + + /** + * Servidor de plantas químicas. + * Maneja muchas conexiones, de control o de transmisión. + */ + class TCPServer: public Runnable { + + // Tipos. + + private: + + /// Lista de conexiones de control. + typedef std::list ConnectionList; + + // Atributos. + + private: + + /// Socket para escuchar conexiones. + sockinetbuf socket; + + /// Conexiones de control. + ConnectionList connections; + + // Métodos. + + private: + + /** + * Entra en el loop para atender conexiones. + */ + virtual void real_run(void); + + 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) = 0; + + public: + + /** + * Destructor. + */ + virtual ~TCPServer(void) {} + + /** + * Constructor. + * + * \param port Puerto en el cual escuchar. + */ + TCPServer(int port); + + /** + * Se encarga de borrar una conexión de la lista cuando finaliza. + * + * \param connection Conexión a eliminar. + */ + void on_connection_finished(Connection* connection); + + }; + +} + +} + +#endif // PLAQUI_TCPSERVER_H diff --git a/Server/src/connection.cpp b/Server/src/connection.cpp index c97685f..18b5909 100644 --- a/Server/src/connection.cpp +++ b/Server/src/connection.cpp @@ -27,23 +27,27 @@ #include "plaqui/server/connection.h" #include +#ifdef DEBUG +# include +#endif // DEBUG -using namespace PlaQui::Server; +PlaQui::Server::Connection::~Connection(void) { +#ifdef DEBUG + std::cerr << __FILE__ << ": destructor." << std::endl; +#endif // DEBUG +} -Connection::Connection(const sockbuf::sockdesc& sd): +PlaQui::Server::Connection::Connection(const sockbuf::sockdesc& sd): socket(sd) { #ifdef DEBUG std::cerr << __FILE__ << ": sd = " << sd.sock << std::endl; #endif // DEBUG } -/* -Connection::Connection(const sockinetbuf& sb): - socket(sb) { -} -*/ - -Connection::Connection(sockbuf::type type): +PlaQui::Server::Connection::Connection(sockbuf::type type): socket(type) { +#ifdef DEBUG + std::cerr << __FILE__ << ": type = " << type << std::endl; +#endif // DEBUG } diff --git a/Server/src/controlserver.cpp b/Server/src/controlserver.cpp index 8789af1..544483f 100644 --- a/Server/src/controlserver.cpp +++ b/Server/src/controlserver.cpp @@ -29,18 +29,24 @@ #include "plaqui/server/request.h" #include #include +#ifdef DEBUG +# include +#endif // DEBUG -using namespace PlaQui::Server; +PlaQui::Server::ControlServer::~ControlServer(void) { +#ifdef DEBUG + std::cerr << __FILE__ << ": destructor." << std::endl; +#endif // DEBUG +} -ControlServer::ControlServer(const sockbuf::sockdesc& sd): +PlaQui::Server::ControlServer::ControlServer(const sockbuf::sockdesc& sd): Connection(sd) { #ifdef DEBUG - std::cerr << "Compilado el " << __DATE__ << std::endl; std::cerr << __FILE__ << ": sd = " << sd.sock << std::endl; #endif // DEBUG } -void ControlServer::real_run(void) { +void PlaQui::Server::ControlServer::real_run(void) { // FIXME se tiene que ir a la clase para poder frenarlo desde afuera. bool stop = false; char buf[BUFFER_SIZE]; @@ -78,7 +84,8 @@ void ControlServer::real_run(void) { // Si es la primera, no pasa nada, sigue esperando un request. } } - // Manda mensaje a la planta. + // TODO: Manda mensaje a la planta. + //signal_command_received().emit(request); //dispatch_command(parse_command(sstr.str())); #ifdef DEBUG std::cerr << "Request: " << std::endl;