First commit
[anna.git] / include / anna / comm / LargeBinaryCodec.hpp
1 // ANNA - Anna is Not 'N' Anymore
2 //
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
4 //
5 // https://bitbucket.org/testillano/anna
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 //
11 //     * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //     * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 //     * Neither the name of Google Inc. nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 // Authors: eduardo.ramos.testillano@gmail.com
34 //          cisco.tierra@gmail.com
35
36
37 #ifndef anna_comm_LargeBinaryCodec_hpp
38 #define anna_comm_LargeBinaryCodec_hpp
39
40 #include <vector>
41
42 #include <anna/core/DataBlock.hpp>
43
44 #include <anna/comm/Codec.hpp>
45
46 namespace anna {
47
48 namespace comm {
49
50 /**
51    Codificador/Decodificador de objetos complejos.
52
53    A diferencia de EnhancedCodec que esta pensado para seriealizar objetos con estructuras
54    tipos de datos basicos, este codec esta pensado especialmente para serializar objetos o
55    listas de objetos tan complejas como sea preciso.
56
57    El mensaje estara formado por una serie indeterminada de bloques de datos binarios, lo que
58    nos permite serializar facilmente cualquier tipo de estructura de datos.
59
60    \warning Esta clase no establece proteccion ante accesos concurrentes
61 */
62 class LargeBinaryCodec : public Codec {
63 public:
64   typedef std::vector <DataBlock*>::iterator iterator;
65   typedef std::vector <DataBlock*>::const_iterator const_iterator;
66
67   /**
68      Constructor.
69
70      @param type Tipo por el que sera conocido este tipo de mensaje.
71      @param scramble Indica si el mensaje debe ser codificado de forma que no se pueda ver el contenido
72      del mismo con una simple herramienta de monitorizacin de mensajes de red. Por defecto esta
73      activo ya que la codificacin realizada es muy simple y rapida y el tiempo empleado es casi
74      inapreciable.
75   */
76   LargeBinaryCodec(const Type type, const bool scramble = true) :
77     Codec(type, scramble),
78     a_dataBlock(true) {
79     attach("LargeBinaryBlock", a_dataBlock);
80   }
81
82   /**
83      Destructor.
84   */
85   virtual ~LargeBinaryCodec() { reset(); clear(); }
86
87   /**
88      Elimina el contenido del mensaje asociado a este objeto.
89   */
90   void clear() throw(RuntimeException) { a_dataBlock.clear(); }
91
92   /**
93      Amplia el contenido del mensaje con el contenido del bloque de memoria recibido.
94      \param dataBlock Bloque de memoria con el que vamos a ampliar el mensaje.
95      \return La referencia a este objeto.
96   */
97   LargeBinaryCodec& operator += (const DataBlock& dataBlock) throw(RuntimeException);
98
99   /**
100      Transfiene la informacin contenida en el bloque de memoria recibido hacia las variables asociadas a este mensaje interno.
101      \param dataBlock Bloque de memoria que contiene las variables codificadas.
102      Para acceder la lista de bloques que componen el mensaje recibido se deben utilizar los metodo begin y end.
103   */
104   virtual void decode(const DataBlock& dataBlock) throw(RuntimeException);
105
106   /**
107      Devuelve el iterador que apunta al comienzo de la serializacin.
108      \return El iterador que apunta al comienzo de la serializacin.
109      \warning El valor de este metodo solo sera valido despues de invocar  a decode.
110   */
111   const_iterator begin() const throw() { return a_blocks.begin(); }
112
113   /**
114      Devuelve el iterador que apunta al final de la serializacin.
115      \return El iterador que apunta al final de la serializacin.
116      \warning El valor de este metodo solo sera valido despues de invocar  a decode.
117   */
118   const_iterator end() const throw() { return a_blocks.end(); }
119
120   /**
121    * Devuelve el número de bloques contenidos en el mensaje.
122    * \return el número de bloques contenidos en el mensaje.
123    */
124   int size() const throw() { return a_blocks.size(); }
125
126   /**
127      Devuelve el puntero al objeto referenciado por el iterador recibido como parametro.
128      \param ii Iterador.
129      \return el puntero al objeto referenciado por el iterador recibido como parametro.
130   */
131   static const DataBlock* data(const_iterator ii) throw() { return *ii; }
132
133   /**
134      Devuelve el puntero al objeto referenciado por el iterador recibido como parametro.
135      \param ii Iterador.
136      \return el puntero al objeto referenciado por el iterador recibido como parametro.
137   */
138   static DataBlock* data(iterator ii) throw() { return *ii; }
139
140 private:
141   DataBlock a_dataBlock;
142   std::vector <DataBlock*> a_blocks;
143
144   void reset() throw();
145 };
146
147 }
148 }
149
150 #endif
151