summaryrefslogtreecommitdiff
path: root/package/source/zippackage
diff options
context:
space:
mode:
authorRüdiger Timm <rt@openoffice.org>2005-10-19 11:49:50 +0000
committerRüdiger Timm <rt@openoffice.org>2005-10-19 11:49:50 +0000
commit2c8d03d361a33f44d5740ad5aa41e9ead0fb01b5 (patch)
treebbb3632531a5c68c37a1dad9b56b09f248baa327 /package/source/zippackage
parent521ffd4772437cac8f673f74d3d64f85fd829d8f (diff)
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
Diffstat (limited to 'package/source/zippackage')
-rw-r--r--package/source/zippackage/ZipPackageStream.cxx82
1 files changed, 51 insertions, 31 deletions
diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx
index 693cd1ec7e6f..b10a734257fd 100644
--- a/package/source/zippackage/ZipPackageStream.cxx
+++ b/package/source/zippackage/ZipPackageStream.cxx
@@ -4,9 +4,9 @@
*
* $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 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 > ();
-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,
@@ -108,6 +108,7 @@ ZipPackageStream::ZipPackageStream ( ZipPackage & rNewPackage,
, m_nStreamMode( PACKAGE_STREAM_NOTSET )
, m_nMagicalHackSize( 0 )
, m_nMagicalHackPos( 0 )
+, m_bHasSeekable( sal_False )
{
OSL_ENSURE( m_xFactory.is(), "No factory is provided to ZipPackageStream!\n" );
@@ -157,20 +158,42 @@ void ZipPackageStream::CloseOwnStreamIfAny()
{
xStream->closeInput();
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()
{
- if ( m_nStreamMode != PACKAGE_STREAM_RAW || !xStream.is() )
+ if ( m_nStreamMode != PACKAGE_STREAM_RAW || !GetOwnSeekStream().is() )
throw io::IOException(); // TODO
if ( xEncryptionData.isEmpty() )
throw ZipIOException( OUString::createFromAscii( "Encrypted stream without encryption data!\n" ),
Reference< XInterface >() );
- uno::Reference< io::XSeekable > xSeek( xStream, UNO_QUERY );
+ uno::Reference< io::XSeekable > xSeek( GetOwnSeekStream(), UNO_QUERY );
if ( !xSeek.is() )
throw ZipIOException( OUString::createFromAscii( "The stream must be seekable!\n" ),
Reference< XInterface >() );
@@ -189,7 +212,7 @@ uno::Reference< io::XInputStream > ZipPackageStream::GetRawEncrStreamNoHeaderCop
throw io::IOException(); // TODO:
// copy the raw stream to the temporary file starting from the current position
- copyInputToOutput_Impl( xStream, xTempOut );
+ copyInputToOutput_Impl( GetOwnSeekStream(), xTempOut );
xTempOut->closeOutput();
xTempSeek->seek( 0 );
@@ -199,7 +222,7 @@ uno::Reference< io::XInputStream > ZipPackageStream::GetRawEncrStreamNoHeaderCop
//--------------------------------------------------------------------------
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
Sequence< sal_Int8 > aKey;
@@ -239,7 +262,7 @@ Reference< io::XInputStream > ZipPackageStream::TryToGetRawFromDataStream( sal_B
if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder();
xNewPackStream->setDataStream( static_cast< io::XInputStream* >(
- new WrapStreamForShare( xStream, m_aSharedMutexRef ) ) );
+ new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef ) ) );
Reference< XPropertySet > xNewPSProps( xNewPackStream, UNO_QUERY );
if ( !xNewPSProps.is() )
@@ -316,9 +339,9 @@ Reference< io::XInputStream > ZipPackageStream::TryToGetRawFromDataStream( sal_B
//--------------------------------------------------------------------------
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;
sal_Bool bOk = sal_False;
@@ -329,7 +352,7 @@ sal_Bool ZipPackageStream::ParsePackageRawStream()
try
{
- if ( xStream->readBytes ( aHeader, 4 ) == 4 )
+ if ( GetOwnSeekStream()->readBytes ( aHeader, 4 ) == 4 )
{
const sal_Int8 *pHeader = aHeader.getConstArray();
sal_uInt32 nHeader = ( pHeader [0] & 0xFF ) |
@@ -342,7 +365,7 @@ sal_Bool ZipPackageStream::ParsePackageRawStream()
xTempEncrData = new EncryptionData;
::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
// and remember it
@@ -393,16 +416,10 @@ void ZipPackageStream::SetPackageMember( sal_Bool bNewValue )
void SAL_CALL ZipPackageStream::setInputStream( const Reference< io::XInputStream >& aStream )
throw(RuntimeException)
{
- // The package component requires that every stream either be FROM a package or it must support XSeekable!
- // 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 >() );
-
+ // if seekable access is required the wrapping will be done on demand
m_aSharedMutexRef = new SotMutexHolder();
- xStream = xNewStream;
+ xStream = aStream;
+ m_bHasSeekable = sal_False;
SetPackageMember ( sal_False );
aEntry.nTime = -1;
m_nStreamMode = PACKAGE_STREAM_DETECT;
@@ -420,11 +437,11 @@ Reference< io::XInputStream > SAL_CALL ZipPackageStream::getRawData()
xEncryptionData->aKey = rZipPackage.getEncryptionKey();
return rZipPackage.getZipFile().getRawData( aEntry, xEncryptionData, bIsEncrypted );
}
- else if ( xStream.is() )
+ else if ( GetOwnSeekStream().is() )
{
if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder();
- return new WrapStreamForShare( xStream, m_aSharedMutexRef );
+ return new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef );
}
else
return Reference < io::XInputStream > ();
@@ -453,11 +470,11 @@ Reference< io::XInputStream > SAL_CALL ZipPackageStream::getInputStream( )
xEncryptionData->aKey = rZipPackage.getEncryptionKey();
return rZipPackage.getZipFile().getInputStream( aEntry, xEncryptionData, bIsEncrypted );
}
- else if ( xStream.is() )
+ else if ( GetOwnSeekStream().is() )
{
if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder();
- return new WrapStreamForShare( xStream, m_aSharedMutexRef );
+ return new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef );
}
else
return Reference < io::XInputStream > ();
@@ -500,12 +517,12 @@ Reference< io::XInputStream > SAL_CALL ZipPackageStream::getDataStream()
return rZipPackage.getZipFile().getDataStream( aEntry, xEncryptionData, bIsEncrypted );
}
else if ( m_nStreamMode == PACKAGE_STREAM_RAW )
- return ZipFile::StaticGetDataFromRawStream( xStream, xEncryptionData );
- else if ( xStream.is() )
+ return ZipFile::StaticGetDataFromRawStream( GetOwnSeekStream(), xEncryptionData );
+ else if ( GetOwnSeekStream().is() )
{
if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder();
- return new WrapStreamForShare( xStream, m_aSharedMutexRef );
+ return new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef );
}
else
return uno::Reference< io::XInputStream >();
@@ -532,13 +549,13 @@ Reference< io::XInputStream > SAL_CALL ZipPackageStream::getRawStream()
return rZipPackage.getZipFile().getWrappedRawStream( aEntry, xEncryptionData, sMediaType );
}
- else if ( xStream.is() )
+ else if ( GetOwnSeekStream().is() )
{
if ( m_nStreamMode == PACKAGE_STREAM_RAW )
{
if ( !m_aSharedMutexRef.Is() )
m_aSharedMutexRef = new SotMutexHolder();
- return new WrapStreamForShare( xStream, m_aSharedMutexRef );
+ return new WrapStreamForShare( GetOwnSeekStream(), m_aSharedMutexRef );
}
else if ( m_nStreamMode == PACKAGE_STREAM_DATA && bToBeEncrypted )
return TryToGetRawFromDataStream( sal_True );
@@ -580,6 +597,9 @@ void SAL_CALL ZipPackageStream::setRawStream( const Reference< io::XInputStream
throw packages::NoRawFormatException();
}
+ // the raw stream MUST have seekable access
+ m_bHasSeekable = sal_True;
+
m_aSharedMutexRef = new SotMutexHolder();
SetPackageMember ( sal_False );
aEntry.nTime = -1;
@@ -603,7 +623,7 @@ uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getPlainRawStream(
{
return rZipPackage.getZipFile().getRawData( aEntry, xEncryptionData, bIsEncrypted );
}
- else if ( xStream.is() )
+ else if ( GetOwnSeekStream().is() )
{
if ( m_nStreamMode == PACKAGE_STREAM_RAW )
{