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_Transport_hpp
10 #define anna_comm_Transport_hpp
12 #include <anna/core/RuntimeException.hpp>
13 #include <anna/core/DataBlock.hpp>
23 Clase generica para definir la capa de transporte de cualquier protocolo de comunicaciones.
25 Estructura basica que nos permite ordenar el proceso de analizar un mensaje recibido desde
26 cualquier medio. El protocolo conoce los detalles semanticos del mensaje que ha recibido,
27 es decir, conoce como interpretar cada uno de los bytes que componen el mensaje, cuando un
28 mensaje esta completo.
30 El principal problema de cualquier protocolo externo a la hora de recibir es conocer cual
31 es el tamao de un determinado mensaje.
33 Todos los metodos que se deberian reescribir en las clases heredadas se invocan desde un
34 metodo MT-safe que se encarga de evitar accesos simultaneos desde varios threads, lo cual,
35 evita que tengamos que preocuparnos por establecer secciones criticas en cada uno de los
38 \warning Los supuestos bajo los que se diseñó éste protocolo facilitan el desarrollo de
39 clases que ofrecen un gran rendimiento, pero imposibilitan el desarrollo del sistema de
40 re-sincronización en caso de que alguno de los mensajes no cumpla los supuestos.
41 Es decir, si nos llega un mensaje errneo nuestro proceso no sera capaz de volver a
42 sincronizarse nunca mas.
46 static const int MinOverQuotaSize = 512;
49 Message* a_inputMessage;
51 static Message* nullInputMessage() throw(RuntimeException);
55 Maximum number of bytes kept by each ClientSocket without identifying
56 a message for the own protocol.
59 static const int DefaultOverQuotaSize = 2048;
62 static const int DefaultOverQuotaSize = 8192;
66 Returns true if the transport layer has a timming control system activated.
68 bool enableTimeout() const throw() { return a_enableTimeout; }
71 Activates the timming control system for the ClientSocket which were created
72 through this transport layer. They will be automatically closed if no activity
73 is detected in a time interval.
74 \see Communicator::setTimeout.
76 void activateTimeout() throw() { a_enableTimeout = true; }
79 Deactivates the timming control system for the ClientSocket which were created
80 through this transport layer.
82 void deactivateTimeout() throw() { a_enableTimeout = false; }
85 // Internal use: returns associated input message
86 Message* getInputMessage() throw(RuntimeException) {
87 return (a_inputMessage == NULL) ? nullInputMessage() : a_inputMessage;
91 Returns the number of bytes reserved by this protocol for the intermediate buffer.
92 @return number of bytes reserved by this protocol for the intermediate buffer.
94 int getOverQuotaSize() const throw() { return a_overQuotaSize; }
97 Establece el numero de bytes que puede mantener este procotolo para cada uno de los
98 ClientSocket sin que se halla identificado el mensaje como propio del protocolo.
99 Si el numero de bytes guardados en la memoria intermedia sobrepasa este numero de
100 bytes se cerrara la conexion con el ClientSocket.
102 \param overQuotaSize Numero de maximo de bytes que podemos mantener en la memoria intermedia.
104 void setOverQuotaSize(const int overQuotaSize) throw() { a_overQuotaSize = (overQuotaSize >= MinOverQuotaSize) ? overQuotaSize : MinOverQuotaSize; }
107 Debe calcular el tamao previsto del mensaje actual.
109 Si se detecta una anomalia irrecuperable en el mensaje debe devolver una excepcion
110 para indicar el error.
112 @param dataBlock Bloque con la parte del mensaje disponible hasta el momento.
114 @return Si con la informacion disponible no puede establecer la longitud del
115 mensaje devolvera -1 en otro caso devolvera la longitud prevista del mensaje.
118 Si el protocolo de transporte implementado detecta problemas al calcular la
119 longitud del mensaje recibido y lanza una excepcion en este metodo el ClientSocket
120 activara los sistemas de recuperacion, si es posible.
122 virtual int calculeSize(const DataBlock& dataBlock) throw(RuntimeException) = 0;
125 Debe establecer el modo en que el protocolo va a verificar que el mensaje obtenido
126 coincide con el patrn esperado e interpretar el contenido del mensaje.
127 Este metodo slo se invoca cuando se considera que el mensaje actual esta completo.
129 Si se detecta una anomalia irrecuperable en el mensaje debe devolver una excepcion
130 para indicar el error.
132 @param message Bloque con lo que hasta el momento se considera el ltimo mensaje recibido
135 \return Un bloque de memoria que contiene el mensaje recibido codificado segn las reglas del
136 protocolo este protocolo de transporte
138 virtual const Message* decode(const DataBlock& message) throw(RuntimeException) = 0;
141 Debe establecer la forma en el protocolo va a preparar el envio a la capa de transporte.
143 @param message Bloque de datos con la codificacin obtenida mediante cualquiera de los
144 codec disponibles (Ver @ref Codec).
146 @return El bloque de memoria con el mensaje que sera enviado a la capa de transporte.
148 \warning De no indicarse ninguna otra implementacin devolvera el mensaje tal y como
151 virtual const DataBlock& code(Message& message) throw(RuntimeException) = 0;
154 Metodo que inicializa el estado de esta capa de transporte. Sera invocado automaticamente por el
157 virtual void clear() throw() { a_forCode.clear(); }
160 DataBlock a_forCode; /**< Bloque de memoria usado para guardar el contenido de la codificacion */
164 \param autoSynchronize Indica si el el protocolo instancia permite la sincronizacion automatica.
165 \param overQuotaSize Longitud maxima que puede contener el buffer intermedio antes de cerrar el socket
166 por considerar que no puede sincronizarlo.
169 a_inputMessage(NULL),
171 a_enableTimeout(false) {
172 a_overQuotaSize = DefaultOverQuotaSize;
176 Establece la instancia del mensaje asociada a este transporte.
177 \param inputMessage Instancia del mensaje a asociar.
179 void setInputMessage(Message* inputMessage) throw() { a_inputMessage = inputMessage; }
183 bool a_enableTimeout;