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 // MARKER( update_precomp.py ): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_package.hxx"
26*b1cdbd2cSJim Jagielski #include <com/sun/star/packages/zip/ZipConstants.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/embed/StorageFormats.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/packages/zip/ZipIOException.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XInputStream.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XOutputStream.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XStream.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XSeekable.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/crypto/DigestID.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/crypto/CipherID.hpp>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <ZipPackageStream.hxx>
38*b1cdbd2cSJim Jagielski #include <ZipPackage.hxx>
39*b1cdbd2cSJim Jagielski #include <ZipFile.hxx>
40*b1cdbd2cSJim Jagielski #include <EncryptedDataHeader.hxx>
41*b1cdbd2cSJim Jagielski #include <vos/diagnose.hxx>
42*b1cdbd2cSJim Jagielski #include "wrapstreamforshare.hxx"
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include <comphelper/seekableinput.hxx>
45*b1cdbd2cSJim Jagielski #include <comphelper/storagehelper.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <rtl/instance.hxx>
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #include <PackageConstants.hxx>
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski using namespace com::sun::star::packages::zip::ZipConstants;
52*b1cdbd2cSJim Jagielski using namespace com::sun::star::packages::zip;
53*b1cdbd2cSJim Jagielski using namespace com::sun::star::uno;
54*b1cdbd2cSJim Jagielski using namespace com::sun::star::lang;
55*b1cdbd2cSJim Jagielski using namespace com::sun::star;
56*b1cdbd2cSJim Jagielski using namespace cppu;
57*b1cdbd2cSJim Jagielski using namespace rtl;
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski namespace { struct lcl_CachedImplId : public rtl::Static< Sequence < sal_Int8 >, lcl_CachedImplId > {}; }
60*b1cdbd2cSJim Jagielski 
static_getImplementationId()61*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Sequence < sal_Int8 >& ZipPackageStream::static_getImplementationId()
62*b1cdbd2cSJim Jagielski {
63*b1cdbd2cSJim Jagielski     return lcl_CachedImplId::get();
64*b1cdbd2cSJim Jagielski }
65*b1cdbd2cSJim Jagielski 
ZipPackageStream(ZipPackage & rNewPackage,const uno::Reference<XMultiServiceFactory> & xFactory,sal_Bool bAllowRemoveOnInsert)66*b1cdbd2cSJim Jagielski ZipPackageStream::ZipPackageStream ( ZipPackage & rNewPackage,
67*b1cdbd2cSJim Jagielski 									const uno::Reference< XMultiServiceFactory >& xFactory,
68*b1cdbd2cSJim Jagielski 									sal_Bool bAllowRemoveOnInsert )
69*b1cdbd2cSJim Jagielski : m_xFactory( xFactory )
70*b1cdbd2cSJim Jagielski , rZipPackage( rNewPackage )
71*b1cdbd2cSJim Jagielski , bToBeCompressed ( sal_True )
72*b1cdbd2cSJim Jagielski , bToBeEncrypted ( sal_False )
73*b1cdbd2cSJim Jagielski , bHaveOwnKey ( sal_False )
74*b1cdbd2cSJim Jagielski , bIsEncrypted ( sal_False )
75*b1cdbd2cSJim Jagielski , m_nImportedStartKeyAlgorithm( 0 )
76*b1cdbd2cSJim Jagielski , m_nImportedEncryptionAlgorithm( 0 )
77*b1cdbd2cSJim Jagielski , m_nImportedChecksumAlgorithm( 0 )
78*b1cdbd2cSJim Jagielski , m_nImportedDerivedKeySize( 0 )
79*b1cdbd2cSJim Jagielski , m_nStreamMode( PACKAGE_STREAM_NOTSET )
80*b1cdbd2cSJim Jagielski , m_nMagicalHackPos( 0 )
81*b1cdbd2cSJim Jagielski , m_nMagicalHackSize( 0 )
82*b1cdbd2cSJim Jagielski , m_bHasSeekable( sal_False )
83*b1cdbd2cSJim Jagielski , m_bCompressedIsSetFromOutside( sal_False )
84*b1cdbd2cSJim Jagielski , m_bFromManifest( sal_False )
85*b1cdbd2cSJim Jagielski , m_bUseWinEncoding( false )
86*b1cdbd2cSJim Jagielski {
87*b1cdbd2cSJim Jagielski 	OSL_ENSURE( m_xFactory.is(), "No factory is provided to ZipPackageStream!\n" );
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski 	this->mbAllowRemoveOnInsert = bAllowRemoveOnInsert;
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 	SetFolder ( sal_False );
92*b1cdbd2cSJim Jagielski 	aEntry.nVersion		= -1;
93*b1cdbd2cSJim Jagielski 	aEntry.nFlag		= 0;
94*b1cdbd2cSJim Jagielski 	aEntry.nMethod		= -1;
95*b1cdbd2cSJim Jagielski 	aEntry.nTime		= -1;
96*b1cdbd2cSJim Jagielski 	aEntry.nCrc			= -1;
97*b1cdbd2cSJim Jagielski 	aEntry.nCompressedSize	= -1;
98*b1cdbd2cSJim Jagielski 	aEntry.nSize		= -1;
99*b1cdbd2cSJim Jagielski 	aEntry.nOffset		= -1;
100*b1cdbd2cSJim Jagielski 	aEntry.nPathLen		= -1;
101*b1cdbd2cSJim Jagielski 	aEntry.nExtraLen	= -1;
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 	Sequence < sal_Int8 > &rCachedImplId = lcl_CachedImplId::get();
104*b1cdbd2cSJim Jagielski 	if ( !rCachedImplId.getLength() )
105*b1cdbd2cSJim Jagielski 	    rCachedImplId = getImplementationId();
106*b1cdbd2cSJim Jagielski }
107*b1cdbd2cSJim Jagielski 
~ZipPackageStream(void)108*b1cdbd2cSJim Jagielski ZipPackageStream::~ZipPackageStream( void )
109*b1cdbd2cSJim Jagielski {
110*b1cdbd2cSJim Jagielski }
111*b1cdbd2cSJim Jagielski 
setZipEntryOnLoading(const ZipEntry & rInEntry)112*b1cdbd2cSJim Jagielski void ZipPackageStream::setZipEntryOnLoading( const ZipEntry &rInEntry )
113*b1cdbd2cSJim Jagielski {
114*b1cdbd2cSJim Jagielski 	aEntry.nVersion = rInEntry.nVersion;
115*b1cdbd2cSJim Jagielski 	aEntry.nFlag = rInEntry.nFlag;
116*b1cdbd2cSJim Jagielski 	aEntry.nMethod = rInEntry.nMethod;
117*b1cdbd2cSJim Jagielski 	aEntry.nTime = rInEntry.nTime;
118*b1cdbd2cSJim Jagielski 	aEntry.nCrc = rInEntry.nCrc;
119*b1cdbd2cSJim Jagielski 	aEntry.nCompressedSize = rInEntry.nCompressedSize;
120*b1cdbd2cSJim Jagielski 	aEntry.nSize = rInEntry.nSize;
121*b1cdbd2cSJim Jagielski 	aEntry.nOffset = rInEntry.nOffset;
122*b1cdbd2cSJim Jagielski 	aEntry.sPath = rInEntry.sPath;
123*b1cdbd2cSJim Jagielski 	aEntry.nPathLen = rInEntry.nPathLen;
124*b1cdbd2cSJim Jagielski 	aEntry.nExtraLen = rInEntry.nExtraLen;
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 	if ( aEntry.nMethod == STORED )
127*b1cdbd2cSJim Jagielski 		bToBeCompressed = sal_False;
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
CloseOwnStreamIfAny()131*b1cdbd2cSJim Jagielski void ZipPackageStream::CloseOwnStreamIfAny()
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski 	if ( xStream.is() )
134*b1cdbd2cSJim Jagielski 	{
135*b1cdbd2cSJim Jagielski 		xStream->closeInput();
136*b1cdbd2cSJim Jagielski 		xStream = uno::Reference< io::XInputStream >();
137*b1cdbd2cSJim Jagielski 		m_bHasSeekable = sal_False;
138*b1cdbd2cSJim Jagielski 	}
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
GetOwnSeekStream()142*b1cdbd2cSJim Jagielski uno::Reference< io::XInputStream > ZipPackageStream::GetOwnSeekStream()
143*b1cdbd2cSJim Jagielski {
144*b1cdbd2cSJim Jagielski 	if ( !m_bHasSeekable && xStream.is() )
145*b1cdbd2cSJim Jagielski 	{
146*b1cdbd2cSJim Jagielski 		// The package component requires that every stream either be FROM a package or it must support XSeekable!
147*b1cdbd2cSJim Jagielski 		// The only exception is a nonseekable stream that is provided only for storing, if such a stream
148*b1cdbd2cSJim Jagielski 		// is accessed before commit it MUST be wrapped.
149*b1cdbd2cSJim Jagielski 		// Wrap the stream in case it is not seekable
150*b1cdbd2cSJim Jagielski 		xStream = ::comphelper::OSeekableInputWrapper::CheckSeekableCanWrap( xStream, m_xFactory );
151*b1cdbd2cSJim Jagielski 		uno::Reference< io::XSeekable > xSeek( xStream, UNO_QUERY );
152*b1cdbd2cSJim Jagielski 		if ( !xSeek.is() )
153*b1cdbd2cSJim Jagielski 			throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "The stream must support XSeekable!" ) ),
154*b1cdbd2cSJim Jagielski 									uno::Reference< XInterface >() );
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 		m_bHasSeekable = sal_True;
157*b1cdbd2cSJim Jagielski 	}
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 	return xStream;
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
GetRawEncrStreamNoHeaderCopy()163*b1cdbd2cSJim Jagielski uno::Reference< io::XInputStream > ZipPackageStream::GetRawEncrStreamNoHeaderCopy()
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski 	if ( m_nStreamMode != PACKAGE_STREAM_RAW || !GetOwnSeekStream().is() )
166*b1cdbd2cSJim Jagielski 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 	if ( m_xBaseEncryptionData.is() )
169*b1cdbd2cSJim Jagielski 		throw ZipIOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Encrypted stream without encryption data!\n" ) ),
170*b1cdbd2cSJim Jagielski 							uno::Reference< XInterface >() );
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 	uno::Reference< io::XSeekable > xSeek( GetOwnSeekStream(), UNO_QUERY );
173*b1cdbd2cSJim Jagielski 	if ( !xSeek.is() )
174*b1cdbd2cSJim Jagielski 		throw ZipIOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "The stream must be seekable!\n" ) ),
175*b1cdbd2cSJim Jagielski 							uno::Reference< XInterface >() );
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 	// skip header
178*b1cdbd2cSJim Jagielski 	xSeek->seek( n_ConstHeaderSize + getInitialisationVector().getLength() +
179*b1cdbd2cSJim Jagielski 					getSalt().getLength() + getDigest().getLength() );
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	// create temporary stream
182*b1cdbd2cSJim Jagielski 	uno::Reference < io::XOutputStream > xTempOut(
183*b1cdbd2cSJim Jagielski 						m_xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.TempFile" ) ) ),
184*b1cdbd2cSJim Jagielski 						uno::UNO_QUERY );
185*b1cdbd2cSJim Jagielski 	uno::Reference < io::XInputStream > xTempIn( xTempOut, UNO_QUERY );
186*b1cdbd2cSJim Jagielski 	uno::Reference < io::XSeekable > xTempSeek( xTempOut, UNO_QUERY );
187*b1cdbd2cSJim Jagielski 	if ( !xTempOut.is() || !xTempIn.is() || !xTempSeek.is() )
188*b1cdbd2cSJim Jagielski 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 	// copy the raw stream to the temporary file starting from the current position
191*b1cdbd2cSJim Jagielski 	::comphelper::OStorageHelper::CopyInputToOutput( GetOwnSeekStream(), xTempOut );
192*b1cdbd2cSJim Jagielski 	xTempOut->closeOutput();
193*b1cdbd2cSJim Jagielski 	xTempSeek->seek( 0 );
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 	return xTempIn;
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
GetEncryptionAlgorithm() const199*b1cdbd2cSJim Jagielski sal_Int32 ZipPackageStream::GetEncryptionAlgorithm() const
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski     return m_nImportedEncryptionAlgorithm ? m_nImportedEncryptionAlgorithm : rZipPackage.GetEncAlgID();
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
GetBlockSize() const205*b1cdbd2cSJim Jagielski sal_Int32 ZipPackageStream::GetBlockSize() const
206*b1cdbd2cSJim Jagielski {
207*b1cdbd2cSJim Jagielski     return GetEncryptionAlgorithm() == ::com::sun::star::xml::crypto::CipherID::AES_CBC_W3C_PADDING ? 16 : 8;
208*b1cdbd2cSJim Jagielski }
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
GetEncryptionData(bool bUseWinEncoding)211*b1cdbd2cSJim Jagielski ::rtl::Reference< EncryptionData > ZipPackageStream::GetEncryptionData( bool bUseWinEncoding )
212*b1cdbd2cSJim Jagielski {
213*b1cdbd2cSJim Jagielski     ::rtl::Reference< EncryptionData > xResult;
214*b1cdbd2cSJim Jagielski     if ( m_xBaseEncryptionData.is() )
215*b1cdbd2cSJim Jagielski         xResult = new EncryptionData(
216*b1cdbd2cSJim Jagielski             *m_xBaseEncryptionData,
217*b1cdbd2cSJim Jagielski             GetEncryptionKey( bUseWinEncoding ),
218*b1cdbd2cSJim Jagielski             GetEncryptionAlgorithm(),
219*b1cdbd2cSJim Jagielski             m_nImportedChecksumAlgorithm ? m_nImportedChecksumAlgorithm : rZipPackage.GetChecksumAlgID(),
220*b1cdbd2cSJim Jagielski             m_nImportedDerivedKeySize ? m_nImportedDerivedKeySize : rZipPackage.GetDefaultDerivedKeySize(),
221*b1cdbd2cSJim Jagielski             GetStartKeyGenID() );
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski     return xResult;
224*b1cdbd2cSJim Jagielski }
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
SetBaseEncryptionData(const::rtl::Reference<BaseEncryptionData> & xData)227*b1cdbd2cSJim Jagielski void ZipPackageStream::SetBaseEncryptionData( const ::rtl::Reference< BaseEncryptionData >& xData )
228*b1cdbd2cSJim Jagielski {
229*b1cdbd2cSJim Jagielski     m_xBaseEncryptionData = xData;
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
GetEncryptionKey(bool bUseWinEncoding)233*b1cdbd2cSJim Jagielski uno::Sequence< sal_Int8 > ZipPackageStream::GetEncryptionKey( bool bUseWinEncoding )
234*b1cdbd2cSJim Jagielski {
235*b1cdbd2cSJim Jagielski     uno::Sequence< sal_Int8 > aResult;
236*b1cdbd2cSJim Jagielski     sal_Int32 nKeyGenID = GetStartKeyGenID();
237*b1cdbd2cSJim Jagielski     bUseWinEncoding = ( bUseWinEncoding || m_bUseWinEncoding );
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski     if ( bHaveOwnKey && m_aStorageEncryptionKeys.getLength() )
240*b1cdbd2cSJim Jagielski     {
241*b1cdbd2cSJim Jagielski         ::rtl::OUString aNameToFind;
242*b1cdbd2cSJim Jagielski         if ( nKeyGenID == xml::crypto::DigestID::SHA256 )
243*b1cdbd2cSJim Jagielski             aNameToFind = PACKAGE_ENCRYPTIONDATA_SHA256UTF8;
244*b1cdbd2cSJim Jagielski         else if ( nKeyGenID == xml::crypto::DigestID::SHA1 )
245*b1cdbd2cSJim Jagielski         {
246*b1cdbd2cSJim Jagielski             aNameToFind = bUseWinEncoding ? PACKAGE_ENCRYPTIONDATA_SHA1MS1252 : PACKAGE_ENCRYPTIONDATA_SHA1UTF8;
247*b1cdbd2cSJim Jagielski         }
248*b1cdbd2cSJim Jagielski         else
249*b1cdbd2cSJim Jagielski             throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No expected key is provided!" ) ), uno::Reference< uno::XInterface >() );
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski         for ( sal_Int32 nInd = 0; nInd < m_aStorageEncryptionKeys.getLength(); nInd++ )
252*b1cdbd2cSJim Jagielski             if ( m_aStorageEncryptionKeys[nInd].Name.equals( aNameToFind ) )
253*b1cdbd2cSJim Jagielski                 m_aStorageEncryptionKeys[nInd].Value >>= aResult;
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski         // empty keys are not allowed here
256*b1cdbd2cSJim Jagielski         // so it is not important whether there is no key, or the key is empty, it is an error
257*b1cdbd2cSJim Jagielski         if ( !aResult.getLength() )
258*b1cdbd2cSJim Jagielski             throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "No expected key is provided!" ) ), uno::Reference< uno::XInterface >() );
259*b1cdbd2cSJim Jagielski     }
260*b1cdbd2cSJim Jagielski     else
261*b1cdbd2cSJim Jagielski         aResult = m_aEncryptionKey;
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski     if ( !aResult.getLength() || !bHaveOwnKey )
264*b1cdbd2cSJim Jagielski         aResult = rZipPackage.GetEncryptionKey();
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski     return aResult;
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
GetStartKeyGenID()270*b1cdbd2cSJim Jagielski sal_Int32 ZipPackageStream::GetStartKeyGenID()
271*b1cdbd2cSJim Jagielski {
272*b1cdbd2cSJim Jagielski     // generally should all the streams use the same Start Key
273*b1cdbd2cSJim Jagielski     // but if raw copy without password takes place, we should preserve the imported algorithm
274*b1cdbd2cSJim Jagielski     return m_nImportedStartKeyAlgorithm ? m_nImportedStartKeyAlgorithm : rZipPackage.GetStartKeyGenID();
275*b1cdbd2cSJim Jagielski }
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
TryToGetRawFromDataStream(sal_Bool bAddHeaderForEncr)278*b1cdbd2cSJim Jagielski uno::Reference< io::XInputStream > ZipPackageStream::TryToGetRawFromDataStream( sal_Bool bAddHeaderForEncr )
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski 	if ( m_nStreamMode != PACKAGE_STREAM_DATA || !GetOwnSeekStream().is() || ( bAddHeaderForEncr && !bToBeEncrypted ) )
281*b1cdbd2cSJim Jagielski 		throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	Sequence< sal_Int8 > aKey;
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski 	if ( bToBeEncrypted )
286*b1cdbd2cSJim Jagielski 	{
287*b1cdbd2cSJim Jagielski 		aKey = GetEncryptionKey();
288*b1cdbd2cSJim Jagielski 		if ( !aKey.getLength() )
289*b1cdbd2cSJim Jagielski 			throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
290*b1cdbd2cSJim Jagielski 	}
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 	try
293*b1cdbd2cSJim Jagielski 	{
294*b1cdbd2cSJim Jagielski 		// create temporary file
295*b1cdbd2cSJim Jagielski 		uno::Reference < io::XStream > xTempStream(
296*b1cdbd2cSJim Jagielski 							m_xFactory->createInstance ( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.TempFile" ) ) ),
297*b1cdbd2cSJim Jagielski 							uno::UNO_QUERY );
298*b1cdbd2cSJim Jagielski 		if ( !xTempStream.is() )
299*b1cdbd2cSJim Jagielski 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski 		// create a package based on it
302*b1cdbd2cSJim Jagielski 		ZipPackage* pPackage = new ZipPackage( m_xFactory );
303*b1cdbd2cSJim Jagielski 		uno::Reference< XSingleServiceFactory > xPackageAsFactory( static_cast< XSingleServiceFactory* >( pPackage ) );
304*b1cdbd2cSJim Jagielski 		if ( !xPackageAsFactory.is() )
305*b1cdbd2cSJim Jagielski 			throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 		Sequence< Any > aArgs( 1 );
308*b1cdbd2cSJim Jagielski 		aArgs[0] <<= xTempStream;
309*b1cdbd2cSJim Jagielski 		pPackage->initialize( aArgs );
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski 		// create a new package stream
312*b1cdbd2cSJim Jagielski 		uno::Reference< XDataSinkEncrSupport > xNewPackStream( xPackageAsFactory->createInstance(), UNO_QUERY );
313*b1cdbd2cSJim Jagielski 		if ( !xNewPackStream.is() )
314*b1cdbd2cSJim Jagielski 			throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski 		xNewPackStream->setDataStream( static_cast< io::XInputStream* >(
317*b1cdbd2cSJim Jagielski 													new WrapStreamForShare( GetOwnSeekStream(), rZipPackage.GetSharedMutexRef() ) ) );
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 		uno::Reference< XPropertySet > xNewPSProps( xNewPackStream, UNO_QUERY );
320*b1cdbd2cSJim Jagielski 		if ( !xNewPSProps.is() )
321*b1cdbd2cSJim Jagielski 			throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski 		// copy all the properties of this stream to the new stream
324*b1cdbd2cSJim Jagielski 		xNewPSProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ), makeAny( sMediaType ) );
325*b1cdbd2cSJim Jagielski 		xNewPSProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Compressed" ) ), makeAny( bToBeCompressed ) );
326*b1cdbd2cSJim Jagielski 		if ( bToBeEncrypted )
327*b1cdbd2cSJim Jagielski 		{
328*b1cdbd2cSJim Jagielski 			xNewPSProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ENCRYPTION_KEY_PROPERTY ) ), makeAny( aKey ) );
329*b1cdbd2cSJim Jagielski 			xNewPSProps->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Encrypted" ) ), makeAny( sal_True ) );
330*b1cdbd2cSJim Jagielski 		}
331*b1cdbd2cSJim Jagielski 
332*b1cdbd2cSJim Jagielski 		// insert a new stream in the package
333*b1cdbd2cSJim Jagielski 		uno::Reference< XUnoTunnel > xTunnel;
334*b1cdbd2cSJim Jagielski 		Any aRoot = pPackage->getByHierarchicalName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "/" ) ) );
335*b1cdbd2cSJim Jagielski 		aRoot >>= xTunnel;
336*b1cdbd2cSJim Jagielski 		uno::Reference< container::XNameContainer > xRootNameContainer( xTunnel, UNO_QUERY );
337*b1cdbd2cSJim Jagielski 		if ( !xRootNameContainer.is() )
338*b1cdbd2cSJim Jagielski 			throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 		uno::Reference< XUnoTunnel > xNPSTunnel( xNewPackStream, UNO_QUERY );
341*b1cdbd2cSJim Jagielski 		xRootNameContainer->insertByName( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "dummy" ) ), makeAny( xNPSTunnel ) );
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski 		// commit the temporary package
344*b1cdbd2cSJim Jagielski 		pPackage->commitChanges();
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 		// get raw stream from the temporary package
347*b1cdbd2cSJim Jagielski 		uno::Reference< io::XInputStream > xInRaw;
348*b1cdbd2cSJim Jagielski 		if ( bAddHeaderForEncr )
349*b1cdbd2cSJim Jagielski 			xInRaw = xNewPackStream->getRawStream();
350*b1cdbd2cSJim Jagielski 		else
351*b1cdbd2cSJim Jagielski 			xInRaw = xNewPackStream->getPlainRawStream();
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski 		// create another temporary file
354*b1cdbd2cSJim Jagielski 		uno::Reference < io::XOutputStream > xTempOut(
355*b1cdbd2cSJim Jagielski 							m_xFactory->createInstance ( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.TempFile" ) ) ),
356*b1cdbd2cSJim Jagielski 							uno::UNO_QUERY );
357*b1cdbd2cSJim Jagielski 		uno::Reference < io::XInputStream > xTempIn( xTempOut, UNO_QUERY );
358*b1cdbd2cSJim Jagielski 		uno::Reference < io::XSeekable > xTempSeek( xTempOut, UNO_QUERY );
359*b1cdbd2cSJim Jagielski 		if ( !xTempOut.is() || !xTempIn.is() || !xTempSeek.is() )
360*b1cdbd2cSJim Jagielski 			throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski 		// copy the raw stream to the temporary file
363*b1cdbd2cSJim Jagielski 		::comphelper::OStorageHelper::CopyInputToOutput( xInRaw, xTempOut );
364*b1cdbd2cSJim Jagielski 		xTempOut->closeOutput();
365*b1cdbd2cSJim Jagielski 		xTempSeek->seek( 0 );
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 		// close raw stream, package stream and folder
368*b1cdbd2cSJim Jagielski 		xInRaw = uno::Reference< io::XInputStream >();
369*b1cdbd2cSJim Jagielski 		xNewPSProps = uno::Reference< XPropertySet >();
370*b1cdbd2cSJim Jagielski 		xNPSTunnel = uno::Reference< XUnoTunnel >();
371*b1cdbd2cSJim Jagielski 		xNewPackStream = uno::Reference< XDataSinkEncrSupport >();
372*b1cdbd2cSJim Jagielski 		xTunnel = uno::Reference< XUnoTunnel >();
373*b1cdbd2cSJim Jagielski 		xRootNameContainer = uno::Reference< container::XNameContainer >();
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 		// return the stream representing the first temporary file
376*b1cdbd2cSJim Jagielski 		return xTempIn;
377*b1cdbd2cSJim Jagielski 	}
378*b1cdbd2cSJim Jagielski 	catch ( RuntimeException& )
379*b1cdbd2cSJim Jagielski 	{
380*b1cdbd2cSJim Jagielski 		throw;
381*b1cdbd2cSJim Jagielski 	}
382*b1cdbd2cSJim Jagielski 	catch ( Exception& )
383*b1cdbd2cSJim Jagielski 	{
384*b1cdbd2cSJim Jagielski 	}
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 	throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
387*b1cdbd2cSJim Jagielski }
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
ParsePackageRawStream()390*b1cdbd2cSJim Jagielski sal_Bool ZipPackageStream::ParsePackageRawStream()
391*b1cdbd2cSJim Jagielski {
392*b1cdbd2cSJim Jagielski 	OSL_ENSURE( GetOwnSeekStream().is(), "A stream must be provided!\n" );
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski 	if ( !GetOwnSeekStream().is() )
395*b1cdbd2cSJim Jagielski 		return sal_False;
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski 	sal_Bool bOk = sal_False;
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 	::rtl::Reference< BaseEncryptionData > xTempEncrData;
400*b1cdbd2cSJim Jagielski 	sal_Int32 nMagHackSize = 0;
401*b1cdbd2cSJim Jagielski 	Sequence < sal_Int8 > aHeader ( 4 );
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 	try
404*b1cdbd2cSJim Jagielski 	{
405*b1cdbd2cSJim Jagielski 		if ( GetOwnSeekStream()->readBytes ( aHeader, 4 ) == 4 )
406*b1cdbd2cSJim Jagielski 		{
407*b1cdbd2cSJim Jagielski 			const sal_Int8 *pHeader = aHeader.getConstArray();
408*b1cdbd2cSJim Jagielski 			sal_uInt32 nHeader = ( pHeader [0] & 0xFF )       |
409*b1cdbd2cSJim Jagielski 							 	( pHeader [1] & 0xFF ) << 8  |
410*b1cdbd2cSJim Jagielski 							 	( pHeader [2] & 0xFF ) << 16 |
411*b1cdbd2cSJim Jagielski 							 	( pHeader [3] & 0xFF ) << 24;
412*b1cdbd2cSJim Jagielski 			if ( nHeader == n_ConstHeader )
413*b1cdbd2cSJim Jagielski 			{
414*b1cdbd2cSJim Jagielski 				// this is one of our god-awful, but extremely devious hacks, everyone cheer
415*b1cdbd2cSJim Jagielski 				xTempEncrData = new BaseEncryptionData;
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski 				::rtl::OUString aMediaType;
418*b1cdbd2cSJim Jagielski                 sal_Int32 nEncAlgorithm = 0;
419*b1cdbd2cSJim Jagielski                 sal_Int32 nChecksumAlgorithm = 0;
420*b1cdbd2cSJim Jagielski                 sal_Int32 nDerivedKeySize = 0;
421*b1cdbd2cSJim Jagielski                 sal_Int32 nStartKeyGenID = 0;
422*b1cdbd2cSJim Jagielski 				if ( ZipFile::StaticFillData( xTempEncrData, nEncAlgorithm, nChecksumAlgorithm, nDerivedKeySize, nStartKeyGenID, nMagHackSize, aMediaType, GetOwnSeekStream() ) )
423*b1cdbd2cSJim Jagielski 				{
424*b1cdbd2cSJim Jagielski 					// We'll want to skip the data we've just read, so calculate how much we just read
425*b1cdbd2cSJim Jagielski 					// and remember it
426*b1cdbd2cSJim Jagielski 					m_nMagicalHackPos = n_ConstHeaderSize + xTempEncrData->m_aSalt.getLength()
427*b1cdbd2cSJim Jagielski 														+ xTempEncrData->m_aInitVector.getLength()
428*b1cdbd2cSJim Jagielski 														+ xTempEncrData->m_aDigest.getLength()
429*b1cdbd2cSJim Jagielski 														+ aMediaType.getLength() * sizeof( sal_Unicode );
430*b1cdbd2cSJim Jagielski                     m_nImportedEncryptionAlgorithm = nEncAlgorithm;
431*b1cdbd2cSJim Jagielski                     m_nImportedChecksumAlgorithm = nChecksumAlgorithm;
432*b1cdbd2cSJim Jagielski                     m_nImportedDerivedKeySize = nDerivedKeySize;
433*b1cdbd2cSJim Jagielski                     m_nImportedStartKeyAlgorithm = nStartKeyGenID;
434*b1cdbd2cSJim Jagielski 					m_nMagicalHackSize = nMagHackSize;
435*b1cdbd2cSJim Jagielski 					sMediaType = aMediaType;
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski 					bOk = sal_True;
438*b1cdbd2cSJim Jagielski 				}
439*b1cdbd2cSJim Jagielski 			}
440*b1cdbd2cSJim Jagielski 		}
441*b1cdbd2cSJim Jagielski 	}
442*b1cdbd2cSJim Jagielski 	catch( Exception& )
443*b1cdbd2cSJim Jagielski 	{
444*b1cdbd2cSJim Jagielski 	}
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 	if ( !bOk )
447*b1cdbd2cSJim Jagielski 	{
448*b1cdbd2cSJim Jagielski 		// the provided stream is not a raw stream
449*b1cdbd2cSJim Jagielski 		return sal_False;
450*b1cdbd2cSJim Jagielski 	}
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski 	m_xBaseEncryptionData = xTempEncrData;
453*b1cdbd2cSJim Jagielski 	SetIsEncrypted ( sal_True );
454*b1cdbd2cSJim Jagielski 	// it's already compressed and encrypted
455*b1cdbd2cSJim Jagielski 	bToBeEncrypted = bToBeCompressed = sal_False;
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski 	return sal_True;
458*b1cdbd2cSJim Jagielski }
459*b1cdbd2cSJim Jagielski 
SetPackageMember(sal_Bool bNewValue)460*b1cdbd2cSJim Jagielski void ZipPackageStream::SetPackageMember( sal_Bool bNewValue )
461*b1cdbd2cSJim Jagielski {
462*b1cdbd2cSJim Jagielski 	if ( bNewValue )
463*b1cdbd2cSJim Jagielski 	{
464*b1cdbd2cSJim Jagielski 		m_nStreamMode = PACKAGE_STREAM_PACKAGEMEMBER;
465*b1cdbd2cSJim Jagielski 		m_nMagicalHackPos = 0;
466*b1cdbd2cSJim Jagielski 		m_nMagicalHackSize = 0;
467*b1cdbd2cSJim Jagielski 	}
468*b1cdbd2cSJim Jagielski 	else if ( m_nStreamMode == PACKAGE_STREAM_PACKAGEMEMBER )
469*b1cdbd2cSJim Jagielski 		m_nStreamMode = PACKAGE_STREAM_NOTSET; // must be reset
470*b1cdbd2cSJim Jagielski }
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski // XActiveDataSink
473*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
setInputStream(const uno::Reference<io::XInputStream> & aStream)474*b1cdbd2cSJim Jagielski void SAL_CALL ZipPackageStream::setInputStream( const uno::Reference< io::XInputStream >& aStream )
475*b1cdbd2cSJim Jagielski 		throw( RuntimeException )
476*b1cdbd2cSJim Jagielski {
477*b1cdbd2cSJim Jagielski 	// if seekable access is required the wrapping will be done on demand
478*b1cdbd2cSJim Jagielski 	xStream = aStream;
479*b1cdbd2cSJim Jagielski     m_nImportedEncryptionAlgorithm = 0;
480*b1cdbd2cSJim Jagielski 	m_bHasSeekable = sal_False;
481*b1cdbd2cSJim Jagielski 	SetPackageMember ( sal_False );
482*b1cdbd2cSJim Jagielski 	aEntry.nTime = -1;
483*b1cdbd2cSJim Jagielski 	m_nStreamMode = PACKAGE_STREAM_DETECT;
484*b1cdbd2cSJim Jagielski }
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
getRawData()487*b1cdbd2cSJim Jagielski uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getRawData()
488*b1cdbd2cSJim Jagielski 		throw( RuntimeException )
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski 	try
491*b1cdbd2cSJim Jagielski 	{
492*b1cdbd2cSJim Jagielski 		if ( IsPackageMember() )
493*b1cdbd2cSJim Jagielski 		{
494*b1cdbd2cSJim Jagielski 			return rZipPackage.getZipFile().getRawData( aEntry, GetEncryptionData(), bIsEncrypted, rZipPackage.GetSharedMutexRef() );
495*b1cdbd2cSJim Jagielski 		}
496*b1cdbd2cSJim Jagielski 		else if ( GetOwnSeekStream().is() )
497*b1cdbd2cSJim Jagielski 		{
498*b1cdbd2cSJim Jagielski 			return new WrapStreamForShare( GetOwnSeekStream(), rZipPackage.GetSharedMutexRef() );
499*b1cdbd2cSJim Jagielski 		}
500*b1cdbd2cSJim Jagielski 		else
501*b1cdbd2cSJim Jagielski 			return uno::Reference < io::XInputStream > ();
502*b1cdbd2cSJim Jagielski 	}
503*b1cdbd2cSJim Jagielski 	catch ( ZipException & )//rException )
504*b1cdbd2cSJim Jagielski 	{
505*b1cdbd2cSJim Jagielski 		VOS_ENSURE( 0, "ZipException thrown" );//rException.Message );
506*b1cdbd2cSJim Jagielski 		return uno::Reference < io::XInputStream > ();
507*b1cdbd2cSJim Jagielski 	}
508*b1cdbd2cSJim Jagielski 	catch ( Exception & )
509*b1cdbd2cSJim Jagielski 	{
510*b1cdbd2cSJim Jagielski 		VOS_ENSURE( 0, "Exception is thrown during stream wrapping!\n" );
511*b1cdbd2cSJim Jagielski 		return uno::Reference < io::XInputStream > ();
512*b1cdbd2cSJim Jagielski 	}
513*b1cdbd2cSJim Jagielski }
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
getInputStream()516*b1cdbd2cSJim Jagielski uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getInputStream()
517*b1cdbd2cSJim Jagielski 		throw( RuntimeException )
518*b1cdbd2cSJim Jagielski {
519*b1cdbd2cSJim Jagielski 	try
520*b1cdbd2cSJim Jagielski 	{
521*b1cdbd2cSJim Jagielski 		if ( IsPackageMember() )
522*b1cdbd2cSJim Jagielski 		{
523*b1cdbd2cSJim Jagielski 			return rZipPackage.getZipFile().getInputStream( aEntry, GetEncryptionData(), bIsEncrypted, rZipPackage.GetSharedMutexRef() );
524*b1cdbd2cSJim Jagielski 		}
525*b1cdbd2cSJim Jagielski 		else if ( GetOwnSeekStream().is() )
526*b1cdbd2cSJim Jagielski 		{
527*b1cdbd2cSJim Jagielski 			return new WrapStreamForShare( GetOwnSeekStream(), rZipPackage.GetSharedMutexRef() );
528*b1cdbd2cSJim Jagielski 		}
529*b1cdbd2cSJim Jagielski 		else
530*b1cdbd2cSJim Jagielski 			return uno::Reference < io::XInputStream > ();
531*b1cdbd2cSJim Jagielski 	}
532*b1cdbd2cSJim Jagielski 	catch ( ZipException & )//rException )
533*b1cdbd2cSJim Jagielski 	{
534*b1cdbd2cSJim Jagielski 		VOS_ENSURE( 0,"ZipException thrown" );//rException.Message );
535*b1cdbd2cSJim Jagielski 		return uno::Reference < io::XInputStream > ();
536*b1cdbd2cSJim Jagielski 	}
537*b1cdbd2cSJim Jagielski 	catch ( Exception & )
538*b1cdbd2cSJim Jagielski 	{
539*b1cdbd2cSJim Jagielski 		VOS_ENSURE( 0, "Exception is thrown during stream wrapping!\n" );
540*b1cdbd2cSJim Jagielski 		return uno::Reference < io::XInputStream > ();
541*b1cdbd2cSJim Jagielski 	}
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski // XDataSinkEncrSupport
545*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
getDataStream()546*b1cdbd2cSJim Jagielski uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getDataStream()
547*b1cdbd2cSJim Jagielski 		throw ( packages::WrongPasswordException,
548*b1cdbd2cSJim Jagielski 				io::IOException,
549*b1cdbd2cSJim Jagielski 				RuntimeException )
550*b1cdbd2cSJim Jagielski {
551*b1cdbd2cSJim Jagielski 	// There is no stream attached to this object
552*b1cdbd2cSJim Jagielski 	if ( m_nStreamMode == PACKAGE_STREAM_NOTSET )
553*b1cdbd2cSJim Jagielski 		return uno::Reference< io::XInputStream >();
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski 	// this method can not be used together with old approach
556*b1cdbd2cSJim Jagielski 	if ( m_nStreamMode == PACKAGE_STREAM_DETECT )
557*b1cdbd2cSJim Jagielski 		throw packages::zip::ZipIOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 	if ( IsPackageMember() )
560*b1cdbd2cSJim Jagielski 	{
561*b1cdbd2cSJim Jagielski         uno::Reference< io::XInputStream > xResult;
562*b1cdbd2cSJim Jagielski         try
563*b1cdbd2cSJim Jagielski         {
564*b1cdbd2cSJim Jagielski 		    xResult = rZipPackage.getZipFile().getDataStream( aEntry, GetEncryptionData(), bIsEncrypted, rZipPackage.GetSharedMutexRef() );
565*b1cdbd2cSJim Jagielski         }
566*b1cdbd2cSJim Jagielski         catch( packages::WrongPasswordException& )
567*b1cdbd2cSJim Jagielski         {
568*b1cdbd2cSJim Jagielski             // workaround for the encrypted documents generated with the old OOo1.x bug.
569*b1cdbd2cSJim Jagielski             if ( rZipPackage.GetStartKeyGenID() == xml::crypto::DigestID::SHA1 && !m_bUseWinEncoding )
570*b1cdbd2cSJim Jagielski             {
571*b1cdbd2cSJim Jagielski                 xResult = rZipPackage.getZipFile().getDataStream( aEntry, GetEncryptionData( true ), bIsEncrypted, rZipPackage.GetSharedMutexRef() );
572*b1cdbd2cSJim Jagielski                 m_bUseWinEncoding = true;
573*b1cdbd2cSJim Jagielski             }
574*b1cdbd2cSJim Jagielski             else
575*b1cdbd2cSJim Jagielski                 throw;
576*b1cdbd2cSJim Jagielski         }
577*b1cdbd2cSJim Jagielski         return xResult;
578*b1cdbd2cSJim Jagielski 	}
579*b1cdbd2cSJim Jagielski 	else if ( m_nStreamMode == PACKAGE_STREAM_RAW )
580*b1cdbd2cSJim Jagielski 		return ZipFile::StaticGetDataFromRawStream( m_xFactory, GetOwnSeekStream(), GetEncryptionData() );
581*b1cdbd2cSJim Jagielski 	else if ( GetOwnSeekStream().is() )
582*b1cdbd2cSJim Jagielski 	{
583*b1cdbd2cSJim Jagielski 		return new WrapStreamForShare( GetOwnSeekStream(), rZipPackage.GetSharedMutexRef() );
584*b1cdbd2cSJim Jagielski 	}
585*b1cdbd2cSJim Jagielski 	else
586*b1cdbd2cSJim Jagielski 		return uno::Reference< io::XInputStream >();
587*b1cdbd2cSJim Jagielski }
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
getRawStream()590*b1cdbd2cSJim Jagielski uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getRawStream()
591*b1cdbd2cSJim Jagielski 		throw ( packages::NoEncryptionException,
592*b1cdbd2cSJim Jagielski 				io::IOException,
593*b1cdbd2cSJim Jagielski 				uno::RuntimeException )
594*b1cdbd2cSJim Jagielski {
595*b1cdbd2cSJim Jagielski 	// There is no stream attached to this object
596*b1cdbd2cSJim Jagielski 	if ( m_nStreamMode == PACKAGE_STREAM_NOTSET )
597*b1cdbd2cSJim Jagielski 		return uno::Reference< io::XInputStream >();
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski 	// this method can not be used together with old approach
600*b1cdbd2cSJim Jagielski 	if ( m_nStreamMode == PACKAGE_STREAM_DETECT )
601*b1cdbd2cSJim Jagielski 		throw packages::zip::ZipIOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski 	if ( IsPackageMember() )
604*b1cdbd2cSJim Jagielski 	{
605*b1cdbd2cSJim Jagielski 		if ( !bIsEncrypted || !GetEncryptionData().is() )
606*b1cdbd2cSJim Jagielski 			throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
607*b1cdbd2cSJim Jagielski 
608*b1cdbd2cSJim Jagielski 		return rZipPackage.getZipFile().getWrappedRawStream( aEntry, GetEncryptionData(), sMediaType, rZipPackage.GetSharedMutexRef() );
609*b1cdbd2cSJim Jagielski 	}
610*b1cdbd2cSJim Jagielski 	else if ( GetOwnSeekStream().is() )
611*b1cdbd2cSJim Jagielski 	{
612*b1cdbd2cSJim Jagielski 		if ( m_nStreamMode == PACKAGE_STREAM_RAW )
613*b1cdbd2cSJim Jagielski 		{
614*b1cdbd2cSJim Jagielski 			return new WrapStreamForShare( GetOwnSeekStream(), rZipPackage.GetSharedMutexRef() );
615*b1cdbd2cSJim Jagielski 		}
616*b1cdbd2cSJim Jagielski 		else if ( m_nStreamMode == PACKAGE_STREAM_DATA && bToBeEncrypted )
617*b1cdbd2cSJim Jagielski 			return TryToGetRawFromDataStream( sal_True );
618*b1cdbd2cSJim Jagielski 	}
619*b1cdbd2cSJim Jagielski 
620*b1cdbd2cSJim Jagielski 	throw packages::NoEncryptionException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
621*b1cdbd2cSJim Jagielski }
622*b1cdbd2cSJim Jagielski 
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
setDataStream(const uno::Reference<io::XInputStream> & aStream)625*b1cdbd2cSJim Jagielski void SAL_CALL ZipPackageStream::setDataStream( const uno::Reference< io::XInputStream >& aStream )
626*b1cdbd2cSJim Jagielski 		throw ( io::IOException,
627*b1cdbd2cSJim Jagielski 				RuntimeException )
628*b1cdbd2cSJim Jagielski {
629*b1cdbd2cSJim Jagielski 	setInputStream( aStream );
630*b1cdbd2cSJim Jagielski 	m_nStreamMode = PACKAGE_STREAM_DATA;
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
setRawStream(const uno::Reference<io::XInputStream> & aStream)634*b1cdbd2cSJim Jagielski void SAL_CALL ZipPackageStream::setRawStream( const uno::Reference< io::XInputStream >& aStream )
635*b1cdbd2cSJim Jagielski 		throw ( packages::EncryptionNotAllowedException,
636*b1cdbd2cSJim Jagielski 				packages::NoRawFormatException,
637*b1cdbd2cSJim Jagielski 				io::IOException,
638*b1cdbd2cSJim Jagielski 				RuntimeException )
639*b1cdbd2cSJim Jagielski {
640*b1cdbd2cSJim Jagielski 	// wrap the stream in case it is not seekable
641*b1cdbd2cSJim Jagielski 	uno::Reference< io::XInputStream > xNewStream = ::comphelper::OSeekableInputWrapper::CheckSeekableCanWrap( aStream, m_xFactory );
642*b1cdbd2cSJim Jagielski 	uno::Reference< io::XSeekable > xSeek( xNewStream, UNO_QUERY );
643*b1cdbd2cSJim Jagielski 	if ( !xSeek.is() )
644*b1cdbd2cSJim Jagielski 		throw RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "The stream must support XSeekable!" ) ),
645*b1cdbd2cSJim Jagielski 									uno::Reference< XInterface >() );
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski 	xSeek->seek( 0 );
648*b1cdbd2cSJim Jagielski 	uno::Reference< io::XInputStream > xOldStream = xStream;
649*b1cdbd2cSJim Jagielski 	xStream = xNewStream;
650*b1cdbd2cSJim Jagielski 	if ( !ParsePackageRawStream() )
651*b1cdbd2cSJim Jagielski 	{
652*b1cdbd2cSJim Jagielski 		xStream = xOldStream;
653*b1cdbd2cSJim Jagielski 		throw packages::NoRawFormatException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
654*b1cdbd2cSJim Jagielski 	}
655*b1cdbd2cSJim Jagielski 
656*b1cdbd2cSJim Jagielski 	// the raw stream MUST have seekable access
657*b1cdbd2cSJim Jagielski 	m_bHasSeekable = sal_True;
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski 	SetPackageMember ( sal_False );
660*b1cdbd2cSJim Jagielski 	aEntry.nTime = -1;
661*b1cdbd2cSJim Jagielski 	m_nStreamMode = PACKAGE_STREAM_RAW;
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
getPlainRawStream()665*b1cdbd2cSJim Jagielski uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getPlainRawStream()
666*b1cdbd2cSJim Jagielski 		throw ( io::IOException,
667*b1cdbd2cSJim Jagielski 				uno::RuntimeException )
668*b1cdbd2cSJim Jagielski {
669*b1cdbd2cSJim Jagielski 	// There is no stream attached to this object
670*b1cdbd2cSJim Jagielski 	if ( m_nStreamMode == PACKAGE_STREAM_NOTSET )
671*b1cdbd2cSJim Jagielski 		return uno::Reference< io::XInputStream >();
672*b1cdbd2cSJim Jagielski 
673*b1cdbd2cSJim Jagielski 	// this method can not be used together with old approach
674*b1cdbd2cSJim Jagielski 	if ( m_nStreamMode == PACKAGE_STREAM_DETECT )
675*b1cdbd2cSJim Jagielski 		throw packages::zip::ZipIOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
676*b1cdbd2cSJim Jagielski 
677*b1cdbd2cSJim Jagielski 	if ( IsPackageMember() )
678*b1cdbd2cSJim Jagielski 	{
679*b1cdbd2cSJim Jagielski 		return rZipPackage.getZipFile().getRawData( aEntry, GetEncryptionData(), bIsEncrypted, rZipPackage.GetSharedMutexRef() );
680*b1cdbd2cSJim Jagielski 	}
681*b1cdbd2cSJim Jagielski 	else if ( GetOwnSeekStream().is() )
682*b1cdbd2cSJim Jagielski 	{
683*b1cdbd2cSJim Jagielski 		if ( m_nStreamMode == PACKAGE_STREAM_RAW )
684*b1cdbd2cSJim Jagielski 		{
685*b1cdbd2cSJim Jagielski 			// the header should not be returned here
686*b1cdbd2cSJim Jagielski 			return GetRawEncrStreamNoHeaderCopy();
687*b1cdbd2cSJim Jagielski 		}
688*b1cdbd2cSJim Jagielski 		else if ( m_nStreamMode == PACKAGE_STREAM_DATA )
689*b1cdbd2cSJim Jagielski 			return TryToGetRawFromDataStream( sal_False );
690*b1cdbd2cSJim Jagielski 	}
691*b1cdbd2cSJim Jagielski 
692*b1cdbd2cSJim Jagielski 	return uno::Reference< io::XInputStream >();
693*b1cdbd2cSJim Jagielski }
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski // XUnoTunnel
696*b1cdbd2cSJim Jagielski 
697*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
getSomething(const Sequence<sal_Int8> & aIdentifier)698*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL ZipPackageStream::getSomething( const Sequence< sal_Int8 >& aIdentifier )
699*b1cdbd2cSJim Jagielski 	throw( RuntimeException )
700*b1cdbd2cSJim Jagielski {
701*b1cdbd2cSJim Jagielski 	sal_Int64 nMe = 0;
702*b1cdbd2cSJim Jagielski 	if ( aIdentifier.getLength() == 16 &&
703*b1cdbd2cSJim Jagielski 		 0 == rtl_compareMemory( static_getImplementationId().getConstArray(), aIdentifier.getConstArray(), 16 ) )
704*b1cdbd2cSJim Jagielski 		nMe = reinterpret_cast < sal_Int64 > ( this );
705*b1cdbd2cSJim Jagielski 	return nMe;
706*b1cdbd2cSJim Jagielski }
707*b1cdbd2cSJim Jagielski 
708*b1cdbd2cSJim Jagielski // XPropertySet
709*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
setPropertyValue(const OUString & aPropertyName,const Any & aValue)710*b1cdbd2cSJim Jagielski void SAL_CALL ZipPackageStream::setPropertyValue( const OUString& aPropertyName, const Any& aValue )
711*b1cdbd2cSJim Jagielski 		throw( beans::UnknownPropertyException, beans::PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException )
712*b1cdbd2cSJim Jagielski {
713*b1cdbd2cSJim Jagielski 	if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "MediaType" )) )
714*b1cdbd2cSJim Jagielski 	{
715*b1cdbd2cSJim Jagielski 		if ( rZipPackage.getFormat() != embed::StorageFormats::PACKAGE && rZipPackage.getFormat() != embed::StorageFormats::OFOPXML )
716*b1cdbd2cSJim Jagielski 			throw beans::PropertyVetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski 		if ( aValue >>= sMediaType )
719*b1cdbd2cSJim Jagielski 		{
720*b1cdbd2cSJim Jagielski 			if ( sMediaType.getLength() > 0 )
721*b1cdbd2cSJim Jagielski 			{
722*b1cdbd2cSJim Jagielski 				if ( sMediaType.indexOf ( OUString( RTL_CONSTASCII_USTRINGPARAM ( "text" ) ) ) != -1
723*b1cdbd2cSJim Jagielski 			 	|| sMediaType.equals( OUString( RTL_CONSTASCII_USTRINGPARAM ( "application/vnd.sun.star.oleobject" ) ) ) )
724*b1cdbd2cSJim Jagielski 					bToBeCompressed = sal_True;
725*b1cdbd2cSJim Jagielski 				else if ( !m_bCompressedIsSetFromOutside )
726*b1cdbd2cSJim Jagielski 					bToBeCompressed = sal_False;
727*b1cdbd2cSJim Jagielski 			}
728*b1cdbd2cSJim Jagielski 		}
729*b1cdbd2cSJim Jagielski 		else
730*b1cdbd2cSJim Jagielski 			throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "MediaType must be a string!\n" ) ),
731*b1cdbd2cSJim Jagielski 											uno::Reference< XInterface >(),
732*b1cdbd2cSJim Jagielski 											2 );
733*b1cdbd2cSJim Jagielski 
734*b1cdbd2cSJim Jagielski 	}
735*b1cdbd2cSJim Jagielski 	else if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Size" ) ) )
736*b1cdbd2cSJim Jagielski 	{
737*b1cdbd2cSJim Jagielski 		if ( !( aValue >>= aEntry.nSize ) )
738*b1cdbd2cSJim Jagielski 			throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Wrong type for Size property!\n" ) ),
739*b1cdbd2cSJim Jagielski 											uno::Reference< XInterface >(),
740*b1cdbd2cSJim Jagielski 											2 );
741*b1cdbd2cSJim Jagielski 	}
742*b1cdbd2cSJim Jagielski 	else if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Encrypted" ) ) )
743*b1cdbd2cSJim Jagielski 	{
744*b1cdbd2cSJim Jagielski 		if ( rZipPackage.getFormat() != embed::StorageFormats::PACKAGE )
745*b1cdbd2cSJim Jagielski 			throw beans::PropertyVetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
746*b1cdbd2cSJim Jagielski 
747*b1cdbd2cSJim Jagielski 		sal_Bool bEnc = sal_False;
748*b1cdbd2cSJim Jagielski 		if ( aValue >>= bEnc )
749*b1cdbd2cSJim Jagielski 		{
750*b1cdbd2cSJim Jagielski 			// In case of new raw stream, the stream must not be encrypted on storing
751*b1cdbd2cSJim Jagielski 			if ( bEnc && m_nStreamMode == PACKAGE_STREAM_RAW )
752*b1cdbd2cSJim Jagielski 				throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Raw stream can not be encrypted on storing" ) ),
753*b1cdbd2cSJim Jagielski 												uno::Reference< XInterface >(),
754*b1cdbd2cSJim Jagielski 												2 );
755*b1cdbd2cSJim Jagielski 
756*b1cdbd2cSJim Jagielski 			bToBeEncrypted = bEnc;
757*b1cdbd2cSJim Jagielski 			if ( bToBeEncrypted && !m_xBaseEncryptionData.is() )
758*b1cdbd2cSJim Jagielski 				m_xBaseEncryptionData = new BaseEncryptionData;
759*b1cdbd2cSJim Jagielski 		}
760*b1cdbd2cSJim Jagielski 		else
761*b1cdbd2cSJim Jagielski 			throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Wrong type for Encrypted property!\n" ) ),
762*b1cdbd2cSJim Jagielski 											uno::Reference< XInterface >(),
763*b1cdbd2cSJim Jagielski 											2 );
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski 	}
766*b1cdbd2cSJim Jagielski 	else if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ENCRYPTION_KEY_PROPERTY ) ) )
767*b1cdbd2cSJim Jagielski 	{
768*b1cdbd2cSJim Jagielski 		if ( rZipPackage.getFormat() != embed::StorageFormats::PACKAGE )
769*b1cdbd2cSJim Jagielski 			throw beans::PropertyVetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
770*b1cdbd2cSJim Jagielski 
771*b1cdbd2cSJim Jagielski 		uno::Sequence< sal_Int8 > aNewKey;
772*b1cdbd2cSJim Jagielski 
773*b1cdbd2cSJim Jagielski 		if ( !( aValue >>= aNewKey ) )
774*b1cdbd2cSJim Jagielski 		{
775*b1cdbd2cSJim Jagielski 			OUString sTempString;
776*b1cdbd2cSJim Jagielski 			if ( ( aValue >>= sTempString ) )
777*b1cdbd2cSJim Jagielski 			{
778*b1cdbd2cSJim Jagielski 				sal_Int32 nPathLength = sTempString.getLength();
779*b1cdbd2cSJim Jagielski 				Sequence < sal_Int8 > aSequence ( nPathLength );
780*b1cdbd2cSJim Jagielski 				sal_Int8 *pArray = aSequence.getArray();
781*b1cdbd2cSJim Jagielski 				const sal_Unicode *pChar = sTempString.getStr();
782*b1cdbd2cSJim Jagielski 				for ( sal_Int16 i = 0; i < nPathLength; i++ )
783*b1cdbd2cSJim Jagielski 					pArray[i] = static_cast < const sal_Int8 > ( pChar[i] );
784*b1cdbd2cSJim Jagielski 				aNewKey = aSequence;
785*b1cdbd2cSJim Jagielski 			}
786*b1cdbd2cSJim Jagielski 			else
787*b1cdbd2cSJim Jagielski 				throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Wrong type for EncryptionKey property!\n" ) ),
788*b1cdbd2cSJim Jagielski 												uno::Reference< XInterface >(),
789*b1cdbd2cSJim Jagielski 												2 );
790*b1cdbd2cSJim Jagielski 		}
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski 		if ( aNewKey.getLength() )
793*b1cdbd2cSJim Jagielski 		{
794*b1cdbd2cSJim Jagielski 			if ( !m_xBaseEncryptionData.is() )
795*b1cdbd2cSJim Jagielski 				m_xBaseEncryptionData = new BaseEncryptionData;
796*b1cdbd2cSJim Jagielski 
797*b1cdbd2cSJim Jagielski 			m_aEncryptionKey = aNewKey;
798*b1cdbd2cSJim Jagielski 			// In case of new raw stream, the stream must not be encrypted on storing
799*b1cdbd2cSJim Jagielski 			bHaveOwnKey = sal_True;
800*b1cdbd2cSJim Jagielski 			if ( m_nStreamMode != PACKAGE_STREAM_RAW )
801*b1cdbd2cSJim Jagielski 				bToBeEncrypted = sal_True;
802*b1cdbd2cSJim Jagielski 		}
803*b1cdbd2cSJim Jagielski 		else
804*b1cdbd2cSJim Jagielski         {
805*b1cdbd2cSJim Jagielski 			bHaveOwnKey = sal_False;
806*b1cdbd2cSJim Jagielski             m_aEncryptionKey.realloc( 0 );
807*b1cdbd2cSJim Jagielski         }
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski         m_aStorageEncryptionKeys.realloc( 0 );
810*b1cdbd2cSJim Jagielski 	}
811*b1cdbd2cSJim Jagielski 	else if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( STORAGE_ENCRYPTION_KEYS_PROPERTY ) ) )
812*b1cdbd2cSJim Jagielski 	{
813*b1cdbd2cSJim Jagielski 		if ( rZipPackage.getFormat() != embed::StorageFormats::PACKAGE )
814*b1cdbd2cSJim Jagielski 			throw beans::PropertyVetoException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski 		uno::Sequence< beans::NamedValue > aKeys;
817*b1cdbd2cSJim Jagielski 		if ( !( aValue >>= aKeys ) )
818*b1cdbd2cSJim Jagielski 		{
819*b1cdbd2cSJim Jagielski 				throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Wrong type for StorageEncryptionKeys property!\n" ) ),
820*b1cdbd2cSJim Jagielski 												uno::Reference< XInterface >(),
821*b1cdbd2cSJim Jagielski 												2 );
822*b1cdbd2cSJim Jagielski 		}
823*b1cdbd2cSJim Jagielski 
824*b1cdbd2cSJim Jagielski 		if ( aKeys.getLength() )
825*b1cdbd2cSJim Jagielski 		{
826*b1cdbd2cSJim Jagielski 			if ( !m_xBaseEncryptionData.is() )
827*b1cdbd2cSJim Jagielski 				m_xBaseEncryptionData = new BaseEncryptionData;
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski 			m_aStorageEncryptionKeys = aKeys;
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski 			// In case of new raw stream, the stream must not be encrypted on storing
832*b1cdbd2cSJim Jagielski 			bHaveOwnKey = sal_True;
833*b1cdbd2cSJim Jagielski 			if ( m_nStreamMode != PACKAGE_STREAM_RAW )
834*b1cdbd2cSJim Jagielski 				bToBeEncrypted = sal_True;
835*b1cdbd2cSJim Jagielski 		}
836*b1cdbd2cSJim Jagielski 		else
837*b1cdbd2cSJim Jagielski         {
838*b1cdbd2cSJim Jagielski 			bHaveOwnKey = sal_False;
839*b1cdbd2cSJim Jagielski             m_aStorageEncryptionKeys.realloc( 0 );
840*b1cdbd2cSJim Jagielski         }
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski         m_aEncryptionKey.realloc( 0 );
843*b1cdbd2cSJim Jagielski 	}
844*b1cdbd2cSJim Jagielski 	else if ( aPropertyName.equalsAsciiL ( RTL_CONSTASCII_STRINGPARAM ( "Compressed" ) ) )
845*b1cdbd2cSJim Jagielski 	{
846*b1cdbd2cSJim Jagielski 		sal_Bool bCompr = sal_False;
847*b1cdbd2cSJim Jagielski 
848*b1cdbd2cSJim Jagielski 		if ( aValue >>= bCompr )
849*b1cdbd2cSJim Jagielski 		{
850*b1cdbd2cSJim Jagielski 			// In case of new raw stream, the stream must not be encrypted on storing
851*b1cdbd2cSJim Jagielski 			if ( bCompr && m_nStreamMode == PACKAGE_STREAM_RAW )
852*b1cdbd2cSJim Jagielski 				throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Raw stream can not be encrypted on storing" ) ),
853*b1cdbd2cSJim Jagielski 												uno::Reference< XInterface >(),
854*b1cdbd2cSJim Jagielski 												2 );
855*b1cdbd2cSJim Jagielski 
856*b1cdbd2cSJim Jagielski 			bToBeCompressed = bCompr;
857*b1cdbd2cSJim Jagielski 			m_bCompressedIsSetFromOutside = sal_True;
858*b1cdbd2cSJim Jagielski 		}
859*b1cdbd2cSJim Jagielski 		else
860*b1cdbd2cSJim Jagielski 			throw IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX "Wrong type for Compressed property!\n" ) ),
861*b1cdbd2cSJim Jagielski 											uno::Reference< XInterface >(),
862*b1cdbd2cSJim Jagielski 											2 );
863*b1cdbd2cSJim Jagielski 	}
864*b1cdbd2cSJim Jagielski 	else
865*b1cdbd2cSJim Jagielski 		throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
866*b1cdbd2cSJim Jagielski }
867*b1cdbd2cSJim Jagielski 
868*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
getPropertyValue(const OUString & PropertyName)869*b1cdbd2cSJim Jagielski Any SAL_CALL ZipPackageStream::getPropertyValue( const OUString& PropertyName )
870*b1cdbd2cSJim Jagielski 		throw( beans::UnknownPropertyException, WrappedTargetException, RuntimeException )
871*b1cdbd2cSJim Jagielski {
872*b1cdbd2cSJim Jagielski 	Any aAny;
873*b1cdbd2cSJim Jagielski 	if ( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "MediaType" ) ) )
874*b1cdbd2cSJim Jagielski 	{
875*b1cdbd2cSJim Jagielski 		aAny <<= sMediaType;
876*b1cdbd2cSJim Jagielski 		return aAny;
877*b1cdbd2cSJim Jagielski 	}
878*b1cdbd2cSJim Jagielski 	else if ( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "Size" ) ) )
879*b1cdbd2cSJim Jagielski 	{
880*b1cdbd2cSJim Jagielski 		aAny <<= aEntry.nSize;
881*b1cdbd2cSJim Jagielski 		return aAny;
882*b1cdbd2cSJim Jagielski 	}
883*b1cdbd2cSJim Jagielski 	else if ( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "Encrypted" ) ) )
884*b1cdbd2cSJim Jagielski 	{
885*b1cdbd2cSJim Jagielski 		aAny <<= ( m_nStreamMode == PACKAGE_STREAM_RAW ) ? sal_True : bToBeEncrypted;
886*b1cdbd2cSJim Jagielski 		return aAny;
887*b1cdbd2cSJim Jagielski 	}
888*b1cdbd2cSJim Jagielski 	else if ( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "WasEncrypted" ) ) )
889*b1cdbd2cSJim Jagielski 	{
890*b1cdbd2cSJim Jagielski 		aAny <<= bIsEncrypted;
891*b1cdbd2cSJim Jagielski 		return aAny;
892*b1cdbd2cSJim Jagielski 	}
893*b1cdbd2cSJim Jagielski 	else if ( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "Compressed" ) ) )
894*b1cdbd2cSJim Jagielski 	{
895*b1cdbd2cSJim Jagielski 		aAny <<= bToBeCompressed;
896*b1cdbd2cSJim Jagielski 		return aAny;
897*b1cdbd2cSJim Jagielski 	}
898*b1cdbd2cSJim Jagielski 	else if ( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ENCRYPTION_KEY_PROPERTY ) ) )
899*b1cdbd2cSJim Jagielski 	{
900*b1cdbd2cSJim Jagielski 		aAny <<= m_aEncryptionKey;
901*b1cdbd2cSJim Jagielski 		return aAny;
902*b1cdbd2cSJim Jagielski 	}
903*b1cdbd2cSJim Jagielski 	else if ( PropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( STORAGE_ENCRYPTION_KEYS_PROPERTY ) ) )
904*b1cdbd2cSJim Jagielski 	{
905*b1cdbd2cSJim Jagielski 		aAny <<= m_aStorageEncryptionKeys;
906*b1cdbd2cSJim Jagielski 		return aAny;
907*b1cdbd2cSJim Jagielski 	}
908*b1cdbd2cSJim Jagielski 	else
909*b1cdbd2cSJim Jagielski 		throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
910*b1cdbd2cSJim Jagielski }
911*b1cdbd2cSJim Jagielski 
912*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
setSize(const sal_Int32 nNewSize)913*b1cdbd2cSJim Jagielski void ZipPackageStream::setSize ( const sal_Int32 nNewSize )
914*b1cdbd2cSJim Jagielski {
915*b1cdbd2cSJim Jagielski 	if ( aEntry.nCompressedSize != nNewSize )
916*b1cdbd2cSJim Jagielski 		aEntry.nMethod = DEFLATED;
917*b1cdbd2cSJim Jagielski 	aEntry.nSize = nNewSize;
918*b1cdbd2cSJim Jagielski }
919*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
getImplementationName()920*b1cdbd2cSJim Jagielski OUString ZipPackageStream::getImplementationName()
921*b1cdbd2cSJim Jagielski 	throw ( RuntimeException )
922*b1cdbd2cSJim Jagielski {
923*b1cdbd2cSJim Jagielski 	return OUString ( RTL_CONSTASCII_USTRINGPARAM ( "ZipPackageStream" ) );
924*b1cdbd2cSJim Jagielski }
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
getSupportedServiceNames()927*b1cdbd2cSJim Jagielski Sequence< OUString > ZipPackageStream::getSupportedServiceNames()
928*b1cdbd2cSJim Jagielski 	throw ( RuntimeException )
929*b1cdbd2cSJim Jagielski {
930*b1cdbd2cSJim Jagielski 	Sequence< OUString > aNames( 1 );
931*b1cdbd2cSJim Jagielski 	aNames[0] = OUString( RTL_CONSTASCII_USTRINGPARAM ( "com.sun.star.packages.PackageStream" ) );
932*b1cdbd2cSJim Jagielski 	return aNames;
933*b1cdbd2cSJim Jagielski }
934*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------
supportsService(OUString const & rServiceName)935*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ZipPackageStream::supportsService( OUString const & rServiceName )
936*b1cdbd2cSJim Jagielski 	throw ( RuntimeException )
937*b1cdbd2cSJim Jagielski {
938*b1cdbd2cSJim Jagielski 	return rServiceName == getSupportedServiceNames()[0];
939*b1cdbd2cSJim Jagielski }
940*b1cdbd2cSJim Jagielski 
941