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 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_extensions.hxx" 26 27 #include "xmxtrct.hxx" 28 29 #include <rtl/memory.h> 30 #include <tools/zcodec.hxx> 31 #include <unotools/streamhelper.hxx> 32 #include <sot/storage.hxx> 33 34 // ---------------- 35 // - XMXLockBytes - 36 // ---------------- 37 38 class XMXLockBytes : public SvLockBytes 39 { 40 REF( NMSP_IO::XInputStream ) mxIStm; 41 SEQ( sal_Int8 ) maSeq; 42 43 XMXLockBytes(); 44 45 public: 46 47 XMXLockBytes( const REF( NMSP_IO::XInputStream )& rxIStm ); 48 virtual ~XMXLockBytes(); 49 50 virtual ErrCode ReadAt( sal_Size nPos, void* pBuffer, sal_Size nCount, sal_Size* pRead ) const; 51 virtual ErrCode WriteAt( sal_Size nPos, const void* pBuffer, sal_Size nCount, sal_Size* pWritten ); 52 virtual ErrCode Flush() const; 53 virtual ErrCode SetSize( sal_Size nSize ); 54 virtual ErrCode Stat( SvLockBytesStat*, SvLockBytesStatFlag ) const; 55 }; 56 57 // ------------------------------------------------------------------------ 58 59 XMXLockBytes::XMXLockBytes( const REF( NMSP_IO::XInputStream )& rxIStm ) : 60 mxIStm( rxIStm ) 61 { 62 if( mxIStm.is() ) 63 { 64 const sal_uInt32 nBytesToRead = 65535; 65 sal_uInt32 nRead; 66 67 do 68 { 69 SEQ( sal_Int8 ) aReadSeq; 70 71 nRead = mxIStm->readSomeBytes( aReadSeq, nBytesToRead ); 72 73 if( nRead ) 74 { 75 const sal_uInt32 nOldLength = maSeq.getLength(); 76 maSeq.realloc( nOldLength + nRead ); 77 rtl_copyMemory( maSeq.getArray() + nOldLength, aReadSeq.getConstArray(), aReadSeq.getLength() ); 78 } 79 } 80 while( nBytesToRead == nRead ); 81 } 82 } 83 84 // ------------------------------------------------------------------------ 85 86 XMXLockBytes::~XMXLockBytes() 87 { 88 } 89 90 // ------------------------------------------------------------------------ 91 92 ErrCode XMXLockBytes::ReadAt( sal_Size nPos, void* pBuffer, sal_Size nCount, sal_Size* pRead ) const 93 { 94 const sal_Size nSeqLen = maSeq.getLength(); 95 ErrCode nErr = ERRCODE_NONE; 96 97 if( nPos < nSeqLen ) 98 { 99 if( ( nPos + nCount ) > nSeqLen ) 100 nCount = nSeqLen - nPos; 101 102 rtl_copyMemory( pBuffer, maSeq.getConstArray() + nPos, nCount ); 103 *pRead = nCount; 104 } 105 else 106 *pRead = 0UL; 107 108 return nErr; 109 } 110 111 // ------------------------------------------------------------------------ 112 113 ErrCode XMXLockBytes::WriteAt( sal_Size /*nPos*/, const void* /*pBuffer*/, sal_Size /*nCount*/, sal_Size* /*pWritten*/ ) 114 { 115 return ERRCODE_IO_CANTWRITE; 116 } 117 118 // ------------------------------------------------------------------------ 119 120 ErrCode XMXLockBytes::Flush() const 121 { 122 return ERRCODE_NONE; 123 } 124 125 // ------------------------------------------------------------------------ 126 127 ErrCode XMXLockBytes::SetSize( sal_Size /*nSize*/ ) 128 { 129 return ERRCODE_IO_CANTWRITE; 130 } 131 132 // ------------------------------------------------------------------------ 133 134 ErrCode XMXLockBytes::Stat( SvLockBytesStat* pStat, SvLockBytesStatFlag /*eFlag*/ ) const 135 { 136 pStat->nSize = maSeq.getLength(); 137 return ERRCODE_NONE; 138 } 139 140 // ---------------- 141 // - XMLExtractor - 142 // ---------------- 143 144 XMLExtractor::XMLExtractor( const REF( NMSP_LANG::XMultiServiceFactory )& rxMgr ) : 145 mxFact( rxMgr ) 146 { 147 } 148 149 // ----------------------------------------------------------------------------- 150 151 XMLExtractor::~XMLExtractor() 152 { 153 } 154 155 // ----------------------------------------------------------------------------- 156 157 REF( NMSP_IO::XInputStream ) SAL_CALL XMLExtractor::extract( const REF( NMSP_IO::XInputStream )& rxIStm ) throw( NMSP_UNO::RuntimeException ) 158 { 159 REF( NMSP_IO::XInputStream ) xRet; 160 161 if( rxIStm.is() ) 162 { 163 SvStream aIStm( new XMXLockBytes( rxIStm ) ); 164 SvStorageRef aStorage( new SvStorage( aIStm ) ); 165 String aStmName; 166 const String aFormat1( String::CreateFromAscii( "XMLFormat" ) ); 167 const String aFormat2( String::CreateFromAscii( "XMLFormat2" ) ); 168 169 if( aStorage->IsContained( aFormat2 ) ) 170 aStmName = aFormat2; 171 else if( aStorage->IsContained( aFormat1 ) ) 172 aStmName = aFormat1; 173 174 if( !aStorage->GetError() && aStmName.Len() && aStorage->IsStream( aStmName ) ) 175 { 176 SvStorageStreamRef xStream( aStorage->OpenSotStream( aStmName ) ); 177 178 if( xStream.Is() ) 179 { 180 SvMemoryStream* pMemStm = new SvMemoryStream( 65535, 65535 ); 181 ZCodec aCodec; 182 183 aCodec.BeginCompression( ZCODEC_BEST_COMPRESSION ); 184 aCodec.Decompress( *xStream, *pMemStm ); 185 aCodec.EndCompression(); 186 187 xRet = new ::utl::OInputStreamHelper( new SvLockBytes( pMemStm, sal_True ), 65535 ); 188 } 189 } 190 } 191 192 return xRet; 193 } 194