1 // ANNA - Anna is Not 'N' Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // https://bitbucket.org/testillano/anna
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 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.
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_Message_hpp
38 #define anna_comm_Message_hpp
40 #include <anna/core/DataBlock.hpp>
52 Clase que modela un mensaje de red basico.
54 class Message : public DataBlock {
67 Devuelve la referencia al cuerpo de este mensaje.
68 \return la referencia al cuerpo de este mensaje.
70 const DataBlock& getBody() const throw() { return *this; }
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.
79 Message * setBody(const DataBlock& body) throw(RuntimeException) { assign(body); return this; }
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.
89 Message * setBody(const char* buffer, const int size) throw(RuntimeException) {
90 DataBlock aux(buffer, size, false);
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.
100 virtual Message * setBody(const xml::Node* node) throw(RuntimeException);
103 Elimina el contenido del cuerpo de este mensaje.
105 void clearBody() throw() { clear(); }
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.
112 virtual const DataBlock& code() throw(RuntimeException) { return *this; }
115 struct StatusCodeBuffer { enum _v { None, Reserve, Copy }; };
117 DataBlock* a_codeBuffer;
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.
124 explicit Message(const StatusCodeBuffer::_v statusCodeBuffer);
128 * \param codeBuffer Búfer a usar como memoria adicional en caso de que la clase heredada la requiera para
131 explicit Message(DataBlock& codeBuffer);
134 const StatusCodeBuffer::_v a_statusCodeBuffer;
135 xml::Compiler* a_xmlCompiler;
137 Message(const Message&);
138 Message& operator = (const Message&);