Updated license
[anna.git] / include / anna / comm / Message.hpp
1 // ANNA - Anna is Not Nothingness 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_Message_hpp
38 #define anna_comm_Message_hpp
39
40 #include <anna/core/DataBlock.hpp>
41
42 namespace anna {
43
44 namespace xml {
45 class Compiler;
46 class Node;
47 }
48
49 namespace comm {
50
51 /**
52    Clase que modela un mensaje de red basico.
53 */
54 class Message : public DataBlock {
55 public:
56   /**
57    * Constructor
58    */
59   Message();
60
61   /**
62    * Destructor.
63    */
64   virtual ~Message();
65
66   /**
67      Devuelve la referencia al cuerpo de este mensaje.
68      \return la referencia al cuerpo de este mensaje.
69   */
70   const DataBlock& getBody() const throw() { return *this; }
71
72   /**
73      Establece el cuerpo de este mensaje.
74      \param body Bloque de memoria que contiene el mensaje.
75      \return Un puntero a la direccion de este mensaje.
76      \warning Si el contructor activa el sistema de optimizacion de renidmiento el bloque de memoria no se
77      copia, por lo que deberia estar disponible, al menos hasta que invoquemos al metodo Message::code.
78   */
79   Message * setBody(const DataBlock& body) throw(RuntimeException) { assign(body); return this; }
80
81   /**
82      Establece el cuerpo de este mensaje.
83      \param buffer Bloque de memoria que contiene el mensaje.
84      \param size Numero de bytes que contiene el mensaje.
85      \return Un puntero a la direccion de este mensaje.
86      \warning El bloque de memoria no se copia, por lo que deberia estar disponible, al menos
87      hasta que invoquemos al metodo Message::code.
88   */
89   Message * setBody(const char* buffer, const int size) throw(RuntimeException) {
90     DataBlock aux(buffer, size, false);
91     assign(aux);
92     return this;
93   }
94
95   /**
96    * Establece el cuerpo de este mensaje con el contenido del documento XML correspondiente al
97    * nodo XML recibido como parámetro.
98    * \param node Nodo XML que contiene el documento XML.
99    */
100   virtual Message * setBody(const xml::Node* node) throw(RuntimeException);
101
102   /**
103      Elimina el contenido del cuerpo de este mensaje.
104   */
105   void clearBody() throw() { clear(); }
106
107   /**
108      Codifica este mensaje, por defecto no realiza ninguna operacion y retorna
109      el contenido del cuerpo tal y con este.
110      \return El bloque de datos que contiene el mensaje codificado.
111   */
112   virtual const DataBlock& code() throw(RuntimeException) { return *this; }
113
114 protected:
115   struct StatusCodeBuffer { enum _v { None, Reserve, Copy }; };
116
117   DataBlock* a_codeBuffer;
118
119   /**
120    * constructor.
121    * \param statusCodeBuffer Indica el modo de reservar la memoria adcional que pueden necesitar las clases
122    * heredadas para realizar la codificación del mensaje.
123    */
124   explicit Message(const StatusCodeBuffer::_v statusCodeBuffer);
125
126   /**
127    * constructor.
128    * \param codeBuffer Búfer a usar como memoria adicional en caso de que la clase heredada la requiera para
129    * codificar.
130    */
131   explicit Message(DataBlock& codeBuffer);
132
133 private:
134   const StatusCodeBuffer::_v a_statusCodeBuffer;
135   xml::Compiler* a_xmlCompiler;
136
137   Message(const Message&);
138   Message& operator = (const Message&);
139 };
140
141 }
142 }
143
144 #endif
145
146