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_Codec_hpp
10 #define anna_comm_Codec_hpp
12 #include <anna/comm/CompatCodec.hpp>
22 Codificador/Decodificador compatible para transporte de datos
24 Esta clase ofrece una forma muy eficaz para codificar estructuras de datos complejas y pretende
25 sustituir los tipicos aplanadores y desaplanadores ya que permite que cualquier proceso
26 defina facilmente la forma de transferir cierta informacion sobre un bloque de memoria
29 Vamos a ver un ejemplo de uso. Primero vamos a definir la clase MensajeDemo:
33 * #include <anna.comm.Codec.h>
35 * class MensajeDemo : public Codec {
37 * static const Codec::Type type = 10;
39 * MensajeDemo () : Codec (type),
42 * attach ("Entero", a_entero);
43 * attach ("Cadena", a_cadena);
44 * attach ("Bloque datos", a_dataBlock);
48 * const int obtenerEntero () const { return a_entero; }
49 * const std::string& obtenerCadena () const { return a_cadena; }
50 * const DataBlock& obtenerDataBlock () const { return a_dataBlock; }
53 * void establecerEntero (const int entero) { a_entero = entero; }
54 * void establecerCadena (const std::string& cadena) { a_cadena = cadena; }
55 * void establecerCadena (const char* cadena) { a_cadena = cadena; }
56 * void establecerDataBlock (const DataBlock& dataBlock) { a_dataBlock = dataBlock; }
60 * std::string a_cadena;
61 * DataBlock a_dataBlock;
66 La clase que use esta clase para enviar un mensaje debe establecer los valores de cada uno de
67 los datos mediante los modificadores definidos y luego invocar al metodo #code que
68 transferiria el contenido de las variables asociadas a este mensaje a un bloque de memoria,
69 que normalmente seriausado como mensaje.
71 Por otra parte la clase que recibe el mensaje invocar�al metodo #decode que transfiere
72 el contenido del bloque de memoria a cada una de las variables asociadas al mensaje.
73 Posteriormente, podremos acceder al contenido de cada una de las variables asociadas al
74 mensaje atraves de los accesores definidos para el caso.
76 Estos codificadores nos dan la posibilidad de definir variables opcionales, de forma que
77 una determinada variable puede no ser transferida al bloque de memoria, y por tanto puede
78 no ser recibida en el otro extremo. Ver el metodo #isNull y #setNull para mas informacion.
80 \warning Esta clase no establece proteccion ante accesos concurrentes
82 class Codec : public CompatCodec {
87 @param type Tipo por el que sera conocido este tipo de mensaje.
88 @param scramble Indica si el mensaje debe ser codificado de forma que no se pueda ver el contenido
89 del mismo con una simple herramienta de monitorizacion de mensajes de red. Por defecto esta
90 activo ya que la codificacion realizada es muy simple y rapida y el tiempo empleado es casi
93 explicit Codec(const Type type, const bool scramble = true) : CompatCodec(type, scramble) {;}
96 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
97 estapensada principalmente para comunicar entre si procesos remotos
98 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
99 de ellos le da a un determinado `id'.
101 \param name Nombre logico de la variable
102 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
103 al mensaje y viceversa.
104 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
106 const Variable* attach(const char* name, std::string& value) throw(RuntimeException) { return CompatCodec::attach(name, size(), value); }
109 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
110 estapensada principalmente para comunicar entre si procesos remotos
111 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
112 de ellos le da a un determinado `id'.
114 \param name Nombre logico de la variable
115 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
116 al mensaje y viceversa.
117 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
119 const Variable* attach(const char* name, const char*& value) throw(RuntimeException) { return CompatCodec::attach(name, size(), value); }
122 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
123 estapensada principalmente para comunicar entre si procesos remotos.
124 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
125 de ellos le da a un determinado `id'.
127 \param name Nombre logico de la variable
128 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
129 al mensaje y viceversa.
130 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
132 const Variable* attach(const char* name, int& value) throw(RuntimeException) { return CompatCodec::attach(name, size(), value); }
135 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
136 estapensada principalmente para comunicar entre si procesos remotos.
137 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
138 de ellos le da a un determinado `id'.
140 \param name Nombre logico de la variable
141 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
142 al mensaje y viceversa.
143 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
145 const Variable* attach(const char* name, S64& value) throw(RuntimeException) { return CompatCodec::attach(name, size(), value); }
148 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
149 estapensada principalmente para comunicar entre si procesos remotos.
150 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
151 de ellos le da a un determinado `id'.
153 \param name Nombre logico de la variable
154 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
155 al mensaje y viceversa.
156 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
158 const Variable* attach(const char* name, bool& value) throw(RuntimeException) { return CompatCodec::attach(name, size(), value); }
161 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
162 estapensada principalmente para comunicar entre si procesos remotos.
163 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
164 de ellos le da a un determinado `id'.
166 \param name Nombre logico de la variable
167 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
168 al mensaje y viceversa. Debe tener activado el sistema de copia profunda.
169 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
171 const Variable* attach(const char* name, DataBlock& value) throw(RuntimeException) { return CompatCodec::attach(name, size(), value); }
174 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
175 estapensada principalmente para comunicar entre si procesos remotos.
176 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
177 de ellos le da a un determinado `id'.
179 \param name Nombre logico de la variable
180 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
181 al mensaje y viceversa. Debe tener activado el sistema de copia profunda.
182 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
184 const Variable* attach(const char* name, float& value) throw(RuntimeException) { return CompatCodec::attach(name, size(), value); }
187 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
188 estapensada principalmente para comunicar entre si procesos remotos.
189 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
190 de ellos le da a un determinado `id'.
192 \param name Nombre logico de la variable
193 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
194 al mensaje y viceversa. Debe tener activado el sistema de copia profunda.
195 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
197 const Variable* attach(const char* name, double& value) throw(RuntimeException) { return CompatCodec::attach(name, size(), value); }
200 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
201 estapensada principalmente para comunicar entre si procesos remotos.
202 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
203 de ellos le da a un determinado `id'.
205 \param name Nombre logico de la variable
206 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
207 al mensaje y viceversa. Debe tener activado el sistema de copia profunda.
208 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
210 const Variable* attach(const char* name, Second& value) throw(RuntimeException);
213 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
214 estapensada principalmente para comunicar entre si procesos remotos.
215 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
216 de ellos le da a un determinado `id'.
218 \param name Nombre logico de la variable
219 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
220 al mensaje y viceversa. Debe tener activado el sistema de copia profunda.
221 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
223 const Variable* attach(const char* name, Millisecond& value) throw(RuntimeException);
226 Asocia el valor recibido como parametro al dato interno identificado por `id'. Esta clase
227 estapensada principalmente para comunicar entre si procesos remotos
228 La unica restriccion que se les imponen a ambos que es compartan el significado que cada uno
229 de ellos le da a un determinado `id'.
231 \param name Nombre logico de la variable
232 @param value Rerencia a una variable de nuestro entorno usada para transferir los datos de la memoria
233 al mensaje y viceversa. Debe tener activado el sistema de copia profunda.
234 @return Un puntero que hace referencia al nuevo dato interno que ha sido creado.
236 const Variable* attach(const char* name, Microsecond& value) throw(RuntimeException);