1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include <stdio.h>
25*b1cdbd2cSJim Jagielski /*#include <libxml/xmlstring.h>
26*b1cdbd2cSJim Jagielski */
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
29*b1cdbd2cSJim Jagielski #include <pk11func.h>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <cppuhelper/bootstrap.hxx>
32*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
33*b1cdbd2cSJim Jagielski #include <cppuhelper/servicefactory.hxx>
34*b1cdbd2cSJim Jagielski #include <ucbhelper/contentbroker.hxx>
35*b1cdbd2cSJim Jagielski #include <ucbhelper/configurationkeys.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/bridge/XUnoUrlResolver.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/registry/XImplementationRegistration.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XFilter.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XExporter.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XImporter.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XInputStream.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XOutputStream.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XActiveDataSource.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/crypto/XUriBinding.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/wrapper/XXMLElementWrapper.hpp>
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XParser.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/InputSource.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XInputStream.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XOutputStream.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XNamingService.hpp>
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski using namespace ::rtl ;
63*b1cdbd2cSJim Jagielski using namespace ::cppu ;
64*b1cdbd2cSJim Jagielski using namespace ::com::sun::star ;
65*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno ;
66*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::io ;
67*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ucb ;
68*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans ;
69*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::document ;
70*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang ;
71*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::bridge ;
72*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::registry ;
73*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::task ;
74*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::xml ;
75*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::xml::wrapper ;
76*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::xml::sax ;
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski /**
80*b1cdbd2cSJim Jagielski  * Helper: Implementation of XInputStream
81*b1cdbd2cSJim Jagielski  */
82*b1cdbd2cSJim Jagielski class OInputStream : public WeakImplHelper1 < XInputStream >
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski 	public:
OInputStream(const Sequence<sal_Int8> & seq)85*b1cdbd2cSJim Jagielski 		OInputStream( const Sequence< sal_Int8 >&seq ) : m_seq( seq ), nPos( 0 ) {}
86*b1cdbd2cSJim Jagielski 
readBytes(Sequence<sal_Int8> & aData,sal_Int32 nBytesToRead)87*b1cdbd2cSJim Jagielski 		virtual sal_Int32 SAL_CALL readBytes(
88*b1cdbd2cSJim Jagielski 			Sequence< sal_Int8 >& aData ,
89*b1cdbd2cSJim Jagielski 			sal_Int32 nBytesToRead
90*b1cdbd2cSJim Jagielski 		) throw( NotConnectedException, BufferSizeExceededException, IOException, RuntimeException )
91*b1cdbd2cSJim Jagielski 		{
92*b1cdbd2cSJim Jagielski 			nBytesToRead = ( nBytesToRead > m_seq.getLength() - nPos ) ?
93*b1cdbd2cSJim Jagielski 				m_seq.getLength() - nPos :
94*b1cdbd2cSJim Jagielski 				nBytesToRead ;
95*b1cdbd2cSJim Jagielski 			aData = Sequence< sal_Int8 > ( &( m_seq.getConstArray()[nPos] ), nBytesToRead ) ;
96*b1cdbd2cSJim Jagielski 			nPos += nBytesToRead ;
97*b1cdbd2cSJim Jagielski 			return nBytesToRead ;
98*b1cdbd2cSJim Jagielski 		}
99*b1cdbd2cSJim Jagielski 
readSomeBytes(::com::sun::star::uno::Sequence<sal_Int8> & aData,sal_Int32 nMaxBytesToRead)100*b1cdbd2cSJim Jagielski 		virtual sal_Int32 SAL_CALL readSomeBytes(
101*b1cdbd2cSJim Jagielski 			::com::sun::star::uno::Sequence< sal_Int8 >& aData ,
102*b1cdbd2cSJim Jagielski 			sal_Int32 nMaxBytesToRead
103*b1cdbd2cSJim Jagielski 		) throw( NotConnectedException, BufferSizeExceededException, IOException, RuntimeException )
104*b1cdbd2cSJim Jagielski 		{
105*b1cdbd2cSJim Jagielski 			return readBytes( aData, nMaxBytesToRead ) ;
106*b1cdbd2cSJim Jagielski 		}
107*b1cdbd2cSJim Jagielski 
skipBytes(sal_Int32 nBytesToSkip)108*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL skipBytes(
109*b1cdbd2cSJim Jagielski 			sal_Int32 nBytesToSkip
110*b1cdbd2cSJim Jagielski 		) throw( NotConnectedException, BufferSizeExceededException, IOException, RuntimeException )
111*b1cdbd2cSJim Jagielski 		{
112*b1cdbd2cSJim Jagielski 			// not implemented
113*b1cdbd2cSJim Jagielski 		}
114*b1cdbd2cSJim Jagielski 
available(void)115*b1cdbd2cSJim Jagielski 		virtual sal_Int32 SAL_CALL available(
116*b1cdbd2cSJim Jagielski 			void
117*b1cdbd2cSJim Jagielski 		) throw( NotConnectedException, IOException, RuntimeException )
118*b1cdbd2cSJim Jagielski 		{
119*b1cdbd2cSJim Jagielski 			return m_seq.getLength() - nPos ;
120*b1cdbd2cSJim Jagielski 		}
121*b1cdbd2cSJim Jagielski 
closeInput(void)122*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL closeInput(
123*b1cdbd2cSJim Jagielski 			void
124*b1cdbd2cSJim Jagielski 		) throw( NotConnectedException, IOException, RuntimeException )
125*b1cdbd2cSJim Jagielski 		{
126*b1cdbd2cSJim Jagielski 			// not needed
127*b1cdbd2cSJim Jagielski 		}
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 	private:
130*b1cdbd2cSJim Jagielski 		sal_Int32 nPos;
131*b1cdbd2cSJim Jagielski 		Sequence< sal_Int8> m_seq;
132*b1cdbd2cSJim Jagielski } ;
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski /**
135*b1cdbd2cSJim Jagielski  * Helper : create a input stream from a file
136*b1cdbd2cSJim Jagielski  */
137*b1cdbd2cSJim Jagielski Reference< XInputStream > createStreamFromFile( const OUString sFile ) ;
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski /**
140*b1cdbd2cSJim Jagielski  * Helper: Implementation of XOutputStream
141*b1cdbd2cSJim Jagielski  */
142*b1cdbd2cSJim Jagielski class OOutputStream : public WeakImplHelper1 < XOutputStream >
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski 	public:
OOutputStream(const char * pcFile)145*b1cdbd2cSJim Jagielski 		OOutputStream( const char *pcFile ) {
146*b1cdbd2cSJim Jagielski 			strcpy( m_pcFile , pcFile ) ;
147*b1cdbd2cSJim Jagielski 			m_f = 0 ;
148*b1cdbd2cSJim Jagielski 		}
149*b1cdbd2cSJim Jagielski 
writeBytes(const Sequence<sal_Int8> & aData)150*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL writeBytes(
151*b1cdbd2cSJim Jagielski 			const Sequence< sal_Int8 >& aData
152*b1cdbd2cSJim Jagielski 		) throw( NotConnectedException , BufferSizeExceededException , RuntimeException ) {
153*b1cdbd2cSJim Jagielski 			if( !m_f ) {
154*b1cdbd2cSJim Jagielski 				m_f = fopen( m_pcFile , "w" ) ;
155*b1cdbd2cSJim Jagielski 			}
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 			fwrite( aData.getConstArray() , 1 , aData.getLength() , m_f ) ;
158*b1cdbd2cSJim Jagielski 		}
159*b1cdbd2cSJim Jagielski 
flush(void)160*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL flush(
161*b1cdbd2cSJim Jagielski 			void
162*b1cdbd2cSJim Jagielski 		) throw( NotConnectedException , BufferSizeExceededException , RuntimeException ) {
163*b1cdbd2cSJim Jagielski 			fflush( m_f ) ;
164*b1cdbd2cSJim Jagielski 		}
165*b1cdbd2cSJim Jagielski 
closeOutput(void)166*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL closeOutput(
167*b1cdbd2cSJim Jagielski 			void
168*b1cdbd2cSJim Jagielski 		) throw( NotConnectedException , BufferSizeExceededException , RuntimeException ) {
169*b1cdbd2cSJim Jagielski 			fclose( m_f ) ;
170*b1cdbd2cSJim Jagielski 			m_f = 0 ;
171*b1cdbd2cSJim Jagielski 		}
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	private:
174*b1cdbd2cSJim Jagielski 		char m_pcFile[256];
175*b1cdbd2cSJim Jagielski 		FILE *m_f;
176*b1cdbd2cSJim Jagielski } ;
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski /**
179*b1cdbd2cSJim Jagielski  * Helper: Implementation of XUriBinding
180*b1cdbd2cSJim Jagielski  */
181*b1cdbd2cSJim Jagielski class OUriBinding : public WeakImplHelper1 < ::com::sun::star::xml::crypto::XUriBinding >
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski 	public:
OUriBinding()184*b1cdbd2cSJim Jagielski 		OUriBinding() {
185*b1cdbd2cSJim Jagielski 			//Do nothing
186*b1cdbd2cSJim Jagielski 		}
187*b1cdbd2cSJim Jagielski 
OUriBinding(::rtl::OUString & aUri,::com::sun::star::uno::Reference<com::sun::star::io::XInputStream> & aInputStream)188*b1cdbd2cSJim Jagielski 		OUriBinding(
189*b1cdbd2cSJim Jagielski 			::rtl::OUString& aUri,
190*b1cdbd2cSJim Jagielski 			::com::sun::star::uno::Reference< com::sun::star::io::XInputStream >& aInputStream ) {
191*b1cdbd2cSJim Jagielski 			m_vUris.push_back( aUri ) ;
192*b1cdbd2cSJim Jagielski 			m_vStreams.push_back( aInputStream ) ;
193*b1cdbd2cSJim Jagielski 		}
194*b1cdbd2cSJim Jagielski 
setUriBinding(const::rtl::OUString & aUri,const::com::sun::star::uno::Reference<::com::sun::star::io::XInputStream> & aInputStream)195*b1cdbd2cSJim Jagielski 		virtual void SAL_CALL setUriBinding(
196*b1cdbd2cSJim Jagielski 			const ::rtl::OUString& aUri ,
197*b1cdbd2cSJim Jagielski 			const ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >& aInputStream
198*b1cdbd2cSJim Jagielski 		) throw( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ) {
199*b1cdbd2cSJim Jagielski 			m_vUris.push_back( aUri ) ;
200*b1cdbd2cSJim Jagielski 			m_vStreams.push_back( aInputStream ) ;
201*b1cdbd2cSJim Jagielski 		}
202*b1cdbd2cSJim Jagielski 
getUriBinding(const::rtl::OUString & uri)203*b1cdbd2cSJim Jagielski 		virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getUriBinding( const ::rtl::OUString& uri ) throw( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ) {
204*b1cdbd2cSJim Jagielski 			::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > xInputStream ;
205*b1cdbd2cSJim Jagielski 
206*b1cdbd2cSJim Jagielski 			int size = m_vUris.size() ;
207*b1cdbd2cSJim Jagielski 			for( int i = 0 ; i<size ; ++i ) {
208*b1cdbd2cSJim Jagielski 				if( uri == m_vUris[i] ) {
209*b1cdbd2cSJim Jagielski 					xInputStream = m_vStreams[i];
210*b1cdbd2cSJim Jagielski 					break;
211*b1cdbd2cSJim Jagielski 				}
212*b1cdbd2cSJim Jagielski 			}
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 			return xInputStream;
215*b1cdbd2cSJim Jagielski 		}
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 	private:
218*b1cdbd2cSJim Jagielski 		std::vector< ::rtl::OUString > m_vUris ;
219*b1cdbd2cSJim Jagielski 		std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > > m_vStreams ;
220*b1cdbd2cSJim Jagielski } ;
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski /**
223*b1cdbd2cSJim Jagielski  * Helper : set a output stream to a file
224*b1cdbd2cSJim Jagielski  */
225*b1cdbd2cSJim Jagielski Reference< XOutputStream > createStreamToFile( const OUString sFile ) ;
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski /**
228*b1cdbd2cSJim Jagielski  * Helper : get service manager and context
229*b1cdbd2cSJim Jagielski  */
230*b1cdbd2cSJim Jagielski Reference< XMultiComponentFactory > serviceManager( Reference< XComponentContext >& xContext , OUString sUnoUrl , OUString sRdbUrl  ) throw( RuntimeException , Exception ) ;
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski /**
233*b1cdbd2cSJim Jagielski  * Helper : Get password function for PKCS11 slot
234*b1cdbd2cSJim Jagielski  */
235*b1cdbd2cSJim Jagielski char* PriPK11PasswordFunc( PK11SlotInfo *slot , PRBool retry , void* arg ) ;
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski 
238