xref: /trunk/main/unoxml/source/dom/node.hxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef DOM_NODE_HXX
29 #define DOM_NODE_HXX
30 
31 #include <hash_map>
32 
33 #include <libxml/tree.h>
34 
35 #include <sal/types.h>
36 #include <rtl/ref.hxx>
37 #include <rtl/string.hxx>
38 #include <rtl/ustring.hxx>
39 
40 #include <cppuhelper/implbase3.hxx>
41 
42 #include <sax/fastattribs.hxx>
43 
44 #include <com/sun/star/uno/Reference.h>
45 #include <com/sun/star/uno/Sequence.h>
46 #include <com/sun/star/lang/XUnoTunnel.hpp>
47 #include <com/sun/star/xml/dom/XNode.hpp>
48 #include <com/sun/star/xml/dom/XNodeList.hpp>
49 #include <com/sun/star/xml/dom/XNamedNodeMap.hpp>
50 #include <com/sun/star/xml/dom/NodeType.hpp>
51 #include <com/sun/star/xml/dom/events/XEventTarget.hpp>
52 #include <com/sun/star/xml/dom/events/XEvent.hpp>
53 #include <com/sun/star/xml/dom/DOMException.hpp>
54 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
55 #include <com/sun/star/xml/sax/XFastDocumentHandler.hpp>
56 
57 
58 using ::rtl::OUString;
59 using ::rtl::OString;
60 using namespace sax_fastparser;
61 using namespace com::sun::star::uno;
62 using namespace com::sun::star::xml::sax;
63 using namespace com::sun::star::xml::dom;
64 using namespace com::sun::star::xml::dom::events;
65 using com::sun::star::lang::XUnoTunnel;
66 
67 
68 namespace DOM
69 {
70     struct Context
71     {
72         Context( const Reference< XFastDocumentHandler >& i_xHandler,
73                  const Reference< XFastTokenHandler >& i_xTokenHandler ) :
74             maNamespaces( 1, std::vector<Namespace>() ),
75             maNamespaceMap(101),
76             mxAttribList(new FastAttributeList(i_xTokenHandler)),
77             mxCurrentHandler(i_xHandler, UNO_QUERY_THROW),
78             mxDocHandler(i_xHandler),
79             mxTokenHandler(i_xTokenHandler)
80         {}
81 
82         struct Namespace
83         {
84             OString	    maPrefix;
85             sal_Int32	mnToken;
86             OUString	maNamespaceURL;
87 
88             const OString& getPrefix() const { return maPrefix; }
89         };
90 
91         typedef std::vector< std::vector<Namespace> > NamespaceVectorType;
92         typedef std::hash_map< OUString,
93                                sal_Int32,
94                                rtl::OUStringHash > NamespaceMapType;
95 
96         /// outer vector: xml context; inner vector: current NS
97         NamespaceVectorType                 maNamespaces;
98         NamespaceMapType                    maNamespaceMap;
99         ::rtl::Reference<FastAttributeList> mxAttribList;
100         Reference<XFastContextHandler>      mxCurrentHandler;
101         Reference<XFastDocumentHandler>     mxDocHandler;
102         Reference<XFastTokenHandler>        mxTokenHandler;
103     };
104 
105     void pushContext(Context& io_rContext);
106     void popContext(Context& io_rContext);
107 
108     sal_Int32 getTokenWithPrefix( const Context& rContext, const sal_Char* xPrefix, const sal_Char* xName );
109     sal_Int32 getToken( const Context& rContext, const sal_Char* xName );
110 
111     /// add namespaces on this node to context
112     void addNamespaces(Context& io_rContext, xmlNodePtr pNode);
113 
114     class CDocument;
115 
116     class CNode : public cppu::WeakImplHelper3< XNode, XUnoTunnel, XEventTarget >
117     {
118         friend class CDocument;
119         friend class CElement;
120         friend class CAttributesMap;
121 
122     private:
123         bool m_bUnlinked; /// node has been removed from document
124 
125     protected:
126         NodeType const m_aNodeType;
127         /// libxml node; NB: not const, because invalidate may reset it to 0!
128         xmlNodePtr m_aNodePtr;
129 
130         ::rtl::Reference< CDocument > const m_xDocument;
131         ::osl::Mutex & m_rMutex;
132 
133         // for initialization by classes derived through ImplInheritanceHelper
134         CNode(CDocument const& rDocument, ::osl::Mutex const& rMutex,
135                 NodeType const& reNodeType, xmlNodePtr const& rpNode);
136         void invalidate();
137 
138         void dispatchSubtreeModified();
139 
140     public:
141 
142         virtual ~CNode();
143 
144         static CNode * GetImplementation(::com::sun::star::uno::Reference<
145                 ::com::sun::star::uno::XInterface> const& xNode);
146 
147         xmlNodePtr GetNodePtr() { return m_aNodePtr; }
148 
149         virtual CDocument & GetOwnerDocument();
150 
151         // recursively create SAX events
152         virtual void saxify(const Reference< XDocumentHandler >& i_xHandler);
153 
154         // recursively create SAX events
155         virtual void fastSaxify( Context& io_rContext );
156 
157         // constrains child relationship between nodes based on type
158         virtual bool IsChildTypeAllowed(NodeType const nodeType);
159 
160         // ---- DOM interfaces
161 
162         /**
163         Adds the node newChild to the end of the list of children of this node.
164         */
165         virtual Reference< XNode > SAL_CALL
166             appendChild(Reference< XNode > const& xNewChild)
167             throw (RuntimeException, DOMException);
168 
169         /**
170         Returns a duplicate of this node, i.e., serves as a generic copy
171         constructor for nodes.
172         */
173         virtual Reference< XNode > SAL_CALL cloneNode(sal_Bool deep)
174             throw (RuntimeException);
175 
176         /**
177         A NamedNodeMap containing the attributes of this node
178         (if it is an Element) or null otherwise.
179         */
180         virtual Reference< XNamedNodeMap > SAL_CALL getAttributes()
181             throw (RuntimeException);
182 
183         /**
184         A NodeList that contains all children of this node.
185         */
186         virtual Reference< XNodeList > SAL_CALL getChildNodes()
187             throw (RuntimeException);
188 
189         /**
190         The first child of this node.
191         */
192         virtual Reference< XNode > SAL_CALL getFirstChild()
193             throw (RuntimeException);
194 
195         /**
196         The last child of this node.
197         */
198         virtual Reference< XNode > SAL_CALL getLastChild()
199             throw (RuntimeException);
200 
201         /**
202         Returns the local part of the qualified name of this node.
203         */
204         virtual OUString SAL_CALL getLocalName()
205             throw (RuntimeException);
206 
207         /**
208         The namespace URI of this node, or null if it is unspecified.
209         */
210         virtual OUString SAL_CALL getNamespaceURI()
211             throw (RuntimeException);
212 
213         /**
214         The node immediately following this node.
215         */
216         virtual Reference< XNode > SAL_CALL getNextSibling()
217             throw (RuntimeException);
218 
219         /**
220         The name of this node, depending on its type; see the table above.
221         -- virtual implemented by actual node types
222         */
223         virtual OUString SAL_CALL getNodeName()
224             throw (RuntimeException);
225 
226         /**
227         A code representing the type of the underlying object, as defined above.
228         */
229         virtual NodeType SAL_CALL getNodeType()
230             throw (RuntimeException);
231 
232         /**
233         The value of this node, depending on its type; see the table above.
234         -- virtual implemented by actual node types
235         */
236         virtual OUString SAL_CALL getNodeValue()
237             throw (RuntimeException);
238 
239         /**
240         The Document object associated with this node.
241         */
242         virtual Reference< XDocument > SAL_CALL getOwnerDocument()
243             throw (RuntimeException);
244 
245         /**
246         The parent of this node.
247         */
248         virtual Reference< XNode > SAL_CALL getParentNode()
249             throw (RuntimeException);
250 
251         /**
252         The namespace prefix of this node, or null if it is unspecified.
253         */
254         virtual OUString SAL_CALL getPrefix()
255             throw (RuntimeException);
256 
257         /**
258         The node immediately preceding this node.
259         */
260         virtual Reference< XNode > SAL_CALL getPreviousSibling()
261             throw (RuntimeException);
262 
263         /**
264         Returns whether this node (if it is an element) has any attributes.
265         */
266         virtual sal_Bool SAL_CALL hasAttributes()
267             throw (RuntimeException);
268 
269         /**
270         Returns whether this node has any children.
271         */
272         virtual sal_Bool SAL_CALL hasChildNodes()
273             throw (RuntimeException);
274 
275         /**
276         Inserts the node newChild before the existing child node refChild.
277         */
278         virtual Reference< XNode > SAL_CALL insertBefore(
279                 const Reference< XNode >& newChild, const Reference< XNode >& refChild)
280             throw (RuntimeException, DOMException);
281 
282         /**
283         Tests whether the DOM implementation implements a specific feature and
284         that feature is supported by this node.
285         */
286         virtual sal_Bool SAL_CALL isSupported(const OUString& feature, const OUString& ver)
287             throw (RuntimeException);
288 
289         /**
290         Puts all Text nodes in the full depth of the sub-tree underneath this
291         Node, including attribute nodes, into a "normal" form where only structure
292         (e.g., elements, comments, processing instructions, CDATA sections, and
293         entity references) separates Text nodes, i.e., there are neither adjacent
294         Text nodes nor empty Text nodes.
295         */
296         virtual void SAL_CALL normalize()
297             throw (RuntimeException);
298 
299         /**
300         Removes the child node indicated by oldChild from the list of children,
301         and returns it.
302         */
303         virtual Reference< XNode > SAL_CALL removeChild(const Reference< XNode >& oldChild)
304             throw (RuntimeException, DOMException);
305 
306         /**
307         Replaces the child node oldChild with newChild in the list of children,
308         and returns the oldChild node.
309         */
310         virtual Reference< XNode > SAL_CALL replaceChild(
311                 const Reference< XNode >& newChild, const Reference< XNode >& oldChild)
312             throw (RuntimeException, DOMException);
313 
314         /**
315         The value of this node, depending on its type; see the table above.
316         */
317         virtual void SAL_CALL setNodeValue(const OUString& nodeValue)
318             throw (RuntimeException, DOMException);
319 
320         /**
321         The namespace prefix of this node, or null if it is unspecified.
322         */
323         virtual void SAL_CALL setPrefix(const OUString& prefix)
324             throw (RuntimeException, DOMException);
325 
326 
327         // --- XEventTarget
328         virtual void SAL_CALL addEventListener(const OUString& eventType,
329             const Reference< XEventListener >& listener,
330             sal_Bool useCapture)
331             throw (RuntimeException);
332 
333         virtual void SAL_CALL removeEventListener(const OUString& eventType,
334             const Reference< XEventListener >& listener,
335             sal_Bool useCapture)
336             throw (RuntimeException);
337 
338         virtual sal_Bool SAL_CALL dispatchEvent(const Reference< XEvent >& evt)
339             throw(RuntimeException, EventException);
340 
341         // --- XUnoTunnel
342         virtual ::sal_Int64 SAL_CALL
343             getSomething(Sequence< ::sal_Int8 > const& rId)
344             throw (RuntimeException);
345     };
346 
347     /// eliminate redundant namespace declarations
348     void nscleanup(const xmlNodePtr aNode, const xmlNodePtr aParent);
349 }
350 
351 #endif
352