Remove dynamic exceptions
[anna.git] / source / comm / Message.cpp
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 #include <anna/comm/Message.hpp>
10
11 #include <anna/xml/Compiler.hpp>
12
13 using namespace anna;
14
15 comm::Message::Message() :
16   DataBlock(true),
17   a_xmlCompiler(NULL),
18   a_statusCodeBuffer(StatusCodeBuffer::None),
19   a_codeBuffer(NULL) {
20 }
21
22 // explicit
23 comm::Message::Message(const comm::Message::StatusCodeBuffer::_v statusCodeBuffer) :
24   DataBlock(true),
25   a_xmlCompiler(NULL),
26   a_statusCodeBuffer(statusCodeBuffer) {
27   if(statusCodeBuffer == StatusCodeBuffer::Reserve)
28     a_codeBuffer = new DataBlock(true);
29   else
30     a_codeBuffer = NULL;
31 }
32
33 // explicit
34 comm::Message::Message(DataBlock& codeBuffer) :
35   DataBlock(true),
36   a_xmlCompiler(NULL),
37   a_statusCodeBuffer(StatusCodeBuffer::Copy) {
38   a_codeBuffer = &codeBuffer;
39 }
40
41 /*virtual*/
42 comm::Message::~Message() {
43   if(a_statusCodeBuffer == StatusCodeBuffer::Reserve)
44     delete a_codeBuffer;
45
46   delete a_xmlCompiler;
47 }
48
49 /*
50  * (1) Si NO tiene activado el indicador de copia profunda => tenemos que ubicar la memoria; que tiene que estar disponible
51  * hasta el momento en que se invoca al método de Message::code.
52  */
53 /*virtual*/
54 comm::Message * comm::Message::setBody(const xml::Node* node)
55 noexcept(false) {
56   if(a_xmlCompiler == NULL)
57     a_xmlCompiler = new xml::Compiler;
58
59   const char* xmldoc = a_xmlCompiler->apply(node, xml::Compiler::Mode::Compact);
60   setBody(xmldoc, anna_strlen(xmldoc));
61   return this;
62 }
63
64