Remove dynamic exceptions
[anna.git] / include / anna / comm / Message.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_Message_hpp
10 #define anna_comm_Message_hpp
11
12 #include <anna/core/DataBlock.hpp>
13
14 namespace anna {
15
16 namespace xml {
17 class Compiler;
18 class Node;
19 }
20
21 namespace comm {
22
23 /**
24    Clase que modela un mensaje de red basico.
25 */
26 class Message : public DataBlock {
27 public:
28   /**
29    * Constructor
30    */
31   Message();
32
33   /**
34    * Destructor.
35    */
36   virtual ~Message();
37
38   /**
39      Devuelve la referencia al cuerpo de este mensaje.
40      \return la referencia al cuerpo de este mensaje.
41   */
42   const DataBlock& getBody() const { return *this; }
43
44   /**
45      Establece el cuerpo de este mensaje.
46      \param body Bloque de memoria que contiene el mensaje.
47      \return Un puntero a la direccion de este mensaje.
48      \warning Si el contructor activa el sistema de optimizacion de renidmiento el bloque de memoria no se
49      copia, por lo que deberia estar disponible, al menos hasta que invoquemos al metodo Message::code.
50   */
51   Message * setBody(const DataBlock& body) noexcept(false) { assign(body); return this; }
52
53   /**
54      Establece el cuerpo de este mensaje.
55      \param buffer Bloque de memoria que contiene el mensaje.
56      \param size Numero de bytes que contiene el mensaje.
57      \return Un puntero a la direccion de este mensaje.
58      \warning El bloque de memoria no se copia, por lo que deberia estar disponible, al menos
59      hasta que invoquemos al metodo Message::code.
60   */
61   Message * setBody(const char* buffer, const int size) noexcept(false) {
62     DataBlock aux(buffer, size, false);
63     assign(aux);
64     return this;
65   }
66
67   /**
68    * Establece el cuerpo de este mensaje con el contenido del documento XML correspondiente al
69    * nodo XML recibido como parámetro.
70    * \param node Nodo XML que contiene el documento XML.
71    */
72   virtual Message * setBody(const xml::Node* node) noexcept(false);
73
74   /**
75      Elimina el contenido del cuerpo de este mensaje.
76   */
77   void clearBody() { clear(); }
78
79   /**
80      Codifica este mensaje, por defecto no realiza ninguna operacion y retorna
81      el contenido del cuerpo tal y con este.
82      \return El bloque de datos que contiene el mensaje codificado.
83   */
84   virtual const DataBlock& code() noexcept(false) { return *this; }
85
86 protected:
87   struct StatusCodeBuffer { enum _v { None, Reserve, Copy }; };
88
89   DataBlock* a_codeBuffer;
90
91   /**
92    * constructor.
93    * \param statusCodeBuffer Indica el modo de reservar la memoria adcional que pueden necesitar las clases
94    * heredadas para realizar la codificación del mensaje.
95    */
96   explicit Message(const StatusCodeBuffer::_v statusCodeBuffer);
97
98   /**
99    * constructor.
100    * \param codeBuffer Búfer a usar como memoria adicional en caso de que la clase heredada la requiera para
101    * codificar.
102    */
103   explicit Message(DataBlock& codeBuffer);
104
105 private:
106   const StatusCodeBuffer::_v a_statusCodeBuffer;
107   xml::Compiler* a_xmlCompiler;
108
109   Message(const Message&);
110   Message& operator = (const Message&);
111 };
112
113 }
114 }
115
116 #endif
117
118