1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
9 #ifndef anna_comm_Handler_hpp
10 #define anna_comm_Handler_hpp
12 #include <netinet/in.h>
14 #include <anna/core/mt/Runnable.hpp>
15 #include <anna/core/util/Millisecond.hpp>
16 #include <anna/core/util/Microsecond.hpp>
31 Controlador de comunicaciones generico.
33 class Handler : public Runnable {
35 using Runnable::initialize;
37 using Runnable::setIsRunning;
40 Mascara que define el funcionamiento de los manejadores de mensajes.
42 struct Support { enum _v { None = 0, CongestionControl = 1 }; };
45 Tipo de controladores predefinidos.
49 ServerSocket, /**< Controlador para ServerSocket */
50 LocalConnection, /**< Controlador para LocalConnection */
51 RemoteConnection, /**< Controlador para RemoteConnection */
52 DatagramSocket, /**< Controlador para DatagramSocket */
53 BinderSocket, /**< Controlador para comm::BinderSocket usado para compartir direcciones IPs. */
54 Custom, /**< Controlador definido por el usuario */
55 ClientSocket /**< Controlador para un ClientSocket directo (sin uso intermedio de Server */
60 Devuelve el tipo de controlador.
61 \return el tipo de controlador.
63 Type::_v getType() const throw() { return a_type; }
66 Devuelve el descriptor de fichero asociado a este controlador.
67 \return el descriptor de fichero asociado a este controlador.
69 int getfd() const throw() { return a_fd; }
72 Devuelve \em true si el descriptor de fichero asociado a este controlador soporta
73 control de congestion o \em false en otro caso.
74 \return \em true si el descriptor de fichero asociado a este controlador soporta
75 control de congestion o \em false en otro caso.
77 bool supportCongestionControl() const throw() { return (a_support & Support::CongestionControl) != 0; }
80 Devuelve \em true si este manejador soporta control de temporizacion o \em false en otro
82 \return \em true si este manejador soporta control de temporizacion o \em false en otro
85 bool supportTimeout() const throw() { return a_timeout > 0; }
88 Operador de comparacion.
89 \param fd Descriptor de fichero con el que comparar.
90 \return \em true si el fd recibido es igual al establecido con #setfd o \em false en caso contrario.
92 bool operator == (const int fd) const throw() { return a_fd == fd; }
95 Metodo invocado por el comunicador cuando detectado actividad en el descriptor de
96 fichero asociado a este controlador.
98 virtual void apply() throw(RuntimeException) = 0;
101 Devuelve el ClientSocket asociado a este manejador de conexiones.
102 \return El ClientSocket asociado a este manejador de conexiones. Puede ser NULL.
103 \warning Uso interno. Se necesita para poder cooperar con el anna::comm::CongestionController.
105 virtual ClientSocket* getClientSocket() throw() { return NULL; }
108 Devuelve una cadena con la informacion referente a esta instancia.
109 \return una cadena con la informacion referente a esta instancia.
111 virtual std::string asString() const throw();
114 Devuelve un documento XML con la informacion referente a esta instancia.
115 \return un documento XML con la informacion referente a esta instancia.
117 virtual xml::Node* asXML(xml::Node* parent) const throw(RuntimeException);
120 Amplia la informacion XML del nodo recibido como parametro.
121 \param node Nodo XML en el que incorporar los atributos.
123 void asAttribute(xml::Node* node) const throw(RuntimeException);
127 Instancia del comunicador puede ser NULL.
129 Communicator* a_communicator;
133 \param communicator Comunicador asociado a este controlador.
134 \param type Tipo de Comunicador.
135 \param support Una combinacion de los valores de Handler::Support.
137 Handler(Communicator* communicator, const Type::_v type, const int support = Support::CongestionControl) :
138 a_communicator(communicator),
149 \param type Tipo de Comunicador.
150 \param support Una combinacion de los valores de Handler::Support.
152 Handler(const Type::_v type, const int support = Support::CongestionControl) :
153 a_communicator(NULL),
163 Establecer el descriptor de fichero asociado a este controlador.
164 \param fd Descriptor de fichero asociado a este controlador.
165 \warning La implementacion del metodo initialize debe invocar a este metodo
166 con descriptor de fichero valido.
168 void setfd(const int fd) throw() { setId(anna::functions::asText("Handler", a_fd = fd)); }
171 Establece el numero de milisegundos maximo que puede estar este manejador sin
172 recibir mensajes antes de ser cerrado por el nucleo.
173 \param timeout Numero de milisegundos maximo sin recibir mensajes.
175 void setTimeout(const Millisecond &timeout) throw() {
177 a_maxTime = functions::hardwareClock() + a_timeout;
181 En los manejadores que pueden recibir mas de una peticion en cada llamada a apply este
182 metodo debe ser invocado para saber si debe dejar de procesar mensajes.
184 bool canContinue() const throw() { return hasRequestedStop() == false; }
187 Metodo con el que podemos redefinir el comportamiento cuando recibe la notificacion de
188 que una IP ha dejado de estar disponible.
189 \param address Direccion IP que ha dejado de estar disponible.
190 \warning Se invoca automaticamente desde el comunicador.
192 virtual void breakAddress(const in_addr_t& address) throw() {;}
195 Metodo con el que podemos redefinir el comportamiento cuando recibe la notificacion de
196 que una IP esta disponible.
197 \param address Direccion IP que ha pasado a estar disponible.
198 \warning Se invoca automaticamente desde el comunicador.
200 virtual void recoverAddress(const in_addr_t& address) throw() {;}
203 * Método que se invoca periódicamente para comprobar si tenemos pendiente el cierre de la conexión
204 * con el canal asociado a este manejador, cuando el fd asociado al manejador de recibe actividad.
206 * \return \em true Si termina la conexión o \em false en otro caso.
208 virtual bool testClose() throw(RuntimeException) { return false;}
211 Metodo con el que podemos redefinir el comportamiento cuando recibe la notificacion de
212 que el componente asociado a este controlador ha dejado de estar operativo.
213 \warning Se invoca automaticamente desde el comunicador al invocar al metodo
214 \em detach correspondiente.
216 virtual void finalize() throw() {;}
219 * Metodo con el que podemos redefinir el comportamiento cuando recibe la notificacion de
220 * que el componente asociado a este controlador ha sido duplicado en un proceso hijo.
221 * \warning Exclusivamente uso interno.
223 virtual void clone() throw(RuntimeException) {;}
226 const Type::_v a_type;
229 Microsecond a_timeout;
230 Microsecond a_maxTime;
233 Handler(const Handler&);
234 void do_action() throw(RuntimeException);
235 void beat(const Microsecond& now) throw() { a_maxTime = now + a_timeout; }
236 bool isTimeout(const Microsecond& now) { return a_maxTime > 0 && a_maxTime <= now; }
238 friend class Communicator;