xref: /trunk/main/comphelper/source/xml/ofopxmlhelper.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_comphelper.hxx"
30 
31 #ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
32 #include <com/sun/star/beans/StringPair.hpp>
33 #endif
34 #ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP
35 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36 #endif
37 #ifndef _COM_SUN_STAR_IO_XACTIVEDATASOURCE_HPP
38 #include <com/sun/star/io/XActiveDataSource.hpp>
39 #endif
40 #ifndef _COM_SUN_STAR_XML_SAX_XPARSER_HPP
41 #include <com/sun/star/xml/sax/XParser.hpp>
42 #endif
43 #ifndef _COM_SUN_STAR_XML_SAX_XDOCUMENTHANDLER_HPP
44 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
45 #endif
46 #ifndef _COM_SUN_STAR_LANG_ILLEGALARGUMENTEXCEPTION_HPP
47 #include <com/sun/star/lang/IllegalArgumentException.hpp>
48 #endif
49 
50 #include <comphelper/ofopxmlhelper.hxx>
51 #include <comphelper/attributelist.hxx>
52 
53 #define RELATIONINFO_FORMAT 0
54 #define CONTENTTYPE_FORMAT  1
55 #define FORMAT_MAX_ID CONTENTTYPE_FORMAT
56 
57 using namespace ::com::sun::star;
58 
59 namespace comphelper {
60 
61 // -----------------------------------
62 uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OFOPXMLHelper::ReadRelationsInfoSequence( const uno::Reference< io::XInputStream >& xInStream, const ::rtl::OUString aStreamName, const uno::Reference< lang::XMultiServiceFactory > xFactory )
63     throw( uno::Exception )
64 {
65     ::rtl::OUString aStringID = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_rels/" ) );
66     aStringID += aStreamName;
67     return ReadSequence_Impl( xInStream, aStringID, RELATIONINFO_FORMAT, xFactory );
68 }
69 
70 // -----------------------------------
71 uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OFOPXMLHelper::ReadContentTypeSequence( const uno::Reference< io::XInputStream >& xInStream, const uno::Reference< lang::XMultiServiceFactory > xFactory )
72     throw( uno::Exception )
73 {
74     ::rtl::OUString aStringID = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "[Content_Types].xml" ) );
75     return ReadSequence_Impl( xInStream, aStringID, CONTENTTYPE_FORMAT, xFactory );
76 }
77 
78 // -----------------------------------
79 void SAL_CALL OFOPXMLHelper::WriteRelationsInfoSequence( const uno::Reference< io::XOutputStream >& xOutStream, const uno::Sequence< uno::Sequence< beans::StringPair > >& aSequence, const uno::Reference< lang::XMultiServiceFactory > xFactory )
80     throw( uno::Exception )
81 {
82     if ( !xOutStream.is() )
83         throw uno::RuntimeException();
84 
85     uno::Reference< io::XActiveDataSource > xWriterSource(
86         xFactory->createInstance(
87             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer" ) ) ),
88         uno::UNO_QUERY_THROW );
89     uno::Reference< xml::sax::XDocumentHandler > xWriterHandler( xWriterSource, uno::UNO_QUERY_THROW );
90 
91     xWriterSource->setOutputStream( xOutStream );
92 
93     ::rtl::OUString aRelListElement( RTL_CONSTASCII_USTRINGPARAM( "Relationships" ) );
94     ::rtl::OUString aRelElement( RTL_CONSTASCII_USTRINGPARAM( "Relationship" ) );
95     ::rtl::OUString aIDAttr( RTL_CONSTASCII_USTRINGPARAM( "Id" ) );
96     ::rtl::OUString aTypeAttr( RTL_CONSTASCII_USTRINGPARAM( "Type" ) );
97     ::rtl::OUString aTargetModeAttr( RTL_CONSTASCII_USTRINGPARAM( "TargetMode" ) );
98     ::rtl::OUString aTargetAttr( RTL_CONSTASCII_USTRINGPARAM( "Target" ) );
99     ::rtl::OUString aCDATAString( RTL_CONSTASCII_USTRINGPARAM ( "CDATA" ) );
100     ::rtl::OUString aWhiteSpace( RTL_CONSTASCII_USTRINGPARAM ( " " ) );
101 
102     // write the namespace
103     AttributeList* pRootAttrList = new AttributeList;
104     uno::Reference< xml::sax::XAttributeList > xRootAttrList( pRootAttrList );
105     pRootAttrList->AddAttribute(
106         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "xmlns" ) ),
107         aCDATAString,
108         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "http://schemas.openxmlformats.org/package/2006/relationships" ) ) );
109 
110     xWriterHandler->startDocument();
111     xWriterHandler->startElement( aRelListElement, xRootAttrList );
112 
113     for ( sal_Int32 nInd = 0; nInd < aSequence.getLength(); nInd++ )
114     {
115         AttributeList *pAttrList = new AttributeList;
116         uno::Reference< xml::sax::XAttributeList > xAttrList( pAttrList );
117         for( sal_Int32 nSecInd = 0; nSecInd < aSequence[nInd].getLength(); nSecInd++ )
118         {
119             if ( aSequence[nInd][nSecInd].First.equals( aIDAttr )
120               || aSequence[nInd][nSecInd].First.equals( aTypeAttr )
121               || aSequence[nInd][nSecInd].First.equals( aTargetModeAttr )
122               || aSequence[nInd][nSecInd].First.equals( aTargetAttr ) )
123             {
124                 pAttrList->AddAttribute( aSequence[nInd][nSecInd].First, aCDATAString, aSequence[nInd][nSecInd].Second );
125             }
126             else
127             {
128                 // TODO/LATER: should the extensions be allowed?
129                 throw lang::IllegalArgumentException();
130             }
131         }
132 
133         xWriterHandler->startElement( aRelElement, xAttrList );
134         xWriterHandler->ignorableWhitespace( aWhiteSpace );
135         xWriterHandler->endElement( aRelElement );
136     }
137 
138     xWriterHandler->ignorableWhitespace( aWhiteSpace );
139     xWriterHandler->endElement( aRelListElement );
140     xWriterHandler->endDocument();
141 }
142 
143 // -----------------------------------
144 void SAL_CALL OFOPXMLHelper::WriteContentSequence( const uno::Reference< io::XOutputStream >& xOutStream, const uno::Sequence< beans::StringPair >& aDefaultsSequence, const uno::Sequence< beans::StringPair >& aOverridesSequence, const uno::Reference< lang::XMultiServiceFactory > xFactory )
145     throw( uno::Exception )
146 {
147     if ( !xOutStream.is() )
148         throw uno::RuntimeException();
149 
150     uno::Reference< io::XActiveDataSource > xWriterSource(
151         xFactory->createInstance(
152             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Writer" ) ) ),
153         uno::UNO_QUERY_THROW );
154     uno::Reference< xml::sax::XDocumentHandler > xWriterHandler( xWriterSource, uno::UNO_QUERY_THROW );
155 
156     xWriterSource->setOutputStream( xOutStream );
157 
158     ::rtl::OUString aTypesElement( RTL_CONSTASCII_USTRINGPARAM( "Types" ) );
159     ::rtl::OUString aDefaultElement( RTL_CONSTASCII_USTRINGPARAM( "Default" ) );
160     ::rtl::OUString aOverrideElement( RTL_CONSTASCII_USTRINGPARAM( "Override" ) );
161     ::rtl::OUString aExtensionAttr( RTL_CONSTASCII_USTRINGPARAM( "Extension" ) );
162     ::rtl::OUString aPartNameAttr( RTL_CONSTASCII_USTRINGPARAM( "PartName" ) );
163     ::rtl::OUString aContentTypeAttr( RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) );
164     ::rtl::OUString aCDATAString( RTL_CONSTASCII_USTRINGPARAM ( "CDATA" ) );
165     ::rtl::OUString aWhiteSpace( RTL_CONSTASCII_USTRINGPARAM ( " " ) );
166 
167     // write the namespace
168     AttributeList* pRootAttrList = new AttributeList;
169     uno::Reference< xml::sax::XAttributeList > xRootAttrList( pRootAttrList );
170     pRootAttrList->AddAttribute(
171         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "xmlns" ) ),
172         aCDATAString,
173         ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( "http://schemas.openxmlformats.org/package/2006/content-types" ) ) );
174 
175     xWriterHandler->startDocument();
176     xWriterHandler->startElement( aTypesElement, xRootAttrList );
177 
178     for ( sal_Int32 nInd = 0; nInd < aDefaultsSequence.getLength(); nInd++ )
179     {
180         AttributeList *pAttrList = new AttributeList;
181         uno::Reference< xml::sax::XAttributeList > xAttrList( pAttrList );
182         pAttrList->AddAttribute( aExtensionAttr, aCDATAString, aDefaultsSequence[nInd].First );
183         pAttrList->AddAttribute( aContentTypeAttr, aCDATAString, aDefaultsSequence[nInd].Second );
184 
185         xWriterHandler->startElement( aDefaultElement, xAttrList );
186         xWriterHandler->ignorableWhitespace( aWhiteSpace );
187         xWriterHandler->endElement( aDefaultElement );
188     }
189 
190     for ( sal_Int32 nInd = 0; nInd < aOverridesSequence.getLength(); nInd++ )
191     {
192         AttributeList *pAttrList = new AttributeList;
193         uno::Reference< xml::sax::XAttributeList > xAttrList( pAttrList );
194         pAttrList->AddAttribute( aPartNameAttr, aCDATAString, aOverridesSequence[nInd].First );
195         pAttrList->AddAttribute( aContentTypeAttr, aCDATAString, aOverridesSequence[nInd].Second );
196 
197         xWriterHandler->startElement( aOverrideElement, xAttrList );
198         xWriterHandler->ignorableWhitespace( aWhiteSpace );
199         xWriterHandler->endElement( aOverrideElement );
200     }
201 
202     xWriterHandler->ignorableWhitespace( aWhiteSpace );
203     xWriterHandler->endElement( aTypesElement );
204     xWriterHandler->endDocument();
205 
206 }
207 
208 // ==================================================================================
209 
210 // -----------------------------------
211 uno::Sequence< uno::Sequence< beans::StringPair > > SAL_CALL OFOPXMLHelper::ReadSequence_Impl( const uno::Reference< io::XInputStream >& xInStream, const ::rtl::OUString& aStringID, sal_uInt16 nFormat, const uno::Reference< lang::XMultiServiceFactory > xFactory )
212     throw( uno::Exception )
213 {
214     if ( !xFactory.is() || !xInStream.is() || nFormat > FORMAT_MAX_ID )
215         throw uno::RuntimeException();
216 
217     uno::Sequence< uno::Sequence< beans::StringPair > > aResult;
218 
219     uno::Reference< xml::sax::XParser > xParser( xFactory->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.xml.sax.Parser" ) ) ), uno::UNO_QUERY_THROW );
220 
221     OFOPXMLHelper* pHelper = new OFOPXMLHelper( nFormat );
222     uno::Reference< xml::sax::XDocumentHandler > xHelper( static_cast< xml::sax::XDocumentHandler* >( pHelper ) );
223     xml::sax::InputSource aParserInput;
224     aParserInput.aInputStream = xInStream;
225     aParserInput.sSystemId = aStringID;
226     xParser->setDocumentHandler( xHelper );
227     xParser->parseStream( aParserInput );
228     xParser->setDocumentHandler( uno::Reference < xml::sax::XDocumentHandler > () );
229 
230     return pHelper->GetParsingResult();
231 }
232 
233 // -----------------------------------
234 OFOPXMLHelper::OFOPXMLHelper( sal_uInt16 nFormat )
235 : m_nFormat( nFormat )
236 , m_aRelListElement( RTL_CONSTASCII_USTRINGPARAM( "Relationships" ) )
237 , m_aRelElement( RTL_CONSTASCII_USTRINGPARAM( "Relationship" ) )
238 , m_aIDAttr( RTL_CONSTASCII_USTRINGPARAM( "Id" ) )
239 , m_aTypeAttr( RTL_CONSTASCII_USTRINGPARAM( "Type" ) )
240 , m_aTargetModeAttr( RTL_CONSTASCII_USTRINGPARAM( "TargetMode" ) )
241 , m_aTargetAttr( RTL_CONSTASCII_USTRINGPARAM( "Target" ) )
242 , m_aTypesElement( RTL_CONSTASCII_USTRINGPARAM( "Types" ) )
243 , m_aDefaultElement( RTL_CONSTASCII_USTRINGPARAM( "Default" ) )
244 , m_aOverrideElement( RTL_CONSTASCII_USTRINGPARAM( "Override" ) )
245 , m_aExtensionAttr( RTL_CONSTASCII_USTRINGPARAM( "Extension" ) )
246 , m_aPartNameAttr( RTL_CONSTASCII_USTRINGPARAM( "PartName" ) )
247 , m_aContentTypeAttr( RTL_CONSTASCII_USTRINGPARAM( "ContentType" ) )
248 {
249 }
250 
251 // -----------------------------------
252 OFOPXMLHelper::~OFOPXMLHelper()
253 {
254 }
255 
256 // -----------------------------------
257 uno::Sequence< uno::Sequence< beans::StringPair > > OFOPXMLHelper::GetParsingResult()
258 {
259     if ( m_aElementsSeq.getLength() )
260         throw uno::RuntimeException(); // the parsing has still not finished!
261 
262     return m_aResultSeq;
263 }
264 
265 // -----------------------------------
266 void SAL_CALL OFOPXMLHelper::startDocument()
267         throw(xml::sax::SAXException, uno::RuntimeException)
268 {
269 }
270 
271 // -----------------------------------
272 void SAL_CALL OFOPXMLHelper::endDocument()
273         throw(xml::sax::SAXException, uno::RuntimeException)
274 {
275 }
276 
277 // -----------------------------------
278 void SAL_CALL OFOPXMLHelper::startElement( const ::rtl::OUString& aName, const uno::Reference< xml::sax::XAttributeList >& xAttribs )
279         throw( xml::sax::SAXException, uno::RuntimeException )
280 {
281     if ( m_nFormat == RELATIONINFO_FORMAT )
282     {
283         if ( aName == m_aRelListElement )
284         {
285             sal_Int32 nNewLength = m_aElementsSeq.getLength() + 1;
286 
287             if ( nNewLength != 1 )
288                 throw xml::sax::SAXException(); // TODO: this element must be the first level element
289 
290             m_aElementsSeq.realloc( nNewLength );
291             m_aElementsSeq[nNewLength-1] = aName;
292 
293             return; // nothing to do
294         }
295         else if ( aName == m_aRelElement )
296         {
297             sal_Int32 nNewLength = m_aElementsSeq.getLength() + 1;
298             if ( nNewLength != 2 )
299                 throw xml::sax::SAXException(); // TODO: this element must be the second level element
300 
301             m_aElementsSeq.realloc( nNewLength );
302             m_aElementsSeq[nNewLength-1] = aName;
303 
304             sal_Int32 nNewEntryNum = m_aResultSeq.getLength() + 1;
305             m_aResultSeq.realloc( nNewEntryNum );
306             sal_Int32 nAttrNum = 0;
307             m_aResultSeq[nNewEntryNum-1].realloc( 4 ); // the maximal expected number of arguments is 4
308 
309             ::rtl::OUString aIDValue = xAttribs->getValueByName( m_aIDAttr );
310             if ( !aIDValue.getLength() )
311                 throw xml::sax::SAXException(); // TODO: the ID value must present
312 
313             ::rtl::OUString aTypeValue = xAttribs->getValueByName( m_aTypeAttr );
314             ::rtl::OUString aTargetValue = xAttribs->getValueByName( m_aTargetAttr );
315             ::rtl::OUString aTargetModeValue = xAttribs->getValueByName( m_aTargetModeAttr );
316 
317             m_aResultSeq[nNewEntryNum-1][++nAttrNum - 1].First = m_aIDAttr;
318             m_aResultSeq[nNewEntryNum-1][nAttrNum - 1].Second = aIDValue;
319 
320             if ( aTypeValue.getLength() )
321             {
322                 m_aResultSeq[nNewEntryNum-1][++nAttrNum - 1].First = m_aTypeAttr;
323                 m_aResultSeq[nNewEntryNum-1][nAttrNum - 1].Second = aTypeValue;
324             }
325 
326             if ( aTargetValue.getLength() )
327             {
328                 m_aResultSeq[nNewEntryNum-1][++nAttrNum - 1].First = m_aTargetAttr;
329                 m_aResultSeq[nNewEntryNum-1][nAttrNum - 1].Second = aTargetValue;
330             }
331 
332             if ( aTargetModeValue.getLength() )
333             {
334                 m_aResultSeq[nNewEntryNum-1][++nAttrNum - 1].First = m_aTargetModeAttr;
335                 m_aResultSeq[nNewEntryNum-1][nAttrNum - 1].Second = aTargetModeValue;
336             }
337 
338             m_aResultSeq[nNewEntryNum-1].realloc( nAttrNum );
339         }
340         else
341             throw xml::sax::SAXException(); // TODO: no other elements expected!
342     }
343     else if ( m_nFormat == CONTENTTYPE_FORMAT )
344     {
345         if ( aName == m_aTypesElement )
346         {
347             sal_Int32 nNewLength = m_aElementsSeq.getLength() + 1;
348 
349             if ( nNewLength != 1 )
350                 throw xml::sax::SAXException(); // TODO: this element must be the first level element
351 
352             m_aElementsSeq.realloc( nNewLength );
353             m_aElementsSeq[nNewLength-1] = aName;
354 
355             if ( !m_aResultSeq.getLength() )
356                 m_aResultSeq.realloc( 2 );
357 
358             return; // nothing to do
359         }
360         else if ( aName == m_aDefaultElement )
361         {
362             sal_Int32 nNewLength = m_aElementsSeq.getLength() + 1;
363             if ( nNewLength != 2 )
364                 throw xml::sax::SAXException(); // TODO: this element must be the second level element
365 
366             m_aElementsSeq.realloc( nNewLength );
367             m_aElementsSeq[nNewLength-1] = aName;
368 
369             if ( !m_aResultSeq.getLength() )
370                 m_aResultSeq.realloc( 2 );
371 
372             if ( m_aResultSeq.getLength() != 2 )
373                 throw uno::RuntimeException();
374 
375             ::rtl::OUString aExtensionValue = xAttribs->getValueByName( m_aExtensionAttr );
376             if ( !aExtensionValue.getLength() )
377                 throw xml::sax::SAXException(); // TODO: the Extension value must present
378 
379             ::rtl::OUString aContentTypeValue = xAttribs->getValueByName( m_aContentTypeAttr );
380             if ( !aContentTypeValue.getLength() )
381                 throw xml::sax::SAXException(); // TODO: the ContentType value must present
382 
383             sal_Int32 nNewResultLen = m_aResultSeq[0].getLength() + 1;
384             m_aResultSeq[0].realloc( nNewResultLen );
385 
386             m_aResultSeq[0][nNewResultLen-1].First = aExtensionValue;
387             m_aResultSeq[0][nNewResultLen-1].Second = aContentTypeValue;
388         }
389         else if ( aName == m_aOverrideElement )
390         {
391             sal_Int32 nNewLength = m_aElementsSeq.getLength() + 1;
392             if ( nNewLength != 2 )
393                 throw xml::sax::SAXException(); // TODO: this element must be the second level element
394 
395             m_aElementsSeq.realloc( nNewLength );
396             m_aElementsSeq[nNewLength-1] = aName;
397 
398             if ( !m_aResultSeq.getLength() )
399                 m_aResultSeq.realloc( 2 );
400 
401             if ( m_aResultSeq.getLength() != 2 )
402                 throw uno::RuntimeException();
403 
404             ::rtl::OUString aPartNameValue = xAttribs->getValueByName( m_aPartNameAttr );
405             if ( !aPartNameValue.getLength() )
406                 throw xml::sax::SAXException(); // TODO: the PartName value must present
407 
408             ::rtl::OUString aContentTypeValue = xAttribs->getValueByName( m_aContentTypeAttr );
409             if ( !aContentTypeValue.getLength() )
410                 throw xml::sax::SAXException(); // TODO: the ContentType value must present
411 
412             sal_Int32 nNewResultLen = m_aResultSeq[1].getLength() + 1;
413             m_aResultSeq[1].realloc( nNewResultLen );
414 
415             m_aResultSeq[1][nNewResultLen-1].First = aPartNameValue;
416             m_aResultSeq[1][nNewResultLen-1].Second = aContentTypeValue;
417         }
418         else
419             throw xml::sax::SAXException(); // TODO: no other elements expected!
420     }
421     else
422         throw xml::sax::SAXException(); // TODO: no other elements expected!
423 }
424 
425 // -----------------------------------
426 void SAL_CALL OFOPXMLHelper::endElement( const ::rtl::OUString& aName )
427     throw( xml::sax::SAXException, uno::RuntimeException )
428 {
429     if ( m_nFormat == RELATIONINFO_FORMAT || m_nFormat == CONTENTTYPE_FORMAT )
430     {
431         sal_Int32 nLength = m_aElementsSeq.getLength();
432         if ( nLength <= 0 )
433             throw xml::sax::SAXException(); // TODO: no other end elements expected!
434 
435         if ( !m_aElementsSeq[nLength-1].equals( aName ) )
436             throw xml::sax::SAXException(); // TODO: unexpected element ended
437 
438         m_aElementsSeq.realloc( nLength - 1 );
439     }
440 }
441 
442 // -----------------------------------
443 void SAL_CALL OFOPXMLHelper::characters( const ::rtl::OUString& /*aChars*/ )
444         throw(xml::sax::SAXException, uno::RuntimeException)
445 {
446 }
447 
448 // -----------------------------------
449 void SAL_CALL OFOPXMLHelper::ignorableWhitespace( const ::rtl::OUString& /*aWhitespaces*/ )
450         throw(xml::sax::SAXException, uno::RuntimeException)
451 {
452 }
453 
454 // -----------------------------------
455 void SAL_CALL OFOPXMLHelper::processingInstruction( const ::rtl::OUString& /*aTarget*/, const ::rtl::OUString& /*aData*/ )
456         throw(xml::sax::SAXException, uno::RuntimeException)
457 {
458 }
459 
460 // -----------------------------------
461 void SAL_CALL OFOPXMLHelper::setDocumentLocator( const uno::Reference< xml::sax::XLocator >& /*xLocator*/ )
462         throw(xml::sax::SAXException, uno::RuntimeException)
463 {
464 }
465 
466 } // namespace comphelper
467 
468