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