xref: /trunk/main/xmlsecurity/source/xmlsec/xmldocumentwrapper_xmlsecimpl.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_xmlsecurity.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "xmldocumentwrapper_xmlsecimpl.hxx"
32*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #include <xmloff/attrlist.hxx>
35*cdf0e10cSrcweir #include "xmlelementwrapper_xmlsecimpl.hxx"
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir //#include <malloc.h>
38*cdf0e10cSrcweir #include <stdio.h>
39*cdf0e10cSrcweir #include <stdlib.h>
40*cdf0e10cSrcweir #include <string.h>
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir /*
43*cdf0e10cSrcweir  * Deleted by AF
44*cdf0e10cSrcweir #include <memory.h>
45*cdf0e10cSrcweir  */
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #include <sys/types.h>
48*cdf0e10cSrcweir #include <sys/stat.h>
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir #ifndef INCLUDED_VECTOR
51*cdf0e10cSrcweir #include <vector>
52*cdf0e10cSrcweir #define INCLUDED_VECTOR
53*cdf0e10cSrcweir #endif
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir #ifdef UNX
56*cdf0e10cSrcweir #define stricmp strcasecmp
57*cdf0e10cSrcweir #endif
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir namespace cssu = com::sun::star::uno;
60*cdf0e10cSrcweir namespace cssl = com::sun::star::lang;
61*cdf0e10cSrcweir namespace cssxc = com::sun::star::xml::crypto;
62*cdf0e10cSrcweir namespace cssxcsax = com::sun::star::xml::csax;
63*cdf0e10cSrcweir namespace cssxs = com::sun::star::xml::sax;
64*cdf0e10cSrcweir namespace cssxw = com::sun::star::xml::wrapper;
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir #define SERVICE_NAME "com.sun.star.xml.wrapper.XMLDocumentWrapper"
67*cdf0e10cSrcweir #define IMPLEMENTATION_NAME "com.sun.star.xml.security.bridge.xmlsec.XMLDocumentWrapper_XmlSecImpl"
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir #define STRXMLNS "xmlns"
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir #define RTL_ASCII_USTRINGPARAM( asciiStr ) asciiStr, strlen( asciiStr ), RTL_TEXTENCODING_ASCII_US
72*cdf0e10cSrcweir #define RTL_UTF8_USTRINGPARAM( asciiStr ) asciiStr, strlen( asciiStr ), RTL_TEXTENCODING_UTF8
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir /* used by the recursiveDelete method */
75*cdf0e10cSrcweir #define NODE_REMOVED    0
76*cdf0e10cSrcweir #define NODE_NOTREMOVED 1
77*cdf0e10cSrcweir #define NODE_STOPED     2
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir XMLDocumentWrapper_XmlSecImpl::XMLDocumentWrapper_XmlSecImpl( )
80*cdf0e10cSrcweir {
81*cdf0e10cSrcweir     saxHelper.startDocument();
82*cdf0e10cSrcweir     m_pDocument = saxHelper.getDocument();
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir     /*
85*cdf0e10cSrcweir      * creates the virtual root element
86*cdf0e10cSrcweir      */
87*cdf0e10cSrcweir     saxHelper.startElement(rtl::OUString(RTL_UTF8_USTRINGPARAM( "root" )), cssu::Sequence<cssxcsax::XMLAttribute>());
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir     m_pRootElement = saxHelper.getCurrentNode();
90*cdf0e10cSrcweir     m_pCurrentElement = m_pRootElement;
91*cdf0e10cSrcweir }
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir XMLDocumentWrapper_XmlSecImpl::~XMLDocumentWrapper_XmlSecImpl()
94*cdf0e10cSrcweir {
95*cdf0e10cSrcweir     saxHelper.endDocument();
96*cdf0e10cSrcweir     xmlFreeDoc(m_pDocument);
97*cdf0e10cSrcweir }
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir void XMLDocumentWrapper_XmlSecImpl::getNextSAXEvent()
100*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/getNextSAXEvent *************************
101*cdf0e10cSrcweir  *
102*cdf0e10cSrcweir  *   NAME
103*cdf0e10cSrcweir  *  getNextSAXEvent -- Prepares the next SAX event to be manipulate
104*cdf0e10cSrcweir  *
105*cdf0e10cSrcweir  *   SYNOPSIS
106*cdf0e10cSrcweir  *  getNextSAXEvent();
107*cdf0e10cSrcweir  *
108*cdf0e10cSrcweir  *   FUNCTION
109*cdf0e10cSrcweir  *  When converting the document into SAX events, this method is used to
110*cdf0e10cSrcweir  *  decide the next SAX event to be generated.
111*cdf0e10cSrcweir  *  Two member variables are checked to make the decision, the
112*cdf0e10cSrcweir  *  m_pCurrentElement and the m_nCurrentPosition.
113*cdf0e10cSrcweir  *  The m_pCurrentElement represents the node which have been covered, and
114*cdf0e10cSrcweir  *  the m_nCurrentPosition represents the event which have been sent.
115*cdf0e10cSrcweir  *  For example, suppose that the m_pCurrentElement
116*cdf0e10cSrcweir  *  points to element A, and the m_nCurrentPosition equals to
117*cdf0e10cSrcweir  *  NODEPOSITION_STARTELEMENT, then the next SAX event should be the
118*cdf0e10cSrcweir  *  endElement for element A if A has no child, or startElement for the
119*cdf0e10cSrcweir  *  first child element of element A otherwise.
120*cdf0e10cSrcweir  *  The m_nCurrentPosition can be one of following values:
121*cdf0e10cSrcweir  *  NODEPOSITION_STARTELEMENT for startElement;
122*cdf0e10cSrcweir  *  NODEPOSITION_ENDELEMENT for endElement;
123*cdf0e10cSrcweir  *  NODEPOSITION_NORMAL for other SAX events;
124*cdf0e10cSrcweir  *
125*cdf0e10cSrcweir  *   INPUTS
126*cdf0e10cSrcweir  *  empty
127*cdf0e10cSrcweir  *
128*cdf0e10cSrcweir  *   RESULT
129*cdf0e10cSrcweir  *  empty
130*cdf0e10cSrcweir  *
131*cdf0e10cSrcweir  *   HISTORY
132*cdf0e10cSrcweir  *  05.01.2004 -    implemented
133*cdf0e10cSrcweir  *
134*cdf0e10cSrcweir  *   AUTHOR
135*cdf0e10cSrcweir  *  Michael Mi
136*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
137*cdf0e10cSrcweir  ******************************************************************************/
138*cdf0e10cSrcweir {
139*cdf0e10cSrcweir     OSL_ASSERT( m_pCurrentElement != NULL );
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir         /*
142*cdf0e10cSrcweir          * Get the next event through tree order.
143*cdf0e10cSrcweir          *
144*cdf0e10cSrcweir          * if the current event is a startElement, then the next
145*cdf0e10cSrcweir          * event depends on whether or not the current node has
146*cdf0e10cSrcweir          * children.
147*cdf0e10cSrcweir          */
148*cdf0e10cSrcweir     if (m_nCurrentPosition == NODEPOSITION_STARTELEMENT)
149*cdf0e10cSrcweir     {
150*cdf0e10cSrcweir             /*
151*cdf0e10cSrcweir              * If the current node has children, then its first child
152*cdf0e10cSrcweir              * should be next current node, and the next event will be
153*cdf0e10cSrcweir              * startElement or charaters(PI) based on that child's node
154*cdf0e10cSrcweir              * type. Otherwise, the endElement of current node is the
155*cdf0e10cSrcweir              * next event.
156*cdf0e10cSrcweir              */
157*cdf0e10cSrcweir         if (m_pCurrentElement->children != NULL)
158*cdf0e10cSrcweir         {
159*cdf0e10cSrcweir             m_pCurrentElement = m_pCurrentElement->children;
160*cdf0e10cSrcweir             m_nCurrentPosition
161*cdf0e10cSrcweir                 = (m_pCurrentElement->type == XML_ELEMENT_NODE)?
162*cdf0e10cSrcweir                     NODEPOSITION_STARTELEMENT:NODEPOSITION_NORMAL;
163*cdf0e10cSrcweir         }
164*cdf0e10cSrcweir         else
165*cdf0e10cSrcweir         {
166*cdf0e10cSrcweir             m_nCurrentPosition = NODEPOSITION_ENDELEMENT;
167*cdf0e10cSrcweir         }
168*cdf0e10cSrcweir     }
169*cdf0e10cSrcweir         /*
170*cdf0e10cSrcweir          * if the current event is a not startElement, then the next
171*cdf0e10cSrcweir          * event depends on whether or not the current node has
172*cdf0e10cSrcweir          * following sibling.
173*cdf0e10cSrcweir          */
174*cdf0e10cSrcweir     else if (m_nCurrentPosition == NODEPOSITION_ENDELEMENT || m_nCurrentPosition == NODEPOSITION_NORMAL)
175*cdf0e10cSrcweir     {
176*cdf0e10cSrcweir         xmlNodePtr pNextSibling = m_pCurrentElement->next;
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir             /*
179*cdf0e10cSrcweir              * If the current node has following sibling, that sibling
180*cdf0e10cSrcweir              * should be next current node, and the next event will be
181*cdf0e10cSrcweir              * startElement or charaters(PI) based on that sibling's node
182*cdf0e10cSrcweir              * type. Otherwise, the endElement of current node's parent
183*cdf0e10cSrcweir              * becomes the next event.
184*cdf0e10cSrcweir              */
185*cdf0e10cSrcweir         if (pNextSibling != NULL)
186*cdf0e10cSrcweir         {
187*cdf0e10cSrcweir             m_pCurrentElement = pNextSibling;
188*cdf0e10cSrcweir             m_nCurrentPosition
189*cdf0e10cSrcweir                 = (m_pCurrentElement->type == XML_ELEMENT_NODE)?
190*cdf0e10cSrcweir                     NODEPOSITION_STARTELEMENT:NODEPOSITION_NORMAL;
191*cdf0e10cSrcweir         }
192*cdf0e10cSrcweir         else
193*cdf0e10cSrcweir         {
194*cdf0e10cSrcweir             m_pCurrentElement = m_pCurrentElement->parent;
195*cdf0e10cSrcweir             m_nCurrentPosition = NODEPOSITION_ENDELEMENT;
196*cdf0e10cSrcweir         }
197*cdf0e10cSrcweir     }
198*cdf0e10cSrcweir }
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir void XMLDocumentWrapper_XmlSecImpl::sendStartElement(
201*cdf0e10cSrcweir     const cssu::Reference< cssxs::XDocumentHandler >& xHandler,
202*cdf0e10cSrcweir     const cssu::Reference< cssxs::XDocumentHandler >& xHandler2,
203*cdf0e10cSrcweir     const xmlNodePtr pNode) const
204*cdf0e10cSrcweir     throw (cssxs::SAXException)
205*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/sendStartElement ************************
206*cdf0e10cSrcweir  *
207*cdf0e10cSrcweir  *   NAME
208*cdf0e10cSrcweir  *  sendStartElement -- Constructs a startElement SAX event
209*cdf0e10cSrcweir  *
210*cdf0e10cSrcweir  *   SYNOPSIS
211*cdf0e10cSrcweir  *  sendStartElement(xHandler, xHandler2, pNode);
212*cdf0e10cSrcweir  *
213*cdf0e10cSrcweir  *   FUNCTION
214*cdf0e10cSrcweir  *  Used when converting the document into SAX event stream.
215*cdf0e10cSrcweir  *  This method constructs a startElement SAX event for a particular
216*cdf0e10cSrcweir  *  element, then calls the startElement methods of the XDocumentHandlers.
217*cdf0e10cSrcweir  *
218*cdf0e10cSrcweir  *   INPUTS
219*cdf0e10cSrcweir  *  xHandler -  the first XDocumentHandler interface to receive the
220*cdf0e10cSrcweir  *          startElement SAX event. It can be NULL.
221*cdf0e10cSrcweir  *  xHandler2 - the second XDocumentHandler interface to receive the
222*cdf0e10cSrcweir  *          startElement SAX event. It can't be NULL.
223*cdf0e10cSrcweir  *  pNode -     the node on which the startElement should be generated.
224*cdf0e10cSrcweir  *          This node must be a element type.
225*cdf0e10cSrcweir  *
226*cdf0e10cSrcweir  *   RESULT
227*cdf0e10cSrcweir  *  empty
228*cdf0e10cSrcweir  *
229*cdf0e10cSrcweir  *   HISTORY
230*cdf0e10cSrcweir  *  05.01.2004 -    implemented
231*cdf0e10cSrcweir  *
232*cdf0e10cSrcweir  *   AUTHOR
233*cdf0e10cSrcweir  *  Michael Mi
234*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
235*cdf0e10cSrcweir  ******************************************************************************/
236*cdf0e10cSrcweir {
237*cdf0e10cSrcweir     SvXMLAttributeList* pAttributeList = new SvXMLAttributeList();
238*cdf0e10cSrcweir     cssu::Reference < cssxs::XAttributeList > xAttrList = cssu::Reference< cssxs::XAttributeList > (pAttributeList);
239*cdf0e10cSrcweir 
240*cdf0e10cSrcweir     xmlNsPtr pNsDef = pNode->nsDef;
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir     while (pNsDef != NULL)
243*cdf0e10cSrcweir     {
244*cdf0e10cSrcweir         const xmlChar* pNsPrefix = pNsDef->prefix;
245*cdf0e10cSrcweir         const xmlChar* pNsHref = pNsDef->href;
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir         if (pNsDef->prefix == NULL)
248*cdf0e10cSrcweir         {
249*cdf0e10cSrcweir             pAttributeList->AddAttribute(
250*cdf0e10cSrcweir                 rtl::OUString(RTL_UTF8_USTRINGPARAM( STRXMLNS )),
251*cdf0e10cSrcweir                 rtl::OUString(RTL_UTF8_USTRINGPARAM( (sal_Char*)pNsHref )));
252*cdf0e10cSrcweir         }
253*cdf0e10cSrcweir         else
254*cdf0e10cSrcweir         {
255*cdf0e10cSrcweir             pAttributeList->AddAttribute(
256*cdf0e10cSrcweir                 rtl::OUString(RTL_UTF8_USTRINGPARAM( STRXMLNS ))
257*cdf0e10cSrcweir                 +rtl::OUString(RTL_UTF8_USTRINGPARAM( ":" ))
258*cdf0e10cSrcweir                 +rtl::OUString(RTL_UTF8_USTRINGPARAM( (sal_Char*)pNsPrefix )),
259*cdf0e10cSrcweir                 rtl::OUString(RTL_UTF8_USTRINGPARAM( (sal_Char*)pNsHref )));
260*cdf0e10cSrcweir         }
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir         pNsDef = pNsDef->next;
263*cdf0e10cSrcweir     }
264*cdf0e10cSrcweir 
265*cdf0e10cSrcweir     xmlAttrPtr pAttr = pNode->properties;
266*cdf0e10cSrcweir 
267*cdf0e10cSrcweir     while (pAttr != NULL)
268*cdf0e10cSrcweir     {
269*cdf0e10cSrcweir         const xmlChar* pAttrName = pAttr->name;
270*cdf0e10cSrcweir         xmlNsPtr pAttrNs = pAttr->ns;
271*cdf0e10cSrcweir 
272*cdf0e10cSrcweir         rtl::OUString ouAttrName;
273*cdf0e10cSrcweir         if (pAttrNs == NULL)
274*cdf0e10cSrcweir         {
275*cdf0e10cSrcweir             ouAttrName = rtl::OUString(RTL_UTF8_USTRINGPARAM( (sal_Char*)pAttrName ));
276*cdf0e10cSrcweir         }
277*cdf0e10cSrcweir         else
278*cdf0e10cSrcweir         {
279*cdf0e10cSrcweir             ouAttrName = rtl::OUString(RTL_UTF8_USTRINGPARAM( (sal_Char*)pAttrNs->prefix))
280*cdf0e10cSrcweir                 +rtl::OUString(RTL_UTF8_USTRINGPARAM( (sal_Char*)":" ))
281*cdf0e10cSrcweir                 +rtl::OUString(RTL_UTF8_USTRINGPARAM( (sal_Char*)pAttrName ));
282*cdf0e10cSrcweir         }
283*cdf0e10cSrcweir 
284*cdf0e10cSrcweir         pAttributeList->AddAttribute(
285*cdf0e10cSrcweir             ouAttrName,
286*cdf0e10cSrcweir             rtl::OUString(RTL_UTF8_USTRINGPARAM( (sal_Char*)(pAttr->children->content))));
287*cdf0e10cSrcweir         pAttr = pAttr->next;
288*cdf0e10cSrcweir     }
289*cdf0e10cSrcweir 
290*cdf0e10cSrcweir     rtl::OString sNodeName = getNodeQName(pNode);
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir     if (xHandler.is())
293*cdf0e10cSrcweir     {
294*cdf0e10cSrcweir         xHandler->startElement(
295*cdf0e10cSrcweir             rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(sNodeName.getStr())) )),
296*cdf0e10cSrcweir             xAttrList);
297*cdf0e10cSrcweir     }
298*cdf0e10cSrcweir 
299*cdf0e10cSrcweir     xHandler2->startElement(
300*cdf0e10cSrcweir         rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(sNodeName.getStr())) )),
301*cdf0e10cSrcweir         xAttrList);
302*cdf0e10cSrcweir }
303*cdf0e10cSrcweir 
304*cdf0e10cSrcweir void XMLDocumentWrapper_XmlSecImpl::sendEndElement(
305*cdf0e10cSrcweir     const cssu::Reference< cssxs::XDocumentHandler >& xHandler,
306*cdf0e10cSrcweir     const cssu::Reference< cssxs::XDocumentHandler >& xHandler2,
307*cdf0e10cSrcweir     const xmlNodePtr pNode) const
308*cdf0e10cSrcweir     throw (cssxs::SAXException)
309*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/sendEndElement **************************
310*cdf0e10cSrcweir  *
311*cdf0e10cSrcweir  *   NAME
312*cdf0e10cSrcweir  *  sendEndElement -- Constructs a endElement SAX event
313*cdf0e10cSrcweir  *
314*cdf0e10cSrcweir  *   SYNOPSIS
315*cdf0e10cSrcweir  *  sendEndElement(xHandler, xHandler2, pNode);
316*cdf0e10cSrcweir  *
317*cdf0e10cSrcweir  *   FUNCTION
318*cdf0e10cSrcweir  *  Used when converting the document into SAX event stream.
319*cdf0e10cSrcweir  *  This method constructs a endElement SAX event for a particular
320*cdf0e10cSrcweir  *  element, then calls the endElement methods of the XDocumentHandlers.
321*cdf0e10cSrcweir  *
322*cdf0e10cSrcweir  *   INPUTS
323*cdf0e10cSrcweir  *  xHandler -  the first XDocumentHandler interface to receive the
324*cdf0e10cSrcweir  *          endElement SAX event. It can be NULL.
325*cdf0e10cSrcweir  *  xHandler2 - the second XDocumentHandler interface to receive the
326*cdf0e10cSrcweir  *          endElement SAX event. It can't be NULL.
327*cdf0e10cSrcweir  *  pNode -     the node on which the endElement should be generated.
328*cdf0e10cSrcweir  *          This node must be a element type.
329*cdf0e10cSrcweir  *
330*cdf0e10cSrcweir  *   RESULT
331*cdf0e10cSrcweir  *  empty
332*cdf0e10cSrcweir  *
333*cdf0e10cSrcweir  *   HISTORY
334*cdf0e10cSrcweir  *  05.01.2004 -    implemented
335*cdf0e10cSrcweir  *
336*cdf0e10cSrcweir  *   AUTHOR
337*cdf0e10cSrcweir  *  Michael Mi
338*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
339*cdf0e10cSrcweir  ******************************************************************************/
340*cdf0e10cSrcweir {
341*cdf0e10cSrcweir     rtl::OString sNodeName = getNodeQName(pNode);
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir     if (xHandler.is())
344*cdf0e10cSrcweir     {
345*cdf0e10cSrcweir         xHandler->endElement(rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(sNodeName.getStr())) )));
346*cdf0e10cSrcweir     }
347*cdf0e10cSrcweir 
348*cdf0e10cSrcweir     xHandler2->endElement(rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(sNodeName.getStr())) )));
349*cdf0e10cSrcweir }
350*cdf0e10cSrcweir 
351*cdf0e10cSrcweir void XMLDocumentWrapper_XmlSecImpl::sendNode(
352*cdf0e10cSrcweir     const cssu::Reference< cssxs::XDocumentHandler >& xHandler,
353*cdf0e10cSrcweir     const cssu::Reference< cssxs::XDocumentHandler >& xHandler2,
354*cdf0e10cSrcweir     const xmlNodePtr pNode) const
355*cdf0e10cSrcweir     throw (cssxs::SAXException)
356*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/sendNode ********************************
357*cdf0e10cSrcweir  *
358*cdf0e10cSrcweir  *   NAME
359*cdf0e10cSrcweir  *  sendNode -- Constructs a characters SAX event or a
360*cdf0e10cSrcweir  *  processingInstruction SAX event
361*cdf0e10cSrcweir  *
362*cdf0e10cSrcweir  *   SYNOPSIS
363*cdf0e10cSrcweir  *  sendNode(xHandler, xHandler2, pNode);
364*cdf0e10cSrcweir  *
365*cdf0e10cSrcweir  *   FUNCTION
366*cdf0e10cSrcweir  *  Used when converting the document into SAX event stream.
367*cdf0e10cSrcweir  *  This method constructs a characters SAX event or a
368*cdf0e10cSrcweir  *  processingInstructionfor SAX event based on the type of a particular
369*cdf0e10cSrcweir  *  element, then calls the corresponding methods of the XDocumentHandlers.
370*cdf0e10cSrcweir  *
371*cdf0e10cSrcweir  *   INPUTS
372*cdf0e10cSrcweir  *  xHandler -  the first XDocumentHandler interface to receive the
373*cdf0e10cSrcweir  *          SAX event. It can be NULL.
374*cdf0e10cSrcweir  *  xHandler2 - the second XDocumentHandler interface to receive the
375*cdf0e10cSrcweir  *          SAX event. It can't be NULL.
376*cdf0e10cSrcweir  *  pNode -     the node on which the endElement should be generated.
377*cdf0e10cSrcweir  *          If it is a text node, then a characters SAX event is
378*cdf0e10cSrcweir  *          generated; if it is a PI node, then a
379*cdf0e10cSrcweir  *          processingInstructionfor SAX event is generated.
380*cdf0e10cSrcweir  *
381*cdf0e10cSrcweir  *   RESULT
382*cdf0e10cSrcweir  *  empty
383*cdf0e10cSrcweir  *
384*cdf0e10cSrcweir  *   HISTORY
385*cdf0e10cSrcweir  *  05.01.2004 -    implemented
386*cdf0e10cSrcweir  *
387*cdf0e10cSrcweir  *   AUTHOR
388*cdf0e10cSrcweir  *  Michael Mi
389*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
390*cdf0e10cSrcweir  ******************************************************************************/
391*cdf0e10cSrcweir {
392*cdf0e10cSrcweir     xmlElementType type = pNode->type;
393*cdf0e10cSrcweir 
394*cdf0e10cSrcweir     if (type == XML_TEXT_NODE)
395*cdf0e10cSrcweir     {
396*cdf0e10cSrcweir         if (xHandler.is())
397*cdf0e10cSrcweir         {
398*cdf0e10cSrcweir             xHandler->characters(rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(pNode->content)) )));
399*cdf0e10cSrcweir         }
400*cdf0e10cSrcweir 
401*cdf0e10cSrcweir         xHandler2->characters(rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(pNode->content)) )));
402*cdf0e10cSrcweir     }
403*cdf0e10cSrcweir     else if (type == XML_PI_NODE)
404*cdf0e10cSrcweir     {
405*cdf0e10cSrcweir         if (xHandler.is())
406*cdf0e10cSrcweir         {
407*cdf0e10cSrcweir             xHandler->processingInstruction(
408*cdf0e10cSrcweir                 rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(pNode->name)) )),
409*cdf0e10cSrcweir                 rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(pNode->content)) )));
410*cdf0e10cSrcweir         }
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir         xHandler2->processingInstruction(
413*cdf0e10cSrcweir             rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(pNode->name)) )),
414*cdf0e10cSrcweir             rtl::OUString(RTL_UTF8_USTRINGPARAM ( ((sal_Char*)(pNode->content)) )));
415*cdf0e10cSrcweir     }
416*cdf0e10cSrcweir }
417*cdf0e10cSrcweir 
418*cdf0e10cSrcweir rtl::OString XMLDocumentWrapper_XmlSecImpl::getNodeQName(const xmlNodePtr pNode) const
419*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/getNodeQName ****************************
420*cdf0e10cSrcweir  *
421*cdf0e10cSrcweir  *   NAME
422*cdf0e10cSrcweir  *  getNodeQName -- Retrives the qualified name of a node
423*cdf0e10cSrcweir  *
424*cdf0e10cSrcweir  *   SYNOPSIS
425*cdf0e10cSrcweir  *  name = getNodeQName(pNode);
426*cdf0e10cSrcweir  *
427*cdf0e10cSrcweir  *   FUNCTION
428*cdf0e10cSrcweir  *  see NAME
429*cdf0e10cSrcweir  *
430*cdf0e10cSrcweir  *   INPUTS
431*cdf0e10cSrcweir  *  pNode - the node whose name will be retrived
432*cdf0e10cSrcweir  *
433*cdf0e10cSrcweir  *   RESULT
434*cdf0e10cSrcweir  *  name - the node's qualified name
435*cdf0e10cSrcweir  *
436*cdf0e10cSrcweir  *   HISTORY
437*cdf0e10cSrcweir  *  05.01.2004 -    implemented
438*cdf0e10cSrcweir  *
439*cdf0e10cSrcweir  *   AUTHOR
440*cdf0e10cSrcweir  *  Michael Mi
441*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
442*cdf0e10cSrcweir  ******************************************************************************/
443*cdf0e10cSrcweir {
444*cdf0e10cSrcweir     rtl::OString sNodeName((const sal_Char*)pNode->name);
445*cdf0e10cSrcweir     if (pNode->ns != NULL)
446*cdf0e10cSrcweir     {
447*cdf0e10cSrcweir         xmlNsPtr pNs = pNode->ns;
448*cdf0e10cSrcweir 
449*cdf0e10cSrcweir         if (pNs->prefix != NULL)
450*cdf0e10cSrcweir         {
451*cdf0e10cSrcweir             rtl::OString sPrefix((const sal_Char*)pNs->prefix);
452*cdf0e10cSrcweir             sNodeName = sPrefix+rtl::OString(":")+sNodeName;
453*cdf0e10cSrcweir         }
454*cdf0e10cSrcweir     }
455*cdf0e10cSrcweir 
456*cdf0e10cSrcweir     return sNodeName;
457*cdf0e10cSrcweir }
458*cdf0e10cSrcweir 
459*cdf0e10cSrcweir xmlNodePtr XMLDocumentWrapper_XmlSecImpl::checkElement( const cssu::Reference< cssxw::XXMLElementWrapper >& xXMLElement) const
460*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/checkElement ****************************
461*cdf0e10cSrcweir  *
462*cdf0e10cSrcweir  *   NAME
463*cdf0e10cSrcweir  *  checkElement -- Retrives the node wrapped by an XXMLElementWrapper
464*cdf0e10cSrcweir  *  interface
465*cdf0e10cSrcweir  *
466*cdf0e10cSrcweir  *   SYNOPSIS
467*cdf0e10cSrcweir  *  node = checkElement(xXMLElement);
468*cdf0e10cSrcweir  *
469*cdf0e10cSrcweir  *   FUNCTION
470*cdf0e10cSrcweir  *  see NAME
471*cdf0e10cSrcweir  *
472*cdf0e10cSrcweir  *   INPUTS
473*cdf0e10cSrcweir  *  xXMLElement -   the XXMLElementWrapper interface wraping a node
474*cdf0e10cSrcweir  *
475*cdf0e10cSrcweir  *   RESULT
476*cdf0e10cSrcweir  *  node - the node wrapped in the XXMLElementWrapper interface
477*cdf0e10cSrcweir  *
478*cdf0e10cSrcweir  *   HISTORY
479*cdf0e10cSrcweir  *  05.01.2004 -    implemented
480*cdf0e10cSrcweir  *
481*cdf0e10cSrcweir  *   AUTHOR
482*cdf0e10cSrcweir  *  Michael Mi
483*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
484*cdf0e10cSrcweir  ******************************************************************************/
485*cdf0e10cSrcweir {
486*cdf0e10cSrcweir     xmlNodePtr rc = NULL;
487*cdf0e10cSrcweir 
488*cdf0e10cSrcweir     if (xXMLElement.is())
489*cdf0e10cSrcweir     {
490*cdf0e10cSrcweir         cssu::Reference< cssl::XUnoTunnel > xNodTunnel( xXMLElement, cssu::UNO_QUERY ) ;
491*cdf0e10cSrcweir         if( !xNodTunnel.is() )
492*cdf0e10cSrcweir         {
493*cdf0e10cSrcweir             throw cssu::RuntimeException() ;
494*cdf0e10cSrcweir         }
495*cdf0e10cSrcweir 
496*cdf0e10cSrcweir         XMLElementWrapper_XmlSecImpl* pElement
497*cdf0e10cSrcweir             = reinterpret_cast<XMLElementWrapper_XmlSecImpl*>(
498*cdf0e10cSrcweir                 sal::static_int_cast<sal_uIntPtr>(
499*cdf0e10cSrcweir                     xNodTunnel->getSomething(
500*cdf0e10cSrcweir                         XMLElementWrapper_XmlSecImpl::getUnoTunnelImplementationId() ))) ;
501*cdf0e10cSrcweir 
502*cdf0e10cSrcweir         if( pElement == NULL ) {
503*cdf0e10cSrcweir             throw cssu::RuntimeException() ;
504*cdf0e10cSrcweir         }
505*cdf0e10cSrcweir 
506*cdf0e10cSrcweir         rc = pElement->getNativeElement();
507*cdf0e10cSrcweir     }
508*cdf0e10cSrcweir 
509*cdf0e10cSrcweir     return rc;
510*cdf0e10cSrcweir }
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir sal_Int32 XMLDocumentWrapper_XmlSecImpl::recursiveDelete(
513*cdf0e10cSrcweir     const xmlNodePtr pNode)
514*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/recursiveDelete *************************
515*cdf0e10cSrcweir  *
516*cdf0e10cSrcweir  *   NAME
517*cdf0e10cSrcweir  *  recursiveDelete -- Deletes a paticular node with its branch.
518*cdf0e10cSrcweir  *
519*cdf0e10cSrcweir  *   SYNOPSIS
520*cdf0e10cSrcweir  *  result = recursiveDelete(pNode);
521*cdf0e10cSrcweir  *
522*cdf0e10cSrcweir  *   FUNCTION
523*cdf0e10cSrcweir  *  Deletes a paticular node with its branch, while reserving the nodes
524*cdf0e10cSrcweir  *  (and their brance) listed in the m_aReservedNodes.
525*cdf0e10cSrcweir  *  The deletion process is preformed in the tree order, that is, a node
526*cdf0e10cSrcweir  *  is deleted after its previous sibling node is deleted, a parent node
527*cdf0e10cSrcweir  *  is deleted after its branch is deleted.
528*cdf0e10cSrcweir  *  During the deletion process when the m_pStopAtNode is reached, the
529*cdf0e10cSrcweir  *  progress is interrupted at once.
530*cdf0e10cSrcweir  *
531*cdf0e10cSrcweir  *   INPUTS
532*cdf0e10cSrcweir  *  pNode - the node to be deleted
533*cdf0e10cSrcweir  *
534*cdf0e10cSrcweir  *   RESULT
535*cdf0e10cSrcweir  *  result -    the result of the deletion process, can be one of following
536*cdf0e10cSrcweir  *          values:
537*cdf0e10cSrcweir  *          NODE_STOPED - the process is interrupted by meeting the
538*cdf0e10cSrcweir  *              m_pStopAtNode
539*cdf0e10cSrcweir  *          NODE_NOTREMOVED - the pNode is not completely removed
540*cdf0e10cSrcweir  *              because there is its descendant in the
541*cdf0e10cSrcweir  *              m_aReservedNodes list
542*cdf0e10cSrcweir  *          NODE_REMOVED - the pNode and its branch are completely
543*cdf0e10cSrcweir  *              removed
544*cdf0e10cSrcweir  *
545*cdf0e10cSrcweir  *   NOTES
546*cdf0e10cSrcweir  *  The node in the m_aReservedNodes list must be in the tree order, otherwise
547*cdf0e10cSrcweir  *  the result is unpredictable.
548*cdf0e10cSrcweir  *
549*cdf0e10cSrcweir  *   HISTORY
550*cdf0e10cSrcweir  *  05.01.2004 -    implemented
551*cdf0e10cSrcweir  *
552*cdf0e10cSrcweir  *   AUTHOR
553*cdf0e10cSrcweir  *  Michael Mi
554*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
555*cdf0e10cSrcweir  ******************************************************************************/
556*cdf0e10cSrcweir {
557*cdf0e10cSrcweir     if (pNode == m_pStopAtNode)
558*cdf0e10cSrcweir     {
559*cdf0e10cSrcweir         return NODE_STOPED;
560*cdf0e10cSrcweir     }
561*cdf0e10cSrcweir 
562*cdf0e10cSrcweir     if (pNode != m_pCurrentReservedNode)
563*cdf0e10cSrcweir     {
564*cdf0e10cSrcweir         xmlNodePtr pChild = pNode->children;
565*cdf0e10cSrcweir 
566*cdf0e10cSrcweir         xmlNodePtr pNextSibling;
567*cdf0e10cSrcweir         bool bIsRemoved = true;
568*cdf0e10cSrcweir         sal_Int32 nResult;
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir         while( pChild != NULL )
571*cdf0e10cSrcweir         {
572*cdf0e10cSrcweir             pNextSibling = pChild->next;
573*cdf0e10cSrcweir             nResult = recursiveDelete(pChild);
574*cdf0e10cSrcweir 
575*cdf0e10cSrcweir             switch (nResult)
576*cdf0e10cSrcweir             {
577*cdf0e10cSrcweir             case NODE_STOPED:
578*cdf0e10cSrcweir                 return NODE_STOPED;
579*cdf0e10cSrcweir             case NODE_NOTREMOVED:
580*cdf0e10cSrcweir                 bIsRemoved = false;
581*cdf0e10cSrcweir                 break;
582*cdf0e10cSrcweir             case NODE_REMOVED:
583*cdf0e10cSrcweir                 removeNode(pChild);
584*cdf0e10cSrcweir                 break;
585*cdf0e10cSrcweir             default:
586*cdf0e10cSrcweir                 throw cssu::RuntimeException();
587*cdf0e10cSrcweir             }
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir             pChild = pNextSibling;
590*cdf0e10cSrcweir         }
591*cdf0e10cSrcweir 
592*cdf0e10cSrcweir         if (pNode == m_pCurrentElement)
593*cdf0e10cSrcweir         {
594*cdf0e10cSrcweir             bIsRemoved = false;
595*cdf0e10cSrcweir         }
596*cdf0e10cSrcweir 
597*cdf0e10cSrcweir         return bIsRemoved?NODE_REMOVED:NODE_NOTREMOVED;
598*cdf0e10cSrcweir     }
599*cdf0e10cSrcweir     else
600*cdf0e10cSrcweir     {
601*cdf0e10cSrcweir         getNextReservedNode();
602*cdf0e10cSrcweir         return NODE_NOTREMOVED;
603*cdf0e10cSrcweir     }
604*cdf0e10cSrcweir }
605*cdf0e10cSrcweir 
606*cdf0e10cSrcweir void XMLDocumentWrapper_XmlSecImpl::getNextReservedNode()
607*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/getNextReservedNode *********************
608*cdf0e10cSrcweir  *
609*cdf0e10cSrcweir  *   NAME
610*cdf0e10cSrcweir  *  getNextReservedNode -- Highlights the next reserved node in the
611*cdf0e10cSrcweir  *  reserved node list
612*cdf0e10cSrcweir  *
613*cdf0e10cSrcweir  *   SYNOPSIS
614*cdf0e10cSrcweir  *  getNextReservedNode();
615*cdf0e10cSrcweir  *
616*cdf0e10cSrcweir  *   FUNCTION
617*cdf0e10cSrcweir  *  The m_aReservedNodes array holds a node list, while the
618*cdf0e10cSrcweir  *  m_pCurrentReservedNode points to the one currently highlighted.
619*cdf0e10cSrcweir  *  This method is used to highlight the next node in the node list.
620*cdf0e10cSrcweir  *  This method is called at the time when the current highlighted node
621*cdf0e10cSrcweir  *  has been already processed, and the next node should be ready.
622*cdf0e10cSrcweir  *
623*cdf0e10cSrcweir  *   INPUTS
624*cdf0e10cSrcweir  *  empty
625*cdf0e10cSrcweir  *
626*cdf0e10cSrcweir  *   RESULT
627*cdf0e10cSrcweir  *  empty
628*cdf0e10cSrcweir  *
629*cdf0e10cSrcweir  *   HISTORY
630*cdf0e10cSrcweir  *  05.01.2004 -    implemented
631*cdf0e10cSrcweir  *
632*cdf0e10cSrcweir  *   AUTHOR
633*cdf0e10cSrcweir  *  Michael Mi
634*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
635*cdf0e10cSrcweir  ******************************************************************************/
636*cdf0e10cSrcweir {
637*cdf0e10cSrcweir     if (m_nReservedNodeIndex < m_aReservedNodes.getLength())
638*cdf0e10cSrcweir     {
639*cdf0e10cSrcweir         m_pCurrentReservedNode = checkElement( m_aReservedNodes[m_nReservedNodeIndex] );
640*cdf0e10cSrcweir         m_nReservedNodeIndex ++;
641*cdf0e10cSrcweir     }
642*cdf0e10cSrcweir     else
643*cdf0e10cSrcweir     {
644*cdf0e10cSrcweir         m_pCurrentReservedNode = NULL;
645*cdf0e10cSrcweir     }
646*cdf0e10cSrcweir }
647*cdf0e10cSrcweir 
648*cdf0e10cSrcweir void XMLDocumentWrapper_XmlSecImpl::removeNode(const xmlNodePtr pNode) const
649*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/removeNode ******************************
650*cdf0e10cSrcweir  *
651*cdf0e10cSrcweir  *   NAME
652*cdf0e10cSrcweir  *  removeNode -- Deletes a node with its branch unconditionaly
653*cdf0e10cSrcweir  *
654*cdf0e10cSrcweir  *   SYNOPSIS
655*cdf0e10cSrcweir  *  removeNode( pNode );
656*cdf0e10cSrcweir  *
657*cdf0e10cSrcweir  *   FUNCTION
658*cdf0e10cSrcweir  *  Delete the node along with its branch from the document.
659*cdf0e10cSrcweir  *
660*cdf0e10cSrcweir  *   INPUTS
661*cdf0e10cSrcweir  *  pNode - the node to be deleted
662*cdf0e10cSrcweir  *
663*cdf0e10cSrcweir  *   RESULT
664*cdf0e10cSrcweir  *  empty
665*cdf0e10cSrcweir  *
666*cdf0e10cSrcweir  *   HISTORY
667*cdf0e10cSrcweir  *  05.01.2004 -    implemented
668*cdf0e10cSrcweir  *
669*cdf0e10cSrcweir  *   AUTHOR
670*cdf0e10cSrcweir  *  Michael Mi
671*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
672*cdf0e10cSrcweir  ******************************************************************************/
673*cdf0e10cSrcweir {
674*cdf0e10cSrcweir     /* you can't remove the current node */
675*cdf0e10cSrcweir     OSL_ASSERT( m_pCurrentElement != pNode );
676*cdf0e10cSrcweir 
677*cdf0e10cSrcweir     xmlAttrPtr pAttr = pNode->properties;
678*cdf0e10cSrcweir 
679*cdf0e10cSrcweir     while (pAttr != NULL)
680*cdf0e10cSrcweir     {
681*cdf0e10cSrcweir         if (!stricmp((sal_Char*)pAttr->name,"id"))
682*cdf0e10cSrcweir         {
683*cdf0e10cSrcweir             xmlRemoveID(m_pDocument, pAttr);
684*cdf0e10cSrcweir         }
685*cdf0e10cSrcweir 
686*cdf0e10cSrcweir         pAttr = pAttr->next;
687*cdf0e10cSrcweir     }
688*cdf0e10cSrcweir 
689*cdf0e10cSrcweir     xmlUnlinkNode(pNode);
690*cdf0e10cSrcweir     xmlFreeNode(pNode);
691*cdf0e10cSrcweir }
692*cdf0e10cSrcweir 
693*cdf0e10cSrcweir void XMLDocumentWrapper_XmlSecImpl::buildIDAttr(xmlNodePtr pNode) const
694*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/buildIDAttr *****************************
695*cdf0e10cSrcweir  *
696*cdf0e10cSrcweir  *   NAME
697*cdf0e10cSrcweir  *  buildIDAttr -- build the ID attribute of a node
698*cdf0e10cSrcweir  *
699*cdf0e10cSrcweir  *   SYNOPSIS
700*cdf0e10cSrcweir  *  buildIDAttr( pNode );
701*cdf0e10cSrcweir  *
702*cdf0e10cSrcweir  *   FUNCTION
703*cdf0e10cSrcweir  *  see NAME
704*cdf0e10cSrcweir  *
705*cdf0e10cSrcweir  *   INPUTS
706*cdf0e10cSrcweir  *  pNode - the node whose id attribute will be built
707*cdf0e10cSrcweir  *
708*cdf0e10cSrcweir  *   RESULT
709*cdf0e10cSrcweir  *  empty
710*cdf0e10cSrcweir  *
711*cdf0e10cSrcweir  *   HISTORY
712*cdf0e10cSrcweir  *  14.06.2004 -    implemented
713*cdf0e10cSrcweir  *
714*cdf0e10cSrcweir  *   AUTHOR
715*cdf0e10cSrcweir  *  Michael Mi
716*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
717*cdf0e10cSrcweir  ******************************************************************************/
718*cdf0e10cSrcweir {
719*cdf0e10cSrcweir     xmlAttrPtr idAttr = xmlHasProp( pNode, (const unsigned char *)"id" );
720*cdf0e10cSrcweir     if (idAttr == NULL)
721*cdf0e10cSrcweir     {
722*cdf0e10cSrcweir         idAttr = xmlHasProp( pNode, (const unsigned char *)"Id" );
723*cdf0e10cSrcweir     }
724*cdf0e10cSrcweir 
725*cdf0e10cSrcweir     if (idAttr != NULL)
726*cdf0e10cSrcweir     {
727*cdf0e10cSrcweir         xmlChar* idValue = xmlNodeListGetString( m_pDocument, idAttr->children, 1 ) ;
728*cdf0e10cSrcweir         xmlAddID( NULL, m_pDocument, idValue, idAttr );
729*cdf0e10cSrcweir     }
730*cdf0e10cSrcweir }
731*cdf0e10cSrcweir 
732*cdf0e10cSrcweir void XMLDocumentWrapper_XmlSecImpl::rebuildIDLink(xmlNodePtr pNode) const
733*cdf0e10cSrcweir /****** XMLDocumentWrapper_XmlSecImpl/rebuildIDLink ***************************
734*cdf0e10cSrcweir  *
735*cdf0e10cSrcweir  *   NAME
736*cdf0e10cSrcweir  *  rebuildIDLink -- rebuild the ID link for the branch
737*cdf0e10cSrcweir  *
738*cdf0e10cSrcweir  *   SYNOPSIS
739*cdf0e10cSrcweir  *  rebuildIDLink( pNode );
740*cdf0e10cSrcweir  *
741*cdf0e10cSrcweir  *   FUNCTION
742*cdf0e10cSrcweir  *  see NAME
743*cdf0e10cSrcweir  *
744*cdf0e10cSrcweir  *   INPUTS
745*cdf0e10cSrcweir  *  pNode - the node, from which the branch will be rebuilt
746*cdf0e10cSrcweir  *
747*cdf0e10cSrcweir  *   RESULT
748*cdf0e10cSrcweir  *  empty
749*cdf0e10cSrcweir  *
750*cdf0e10cSrcweir  *   HISTORY
751*cdf0e10cSrcweir  *  14.06.2004 -    implemented
752*cdf0e10cSrcweir  *
753*cdf0e10cSrcweir  *   AUTHOR
754*cdf0e10cSrcweir  *  Michael Mi
755*cdf0e10cSrcweir  *  Email: michael.mi@sun.com
756*cdf0e10cSrcweir  ******************************************************************************/
757*cdf0e10cSrcweir {
758*cdf0e10cSrcweir     if (pNode != NULL && pNode->type == XML_ELEMENT_NODE)
759*cdf0e10cSrcweir     {
760*cdf0e10cSrcweir         buildIDAttr( pNode );
761*cdf0e10cSrcweir 
762*cdf0e10cSrcweir         xmlNodePtr child = pNode->children;
763*cdf0e10cSrcweir         while (child != NULL)
764*cdf0e10cSrcweir         {
765*cdf0e10cSrcweir             rebuildIDLink(child);
766*cdf0e10cSrcweir             child = child->next;
767*cdf0e10cSrcweir         }
768*cdf0e10cSrcweir     }
769*cdf0e10cSrcweir }
770*cdf0e10cSrcweir 
771*cdf0e10cSrcweir /* XXMLDocumentWrapper */
772*cdf0e10cSrcweir cssu::Reference< cssxw::XXMLElementWrapper > SAL_CALL XMLDocumentWrapper_XmlSecImpl::getCurrentElement(  )
773*cdf0e10cSrcweir     throw (cssu::RuntimeException)
774*cdf0e10cSrcweir {
775*cdf0e10cSrcweir     XMLElementWrapper_XmlSecImpl* pElement = new XMLElementWrapper_XmlSecImpl(m_pCurrentElement);
776*cdf0e10cSrcweir     return (cssu::Reference< cssxw::XXMLElementWrapper >)pElement;
777*cdf0e10cSrcweir }
778*cdf0e10cSrcweir 
779*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::setCurrentElement( const cssu::Reference< cssxw::XXMLElementWrapper >& element )
780*cdf0e10cSrcweir     throw (cssu::RuntimeException)
781*cdf0e10cSrcweir {
782*cdf0e10cSrcweir     m_pCurrentElement = checkElement( element );
783*cdf0e10cSrcweir     saxHelper.setCurrentNode( m_pCurrentElement );
784*cdf0e10cSrcweir }
785*cdf0e10cSrcweir 
786*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::removeCurrentElement(  )
787*cdf0e10cSrcweir     throw (cssu::RuntimeException)
788*cdf0e10cSrcweir {
789*cdf0e10cSrcweir     OSL_ASSERT( m_pCurrentElement != NULL );
790*cdf0e10cSrcweir 
791*cdf0e10cSrcweir     xmlNodePtr pOldCurrentElement = m_pCurrentElement;
792*cdf0e10cSrcweir 
793*cdf0e10cSrcweir     /*
794*cdf0e10cSrcweir      * pop the top node in the parser context's
795*cdf0e10cSrcweir      * nodeTab stack, then the parent of that node will
796*cdf0e10cSrcweir      * automatically become the new stack top, and
797*cdf0e10cSrcweir      * the current node as well.
798*cdf0e10cSrcweir      */
799*cdf0e10cSrcweir     saxHelper.endElement(
800*cdf0e10cSrcweir         rtl::OUString(
801*cdf0e10cSrcweir             RTL_UTF8_USTRINGPARAM (
802*cdf0e10cSrcweir                 (sal_Char*)(pOldCurrentElement->name)
803*cdf0e10cSrcweir             )));
804*cdf0e10cSrcweir     m_pCurrentElement = saxHelper.getCurrentNode();
805*cdf0e10cSrcweir 
806*cdf0e10cSrcweir     /*
807*cdf0e10cSrcweir      * remove the node
808*cdf0e10cSrcweir      */
809*cdf0e10cSrcweir     removeNode(pOldCurrentElement);
810*cdf0e10cSrcweir }
811*cdf0e10cSrcweir 
812*cdf0e10cSrcweir sal_Bool SAL_CALL XMLDocumentWrapper_XmlSecImpl::isCurrent( const cssu::Reference< cssxw::XXMLElementWrapper >& node )
813*cdf0e10cSrcweir     throw (cssu::RuntimeException)
814*cdf0e10cSrcweir {
815*cdf0e10cSrcweir     xmlNodePtr pNode = checkElement(node);
816*cdf0e10cSrcweir     return (pNode == m_pCurrentElement);
817*cdf0e10cSrcweir }
818*cdf0e10cSrcweir 
819*cdf0e10cSrcweir sal_Bool SAL_CALL XMLDocumentWrapper_XmlSecImpl::isCurrentElementEmpty(  )
820*cdf0e10cSrcweir     throw (cssu::RuntimeException)
821*cdf0e10cSrcweir {
822*cdf0e10cSrcweir     sal_Bool rc = sal_False;
823*cdf0e10cSrcweir 
824*cdf0e10cSrcweir     if (m_pCurrentElement->children == NULL)
825*cdf0e10cSrcweir     {
826*cdf0e10cSrcweir         rc = sal_True;
827*cdf0e10cSrcweir     }
828*cdf0e10cSrcweir 
829*cdf0e10cSrcweir     return rc;
830*cdf0e10cSrcweir }
831*cdf0e10cSrcweir 
832*cdf0e10cSrcweir rtl::OUString SAL_CALL XMLDocumentWrapper_XmlSecImpl::getNodeName( const cssu::Reference< cssxw::XXMLElementWrapper >& node )
833*cdf0e10cSrcweir     throw (cssu::RuntimeException)
834*cdf0e10cSrcweir {
835*cdf0e10cSrcweir     xmlNodePtr pNode = checkElement(node);
836*cdf0e10cSrcweir     return rtl::OUString(RTL_UTF8_USTRINGPARAM ( (sal_Char*)pNode->name ));
837*cdf0e10cSrcweir }
838*cdf0e10cSrcweir 
839*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::clearUselessData(
840*cdf0e10cSrcweir     const cssu::Reference< cssxw::XXMLElementWrapper >& node,
841*cdf0e10cSrcweir     const cssu::Sequence< cssu::Reference< cssxw::XXMLElementWrapper > >& reservedDescendants,
842*cdf0e10cSrcweir     const cssu::Reference< cssxw::XXMLElementWrapper >& stopAtNode )
843*cdf0e10cSrcweir     throw (cssu::RuntimeException)
844*cdf0e10cSrcweir {
845*cdf0e10cSrcweir     xmlNodePtr pTargetNode = checkElement(node);
846*cdf0e10cSrcweir 
847*cdf0e10cSrcweir     m_pStopAtNode = checkElement(stopAtNode);
848*cdf0e10cSrcweir     m_aReservedNodes = reservedDescendants;
849*cdf0e10cSrcweir     m_nReservedNodeIndex = 0;
850*cdf0e10cSrcweir 
851*cdf0e10cSrcweir     getNextReservedNode();
852*cdf0e10cSrcweir 
853*cdf0e10cSrcweir     recursiveDelete(pTargetNode);
854*cdf0e10cSrcweir }
855*cdf0e10cSrcweir 
856*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::collapse( const cssu::Reference< cssxw::XXMLElementWrapper >& node )
857*cdf0e10cSrcweir     throw (cssu::RuntimeException)
858*cdf0e10cSrcweir {
859*cdf0e10cSrcweir     xmlNodePtr pTargetNode = checkElement(node);
860*cdf0e10cSrcweir     xmlNodePtr pParent;
861*cdf0e10cSrcweir 
862*cdf0e10cSrcweir     while (pTargetNode != NULL)
863*cdf0e10cSrcweir     {
864*cdf0e10cSrcweir         if (pTargetNode->children != NULL || pTargetNode == m_pCurrentElement)
865*cdf0e10cSrcweir         {
866*cdf0e10cSrcweir             break;
867*cdf0e10cSrcweir         }
868*cdf0e10cSrcweir 
869*cdf0e10cSrcweir         pParent = pTargetNode->parent;
870*cdf0e10cSrcweir         removeNode(pTargetNode);
871*cdf0e10cSrcweir         pTargetNode = pParent;
872*cdf0e10cSrcweir     }
873*cdf0e10cSrcweir }
874*cdf0e10cSrcweir 
875*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::getTree( const cssu::Reference< cssxs::XDocumentHandler >& handler )
876*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
877*cdf0e10cSrcweir {
878*cdf0e10cSrcweir     if (m_pRootElement != NULL)
879*cdf0e10cSrcweir     {
880*cdf0e10cSrcweir         xmlNodePtr pTempCurrentElement = m_pCurrentElement;
881*cdf0e10cSrcweir         sal_Int32 nTempCurrentPosition = m_nCurrentPosition;
882*cdf0e10cSrcweir 
883*cdf0e10cSrcweir         m_pCurrentElement = m_pRootElement;
884*cdf0e10cSrcweir 
885*cdf0e10cSrcweir         m_nCurrentPosition = NODEPOSITION_STARTELEMENT;
886*cdf0e10cSrcweir         cssu::Reference< cssxs::XDocumentHandler > xHandler = handler;
887*cdf0e10cSrcweir 
888*cdf0e10cSrcweir         while(true)
889*cdf0e10cSrcweir         {
890*cdf0e10cSrcweir             switch (m_nCurrentPosition)
891*cdf0e10cSrcweir             {
892*cdf0e10cSrcweir             case NODEPOSITION_STARTELEMENT:
893*cdf0e10cSrcweir                 sendStartElement(NULL, xHandler, m_pCurrentElement);
894*cdf0e10cSrcweir                 break;
895*cdf0e10cSrcweir             case NODEPOSITION_ENDELEMENT:
896*cdf0e10cSrcweir                 sendEndElement(NULL, xHandler, m_pCurrentElement);
897*cdf0e10cSrcweir                 break;
898*cdf0e10cSrcweir             case NODEPOSITION_NORMAL:
899*cdf0e10cSrcweir                 sendNode(NULL, xHandler, m_pCurrentElement);
900*cdf0e10cSrcweir                 break;
901*cdf0e10cSrcweir             }
902*cdf0e10cSrcweir 
903*cdf0e10cSrcweir             if ( (m_pCurrentElement == m_pRootElement) && (m_nCurrentPosition == NODEPOSITION_ENDELEMENT ))
904*cdf0e10cSrcweir             {
905*cdf0e10cSrcweir                 break;
906*cdf0e10cSrcweir             }
907*cdf0e10cSrcweir 
908*cdf0e10cSrcweir             getNextSAXEvent();
909*cdf0e10cSrcweir         }
910*cdf0e10cSrcweir 
911*cdf0e10cSrcweir         m_pCurrentElement = pTempCurrentElement;
912*cdf0e10cSrcweir         m_nCurrentPosition = nTempCurrentPosition;
913*cdf0e10cSrcweir     }
914*cdf0e10cSrcweir }
915*cdf0e10cSrcweir 
916*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::generateSAXEvents(
917*cdf0e10cSrcweir     const cssu::Reference< cssxs::XDocumentHandler >& handler,
918*cdf0e10cSrcweir     const cssu::Reference< cssxs::XDocumentHandler >& xEventKeeperHandler,
919*cdf0e10cSrcweir     const cssu::Reference< cssxw::XXMLElementWrapper >& startNode,
920*cdf0e10cSrcweir     const cssu::Reference< cssxw::XXMLElementWrapper >& endNode )
921*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
922*cdf0e10cSrcweir {
923*cdf0e10cSrcweir         /*
924*cdf0e10cSrcweir          * The first SAX event is the startElement of the startNode
925*cdf0e10cSrcweir          * element.
926*cdf0e10cSrcweir          */
927*cdf0e10cSrcweir     bool bHasCurrentElementChild = (m_pCurrentElement->children != NULL);
928*cdf0e10cSrcweir 
929*cdf0e10cSrcweir     xmlNodePtr pTempCurrentElement = m_pCurrentElement;
930*cdf0e10cSrcweir 
931*cdf0e10cSrcweir     m_pCurrentElement = checkElement(startNode);
932*cdf0e10cSrcweir 
933*cdf0e10cSrcweir     if (m_pCurrentElement->type == XML_ELEMENT_NODE)
934*cdf0e10cSrcweir     {
935*cdf0e10cSrcweir         m_nCurrentPosition = NODEPOSITION_STARTELEMENT;
936*cdf0e10cSrcweir     }
937*cdf0e10cSrcweir     else
938*cdf0e10cSrcweir     {
939*cdf0e10cSrcweir         m_nCurrentPosition = NODEPOSITION_NORMAL;
940*cdf0e10cSrcweir     }
941*cdf0e10cSrcweir 
942*cdf0e10cSrcweir     xmlNodePtr pEndNode = checkElement(endNode);
943*cdf0e10cSrcweir 
944*cdf0e10cSrcweir     cssu::Reference < cssxc::sax::XSAXEventKeeper > xSAXEventKeeper( xEventKeeperHandler, cssu::UNO_QUERY );
945*cdf0e10cSrcweir 
946*cdf0e10cSrcweir     cssu::Reference< cssxs::XDocumentHandler > xHandler = handler;
947*cdf0e10cSrcweir 
948*cdf0e10cSrcweir     while(true)
949*cdf0e10cSrcweir     {
950*cdf0e10cSrcweir         switch (m_nCurrentPosition)
951*cdf0e10cSrcweir         {
952*cdf0e10cSrcweir         case NODEPOSITION_STARTELEMENT:
953*cdf0e10cSrcweir             sendStartElement(xHandler, xEventKeeperHandler, m_pCurrentElement);
954*cdf0e10cSrcweir             break;
955*cdf0e10cSrcweir         case NODEPOSITION_ENDELEMENT:
956*cdf0e10cSrcweir             sendEndElement(xHandler, xEventKeeperHandler, m_pCurrentElement);
957*cdf0e10cSrcweir             break;
958*cdf0e10cSrcweir         case NODEPOSITION_NORMAL:
959*cdf0e10cSrcweir             sendNode(xHandler, xEventKeeperHandler, m_pCurrentElement);
960*cdf0e10cSrcweir             break;
961*cdf0e10cSrcweir         default:
962*cdf0e10cSrcweir             throw cssu::RuntimeException();
963*cdf0e10cSrcweir         }
964*cdf0e10cSrcweir 
965*cdf0e10cSrcweir         if (xSAXEventKeeper->isBlocking())
966*cdf0e10cSrcweir         {
967*cdf0e10cSrcweir             xHandler = NULL;
968*cdf0e10cSrcweir         }
969*cdf0e10cSrcweir 
970*cdf0e10cSrcweir         if (pEndNode == NULL &&
971*cdf0e10cSrcweir             ((bHasCurrentElementChild && m_pCurrentElement == xmlGetLastChild(pTempCurrentElement) && m_nCurrentPosition != NODEPOSITION_STARTELEMENT) ||
972*cdf0e10cSrcweir              (!bHasCurrentElementChild && m_pCurrentElement == pTempCurrentElement && m_nCurrentPosition == NODEPOSITION_STARTELEMENT)))
973*cdf0e10cSrcweir         {
974*cdf0e10cSrcweir             break;
975*cdf0e10cSrcweir         }
976*cdf0e10cSrcweir 
977*cdf0e10cSrcweir         getNextSAXEvent();
978*cdf0e10cSrcweir 
979*cdf0e10cSrcweir             /*
980*cdf0e10cSrcweir              * If there is an end point specified, then check whether
981*cdf0e10cSrcweir              * the current node equals to the end point. If so, stop
982*cdf0e10cSrcweir              * generating.
983*cdf0e10cSrcweir              */
984*cdf0e10cSrcweir         if (pEndNode != NULL && m_pCurrentElement == pEndNode)
985*cdf0e10cSrcweir         {
986*cdf0e10cSrcweir             break;
987*cdf0e10cSrcweir         }
988*cdf0e10cSrcweir     }
989*cdf0e10cSrcweir 
990*cdf0e10cSrcweir     m_pCurrentElement = pTempCurrentElement;
991*cdf0e10cSrcweir }
992*cdf0e10cSrcweir 
993*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::rebuildIDLink(
994*cdf0e10cSrcweir     const com::sun::star::uno::Reference< com::sun::star::xml::wrapper::XXMLElementWrapper >& node )
995*cdf0e10cSrcweir     throw (com::sun::star::uno::RuntimeException)
996*cdf0e10cSrcweir {
997*cdf0e10cSrcweir     xmlNodePtr pNode = checkElement( node );
998*cdf0e10cSrcweir     rebuildIDLink(pNode);
999*cdf0e10cSrcweir }
1000*cdf0e10cSrcweir 
1001*cdf0e10cSrcweir 
1002*cdf0e10cSrcweir /* cssxs::XDocumentHandler */
1003*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::startDocument(  )
1004*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1005*cdf0e10cSrcweir {
1006*cdf0e10cSrcweir }
1007*cdf0e10cSrcweir 
1008*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::endDocument(  )
1009*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1010*cdf0e10cSrcweir {
1011*cdf0e10cSrcweir }
1012*cdf0e10cSrcweir 
1013*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::startElement( const rtl::OUString& aName, const cssu::Reference< cssxs::XAttributeList >& xAttribs )
1014*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1015*cdf0e10cSrcweir {
1016*cdf0e10cSrcweir     sal_Int32 nLength = xAttribs->getLength();
1017*cdf0e10cSrcweir     cssu::Sequence< cssxcsax::XMLAttribute > aAttributes (nLength);
1018*cdf0e10cSrcweir 
1019*cdf0e10cSrcweir     for (int i = 0; i < nLength; ++i)
1020*cdf0e10cSrcweir     {
1021*cdf0e10cSrcweir         aAttributes[i].sName = xAttribs->getNameByIndex((short)i);
1022*cdf0e10cSrcweir         aAttributes[i].sValue =xAttribs->getValueByIndex((short)i);
1023*cdf0e10cSrcweir     }
1024*cdf0e10cSrcweir 
1025*cdf0e10cSrcweir     _startElement(aName, aAttributes);
1026*cdf0e10cSrcweir }
1027*cdf0e10cSrcweir 
1028*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::endElement( const rtl::OUString& aName )
1029*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1030*cdf0e10cSrcweir {
1031*cdf0e10cSrcweir     saxHelper.endElement(aName);
1032*cdf0e10cSrcweir     m_pCurrentElement = saxHelper.getCurrentNode();
1033*cdf0e10cSrcweir }
1034*cdf0e10cSrcweir 
1035*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::characters( const rtl::OUString& aChars )
1036*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1037*cdf0e10cSrcweir {
1038*cdf0e10cSrcweir     saxHelper.characters(aChars);
1039*cdf0e10cSrcweir }
1040*cdf0e10cSrcweir 
1041*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::ignorableWhitespace( const rtl::OUString& aWhitespaces )
1042*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1043*cdf0e10cSrcweir {
1044*cdf0e10cSrcweir     saxHelper.ignorableWhitespace(aWhitespaces);
1045*cdf0e10cSrcweir }
1046*cdf0e10cSrcweir 
1047*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::processingInstruction( const rtl::OUString& aTarget, const rtl::OUString& aData )
1048*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1049*cdf0e10cSrcweir {
1050*cdf0e10cSrcweir     saxHelper.processingInstruction(aTarget, aData);
1051*cdf0e10cSrcweir }
1052*cdf0e10cSrcweir 
1053*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::setDocumentLocator( const cssu::Reference< cssxs::XLocator >& xLocator )
1054*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1055*cdf0e10cSrcweir {
1056*cdf0e10cSrcweir     saxHelper.setDocumentLocator(xLocator);
1057*cdf0e10cSrcweir }
1058*cdf0e10cSrcweir 
1059*cdf0e10cSrcweir /* XCompressedDocumentHandler */
1060*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::_startDocument(  )
1061*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1062*cdf0e10cSrcweir {
1063*cdf0e10cSrcweir }
1064*cdf0e10cSrcweir 
1065*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::_endDocument(  )
1066*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1067*cdf0e10cSrcweir {
1068*cdf0e10cSrcweir }
1069*cdf0e10cSrcweir 
1070*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::_startElement( const rtl::OUString& aName, const cssu::Sequence< cssxcsax::XMLAttribute >& aAttributes )
1071*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1072*cdf0e10cSrcweir {
1073*cdf0e10cSrcweir     saxHelper.startElement(aName, aAttributes);
1074*cdf0e10cSrcweir     m_pCurrentElement = saxHelper.getCurrentNode();
1075*cdf0e10cSrcweir 
1076*cdf0e10cSrcweir     buildIDAttr( m_pCurrentElement );
1077*cdf0e10cSrcweir }
1078*cdf0e10cSrcweir 
1079*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::_endElement( const rtl::OUString& aName )
1080*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1081*cdf0e10cSrcweir {
1082*cdf0e10cSrcweir     endElement( aName );
1083*cdf0e10cSrcweir }
1084*cdf0e10cSrcweir 
1085*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::_characters( const rtl::OUString& aChars )
1086*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1087*cdf0e10cSrcweir {
1088*cdf0e10cSrcweir     characters( aChars );
1089*cdf0e10cSrcweir }
1090*cdf0e10cSrcweir 
1091*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::_ignorableWhitespace( const rtl::OUString& aWhitespaces )
1092*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1093*cdf0e10cSrcweir {
1094*cdf0e10cSrcweir     ignorableWhitespace( aWhitespaces );
1095*cdf0e10cSrcweir }
1096*cdf0e10cSrcweir 
1097*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::_processingInstruction( const rtl::OUString& aTarget, const rtl::OUString& aData )
1098*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1099*cdf0e10cSrcweir {
1100*cdf0e10cSrcweir     processingInstruction( aTarget, aData );
1101*cdf0e10cSrcweir }
1102*cdf0e10cSrcweir 
1103*cdf0e10cSrcweir void SAL_CALL XMLDocumentWrapper_XmlSecImpl::_setDocumentLocator( sal_Int32 /*columnNumber*/, sal_Int32 /*lineNumber*/, const rtl::OUString& /*publicId*/, const rtl::OUString& /*systemId*/ )
1104*cdf0e10cSrcweir     throw (cssxs::SAXException, cssu::RuntimeException)
1105*cdf0e10cSrcweir {
1106*cdf0e10cSrcweir }
1107*cdf0e10cSrcweir 
1108*cdf0e10cSrcweir rtl::OUString XMLDocumentWrapper_XmlSecImpl_getImplementationName ()
1109*cdf0e10cSrcweir     throw (cssu::RuntimeException)
1110*cdf0e10cSrcweir {
1111*cdf0e10cSrcweir     return rtl::OUString ( RTL_ASCII_USTRINGPARAM ( IMPLEMENTATION_NAME ) );
1112*cdf0e10cSrcweir }
1113*cdf0e10cSrcweir 
1114*cdf0e10cSrcweir sal_Bool SAL_CALL XMLDocumentWrapper_XmlSecImpl_supportsService( const rtl::OUString& ServiceName )
1115*cdf0e10cSrcweir     throw (cssu::RuntimeException)
1116*cdf0e10cSrcweir {
1117*cdf0e10cSrcweir     return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME ));
1118*cdf0e10cSrcweir }
1119*cdf0e10cSrcweir 
1120*cdf0e10cSrcweir cssu::Sequence< rtl::OUString > SAL_CALL XMLDocumentWrapper_XmlSecImpl_getSupportedServiceNames(  )
1121*cdf0e10cSrcweir     throw (cssu::RuntimeException)
1122*cdf0e10cSrcweir {
1123*cdf0e10cSrcweir     cssu::Sequence < rtl::OUString > aRet(1);
1124*cdf0e10cSrcweir     rtl::OUString* pArray = aRet.getArray();
1125*cdf0e10cSrcweir     pArray[0] =  rtl::OUString ( RTL_ASCII_USTRINGPARAM ( SERVICE_NAME ) );
1126*cdf0e10cSrcweir     return aRet;
1127*cdf0e10cSrcweir }
1128*cdf0e10cSrcweir #undef SERVICE_NAME
1129*cdf0e10cSrcweir 
1130*cdf0e10cSrcweir cssu::Reference< cssu::XInterface > SAL_CALL XMLDocumentWrapper_XmlSecImpl_createInstance(
1131*cdf0e10cSrcweir     const cssu::Reference< cssl::XMultiServiceFactory > &)
1132*cdf0e10cSrcweir     throw( cssu::Exception )
1133*cdf0e10cSrcweir {
1134*cdf0e10cSrcweir     return (cppu::OWeakObject*) new XMLDocumentWrapper_XmlSecImpl( );
1135*cdf0e10cSrcweir }
1136*cdf0e10cSrcweir 
1137*cdf0e10cSrcweir /* XServiceInfo */
1138*cdf0e10cSrcweir rtl::OUString SAL_CALL XMLDocumentWrapper_XmlSecImpl::getImplementationName(  )
1139*cdf0e10cSrcweir     throw (cssu::RuntimeException)
1140*cdf0e10cSrcweir {
1141*cdf0e10cSrcweir     return XMLDocumentWrapper_XmlSecImpl_getImplementationName();
1142*cdf0e10cSrcweir }
1143*cdf0e10cSrcweir sal_Bool SAL_CALL XMLDocumentWrapper_XmlSecImpl::supportsService( const rtl::OUString& rServiceName )
1144*cdf0e10cSrcweir     throw (cssu::RuntimeException)
1145*cdf0e10cSrcweir {
1146*cdf0e10cSrcweir     return XMLDocumentWrapper_XmlSecImpl_supportsService( rServiceName );
1147*cdf0e10cSrcweir }
1148*cdf0e10cSrcweir cssu::Sequence< rtl::OUString > SAL_CALL XMLDocumentWrapper_XmlSecImpl::getSupportedServiceNames(  )
1149*cdf0e10cSrcweir     throw (cssu::RuntimeException)
1150*cdf0e10cSrcweir {
1151*cdf0e10cSrcweir     return XMLDocumentWrapper_XmlSecImpl_getSupportedServiceNames();
1152*cdf0e10cSrcweir }
1153*cdf0e10cSrcweir 
1154