1 // ANNA - Anna is Not Nothingness Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // http://redmine.teslayout.com/projects/anna-suite
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
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
17 // * Neither the name of the copyright holder 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.
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.
33 // Authors: eduardo.ramos.testillano@gmail.com
34 // cisco.tierra@gmail.com
37 #ifndef anna_comm_LargeBinaryCodec_hpp
38 #define anna_comm_LargeBinaryCodec_hpp
42 #include <anna/core/DataBlock.hpp>
44 #include <anna/comm/Codec.hpp>
51 Codificador/Decodificador de objetos complejos.
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.
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.
60 \warning Esta clase no establece proteccion ante accesos concurrentes
62 class LargeBinaryCodec : public Codec {
64 typedef std::vector <DataBlock*>::iterator iterator;
65 typedef std::vector <DataBlock*>::const_iterator const_iterator;
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
76 LargeBinaryCodec(const Type type, const bool scramble = true) :
77 Codec(type, scramble),
79 attach("LargeBinaryBlock", a_dataBlock);
85 virtual ~LargeBinaryCodec() { reset(); clear(); }
88 Elimina el contenido del mensaje asociado a este objeto.
90 void clear() throw(RuntimeException) { a_dataBlock.clear(); }
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.
97 LargeBinaryCodec& operator += (const DataBlock& dataBlock) throw(RuntimeException);
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.
104 virtual void decode(const DataBlock& dataBlock) throw(RuntimeException);
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.
111 const_iterator begin() const throw() { return a_blocks.begin(); }
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.
118 const_iterator end() const throw() { return a_blocks.end(); }
121 * Devuelve el número de bloques contenidos en el mensaje.
122 * \return el número de bloques contenidos en el mensaje.
124 int size() const throw() { return a_blocks.size(); }
127 Devuelve el puntero al objeto referenciado por el iterador recibido como parametro.
129 \return el puntero al objeto referenciado por el iterador recibido como parametro.
131 static const DataBlock* data(const_iterator ii) throw() { return *ii; }
134 Devuelve el puntero al objeto referenciado por el iterador recibido como parametro.
136 \return el puntero al objeto referenciado por el iterador recibido como parametro.
138 static DataBlock* data(iterator ii) throw() { return *ii; }
141 DataBlock a_dataBlock;
142 std::vector <DataBlock*> a_blocks;
144 void reset() throw();