xref: /AOO41X/main/dbaccess/source/core/recovery/storagexmlstream.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
1*96de5490SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*96de5490SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*96de5490SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*96de5490SAndrew Rist  * distributed with this work for additional information
6*96de5490SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*96de5490SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*96de5490SAndrew Rist  * "License"); you may not use this file except in compliance
9*96de5490SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*96de5490SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*96de5490SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*96de5490SAndrew Rist  * software distributed under the License is distributed on an
15*96de5490SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*96de5490SAndrew Rist  * KIND, either express or implied.  See the License for the
17*96de5490SAndrew Rist  * specific language governing permissions and limitations
18*96de5490SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*96de5490SAndrew Rist  *************************************************************/
21*96de5490SAndrew Rist 
22*96de5490SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "precompiled_dbaccess.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "storagexmlstream.hxx"
27cdf0e10cSrcweir 
28cdf0e10cSrcweir /** === begin UNO includes === **/
29cdf0e10cSrcweir #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
30cdf0e10cSrcweir #include <com/sun/star/io/XActiveDataSource.hpp>
31cdf0e10cSrcweir #include <com/sun/star/xml/sax/XParser.hpp>
32cdf0e10cSrcweir /** === end UNO includes === **/
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <comphelper/componentcontext.hxx>
35cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx>
36cdf0e10cSrcweir #include <rtl/ref.hxx>
37cdf0e10cSrcweir #include <tools/diagnose_ex.h>
38cdf0e10cSrcweir #include <xmloff/attrlist.hxx>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #include <stack>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir //......................................................................................................................
43cdf0e10cSrcweir namespace dbaccess
44cdf0e10cSrcweir {
45cdf0e10cSrcweir //......................................................................................................................
46cdf0e10cSrcweir 
47cdf0e10cSrcweir 	/** === begin UNO using === **/
48cdf0e10cSrcweir 	using ::com::sun::star::uno::Reference;
49cdf0e10cSrcweir 	using ::com::sun::star::uno::XInterface;
50cdf0e10cSrcweir 	using ::com::sun::star::uno::UNO_QUERY;
51cdf0e10cSrcweir 	using ::com::sun::star::uno::UNO_QUERY_THROW;
52cdf0e10cSrcweir 	using ::com::sun::star::uno::UNO_SET_THROW;
53cdf0e10cSrcweir 	using ::com::sun::star::uno::Exception;
54cdf0e10cSrcweir 	using ::com::sun::star::uno::RuntimeException;
55cdf0e10cSrcweir 	using ::com::sun::star::uno::Any;
56cdf0e10cSrcweir 	using ::com::sun::star::uno::makeAny;
57cdf0e10cSrcweir 	using ::com::sun::star::uno::Sequence;
58cdf0e10cSrcweir 	using ::com::sun::star::uno::Type;
59cdf0e10cSrcweir     using ::com::sun::star::embed::XStorage;
60cdf0e10cSrcweir     using ::com::sun::star::xml::sax::XDocumentHandler;
61cdf0e10cSrcweir     using ::com::sun::star::xml::sax::XAttributeList;
62cdf0e10cSrcweir     using ::com::sun::star::io::XStream;
63cdf0e10cSrcweir     using ::com::sun::star::io::XOutputStream;
64cdf0e10cSrcweir     using ::com::sun::star::io::XActiveDataSource;
65cdf0e10cSrcweir     using ::com::sun::star::xml::sax::XParser;
66cdf0e10cSrcweir     using ::com::sun::star::xml::sax::InputSource;
67cdf0e10cSrcweir 	/** === end UNO using === **/
68cdf0e10cSrcweir 
69cdf0e10cSrcweir 	//==================================================================================================================
70cdf0e10cSrcweir 	//= StorageXMLOutputStream_Data
71cdf0e10cSrcweir 	//==================================================================================================================
72cdf0e10cSrcweir     struct StorageXMLOutputStream_Data
73cdf0e10cSrcweir     {
74cdf0e10cSrcweir         Reference< XDocumentHandler >           xHandler;
75cdf0e10cSrcweir         ::std::stack< ::rtl::OUString >         aElements;
76cdf0e10cSrcweir         ::rtl::Reference< SvXMLAttributeList >  xAttributes;
77cdf0e10cSrcweir     };
78cdf0e10cSrcweir 
79cdf0e10cSrcweir 	//==================================================================================================================
80cdf0e10cSrcweir 	//= StorageXMLOutputStream
81cdf0e10cSrcweir 	//==================================================================================================================
82cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
StorageXMLOutputStream(const::comphelper::ComponentContext & i_rContext,const Reference<XStorage> & i_rParentStorage,const::rtl::OUString & i_rStreamName)83cdf0e10cSrcweir     StorageXMLOutputStream::StorageXMLOutputStream( const ::comphelper::ComponentContext& i_rContext,
84cdf0e10cSrcweir                                                     const Reference< XStorage >& i_rParentStorage,
85cdf0e10cSrcweir                                                     const ::rtl::OUString& i_rStreamName )
86cdf0e10cSrcweir         :StorageOutputStream( i_rContext, i_rParentStorage, i_rStreamName )
87cdf0e10cSrcweir         ,m_pData( new StorageXMLOutputStream_Data )
88cdf0e10cSrcweir     {
89cdf0e10cSrcweir         const Reference< XActiveDataSource > xSaxWriter( i_rContext.createComponent( "com.sun.star.xml.sax.Writer" ), UNO_QUERY_THROW );
90cdf0e10cSrcweir         xSaxWriter->setOutputStream( getOutputStream() );
91cdf0e10cSrcweir 
92cdf0e10cSrcweir         m_pData->xHandler.set( xSaxWriter, UNO_QUERY_THROW );
93cdf0e10cSrcweir         m_pData->xHandler->startDocument();
94cdf0e10cSrcweir 
95cdf0e10cSrcweir         m_pData->xAttributes = new SvXMLAttributeList;
96cdf0e10cSrcweir     }
97cdf0e10cSrcweir 
98cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
~StorageXMLOutputStream()99cdf0e10cSrcweir     StorageXMLOutputStream::~StorageXMLOutputStream()
100cdf0e10cSrcweir     {
101cdf0e10cSrcweir     }
102cdf0e10cSrcweir 
103cdf0e10cSrcweir     //------------------------------------------------------------------------------------------------------------------
close()104cdf0e10cSrcweir     void StorageXMLOutputStream::close()
105cdf0e10cSrcweir     {
106cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( m_pData->xHandler.is(), "illegal document handler" );
107cdf0e10cSrcweir         m_pData->xHandler->endDocument();
108cdf0e10cSrcweir         // do not call the base class, it would call closeOutput on the output stream, which is already done by
109cdf0e10cSrcweir         // endDocument
110cdf0e10cSrcweir     }
111cdf0e10cSrcweir 
112cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
addAttribute(const::rtl::OUString & i_rName,const::rtl::OUString & i_rValue) const113cdf0e10cSrcweir     void StorageXMLOutputStream::addAttribute( const ::rtl::OUString& i_rName, const ::rtl::OUString& i_rValue ) const
114cdf0e10cSrcweir     {
115cdf0e10cSrcweir         m_pData->xAttributes->AddAttribute( i_rName, i_rValue );
116cdf0e10cSrcweir     }
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
startElement(const::rtl::OUString & i_rElementName) const119cdf0e10cSrcweir     void StorageXMLOutputStream::startElement( const ::rtl::OUString& i_rElementName ) const
120cdf0e10cSrcweir     {
121cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( m_pData->xHandler.is(), "no document handler" );
122cdf0e10cSrcweir 
123cdf0e10cSrcweir         m_pData->xHandler->startElement( i_rElementName, m_pData->xAttributes.get() );
124cdf0e10cSrcweir         m_pData->xAttributes = new SvXMLAttributeList;
125cdf0e10cSrcweir         m_pData->aElements.push( i_rElementName );
126cdf0e10cSrcweir     }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
endElement() const129cdf0e10cSrcweir     void StorageXMLOutputStream::endElement() const
130cdf0e10cSrcweir     {
131cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( m_pData->xHandler.is(), "no document handler" );
132cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( !m_pData->aElements.empty(), "no element on the stack" );
133cdf0e10cSrcweir 
134cdf0e10cSrcweir         const ::rtl::OUString sElementName( m_pData->aElements.top() );
135cdf0e10cSrcweir         m_pData->xHandler->endElement( sElementName );
136cdf0e10cSrcweir         m_pData->aElements.pop();
137cdf0e10cSrcweir     }
138cdf0e10cSrcweir 
139cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
ignorableWhitespace(const::rtl::OUString & i_rWhitespace) const140cdf0e10cSrcweir     void StorageXMLOutputStream::ignorableWhitespace( const ::rtl::OUString& i_rWhitespace ) const
141cdf0e10cSrcweir     {
142cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( m_pData->xHandler.is(), "no document handler" );
143cdf0e10cSrcweir 
144cdf0e10cSrcweir         m_pData->xHandler->ignorableWhitespace( i_rWhitespace );
145cdf0e10cSrcweir     }
146cdf0e10cSrcweir 
147cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
characters(const::rtl::OUString & i_rCharacters) const148cdf0e10cSrcweir     void StorageXMLOutputStream::characters( const ::rtl::OUString& i_rCharacters ) const
149cdf0e10cSrcweir     {
150cdf0e10cSrcweir         ENSURE_OR_RETURN_VOID( m_pData->xHandler.is(), "no document handler" );
151cdf0e10cSrcweir 
152cdf0e10cSrcweir         m_pData->xHandler->characters( i_rCharacters );
153cdf0e10cSrcweir     }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir 	//==================================================================================================================
156cdf0e10cSrcweir 	//= StorageXMLInputStream_Data
157cdf0e10cSrcweir 	//==================================================================================================================
158cdf0e10cSrcweir     struct StorageXMLInputStream_Data
159cdf0e10cSrcweir     {
160cdf0e10cSrcweir         Reference< XParser >    xParser;
161cdf0e10cSrcweir     };
162cdf0e10cSrcweir 
163cdf0e10cSrcweir 	//==================================================================================================================
164cdf0e10cSrcweir 	//= StorageXMLInputStream
165cdf0e10cSrcweir 	//==================================================================================================================
166cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
StorageXMLInputStream(const::comphelper::ComponentContext & i_rContext,const Reference<XStorage> & i_rParentStorage,const::rtl::OUString & i_rStreamName)167cdf0e10cSrcweir     StorageXMLInputStream::StorageXMLInputStream( const ::comphelper::ComponentContext& i_rContext,
168cdf0e10cSrcweir                                                   const Reference< XStorage >& i_rParentStorage,
169cdf0e10cSrcweir                                                   const ::rtl::OUString& i_rStreamName )
170cdf0e10cSrcweir         :StorageInputStream( i_rContext, i_rParentStorage, i_rStreamName )
171cdf0e10cSrcweir         ,m_pData( new StorageXMLInputStream_Data )
172cdf0e10cSrcweir     {
173cdf0e10cSrcweir         m_pData->xParser.set( i_rContext.createComponent( "com.sun.star.xml.sax.Parser" ), UNO_QUERY_THROW );
174cdf0e10cSrcweir     }
175cdf0e10cSrcweir 
176cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
import(const Reference<XDocumentHandler> & i_rHandler)177cdf0e10cSrcweir     void StorageXMLInputStream::import( const Reference< XDocumentHandler >& i_rHandler )
178cdf0e10cSrcweir     {
179cdf0e10cSrcweir         ENSURE_OR_THROW( i_rHandler.is(), "illegal document handler (NULL)" );
180cdf0e10cSrcweir 
181cdf0e10cSrcweir         InputSource aInputSource;
182cdf0e10cSrcweir         aInputSource.aInputStream = getInputStream();
183cdf0e10cSrcweir 
184cdf0e10cSrcweir         m_pData->xParser->setDocumentHandler( i_rHandler );
185cdf0e10cSrcweir         m_pData->xParser->parseStream( aInputSource );
186cdf0e10cSrcweir     }
187cdf0e10cSrcweir 
188cdf0e10cSrcweir 	//------------------------------------------------------------------------------------------------------------------
~StorageXMLInputStream()189cdf0e10cSrcweir     StorageXMLInputStream::~StorageXMLInputStream()
190cdf0e10cSrcweir     {
191cdf0e10cSrcweir     }
192cdf0e10cSrcweir 
193cdf0e10cSrcweir //......................................................................................................................
194cdf0e10cSrcweir } // namespace dbaccess
195cdf0e10cSrcweir //......................................................................................................................
196