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