INTEGRATION: CWS cov2src (1.44.4); FILE MERGED

2005/10/18 09:50:27 rt 1.44.4.1: #126234# Join MWS COV680 m4 into SRC680
This commit is contained in:
Rüdiger Timm
2005-10-19 11:49:50 +00:00
parent 521ffd4772
commit 2c8d03d361

View File

@@ -4,9 +4,9 @@
* *
* $RCSfile: ZipPackageStream.cxx,v $ * $RCSfile: ZipPackageStream.cxx,v $
* *
* $Revision: 1.44 $ * $Revision: 1.45 $
* *
* last change: $Author: hr $ $Date: 2005-09-23 15:56:03 $ * last change: $Author: rt $ $Date: 2005-10-19 12:49:50 $
* *
* The Contents of this file are made available subject to * The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1. * the terms of GNU Lesser General Public License Version 2.1.
@@ -92,7 +92,7 @@ using namespace rtl;
Sequence < sal_Int8 > ZipPackageStream::aImplementationId = Sequence < sal_Int8 > (); Sequence < sal_Int8 > ZipPackageStream::aImplementationId = Sequence < sal_Int8 > ();
void copyInputToOutput_Impl( Reference< io::XInputStream >& aIn, Reference< io::XOutputStream >& aOut ); void copyInputToOutput_Impl( const Reference< io::XInputStream >& aIn, const Reference< io::XOutputStream >& aOut );
ZipPackageStream::ZipPackageStream ( ZipPackage & rNewPackage, ZipPackageStream::ZipPackageStream ( ZipPackage & rNewPackage,
@@ -108,6 +108,7 @@ ZipPackageStream::ZipPackageStream ( ZipPackage & rNewPackage,
, m_nStreamMode( PACKAGE_STREAM_NOTSET ) , m_nStreamMode( PACKAGE_STREAM_NOTSET )
, m_nMagicalHackSize( 0 ) , m_nMagicalHackSize( 0 )
, m_nMagicalHackPos( 0 ) , m_nMagicalHackPos( 0 )
, m_bHasSeekable( sal_False )
{ {
OSL_ENSURE( m_xFactory.is(), "No factory is provided to ZipPackageStream!\n" ); OSL_ENSURE( m_xFactory.is(), "No factory is provided to ZipPackageStream!\n" );
@@ -157,20 +158,42 @@ void ZipPackageStream::CloseOwnStreamIfAny()
{ {
xStream->closeInput(); xStream->closeInput();
xStream = uno::Reference< io::XInputStream >(); xStream = uno::Reference< io::XInputStream >();
m_bHasSeekable = sal_False;
} }
} }
//--------------------------------------------------------------------------
uno::Reference< io::XInputStream >& ZipPackageStream::GetOwnSeekStream()
{
if ( !m_bHasSeekable && xStream.is() )
{
// The package component requires that every stream either be FROM a package or it must support XSeekable!
// The only exception is a nonseekable stream that is provided only for storing, if such a stream
// is accessed before commit it MUST be wrapped.
// Wrap the stream in case it is not seekable
xStream = ::comphelper::OSeekableInputWrapper::CheckSeekableCanWrap( xStream, m_xFactory );
Reference< io::XSeekable > xSeek( xStream, UNO_QUERY );
if ( !xSeek.is() )
throw RuntimeException( OUString::createFromAscii( "The stream must support XSeekable!" ),
Reference< XInterface >() );
m_bHasSeekable = sal_True;
}
return xStream;
}
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
uno::Reference< io::XInputStream > ZipPackageStream::GetRawEncrStreamNoHeaderCopy() uno::Reference< io::XInputStream > ZipPackageStream::GetRawEncrStreamNoHeaderCopy()
{ {
if ( m_nStreamMode != PACKAGE_STREAM_RAW || !xStream.is() ) if ( m_nStreamMode != PACKAGE_STREAM_RAW || !GetOwnSeekStream().is() )
throw io::IOException(); // TODO throw io::IOException(); // TODO
if ( xEncryptionData.isEmpty() ) if ( xEncryptionData.isEmpty() )
throw ZipIOException( OUString::createFromAscii( "Encrypted stream without encryption data!\n" ), throw ZipIOException( OUString::createFromAscii( "Encrypted stream without encryption data!\n" ),
Reference< XInterface >() ); Reference< XInterface >() );
uno::Reference< io::XSeekable > xSeek( xStream, UNO_QUERY ); uno::Reference< io::XSeekable > xSeek( GetOwnSeekStream(), UNO_QUERY );
if ( !xSeek.is() ) if ( !xSeek.is() )
throw ZipIOException( OUString::createFromAscii( "The stream must be seekable!\n" ), throw ZipIOException( OUString::createFromAscii( "The stream must be seekable!\n" ),
Reference< XInterface >() ); Reference< XInterface >() );
@@ -189,7 +212,7 @@ uno::Reference< io::XInputStream > ZipPackageStream::GetRawEncrStreamNoHeaderCop
throw io::IOException(); // TODO: throw io::IOException(); // TODO:
// copy the raw stream to the temporary file starting from the current position // copy the raw stream to the temporary file starting from the current position
copyInputToOutput_Impl( xStream, xTempOut ); copyInputToOutput_Impl( GetOwnSeekStream(), xTempOut );
xTempOut->closeOutput(); xTempOut->closeOutput();
xTempSeek->seek( 0 ); xTempSeek->seek( 0 );
@@ -199,7 +222,7 @@ uno::Reference< io::XInputStream > ZipPackageStream::GetRawEncrStreamNoHeaderCop
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
Reference< io::XInputStream > ZipPackageStream::TryToGetRawFromDataStream( sal_Bool bAddHeaderForEncr ) Reference< io::XInputStream > ZipPackageStream::TryToGetRawFromDataStream( sal_Bool bAddHeaderForEncr )
{ {
if ( m_nStreamMode != PACKAGE_STREAM_DATA || !xStream.is() || bAddHeaderForEncr && !bToBeEncrypted ) if ( m_nStreamMode != PACKAGE_STREAM_DATA || !GetOwnSeekStream().is() || bAddHeaderForEncr && !bToBeEncrypted )
throw packages::NoEncryptionException(); // TODO throw packages::NoEncryptionException(); // TODO
Sequence< sal_Int8 > aKey; Sequence< sal_Int8 > aKey;
@@ -239,7 +262,7 @@ Reference< io::XInputStream > ZipPackageStream::TryToGetRawFromDataStream( sal_B
if ( !m_aSharedMutexRef.Is() ) if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder(); m_aSharedMutexRef = new SotMutexHolder();
xNewPackStream->setDataStream( static_cast< io::XInputStream* >( xNewPackStream->setDataStream( static_cast< io::XInputStream* >(
new WrapStreamForShare( xStream, m_aSharedMutexRef ) ) ); new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef ) ) );
Reference< XPropertySet > xNewPSProps( xNewPackStream, UNO_QUERY ); Reference< XPropertySet > xNewPSProps( xNewPackStream, UNO_QUERY );
if ( !xNewPSProps.is() ) if ( !xNewPSProps.is() )
@@ -316,9 +339,9 @@ Reference< io::XInputStream > ZipPackageStream::TryToGetRawFromDataStream( sal_B
//-------------------------------------------------------------------------- //--------------------------------------------------------------------------
sal_Bool ZipPackageStream::ParsePackageRawStream() sal_Bool ZipPackageStream::ParsePackageRawStream()
{ {
OSL_ENSURE( xStream.is(), "A stream must be provided!\n" ); OSL_ENSURE( GetOwnSeekStream().is(), "A stream must be provided!\n" );
if ( !xStream.is() ) if ( !GetOwnSeekStream().is() )
return sal_False; return sal_False;
sal_Bool bOk = sal_False; sal_Bool bOk = sal_False;
@@ -329,7 +352,7 @@ sal_Bool ZipPackageStream::ParsePackageRawStream()
try try
{ {
if ( xStream->readBytes ( aHeader, 4 ) == 4 ) if ( GetOwnSeekStream()->readBytes ( aHeader, 4 ) == 4 )
{ {
const sal_Int8 *pHeader = aHeader.getConstArray(); const sal_Int8 *pHeader = aHeader.getConstArray();
sal_uInt32 nHeader = ( pHeader [0] & 0xFF ) | sal_uInt32 nHeader = ( pHeader [0] & 0xFF ) |
@@ -342,7 +365,7 @@ sal_Bool ZipPackageStream::ParsePackageRawStream()
xTempEncrData = new EncryptionData; xTempEncrData = new EncryptionData;
::rtl::OUString aMediaType; ::rtl::OUString aMediaType;
if ( ZipFile::StaticFillData ( xTempEncrData, nMagHackSize, aMediaType, xStream ) ) if ( ZipFile::StaticFillData ( xTempEncrData, nMagHackSize, aMediaType, GetOwnSeekStream() ) )
{ {
// We'll want to skip the data we've just read, so calculate how much we just read // We'll want to skip the data we've just read, so calculate how much we just read
// and remember it // and remember it
@@ -393,16 +416,10 @@ void ZipPackageStream::SetPackageMember( sal_Bool bNewValue )
void SAL_CALL ZipPackageStream::setInputStream( const Reference< io::XInputStream >& aStream ) void SAL_CALL ZipPackageStream::setInputStream( const Reference< io::XInputStream >& aStream )
throw(RuntimeException) throw(RuntimeException)
{ {
// The package component requires that every stream either be FROM a package or it must support XSeekable! // if seekable access is required the wrapping will be done on demand
// wrap the stream in case it is not seekable
Reference< io::XInputStream > xNewStream = ::comphelper::OSeekableInputWrapper::CheckSeekableCanWrap( aStream, m_xFactory );
Reference< io::XSeekable > xSeek( xNewStream, UNO_QUERY );
if ( !xSeek.is() )
throw RuntimeException( OUString::createFromAscii( "The stream must support XSeekable!" ),
Reference< XInterface >() );
m_aSharedMutexRef = new SotMutexHolder(); m_aSharedMutexRef = new SotMutexHolder();
xStream = xNewStream; xStream = aStream;
m_bHasSeekable = sal_False;
SetPackageMember ( sal_False ); SetPackageMember ( sal_False );
aEntry.nTime = -1; aEntry.nTime = -1;
m_nStreamMode = PACKAGE_STREAM_DETECT; m_nStreamMode = PACKAGE_STREAM_DETECT;
@@ -420,11 +437,11 @@ Reference< io::XInputStream > SAL_CALL ZipPackageStream::getRawData()
xEncryptionData->aKey = rZipPackage.getEncryptionKey(); xEncryptionData->aKey = rZipPackage.getEncryptionKey();
return rZipPackage.getZipFile().getRawData( aEntry, xEncryptionData, bIsEncrypted ); return rZipPackage.getZipFile().getRawData( aEntry, xEncryptionData, bIsEncrypted );
} }
else if ( xStream.is() ) else if ( GetOwnSeekStream().is() )
{ {
if ( !m_aSharedMutexRef.Is() ) if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder(); m_aSharedMutexRef = new SotMutexHolder();
return new WrapStreamForShare( xStream, m_aSharedMutexRef ); return new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef );
} }
else else
return Reference < io::XInputStream > (); return Reference < io::XInputStream > ();
@@ -453,11 +470,11 @@ Reference< io::XInputStream > SAL_CALL ZipPackageStream::getInputStream( )
xEncryptionData->aKey = rZipPackage.getEncryptionKey(); xEncryptionData->aKey = rZipPackage.getEncryptionKey();
return rZipPackage.getZipFile().getInputStream( aEntry, xEncryptionData, bIsEncrypted ); return rZipPackage.getZipFile().getInputStream( aEntry, xEncryptionData, bIsEncrypted );
} }
else if ( xStream.is() ) else if ( GetOwnSeekStream().is() )
{ {
if ( !m_aSharedMutexRef.Is() ) if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder(); m_aSharedMutexRef = new SotMutexHolder();
return new WrapStreamForShare( xStream, m_aSharedMutexRef ); return new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef );
} }
else else
return Reference < io::XInputStream > (); return Reference < io::XInputStream > ();
@@ -500,12 +517,12 @@ Reference< io::XInputStream > SAL_CALL ZipPackageStream::getDataStream()
return rZipPackage.getZipFile().getDataStream( aEntry, xEncryptionData, bIsEncrypted ); return rZipPackage.getZipFile().getDataStream( aEntry, xEncryptionData, bIsEncrypted );
} }
else if ( m_nStreamMode == PACKAGE_STREAM_RAW ) else if ( m_nStreamMode == PACKAGE_STREAM_RAW )
return ZipFile::StaticGetDataFromRawStream( xStream, xEncryptionData ); return ZipFile::StaticGetDataFromRawStream( GetOwnSeekStream(), xEncryptionData );
else if ( xStream.is() ) else if ( GetOwnSeekStream().is() )
{ {
if ( !m_aSharedMutexRef.Is() ) if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder(); m_aSharedMutexRef = new SotMutexHolder();
return new WrapStreamForShare( xStream, m_aSharedMutexRef ); return new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef );
} }
else else
return uno::Reference< io::XInputStream >(); return uno::Reference< io::XInputStream >();
@@ -532,13 +549,13 @@ Reference< io::XInputStream > SAL_CALL ZipPackageStream::getRawStream()
return rZipPackage.getZipFile().getWrappedRawStream( aEntry, xEncryptionData, sMediaType ); return rZipPackage.getZipFile().getWrappedRawStream( aEntry, xEncryptionData, sMediaType );
} }
else if ( xStream.is() ) else if ( GetOwnSeekStream().is() )
{ {
if ( m_nStreamMode == PACKAGE_STREAM_RAW ) if ( m_nStreamMode == PACKAGE_STREAM_RAW )
{ {
if ( !m_aSharedMutexRef.Is() ) if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder(); m_aSharedMutexRef = new SotMutexHolder();
return new WrapStreamForShare( xStream, m_aSharedMutexRef ); return new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef );
} }
else if ( m_nStreamMode == PACKAGE_STREAM_DATA && bToBeEncrypted ) else if ( m_nStreamMode == PACKAGE_STREAM_DATA && bToBeEncrypted )
return TryToGetRawFromDataStream( sal_True ); return TryToGetRawFromDataStream( sal_True );
@@ -580,6 +597,9 @@ void SAL_CALL ZipPackageStream::setRawStream( const Reference< io::XInputStream
throw packages::NoRawFormatException(); throw packages::NoRawFormatException();
} }
// the raw stream MUST have seekable access
m_bHasSeekable = sal_True;
m_aSharedMutexRef = new SotMutexHolder(); m_aSharedMutexRef = new SotMutexHolder();
SetPackageMember ( sal_False ); SetPackageMember ( sal_False );
aEntry.nTime = -1; aEntry.nTime = -1;
@@ -603,7 +623,7 @@ uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getPlainRawStream(
{ {
return rZipPackage.getZipFile().getRawData( aEntry, xEncryptionData, bIsEncrypted ); return rZipPackage.getZipFile().getRawData( aEntry, xEncryptionData, bIsEncrypted );
} }
else if ( xStream.is() ) else if ( GetOwnSeekStream().is() )
{ {
if ( m_nStreamMode == PACKAGE_STREAM_RAW ) if ( m_nStreamMode == PACKAGE_STREAM_RAW )
{ {