bug in RC
[anna.git] / include / anna / comm / LargeBinaryCodec.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
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 //
7
8
9 #ifndef anna_comm_LargeBinaryCodec_hpp
10 #define anna_comm_LargeBinaryCodec_hpp
11
12 #include <vector>
13
14 #include <anna/core/DataBlock.hpp>
15
16 #include <anna/comm/Codec.hpp>
17
18 namespace anna {
19
20 namespace comm {
21
22 /**
23    Codificador/Decodificador de objetos complejos.
24
25    A diferencia de EnhancedCodec que esta pensado para seriealizar objetos con estructuras
26    tipos de datos basicos, este codec esta pensado especialmente para serializar objetos o
27    listas de objetos tan complejas como sea preciso.
28
29    El mensaje estara formado por una serie indeterminada de bloques de datos binarios, lo que
30    nos permite serializar facilmente cualquier tipo de estructura de datos.
31
32    \warning Esta clase no establece proteccion ante accesos concurrentes
33 */
34 class LargeBinaryCodec : public Codec {
35 public:
36   typedef std::vector <DataBlock*>::iterator iterator;
37   typedef std::vector <DataBlock*>::const_iterator const_iterator;
38
39   /**
40      Constructor.
41
42      @param type Tipo por el que sera conocido este tipo de mensaje.
43      @param scramble Indica si el mensaje debe ser codificado de forma que no se pueda ver el contenido
44      del mismo con una simple herramienta de monitorizacin de mensajes de red. Por defecto esta
45      activo ya que la codificacin realizada es muy simple y rapida y el tiempo empleado es casi
46      inapreciable.
47   */
48   LargeBinaryCodec(const Type type, const bool scramble = true) :
49     Codec(type, scramble),
50     a_dataBlock(true) {
51     attach("LargeBinaryBlock", a_dataBlock);
52   }
53
54   /**
55      Destructor.
56   */
57   virtual ~LargeBinaryCodec() { reset(); clear(); }
58
59   /**
60      Elimina el contenido del mensaje asociado a este objeto.
61   */
62   void clear() throw(RuntimeException) { a_dataBlock.clear(); }
63
64   /**
65      Amplia el contenido del mensaje con el contenido del bloque de memoria recibido.
66      \param dataBlock Bloque de memoria con el que vamos a ampliar el mensaje.
67      \return La referencia a este objeto.
68   */
69   LargeBinaryCodec& operator += (const DataBlock& dataBlock) throw(RuntimeException);
70
71   /**
72      Transfiene la informacin contenida en el bloque de memoria recibido hacia las variables asociadas a este mensaje interno.
73      \param dataBlock Bloque de memoria que contiene las variables codificadas.
74      Para acceder la lista de bloques que componen el mensaje recibido se deben utilizar los metodo begin y end.
75   */
76   virtual void decode(const DataBlock& dataBlock) throw(RuntimeException);
77
78   /**
79      Devuelve el iterador que apunta al comienzo de la serializacin.
80      \return El iterador que apunta al comienzo de la serializacin.
81      \warning El valor de este metodo solo sera valido despues de invocar  a decode.
82   */
83   const_iterator begin() const throw() { return a_blocks.begin(); }
84
85   /**
86      Devuelve el iterador que apunta al final de la serializacin.
87      \return El iterador que apunta al final de la serializacin.
88      \warning El valor de este metodo solo sera valido despues de invocar  a decode.
89   */
90   const_iterator end() const throw() { return a_blocks.end(); }
91
92   /**
93    * Devuelve el número de bloques contenidos en el mensaje.
94    * \return el número de bloques contenidos en el mensaje.
95    */
96   int size() const throw() { return a_blocks.size(); }
97
98   /**
99      Devuelve el puntero al objeto referenciado por el iterador recibido como parametro.
100      \param ii Iterador.
101      \return el puntero al objeto referenciado por el iterador recibido como parametro.
102   */
103   static const DataBlock* data(const_iterator ii) throw() { return *ii; }
104
105   /**
106      Devuelve el puntero al objeto referenciado por el iterador recibido como parametro.
107      \param ii Iterador.
108      \return el puntero al objeto referenciado por el iterador recibido como parametro.
109   */
110   static DataBlock* data(iterator ii) throw() { return *ii; }
111
112 private:
113   DataBlock a_dataBlock;
114   std::vector <DataBlock*> a_blocks;
115
116   void reset() throw();
117 };
118
119 }
120 }
121
122 #endif
123