Remove dynamic exceptions
[anna.git] / include / anna / xml / Document.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_xml_Document_hpp
10 #define anna_xml_Document_hpp
11
12 struct _xmlDoc;
13 struct _xmlValidCtxt;
14 struct _xmlDoc;
15
16 #include <anna/core/DataBlock.hpp>
17 #include <anna/core/RuntimeException.hpp>
18
19 namespace anna {
20
21 namespace xml {
22
23 class Parser;
24 class XPath;
25 class DTD;
26 class Node;
27
28 /**
29    Clase base para manejar los documentos XML.
30
31    Ejemplo de documento XML:
32
33    \code
34
35    <xvc HeartBeat="20000">
36       <broadcast>
37          <INetAddress Address="204.152.65.15" Port="2000"/>
38          <INetAddress Address="204.152.65.47" Port="2002"/>
39       </broadcast>
40
41       <ethernet Mode="raw" VirtualAddress="1.1.1.100">
42          <Input Device="/dev/qfe" PhysicalAccessPoint="2" MAC="8:0:20:9e:ee:21"/>
43          <Output Device="/dev/qfe" PhysicalAccessPoint="2" MAC="8:0:20:9e:ee:c9"/>
44       </ethernet>
45    </xvc>
46
47    \endcode
48 */
49 class Document : anna::DataBlock {
50 public:
51   /**
52      Destructor.
53   */
54   virtual ~Document();
55
56   /**
57      Inicializa el contenido del documento XML.
58      \param content Contenido de la Documento, depedendiendo del tipo de Documento hara referencia
59      a un nombre de archivo, una URI o a una cadena.
60   */
61   void initialize(const char* content) noexcept(false);
62
63   /**
64      Inicializa el contenido del documento XML.
65      \param content Contenido del Documento XML.
66   */
67   void initialize(const DataBlock& content) noexcept(false);
68
69   /**
70    * Obtiene el conjunto de caracteres usado en el documento XML. Puede ser NULL.
71    * \return El conjunto de caracteres usado en el documento XML.
72    */
73   const char* getEncoding() const ;
74
75   /**
76    * Obtiene la versión indicada en el documento XML.Puede ser NULL.
77    * \return La versión indicada en el documento XML.
78    */
79   const char* getVersion() const ;
80
81   /**
82      Devuelve el contenido asociado al documento XML.
83      \return El contenido asociado al documento XML.
84   */
85   virtual const DataBlock& getContent() const noexcept(false) { return *this; }
86
87   /**
88      Devuelve el contenido asociado al documento XML expresado como una cadena C.
89      \return El contenido asociado al documento XML expresado como una cadena C.
90   */
91   const char* getContentAsCString() const noexcept(false);
92
93   /**
94    * Establece el conjunto de caracteres usado en el documento XML.
95    * \param encoding Literal que indica el conjunto de caracteres. Puede ser NULL.
96    */
97   void setEncoding(const char* encoding) ;
98
99   /**
100    * Establece la versión usada en el documento XML.
101    * \param encoding Literal que indica la versión. Puede ser NULL.
102    */
103   void setVersion(const char* version) ;
104
105   /**
106    * Analiza el contenido del documento XML y devuelve el nodo raíz.
107    * \return El nodo raiz del arbol XML correspondiente al resultado del analisis.
108    * \warning Este documento debe estar correctamente inicializado.
109    */
110   const xml::Node* parse() noexcept(false);
111
112   /**
113    * Analiza el documento XML recibido como parametro, y verifica que cumpla las reglas
114    * establecidas por la DTD.
115    * \param dtd DTD que debe cumplir el documento XML.
116    * \return El nodo raiz del arbol XML correspondiente al resultado del analisis.
117    * \warning Este documento debe estar correctamente inicializado.
118    */
119   const xml::Node* parse(const DTD& dtd) noexcept(false);
120
121 protected:
122   /**
123      Constructor.
124   */
125   Document();
126
127   /**
128    * Libera la memoria asociada a los componentes de este documento.
129    */
130   void clear() ;
131
132   /*
133    * Establece el contenido de este documento XML.
134    * \param content Buffer que contiene una C-String con la que inciar este documento XML.
135    */
136   void setContent(const char* content) {
137     DataBlock::clear();
138     DataBlock::append(content, anna_strlen(content) + 1);
139     a_contentIsCString = true;
140   }
141
142   /*
143    * Establece el contenido de este documento XML.
144    * \param content Buffer que apunta al contenido con la que inciar este documento XML.
145    * \param size Longitud del buffer.
146    * \warning Sólo uso interno
147    */
148   void setContent(const char* content, const int size) {
149     DataBlock::clear();
150     DataBlock::append(content, size);
151     a_contentIsCString = false;
152   }
153
154   /*
155    * Establece el contenido de este documento XML.
156    * \param content Bloque de datos del que copiar el valor para iniciar este documento XML.
157    */
158   void setContent(const DataBlock& content) {
159     DataBlock::operator= (content);
160     a_contentIsCString = false;
161   }
162
163 private:
164   _xmlDoc* a_handle;
165   std::string* a_encoding;
166   std::string* a_version;
167   bool a_contentIsCString;
168   DataBlock* a_asCString;
169   Parser* a_parser;
170
171   Document(const Document&);
172
173   virtual _xmlDoc* do_initialize(const char* content) noexcept(false) = 0;
174   virtual _xmlDoc* do_initialize(const DataBlock& content) noexcept(false) = 0;
175
176   friend class Parser;
177   friend class XPath;
178 };
179
180 }
181 }
182
183 #endif