xref: /AOO41X/main/extensions/source/xmlextract/xmxtrct.cxx (revision 2a97ec55f1442d65917e8c8b82a55ab76c9ff676)
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 
XMXLockBytes(const REF (NMSP_IO::XInputStream)& rxIStm)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 
~XMXLockBytes()86 XMXLockBytes::~XMXLockBytes()
87 {
88 }
89 
90 // ------------------------------------------------------------------------
91 
ReadAt(sal_Size nPos,void * pBuffer,sal_Size nCount,sal_Size * pRead) const92 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 
WriteAt(sal_Size,const void *,sal_Size,sal_Size *)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 
Flush() const120 ErrCode XMXLockBytes::Flush() const
121 {
122     return ERRCODE_NONE;
123 }
124 
125 // ------------------------------------------------------------------------
126 
SetSize(sal_Size)127 ErrCode XMXLockBytes::SetSize( sal_Size /*nSize*/ )
128 {
129     return ERRCODE_IO_CANTWRITE;
130 }
131 
132 // ------------------------------------------------------------------------
133 
Stat(SvLockBytesStat * pStat,SvLockBytesStatFlag) const134 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 
XMLExtractor(const REF (NMSP_LANG::XMultiServiceFactory)& rxMgr)144 XMLExtractor::XMLExtractor( const REF( NMSP_LANG::XMultiServiceFactory )& rxMgr ) :
145     mxFact( rxMgr )
146 {
147 }
148 
149 // -----------------------------------------------------------------------------
150 
~XMLExtractor()151 XMLExtractor::~XMLExtractor()
152 {
153 }
154 
155 // -----------------------------------------------------------------------------
156 
REF(NMSP_IO::XInputStream)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