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