diff options
-rw-r--r-- | package/inc/ByteGrabber.hxx | 7 | ||||
-rw-r--r-- | package/inc/ZipFile.hxx | 9 | ||||
-rw-r--r-- | package/inc/ZipOutputStream.hxx | 11 | ||||
-rw-r--r-- | package/inc/ZipPackage.hxx | 46 | ||||
-rw-r--r-- | package/inc/ZipPackageBuffer.hxx | 9 | ||||
-rw-r--r-- | package/inc/ZipPackageFolder.hxx | 32 | ||||
-rw-r--r-- | package/source/zipapi/ByteGrabber.cxx | 9 | ||||
-rw-r--r-- | package/source/zipapi/Deflater.cxx | 13 | ||||
-rw-r--r-- | package/source/zipapi/EntryInputStream.cxx | 26 | ||||
-rw-r--r-- | package/source/zipapi/Inflater.cxx | 13 | ||||
-rw-r--r-- | package/source/zipapi/ZipFile.cxx | 103 | ||||
-rw-r--r-- | package/source/zipapi/ZipOutputStream.cxx | 14 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackage.cxx | 214 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackageBuffer.cxx | 31 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackageFolder.cxx | 241 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackageStream.cxx | 28 |
16 files changed, 556 insertions, 250 deletions
diff --git a/package/inc/ByteGrabber.hxx b/package/inc/ByteGrabber.hxx index baa220eaf54e..3f0fdc195d5b 100644 --- a/package/inc/ByteGrabber.hxx +++ b/package/inc/ByteGrabber.hxx @@ -2,9 +2,9 @@ * * $RCSfile: ByteGrabber.hxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: mtg $ $Date: 2000-11-29 13:47:16 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:36 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -79,9 +79,10 @@ private: com::sun::star::uno::Reference < com::sun::star::io::XInputStream > xStream; com::sun::star::uno::Reference < com::sun::star::io::XSeekable > xSeek; public: - ByteGrabber (com::sun::star::uno::Reference<com::sun::star::io::XInputStream> xIstream); + ByteGrabber (com::sun::star::uno::Reference < com::sun::star::io::XInputStream > xIstream); ~ByteGrabber(); + void setInputStream (com::sun::star::uno::Reference < com::sun::star::io::XInputStream > xNewStream); // XInputStream virtual sal_Int32 SAL_CALL readBytes( ::com::sun::star::uno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead ) throw(::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); diff --git a/package/inc/ZipFile.hxx b/package/inc/ZipFile.hxx index 0d3e6c1da808..c7cc9dd1c805 100644 --- a/package/inc/ZipFile.hxx +++ b/package/inc/ZipFile.hxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipFile.hxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: mtg $ $Date: 2000-12-04 11:30:06 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:36 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -121,7 +121,12 @@ public: ZipFile( com::sun::star::uno::Reference < com::sun::star::io::XInputStream > &xInput, sal_Bool bInitialise) throw(::com::sun::star::io::IOException, com::sun::star::package::ZipException, com::sun::star::uno::RuntimeException); void updateFromManList(std::vector < ManifestEntry * > &rManList); + void setInputStream ( com::sun::star::uno::Reference < com::sun::star::io::XInputStream > xNewStream ); + sal_uInt32 SAL_CALL getHeader(const ::com::sun::star::package::ZipEntry& rEntry) + throw(::com::sun::star::io::IOException, ::com::sun::star::package::ZipException, ::com::sun::star::uno::RuntimeException); virtual ~ZipFile(); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL getRawStream( const ::com::sun::star::package::ZipEntry& rEntry ) + throw(::com::sun::star::io::IOException, ::com::sun::star::package::ZipException, ::com::sun::star::uno::RuntimeException); // XElementAccess virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) diff --git a/package/inc/ZipOutputStream.hxx b/package/inc/ZipOutputStream.hxx index d643c3a2da56..9d569f8b7d73 100644 --- a/package/inc/ZipOutputStream.hxx +++ b/package/inc/ZipOutputStream.hxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipOutputStream.hxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: mtg $ $Date: 2000-12-04 11:30:06 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:36 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -118,6 +118,13 @@ private: public: ZipOutputStream( com::sun::star::uno::Reference < com::sun::star::io::XOutputStream > &xOStream, sal_Int32 nNewBufferSize); virtual ~ZipOutputStream(void); + + // rawWrite to support a direct write to the output stream + void SAL_CALL rawWrite( const ::com::sun::star::uno::Sequence< sal_Int8 >& rBuffer) + throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); + void SAL_CALL rawCloseEntry( ) + throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setComment( const ::rtl::OUString& rComment ) throw(::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setMethod( sal_Int32 nNewMethod ) diff --git a/package/inc/ZipPackage.hxx b/package/inc/ZipPackage.hxx index ef8c17489ab5..b9840bb28a4c 100644 --- a/package/inc/ZipPackage.hxx +++ b/package/inc/ZipPackage.hxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipPackage.hxx,v $ * - * $Revision: 1.13 $ + * $Revision: 1.14 $ * - * last change: $Author: mtg $ $Date: 2000-11-29 13:47:16 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:36 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -61,8 +61,8 @@ #ifndef _ZIP_PACKAGE_HXX #define _ZIP_PACKAGE_HXX -#ifndef _CPPUHELPER_IMPLBASE4_HXX_ -#include <cppuhelper/implbase4.hxx> // helper for implementations +#ifndef _CPPUHELPER_WEAK_HXX_ +#include <cppuhelper/weak.hxx> // helper for implementations #endif #ifndef _CPPUHELPER_FACTORY_HXX_ @@ -85,6 +85,10 @@ #include <com/sun/star/util/XChangesBatch.hpp> #endif +#ifndef _COM_SUN_STAR_LANG_XUNOTUNNEL_HPP_ +#include <com/sun/star/lang/XUnoTunnel.hpp> +#endif + #ifndef _UCBHELPER_CONTENT_HXX #include <ucbhelper/content.hxx> #endif @@ -113,10 +117,6 @@ #include "ZipPackageBuffer.hxx" #endif -#ifdef _DEBUG_RECURSION_ -#include "testzip.hxx" -#endif - #ifndef _MANIFEST_ENTRY_HXX #include "ManifestEntry.hxx" #endif @@ -130,18 +130,20 @@ #endif #include <vector> - -class ZipPackage : public cppu::WeakImplHelper4< - com::sun::star::lang::XInitialization, - com::sun::star::container::XHierarchicalNameAccess, - com::sun::star::lang::XSingleServiceFactory, - com::sun::star::util::XChangesBatch - > +class ZipPackageFolder; + +class ZipPackage : public com::sun::star::lang::XInitialization, + public com::sun::star::lang::XSingleServiceFactory, + public com::sun::star::lang::XUnoTunnel, + public com::sun::star::container::XHierarchicalNameAccess, + public com::sun::star::util::XChangesBatch, + public ::cppu::OWeakObject { private: ZipPackageFolder *pRootFolder; ZipFile *pZipFile; ::ucb::Content *pContent; + sal_Bool bContained; ::std::vector < com::sun::star::uno::Reference < com::sun::star::lang::XSingleServiceFactory > > aContainedZips; ::com::sun::star::uno::Reference < com::sun::star::package::XZipFile > xZipFile; ::com::sun::star::uno::Reference < com::sun::star::lang::XUnoTunnel > xRootFolder; @@ -151,6 +153,7 @@ private: sal_Bool isZipFile(com::sun::star::package::ZipEntry &rEntry); void getZipFileContents(); void destroyFolderTree( ::com::sun::star::uno::Reference < ::com::sun::star::lang::XUnoTunnel > xFolder ); + public: ZipPackage (com::sun::star::uno::Reference < com::sun::star::io::XInputStream > &xInput, const ::com::sun::star::uno::Reference < com::sun::star::lang::XMultiServiceFactory > &xNewFactory); @@ -159,7 +162,16 @@ public: { return pRootFolder; } + ZipPackageBuffer & SAL_CALL ZipPackage::writeToBuffer() + throw(::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); virtual ~ZipPackage( void ); + // XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& rType ) + throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL acquire( ) + throw(); + virtual void SAL_CALL release( ) + throw(); // XInitialization virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); @@ -183,5 +195,9 @@ public: // Uno componentiseralation com::sun::star::uno::Reference< com::sun::star::uno::XInterface > ZipFile_create( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > & xMgr ); + virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) + throw(::com::sun::star::uno::RuntimeException); + com::sun::star::uno::Sequence < sal_Int8 > getUnoTunnelImplementationId( void ) + throw(::com::sun::star::uno::RuntimeException); }; #endif diff --git a/package/inc/ZipPackageBuffer.hxx b/package/inc/ZipPackageBuffer.hxx index 6c458ba51aa1..93e5bd61db61 100644 --- a/package/inc/ZipPackageBuffer.hxx +++ b/package/inc/ZipPackageBuffer.hxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipPackageBuffer.hxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: mtg $ $Date: 2000-11-27 16:51:45 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:36 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -81,6 +81,8 @@ #include <cppuhelper/weak.hxx> #endif +#include <memory.h> // for memcpy + class ZipPackageBuffer : public com::sun::star::io::XInputStream, public com::sun::star::io::XOutputStream, @@ -101,6 +103,7 @@ public: throw(); virtual void SAL_CALL release(void) throw(); + // XInputStream virtual sal_Int32 SAL_CALL readBytes( ::com::sun::star::uno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead ) throw(::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual sal_Int32 SAL_CALL readSomeBytes( ::com::sun::star::uno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead ) @@ -111,12 +114,14 @@ public: throw(::com::sun::star::io::NotConnectedException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL closeInput( ) throw(::com::sun::star::io::NotConnectedException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); + // XOutputStream virtual void SAL_CALL writeBytes( const ::com::sun::star::uno::Sequence< sal_Int8 >& aData ) throw(::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL flush( ) throw(::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL closeOutput( ) throw(::com::sun::star::io::NotConnectedException, ::com::sun::star::io::BufferSizeExceededException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); + // XSeekable virtual void SAL_CALL seek( sal_Int64 location ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); virtual sal_Int64 SAL_CALL getPosition( ) diff --git a/package/inc/ZipPackageFolder.hxx b/package/inc/ZipPackageFolder.hxx index 934b7b5080ef..28a7fed0a963 100644 --- a/package/inc/ZipPackageFolder.hxx +++ b/package/inc/ZipPackageFolder.hxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipPackageFolder.hxx,v $ * - * $Revision: 1.11 $ + * $Revision: 1.12 $ * - * last change: $Author: mtg $ $Date: 2000-12-04 11:30:06 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:36 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -77,15 +77,15 @@ #include <com/sun/star/container/XEnumerationAccess.hpp> #endif -#ifndef __com_sun_star_package_ZipEntry_hpp__ +#ifndef _COM_SUN_STAR_PACKAGE_ZIPENTRY_HPP_ #include <com/sun/star/package/ZipEntry.hpp> #endif -#ifndef __com_sun_star_beans_XPropertySet_hpp__ +#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_ #include <com/sun/star/beans/XPropertySet.hpp> #endif -#ifndef __com_sun_star_lang_XUnoTunnel_hpp__ +#ifndef _COM_SUN_STAR_LANG_XUNOTUNNEl_HPP_ #include <com/sun/star/lang/XUnoTunnel.hpp> #endif @@ -131,6 +131,14 @@ struct hashFunc #include "ZipPackageStream.hxx" #endif +#ifndef _ZIP_PACKAGE_HXX +#include "ZipPackage.hxx" +#endif + +#ifndef _ZIP_PACKAGE_BUFFER_HXX +#include "ZipPackageBuffer.hxx" +#endif + #ifndef _ZIP_OUTPUT_STREAM_HXX #include "ZipOutputStream.hxx" #endif @@ -143,12 +151,8 @@ struct hashFunc #include "ManifestEntry.hxx" #endif -#ifdef _DEBUG_RECURSION_ -#include "testzip.hxx" -#endif - typedef std::hash_map < rtl::OUString, com::sun::star::uno::Reference < com::sun::star::lang::XUnoTunnel > , hashFunc, eqFunc > TunnelHash; - +class ZipPackage; class ZipPackageFolder : public ZipPackageEntry, public ::com::sun::star::container::XNameContainer, public ::com::sun::star::container::XEnumerationAccess, @@ -158,16 +162,18 @@ private: ::rtl::OUString sMediaType; TunnelHash aContents; com::sun::star::uno::Reference < com::sun::star::uno::XInterface > xParent; - void setEntry(com::sun::star::package::ZipEntry &rDest, com::sun::star::package::ZipEntry &rSrc); public: - ZipPackageFolder ( void ) ; + ZipPackage *pPackage; + ZipPackageFolder ( void ); + virtual ~ZipPackageFolder( void ); + + static void copyZipEntry( com::sun::star::package::ZipEntry &rDest, const com::sun::star::package::ZipEntry &rSource); void saveContents(rtl::OUString &rPath, std::vector < ManifestEntry * > &rManList, ZipOutputStream & rZipOut) throw(::com::sun::star::uno::RuntimeException); void updateReferences( ZipFile * pNewZipFile); inline sal_Bool isFolder( void ) {return sal_True;} inline sal_Bool isStream( void ) {return sal_False;} - virtual ~ZipPackageFolder( void ); // XInterface virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& rType ) throw(::com::sun::star::uno::RuntimeException); diff --git a/package/source/zipapi/ByteGrabber.cxx b/package/source/zipapi/ByteGrabber.cxx index 04d675d54f52..6ee81797eeb3 100644 --- a/package/source/zipapi/ByteGrabber.cxx +++ b/package/source/zipapi/ByteGrabber.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ByteGrabber.cxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: mtg $ $Date: 2000-12-01 10:49:47 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:43 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -78,6 +78,11 @@ ByteGrabber::~ByteGrabber() if ( xStream.is() ) xStream->closeInput(); } +void ByteGrabber::setInputStream (uno::Reference < io::XInputStream > xNewStream) +{ + xStream = xNewStream; + xSeek = uno::Reference < io::XSeekable > (xNewStream, uno::UNO_QUERY); +} // XInputStream chained sal_Int32 SAL_CALL ByteGrabber::readBytes( uno::Sequence< sal_Int8 >& aData, diff --git a/package/source/zipapi/Deflater.cxx b/package/source/zipapi/Deflater.cxx index 71b77fa88ae4..3dcec91fa237 100644 --- a/package/source/zipapi/Deflater.cxx +++ b/package/source/zipapi/Deflater.cxx @@ -2,9 +2,9 @@ * * $RCSfile: Deflater.cxx,v $ * - * $Revision: 1.4 $ + * $Revision: 1.5 $ * - * last change: $Author: mtg $ $Date: 2000-11-21 17:57:07 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:43 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -74,8 +74,7 @@ using namespace com::sun::star; Deflater::~Deflater(void) { - if (pStream) - delete pStream; + end(); } void Deflater::init (sal_Int32 nLevel, sal_Int32 nStrategy, sal_Bool bNowrap) { @@ -312,6 +311,10 @@ void SAL_CALL Deflater::reset( ) void SAL_CALL Deflater::end( ) throw(uno::RuntimeException) { - z_deflateEnd(pStream); + if (pStream != NULL) + { + z_deflateEnd(pStream); + delete pStream; + } pStream = NULL; } diff --git a/package/source/zipapi/EntryInputStream.cxx b/package/source/zipapi/EntryInputStream.cxx index 34a78847ac50..51ab57f4b2f5 100644 --- a/package/source/zipapi/EntryInputStream.cxx +++ b/package/source/zipapi/EntryInputStream.cxx @@ -2,9 +2,9 @@ * * $RCSfile: EntryInputStream.cxx,v $ * - * $Revision: 1.7 $ + * $Revision: 1.8 $ * - * last change: $Author: obo $ $Date: 2000-12-08 12:28:22 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:43 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -71,6 +71,10 @@ using namespace com::sun::star; /** Provides access to the compressed data in a zipfile. Decompresses on the fly, but * does not currently support XSeekable into the compressed data stream. + * + * 04/12/00 - uncompresses the stream into memory and seeks on it 'in memory' + * This is a "temporary" fix which will be changed ASAP (read 2001) + * * Acts on the same underlying XInputStream as both the full Zip File and other * EntryInputStreams, and thus must maintain its current position in the stream and * seek to it before performing any reads. @@ -97,6 +101,7 @@ EntryInputStream::EntryInputStream( uno::Reference < io::XInputStream > xNewInpu xStream->readBytes(aSequence, static_cast < sal_Int32 > (nNewEnd - nNewBegin)); aInflater.setInputSegment(aSequence, 0, static_cast < sal_Int32 > (nNewEnd - nNewBegin) ); aInflater.doInflate(aBuffer); + aInflater.end(); } else { @@ -124,20 +129,15 @@ sal_Int32 SAL_CALL EntryInputStream::readBytes( uno::Sequence< sal_Int8 >& aData sal_Int32 nBytesToRead ) throw(io::NotConnectedException, io::BufferSizeExceededException, io::IOException, uno::RuntimeException) { - if (nBytesToRead <=0) - return 0; + if (nBytesToRead <0) + throw io::BufferSizeExceededException(::rtl::OUString(), *this); if (nBytesToRead + nCurrent > nEnd) - { - if (nCurrent > nEnd) - return 0; nBytesToRead = static_cast < sal_Int32> (nEnd - nCurrent); - } aData.realloc( nBytesToRead ); - - for ( sal_Int32 i = 0; i< nBytesToRead;i++,nCurrent++) - aData[i] = aBuffer[static_cast < sal_Int32 > (nCurrent)]; + memcpy(aData.getArray(), aBuffer.getConstArray() + nCurrent, nBytesToRead); + nCurrent+=nBytesToRead; return nBytesToRead; /* @@ -186,8 +186,8 @@ sal_Int32 SAL_CALL EntryInputStream::readSomeBytes( uno::Sequence< sal_Int8 >& a void SAL_CALL EntryInputStream::skipBytes( sal_Int32 nBytesToSkip ) throw(io::NotConnectedException, io::BufferSizeExceededException, io::IOException, uno::RuntimeException) { - if (nBytesToSkip == 0) - return; + if (nBytesToSkip < 0) + throw io::BufferSizeExceededException(::rtl::OUString(), *this); if (nBytesToSkip + nCurrent > nEnd ) nBytesToSkip = static_cast < sal_Int32 > (nEnd - nCurrent); diff --git a/package/source/zipapi/Inflater.cxx b/package/source/zipapi/Inflater.cxx index 5e4eba639f74..934cabb0862d 100644 --- a/package/source/zipapi/Inflater.cxx +++ b/package/source/zipapi/Inflater.cxx @@ -2,9 +2,9 @@ * * $RCSfile: Inflater.cxx,v $ * - * $Revision: 1.3 $ + * $Revision: 1.4 $ * - * last change: $Author: mtg $ $Date: 2000-11-21 12:07:21 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:43 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -116,8 +116,7 @@ Inflater::Inflater() } Inflater::~Inflater() { - if (pStream) - delete pStream; + end(); } void SAL_CALL Inflater::setInputSegment( const com::sun::star::uno::Sequence< sal_Int8 >& rBuffer, sal_Int32 nNewOffset, sal_Int32 nNewLength ) throw(com::sun::star::uno::RuntimeException) @@ -231,7 +230,11 @@ void SAL_CALL Inflater::reset( ) void SAL_CALL Inflater::end( ) throw(com::sun::star::uno::RuntimeException) { - z_inflateEnd(pStream); + if (pStream != NULL) + { + z_inflateEnd(pStream); + delete pStream; + } pStream = NULL; } diff --git a/package/source/zipapi/ZipFile.cxx b/package/source/zipapi/ZipFile.cxx index 319f8f512b30..82aa2caa6b2e 100644 --- a/package/source/zipapi/ZipFile.cxx +++ b/package/source/zipapi/ZipFile.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipFile.cxx,v $ * - * $Revision: 1.12 $ + * $Revision: 1.13 $ * - * last change: $Author: mtg $ $Date: 2000-12-08 13:40:03 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:43 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -76,7 +76,7 @@ ZipFile::ZipFile (uno::Reference < io::XInputStream > &xInput) { readCEN(); } -ZipFile::ZipFile( com::sun::star::uno::Reference < com::sun::star::io::XInputStream > &xInput, sal_Bool bInitialise) +ZipFile::ZipFile( uno::Reference < io::XInputStream > &xInput, sal_Bool bInitialise) throw(io::IOException, package::ZipException, uno::RuntimeException) : xStream(xInput) , aGrabber(xInput) @@ -84,28 +84,38 @@ ZipFile::ZipFile( com::sun::star::uno::Reference < com::sun::star::io::XInputStr if (bInitialise) readCEN(); } +void ZipFile::setInputStream ( uno::Reference < io::XInputStream > xNewStream ) +{ + xStream = xNewStream; + aGrabber.setInputStream ( xStream ); +} void ZipFile::updateFromManList(std::vector < ManifestEntry * > &rManList) { sal_Int32 i=0, nSize = rManList.size(); aEntries.clear(); + package::ZipEntry *pEntry = &rManList[i]->aEntry; for (;i < nSize ; i++) { + // This is a bitwise copy, = is not an overloaded operator + // I'm not sure how evil this is in this case... + aEntries[pEntry->sName] = *pEntry;//rManList[i]->aEntry; + /* package::ZipEntry *pEntry = new package::ZipEntry; - pEntry->nVersion = rManList[i]->pEntry->nVersion; - pEntry->nFlag = rManList[i]->pEntry->nFlag; - pEntry->nMethod = rManList[i]->pEntry->nMethod; - pEntry->nTime = rManList[i]->pEntry->nTime; - pEntry->nCrc = rManList[i]->pEntry->nCrc; - pEntry->nCompressedSize = rManList[i]->pEntry->nCompressedSize; - pEntry->nSize = rManList[i]->pEntry->nSize; - rManList[i]->pEntry->nOffset *=-1; - pEntry->nOffset = rManList[i]->pEntry->nOffset; - pEntry->sName = rManList[i]->pEntry->sName; - pEntry->extra = rManList[i]->pEntry->extra; - pEntry->sComment = rManList[i]->pEntry->sComment; + pEntry->nVersion = rManList[i]->aEntry.nVersion; + pEntry->nFlag = rManList[i]->aEntry.nFlag; + pEntry->nMethod = rManList[i]->aEntry.nMethod; + pEntry->nTime = rManList[i]->aEntry.nTime; + pEntry->nCrc = rManList[i]->aEntry.nCrc; + pEntry->nCompressedSize = rManList[i]->aEntry.nCompressedSize; + pEntry->nSize = rManList[i]->aEntry.nSize; + pEntry->nOffset = rManList[i]->aEntry.nOffset; + pEntry->sName = rManList[i]->aEntry.sName; + pEntry->extra = rManList[i]->aEntry.extra; + pEntry->sComment = rManList[i]->aEntry.sComment; aEntries[pEntry->sName] = *pEntry; + */ } } @@ -177,7 +187,7 @@ sal_Bool SAL_CALL ZipFile::hasByName( const ::rtl::OUString& aName ) } uno::Reference< io::XInputStream > SAL_CALL ZipFile::getInputStream( const package::ZipEntry& rEntry ) - throw(io::IOException, package::ZipException, uno::RuntimeException) + throw(io::IOException, package::ZipException, uno::RuntimeException) { sal_Int64 nEnd = rEntry.nCompressedSize == 0 ? rEntry.nSize : rEntry.nCompressedSize; if (rEntry.nOffset <= 0) @@ -189,6 +199,64 @@ uno::Reference< io::XInputStream > SAL_CALL ZipFile::getInputStream( const packa return xStreamRef; } +sal_uInt32 SAL_CALL ZipFile::getHeader(const package::ZipEntry& rEntry) + throw(io::IOException, package::ZipException, uno::RuntimeException) +{ + uno::Sequence < sal_Int8 > aSequence (4); + + try + { + if (rEntry.nOffset <= 0) + readLOC(rEntry); + } + catch (package::ZipException&) + { + VOS_ENSURE(0, "Zip file bug!"); + return 0; + } + + aGrabber.seek(rEntry.nOffset); + if (rEntry.nMethod == STORED) + { + if (xStream->readBytes(aSequence, 4) < 4) + return 0; + } + else if (rEntry.nMethod == DEFLATED) + { + uno::Reference < io::XInputStream > xEntryStream = getInputStream (rEntry); + if (xEntryStream->readBytes(aSequence, 4) < 4) + return 0; + /* + Inflater aInflater ( sal_True ); + sal_Int32 nSize = rEntry.nCompressedSize < 50 ? rEntry.nCompressedSize : 50; + uno::Sequence < sal_Int8 > aCompSeq (nSize ); + if (xStream->readBytes(aCompSeq, nSize) < nSize) + return 0; + aInflater.setInput(aCompSeq); + aInflater.doInflate(aSequence); + aInflater.end(); + */ + } + return (static_cast < sal_uInt32 > + (static_cast < sal_uInt8> (aSequence[0]& 0xFF) + | static_cast < sal_uInt8> (aSequence[1]& 0xFF) << 8 + | static_cast < sal_uInt8> (aSequence[2]& 0xFF) << 16 + | static_cast < sal_uInt8> (aSequence[3]& 0xFF) << 24)); +} + +uno::Reference< io::XInputStream > SAL_CALL ZipFile::getRawStream( const package::ZipEntry& rEntry ) + throw(io::IOException, package::ZipException, uno::RuntimeException) +{ + sal_Int64 nSize = rEntry.nMethod == DEFLATED ? rEntry.nCompressedSize : rEntry.nSize; + + if (rEntry.nOffset <= 0) + readLOC(rEntry); + sal_Int64 nBegin = rEntry.nOffset; + + uno::Reference< io::XInputStream > xStreamRef = new EntryInputStream(xStream, nBegin, nSize+nBegin, 1024, nSize, sal_False); + return xStreamRef; +} + sal_Bool ZipFile::readLOC(const package::ZipEntry &rEntry) throw(io::IOException, package::ZipException, uno::RuntimeException) { @@ -296,9 +364,9 @@ sal_Int32 ZipFile::readCEN() nLocPos = nCenPos - nCenOff; aGrabber.seek(nCenPos); + package::ZipEntry *pEntry = new package::ZipEntry; for (nCount = 0 ; nCount < nTotal; nCount++) { - package::ZipEntry *pEntry = new package::ZipEntry; sal_Int32 nTestSig, nCRC, nCompressedSize, nTime, nSize, nExtAttr, nOffset; sal_Int16 nVerMade, nVersion, nFlag, nHow, nNameLen, nExtraLen, nCommentLen; sal_Int16 nDisk, nIntAttr; @@ -368,6 +436,7 @@ sal_Int32 ZipFile::readCEN() } aEntries[pEntry->sName] = *pEntry; } + delete pEntry; if (nCount != nTotal) throw package::ZipException(OUString::createFromAscii("Count != Total"), uno::Reference < uno::XInterface > ()); diff --git a/package/source/zipapi/ZipOutputStream.cxx b/package/source/zipapi/ZipOutputStream.cxx index 449129caab5a..bb7e0e08ddd1 100644 --- a/package/source/zipapi/ZipOutputStream.cxx +++ b/package/source/zipapi/ZipOutputStream.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipOutputStream.cxx,v $ * - * $Revision: 1.13 $ + * $Revision: 1.14 $ * - * last change: $Author: mtg $ $Date: 2000-12-07 11:04:05 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:43 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -218,6 +218,16 @@ void SAL_CALL ZipOutputStream::write( const uno::Sequence< sal_Int8 >& rBuffer, } aCRC.updateSegment(rBuffer, nNewOffset, nNewLength); } +void SAL_CALL ZipOutputStream::rawWrite( const uno::Sequence< sal_Int8 >& rBuffer) +{ + aChucker.writeBytes(rBuffer); +} +void SAL_CALL ZipOutputStream::rawCloseEntry( ) +{ + writeEXT(*pCurrentEntry); + aCRC.reset(); + pCurrentEntry = NULL; +} void SAL_CALL ZipOutputStream::finish( ) throw(io::IOException, uno::RuntimeException) { diff --git a/package/source/zippackage/ZipPackage.cxx b/package/source/zippackage/ZipPackage.cxx index 74ef9ca8fe81..2dda1a2a6804 100644 --- a/package/source/zippackage/ZipPackage.cxx +++ b/package/source/zippackage/ZipPackage.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipPackage.cxx,v $ * - * $Revision: 1.23 $ + * $Revision: 1.24 $ * - * last change: $Author: obo $ $Date: 2000-12-08 12:37:08 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:47 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -90,9 +90,9 @@ ZipPackage::ZipPackage (Reference < XInputStream > &xNewInput, { pZipFile = new ZipFile(xContentStream, sal_True); } - catch (ZipException& rException) + catch (ZipException&)// rException) { - VOS_DEBUG_ONLY(rException.Message); + VOS_ENSURE( 0, "ZipException thrown...bad ZipFile"); // rException.Message ); } xZipFile = Reference < XZipFile > ( pZipFile ); @@ -120,16 +120,6 @@ ZipPackage::~ZipPackage( void ) { if (pContent) delete pContent; -/* if (pZipFile) - delete pZipFile; - if (pZipOut) - delete pZipOut; - if (pZipBuffer) - delete pZipBuffer; - if (pRootFolder) - delete pRootFolder; - destroyFolderTree(xRootFolder); -*/ } void ZipPackage::destroyFolderTree( Reference < XUnoTunnel > xFolder ) @@ -190,11 +180,11 @@ void ZipPackage::getZipFileContents() while ((nIndex = rName.indexOf('/', nOldIndex)) != -1) { OUString sTemp = rName.copy (nOldIndex, nIndex - nOldIndex); - if (nIndex == nOldIndex) //sTemp.getLength() == 1) + if (nIndex == nOldIndex) break; if (!xCurrent->hasByName(sTemp)) { - pPkgFolder = new ZipPackageFolder();//*this); + pPkgFolder = new ZipPackageFolder(); pPkgFolder->setName(sTemp); try { @@ -202,10 +192,8 @@ void ZipPackage::getZipFileContents() } catch ( NoSupportException& ) { - VOS_DEBUG_ONLY("setParent threw an exception: attempted to set Parent to non-existing interface!"); + VOS_ENSURE(0, "setParent threw an exception: attempted to set Parent to non-existing interface!"); } - aAny <<= Reference < XUnoTunnel > (pPkgFolder); - //xCurrent->insertByName(sTemp, aAny); xCurrent = Reference < XNameContainer > (pPkgFolder); } else @@ -224,11 +212,11 @@ void ZipPackage::getZipFileContents() while ((nIndex = rName.indexOf('/', nOldIndex)) != -1) { OUString sTemp = rName.copy (nOldIndex, nIndex - nOldIndex); - if (nIndex == nOldIndex) //sTemp.getLength() == 1) + if (nIndex == nOldIndex) break; if (!xCurrent->hasByName(sTemp)) { - pPkgFolder = new ZipPackageFolder();//*this); + pPkgFolder = new ZipPackageFolder(); pPkgFolder->setName(sTemp); try { @@ -236,10 +224,8 @@ void ZipPackage::getZipFileContents() } catch ( NoSupportException& ) { - VOS_DEBUG_ONLY("setParent threw an exception: attempted to set Parent to non-existing interface!"); + VOS_ENSURE( 0, "setParent threw an exception: attempted to set Parent to non-existing interface!"); } - aAny <<= Reference < XUnoTunnel > (pPkgFolder); - //xCurrent->insertByName(sTemp, aAny); xCurrent = Reference < XNameContainer > (pPkgFolder); } else @@ -256,19 +242,17 @@ void ZipPackage::getZipFileContents() { Reference < XInputStream > xContentStream = pZipFile->getInputStream(aEntry); ZipPackage *pInZip = new ZipPackage (xContentStream, xFactory ); - aContainedZips.push_back (Reference < XSingleServiceFactory > (pInZip)); pPkgFolder = pInZip->getRootFolder(); pPkgFolder->setName(sStreamName); + pPkgFolder->pPackage = pInZip; try { pPkgFolder->setParent( Reference < XInterface >(xCurrent, UNO_QUERY)); } catch ( NoSupportException& ) { - VOS_DEBUG_ONLY("setParent threw an exception: attempted to set Parent to non-existing interface!"); + VOS_ENSURE( 0, "setParent threw an exception: attempted to set Parent to non-existing interface!"); } - aAny <<= Reference < XUnoTunnel > (pPkgFolder); - //xCurrent->insertByName(sStreamName, aAny); } else { @@ -282,10 +266,8 @@ void ZipPackage::getZipFileContents() } catch ( NoSupportException& ) { - VOS_DEBUG_ONLY("setParent threw an exception: attempted to set Parent to non-existing interface!"); + VOS_ENSURE( 0, "setParent threw an exception: attempted to set Parent to non-existing interface!"); } - aAny <<= Reference < XUnoTunnel > (pPkgStream); - //xCurrent->insertByName(sStreamName, aAny); } } } @@ -304,7 +286,7 @@ void ZipPackage::getZipFileContents() } catch ( com::sun::star::xml::sax::SAXException & ) { - VOS_DEBUG_ONLY( "SAX threw an exception when reading XML Manifest!"); + VOS_ENSURE( 0, "SAX threw an exception when reading XML Manifest!"); } } } @@ -327,9 +309,9 @@ void SAL_CALL ZipPackage::initialize( const Sequence< Any >& aArguments ) pZipFile = new ZipFile(xContentStream, sal_True); xZipFile = Reference < XZipFile > ( pZipFile ); } - catch (ZipException& rException) + catch (ZipException&)// rException) { - VOS_DEBUG_ONLY(rException.Message); + VOS_ENSURE( 0, "ZipException thrown - bad Zip File"); //rException.Message); } getZipFileContents(); } @@ -357,7 +339,7 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName ) while ((nIndex = aName.indexOf('/', nOldIndex)) != -1) { OUString sTemp = aName.copy (nOldIndex, nIndex - nOldIndex); - if (nIndex == nOldIndex) //sTemp.getLength() == 1) + if (nIndex == nOldIndex) break; if (xCurrent->hasByName(sTemp)) { @@ -376,7 +358,7 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName ) while ((nIndex = aName.indexOf('/', nOldIndex)) != -1) { OUString sTemp = aName.copy (nOldIndex, nIndex - nOldIndex); - if (nIndex == nOldIndex) //sTemp.getLength() == 1) + if (nIndex == nOldIndex) break; if (xCurrent->hasByName(sTemp)) { @@ -474,8 +456,7 @@ Reference< XInterface > SAL_CALL ZipPackage::createInstanceWithArguments( const return xRef; } -// XChangesBatch -void SAL_CALL ZipPackage::commitChanges( ) +ZipPackageBuffer & SAL_CALL ZipPackage::writeToBuffer( ) throw(WrappedTargetException, RuntimeException) { std::vector < ManifestEntry * > aManList; @@ -525,7 +506,7 @@ void SAL_CALL ZipPackage::commitChanges( ) } catch ( com::sun::star::xml::sax::SAXException & ) { - VOS_DEBUG_ONLY( "SAX threw an exception when writing XML Manifest!"); + VOS_ENSURE( 0, "SAX threw an exception when writing XML Manifest!"); } pManifestStream->setInputStream(Reference < XInputStream > (xManOutStream, UNO_QUERY)); @@ -544,47 +525,66 @@ void SAL_CALL ZipPackage::commitChanges( ) } catch (::com::sun::star::io::IOException & ) { - VOS_DEBUG_ONLY ( "Error writing ZipOutputStream" ); + VOS_ENSURE( 0, "Error writing ZipOutputStream" ); } - pZipBuffer->seek(0); - aAny <<= Reference < XUnoTunnel > (pManifestStream); pMetaInfFolder->insertByName(OUString::createFromAscii("manifest.xml"), aAny); + pManifestStream->aEntry.nOffset *=-1; + xContentStream = Reference < XInputStream > (pZipBuffer); + xContentSeek = Reference < XSeekable > (pZipBuffer); + + // If we have a valid pZipFile pointer, then we opened a stream + // earlier and read from it + // Otherwise we are writing a new ZipFile + pZipBuffer->seek(0); + /* + try + { + pZipFile = new ZipFile(xContentStream, sal_False); + xZipFile = Reference < XZipFile > ( pZipFile ); + pRootFolder->updateReferences ( pZipFile ); + } + catch (ZipException&)// rException) + { + VOS_ENSURE( 0, "ZipException thrown - bad ZipFile " );//rException.Message); + } + */ + pZipFile->setInputStream ( xContentStream ); + pZipFile->updateFromManList( aManList ); for (sal_uInt32 i=0 ; i < aManList.size(); i++) { - ZipEntry * pEntry = aManList[i]->pEntry; - pEntry->sName = aManList[i]->sShortName; + aManList[i]->aEntry.sName = aManList[i]->sShortName; + delete aManList[i]; } + + pZipBuffer->seek(0); + // If we are writing the zip file for the first time, pZipBuffer becomes + // the xContentStream. If so, it will have a refcount of 1 before the following + // call. + // + // Otherwise, it will have a refcount of 0, and will be deleted after the + // following call + // + // (at least...that's the plan!) mtg 6/12/00 + return *pZipBuffer; + // Likewise, pBuffer and pZipOut will be deleted automagically due to the xZipOut and xOutStream +} +// XChangesBatch +void SAL_CALL ZipPackage::commitChanges( ) + throw(WrappedTargetException, RuntimeException) +{ try { - pContent->writeStream(Reference < XInputStream > (pZipBuffer), sal_True); + pContent->writeStream(Reference < XInputStream > (&writeToBuffer()), sal_True); } catch (::com::sun::star::ucb::CommandAbortedException&) { - VOS_DEBUG_ONLY( "Unable to write Zip File to disk!"); + VOS_ENSURE( 0, "Unable to write Zip File to disk!"); } - if (!pZipFile) - { - // If we have a valid pZipFile pointer, then we opened a stream - // earlier and read from it - // Otherwise we are writing a new ZipFile - xContentStream = Reference < XInputStream > (pZipBuffer); - xContentSeek = Reference < XSeekable > (pZipBuffer); - try - { - pZipFile = new ZipFile(xContentStream, sal_False); - xZipFile = Reference < XZipFile > ( pZipFile ); - pRootFolder->updateReferences ( pZipFile ); - } - catch (ZipException& rException) - { - VOS_DEBUG_ONLY(rException.Message); - } - } - pZipFile->updateFromManList( aManList ); + } sal_Bool SAL_CALL ZipPackage::hasPendingChanges( ) @@ -600,22 +600,12 @@ Sequence< ElementChange > SAL_CALL ZipPackage::getPendingChanges( ) sal_Bool ZipPackage::isZipFile(com::sun::star::package::ZipEntry &rEntry) { - Reference < XInputStream > xEntryStream = pZipFile->getInputStream(rEntry); - Sequence < sal_Int8 > aSequence (4); - - if (xEntryStream->readBytes(aSequence, 4) < 4) - return sal_False; - - sal_uInt32 nTestSig = static_cast < sal_uInt32 > - (static_cast < sal_uInt8> (aSequence[0]& 0xFF) - | static_cast < sal_uInt8> (aSequence[1]& 0xFF) << 8 - | static_cast < sal_uInt8> (aSequence[2]& 0xFF) << 16 - | static_cast < sal_uInt8> (aSequence[3]& 0xFF) << 24); - - if (nTestSig == LOCSIG) - return sal_True; - else - return sal_False; + if (rEntry.nMethod == STORED) + { + if (rEntry.nSize < 98) // smallest possible zip file size + return sal_False; + } + return (pZipFile->getHeader(rEntry) == LOCSIG); } /** @@ -664,7 +654,7 @@ extern "C" sal_Bool SAL_CALL component_writeInfo( void* pServiceManager, void* p } catch ( InvalidRegistryException& ) { - VOS_DEBUG_ONLY( "InvalidRegistryException detected\n"); + VOS_ENSURE( 0, "InvalidRegistryException detected\n"); return sal_False; } @@ -702,3 +692,63 @@ extern "C" void * SAL_CALL component_getFactory( } return pRet; } +//XInterface +Any SAL_CALL ZipPackage::queryInterface( const Type& rType ) + throw(RuntimeException) +{ + // Ask for my own supported interfaces ... + Any aReturn ( ::cppu::queryInterface ( rType , + static_cast< XInitialization* > ( this ) , + static_cast< XSingleServiceFactory* > ( this ) , + static_cast< XUnoTunnel* > ( this ) , + static_cast< XHierarchicalNameAccess*> ( this ) , + static_cast< XChangesBatch* > ( this ) ) ); + + // If searched interface supported by this class ... + if ( aReturn.hasValue () == sal_True ) + { + // ... return this information. + return aReturn ; + } + else + { + // Else; ... ask baseclass for interfaces! + return OWeakObject::queryInterface ( rType ) ; + } +} +void SAL_CALL ZipPackage::acquire( ) + throw() +{ + OWeakObject::acquire(); +} +void SAL_CALL ZipPackage::release( ) + throw() +{ + OWeakObject::release(); +} + +// XUnoTunnel +Sequence< sal_Int8 > ZipPackage::getUnoTunnelImplementationId( void ) + throw (RuntimeException) +{ + static ::cppu::OImplementationId * pId = 0; + if (! pId) + { + ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if (! pId) + { + static ::cppu::OImplementationId aId; + pId = &aId; + } + } + return pId->getImplementationId(); +} + +sal_Int64 SAL_CALL ZipPackage::getSomething( const Sequence< sal_Int8 >& aIdentifier ) + throw(RuntimeException) +{ + if (aIdentifier.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), aIdentifier.getConstArray(), 16 ) ) + return reinterpret_cast < sal_Int64 > ( this ); + return 0; +} + diff --git a/package/source/zippackage/ZipPackageBuffer.cxx b/package/source/zippackage/ZipPackageBuffer.cxx index ded6c6321be1..5911c0ba2e4a 100644 --- a/package/source/zippackage/ZipPackageBuffer.cxx +++ b/package/source/zippackage/ZipPackageBuffer.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipPackageBuffer.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: mtg $ $Date: 2000-12-01 10:50:49 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:47 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -100,14 +100,19 @@ void SAL_CALL ZipPackageBuffer::release(void) sal_Int32 SAL_CALL ZipPackageBuffer::readBytes( Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead ) throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException) { + if (nBytesToRead < 0) + throw BufferSizeExceededException(::rtl::OUString(),*this); + if (nBytesToRead + nCurrent > nEnd) nBytesToRead = static_cast < sal_Int32 > (nEnd - nCurrent); - sal_Int64 nEndRead = nBytesToRead+nCurrent; - for (sal_Int32 i =0; nCurrent < nEndRead; nCurrent++, i++) - aData[i] = aBuffer[static_cast < sal_Int32 > (nCurrent)]; + aData.realloc(nBytesToRead); + memcpy(aData.getArray(), aBuffer.getConstArray() + nCurrent, nBytesToRead); + nCurrent +=nBytesToRead; + return nBytesToRead; } + sal_Int32 SAL_CALL ZipPackageBuffer::readSomeBytes( Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead ) throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException) { @@ -120,11 +125,19 @@ sal_Int32 SAL_CALL ZipPackageBuffer::readSomeBytes( Sequence< sal_Int8 >& aData, aData[i] = aBuffer[nCurrent]; return nMaxBytesToRead; */ + + // all data is available at once return readBytes(aData, nMaxBytesToRead); } void SAL_CALL ZipPackageBuffer::skipBytes( sal_Int32 nBytesToSkip ) throw(NotConnectedException, BufferSizeExceededException, IOException, RuntimeException) { + if (nBytesToSkip < 0) + throw BufferSizeExceededException(::rtl::OUString(),*this); + + if (nBytesToSkip + nCurrent > nEnd) + nBytesToSkip = static_cast < sal_Int32 > (nEnd - nCurrent); + nCurrent+=nBytesToSkip; } sal_Int32 SAL_CALL ZipPackageBuffer::available( ) @@ -142,11 +155,13 @@ void SAL_CALL ZipPackageBuffer::writeBytes( const Sequence< sal_Int8 >& aData ) sal_Int64 nDataLen = aData.getLength(); if (nEnd + nDataLen > nBufferSize) { - nBufferSize *=2; + while (nEnd + nDataLen > nBufferSize) + nBufferSize *=2; aBuffer.realloc(static_cast < sal_Int32 > (nBufferSize)); } - for (sal_Int32 i=0; i<nDataLen;i++,nCurrent++) - aBuffer[static_cast < sal_Int32 > (nCurrent) ] = aData[i]; + + memcpy(aBuffer.getArray()+nCurrent, aData.getConstArray(), static_cast < sal_Int32 > (nDataLen)); + nCurrent+=nDataLen; if (nCurrent>nEnd) nEnd = nCurrent; } diff --git a/package/source/zippackage/ZipPackageFolder.cxx b/package/source/zippackage/ZipPackageFolder.cxx index 051ba20538a9..32e4fbdb201a 100644 --- a/package/source/zippackage/ZipPackageFolder.cxx +++ b/package/source/zippackage/ZipPackageFolder.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipPackageFolder.cxx,v $ * - * $Revision: 1.20 $ + * $Revision: 1.21 $ * - * last change: $Author: hjs $ $Date: 2000-12-07 15:48:04 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:47 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -67,6 +67,7 @@ using namespace com::sun::star; using namespace rtl; ZipPackageFolder::ZipPackageFolder (void) +: pPackage( NULL ) { aEntry.nVersion = -1; aEntry.nFlag = 0; @@ -78,9 +79,23 @@ ZipPackageFolder::ZipPackageFolder (void) aEntry.nOffset = -1; } + ZipPackageFolder::~ZipPackageFolder( void ) { - +} +void ZipPackageFolder::copyZipEntry( com::sun::star::package::ZipEntry &rDest, const com::sun::star::package::ZipEntry &rSource) +{ + rDest.nVersion = rSource.nVersion; + rDest.nFlag = rSource.nFlag; + rDest.nMethod = rSource.nMethod; + rDest.nTime = rSource.nTime; + rDest.nCrc = rSource.nCrc; + rDest.nCompressedSize = rSource.nCompressedSize; + rDest.nSize = rSource.nSize; + rDest.nOffset = rSource.nOffset; + rDest.sName = rSource.sName; + rDest.extra = rSource.extra; + rDest.sComment = rSource.sComment; } uno::Any SAL_CALL ZipPackageFolder::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException) @@ -143,7 +158,7 @@ void SAL_CALL ZipPackageFolder::insertByName( const ::rtl::OUString& aName, cons } catch ( lang::NoSupportException& ) { - VOS_DEBUG_ONLY("setParent threw an exception: attempted to set Parent to non-existing interface!"); + VOS_ENSURE( 0, "setParent threw an exception: attempted to set Parent to non-existing interface!"); } } } @@ -281,14 +296,11 @@ void ZipPackageFolder::saveContents(rtl::OUString &rPath, std::vector < Manifest throw(uno::RuntimeException) { uno::Reference < lang::XUnoTunnel > xTunnel; - package::ZipEntry *aEntry = NULL; ZipPackageFolder *pFolder = NULL; ZipPackageStream *pStream = NULL; sal_Bool bIsFolder = sal_False; TunnelHash::const_iterator aCI = aContents.begin(); - //rPath = rPath + getName(); - for (;aCI!=aContents.end();aCI++) { xTunnel = uno::Reference < lang::XUnoTunnel> ((*aCI).second, uno::UNO_QUERY); @@ -314,76 +326,162 @@ void ZipPackageFolder::saveContents(rtl::OUString &rPath, std::vector < Manifest if (bIsFolder) { - time_t nTime = time(NULL); - ManifestEntry *pMan = new ManifestEntry; - pMan->sShortName = (*aCI).first; - pFolder->aEntry.sName = rPath + pMan->sShortName + OUString::createFromAscii("/"); - pFolder->aEntry.nTime = ZipOutputStream::tmDateToDosDate ( *localtime(&nTime)); - pFolder->aEntry.nCrc = 0; - pFolder->aEntry.nSize = 0; - pFolder->aEntry.nCompressedSize = 0; - pFolder->aEntry.nMethod = STORED; - try + if (pFolder->pPackage) { - rZipOut.putNextEntry(pFolder->aEntry); - rZipOut.closeEntry(); + // This ZipPackageFolder is the root folder of a zipfile contained within + // this zipfile. Things will get a little strange from here on in... + ManifestEntry *pMan = new ManifestEntry; + pMan->sShortName = (*aCI).first; + + ZipPackageFolder::copyZipEntry(pMan->aEntry, pFolder->aEntry); + pMan->aEntry.sName = rPath + pMan->sShortName; + + pMan->aEntry.nCrc = -1; + pMan->aEntry.nSize = -1; + pMan->aEntry.nCompressedSize = -1; + pMan->aEntry.nMethod = STORED; + + try + { + rZipOut.putNextEntry(pMan->aEntry); + ZipPackageBuffer &rBuffer = pFolder->pPackage->writeToBuffer(); + pMan->aEntry.nSize = pMan->aEntry.nCompressedSize = static_cast < sal_Int32 > (rBuffer.getLength()); + rZipOut.write(rBuffer.aBuffer, 0, static_cast < sal_Int32 > (rBuffer.getLength())); + rZipOut.closeEntry(); + } + catch (::com::sun::star::io::IOException & ) + { + VOS_ENSURE( 0, "Error writing ZipOutputStream" ); + } + // Then copy it back + ZipPackageFolder::copyZipEntry(pFolder->aEntry, pMan->aEntry); + pFolder->aEntry.nOffset *= -1; + rManList.push_back (pMan); } - catch (::com::sun::star::io::IOException & ) + else { - VOS_DEBUG_ONLY ( "Error writing ZipOutputStream" ); + // In case the entry we are reading is also the entry we are writing, we will + // store the ZipEntry data in the ManifestEntry struct and then update the + // ZipEntry data in the ZipPackageFolder later + + time_t nTime = time(NULL); + ManifestEntry *pMan = new ManifestEntry; + pMan->sShortName = (*aCI).first; + + // First copy current data to ManifestEntry + ZipPackageFolder::copyZipEntry(pMan->aEntry, pFolder->aEntry); + + pMan->aEntry.sName = rPath + pMan->sShortName + OUString::createFromAscii("/"); + pMan->aEntry.nTime = ZipOutputStream::tmDateToDosDate ( *localtime(&nTime)); + pMan->aEntry.nCrc = 0; + pMan->aEntry.nSize = 0; + pMan->aEntry.nCompressedSize = 0; + pMan->aEntry.nMethod = STORED; + + try + { + rZipOut.putNextEntry(pMan->aEntry); + rZipOut.closeEntry(); + } + catch (::com::sun::star::io::IOException & ) + { + VOS_ENSURE( 0, "Error writing ZipOutputStream" ); + } + pMan->sMediaType = OUString::createFromAscii(""); + // Then copy it back + ZipPackageFolder::copyZipEntry(pFolder->aEntry, pMan->aEntry); + pFolder->aEntry.nOffset *= -1; + pFolder->saveContents(pFolder->aEntry.sName, rManList, rZipOut); + rManList.push_back (pMan); } - pMan->sMediaType = OUString::createFromAscii(""); - pMan->pEntry = &(pFolder->aEntry); - pFolder->saveContents(pFolder->aEntry.sName, rManList, rZipOut); - rManList.push_back (pMan); } else { + // In case the entry we are reading is also the entry we are writing, we will + // store the ZipEntry data in the ManifestEntry struct and then update the + // ZipEntry data in the ZipPackageStream later + ManifestEntry *pMan = new ManifestEntry; pMan->sShortName = (*aCI).first; - pStream->aEntry.sName = rPath + pMan->sShortName; - uno::Reference < io::XInputStream > xStream = pStream->getInputStream(); - uno::Reference < io::XSeekable > xSeek (xStream, uno::UNO_QUERY); - sal_Bool bTrackLength = sal_True; + // Copy current info to pMan... + ZipPackageFolder::copyZipEntry(pMan->aEntry, pStream->aEntry); + pMan->aEntry.sName = rPath + pMan->sShortName; - pStream->aEntry.nCrc = -1; - pStream->aEntry.nSize = -1; - pStream->aEntry.nCompressedSize = -1; - if (xSeek.is()) + if (pStream->bPackageMember) { - xSeek->seek(0); - if (pStream->aEntry.nMethod == STORED) + try + { + uno::Reference < io::XInputStream > xStream = pStream->getRawStream( pMan->aEntry ); + try + { + rZipOut.putNextEntry(pMan->aEntry); + while (1) + { + uno::Sequence < sal_Int8 > aSeq (65535); + sal_Int32 nLength; + nLength = xStream->readBytes(aSeq, 65535); + if (nLength < 65535) + aSeq.realloc(nLength); + rZipOut.rawWrite(aSeq); + if (nLength < 65535) // EOF + break; + } + rZipOut.rawCloseEntry(); + } + catch (package::ZipException&) + { + } + } + catch (::com::sun::star::io::IOException & ) { - pStream->aEntry.nSize = pStream->aEntry.nCompressedSize = static_cast < sal_Int32 > (xSeek->getLength()); - bTrackLength = sal_False; + VOS_ENSURE( 0, "Error writing ZipOutputStream" ); } } - - try + else { - rZipOut.putNextEntry(pStream->aEntry); - while (1) + uno::Reference < io::XInputStream > xStream = pStream->getInputStream(); + uno::Reference < io::XSeekable > xSeek (xStream, uno::UNO_QUERY); + sal_Bool bTrackLength = sal_True; + + pMan->aEntry.nCrc = -1; + pMan->aEntry.nSize = -1; + pMan->aEntry.nCompressedSize = -1; + if (xSeek.is()) + { + xSeek->seek(0); + if (pMan->aEntry.nMethod == STORED) + { + pMan->aEntry.nSize = pMan->aEntry.nCompressedSize = static_cast < sal_Int32 > (xSeek->getLength()); + bTrackLength = sal_False; + } + } + + try { - uno::Sequence < sal_Int8 > aSeq (65535); - sal_Int32 nLength; - nLength = xStream->readBytes(aSeq, 65535); - if (nLength < 65535) - aSeq.realloc(nLength); - rZipOut.write(aSeq, 0, nLength); + rZipOut.putNextEntry(pMan->aEntry); + while (1) + { + uno::Sequence < sal_Int8 > aSeq (65535); + sal_Int32 nLength; + nLength = xStream->readBytes(aSeq, 65535); + if (nLength < 65535) + aSeq.realloc(nLength); + rZipOut.write(aSeq, 0, nLength); + if (bTrackLength) + pMan->aEntry.nSize+=nLength; + if (nLength < 65535) // EOF + break; + } if (bTrackLength) - pStream->aEntry.nSize+=nLength; - if (nLength < 65535) // EOF - break; + pMan->aEntry.nCompressedSize = pStream->aEntry.nSize; + pStream->bPackageMember = sal_True; + rZipOut.closeEntry(); + } + catch (::com::sun::star::io::IOException & ) + { + VOS_ENSURE( 0, "Error writing ZipOutputStream" ); } - if (bTrackLength) - pStream->aEntry.nCompressedSize = pStream->aEntry.nSize; - pStream->bPackageMember = sal_True; - rZipOut.closeEntry(); - } - catch (::com::sun::star::io::IOException & ) - { - VOS_DEBUG_ONLY ( "Error writing ZipOutputStream" ); } try { @@ -392,27 +490,15 @@ void ZipPackageFolder::saveContents(rtl::OUString &rPath, std::vector < Manifest } catch (::com::sun::star::beans::UnknownPropertyException & ) { - VOS_DEBUG_ONLY ( "MediaType is an unknown property!!" ); + VOS_ENSURE( 0, "MediaType is an unknown property!!" ); } - pMan->pEntry = &(pStream->aEntry); + // Then copy it back afterwards... + ZipPackageFolder::copyZipEntry(pStream->aEntry, pMan->aEntry); + pStream->aEntry.nOffset *= -1; rManList.push_back (pMan); } } } -void ZipPackageFolder::setEntry(package::ZipEntry &rDest, package::ZipEntry &rSrc) -{ - rDest.nVersion = rSrc.nVersion; - rDest.nFlag = rSrc.nFlag; - rDest.nMethod = rSrc.nMethod; - rDest.nTime = rSrc.nTime; - rDest.nCrc = rSrc.nCrc; - rDest.nCompressedSize = rSrc.nCompressedSize; - rDest.nSize = rSrc.nSize; - rDest.nOffset = rSrc.nOffset; - rDest.sName = rSrc.sName; - rDest.extra = rSrc.extra; - rDest.sComment = rSrc.sComment; -} void ZipPackageFolder::updateReferences( ZipFile * pNewZipFile) { uno::Reference < lang::XUnoTunnel > xTunnel; @@ -445,7 +531,12 @@ void ZipPackageFolder::updateReferences( ZipFile * pNewZipFile) } if (bIsFolder) - pFolder->updateReferences(pNewZipFile); + { + //if pPackage is set,then this is the root folder of a different ZipPackage and + // should not be changed + if (!pFolder->pPackage) + pFolder->updateReferences(pNewZipFile); + } else pStream->pZipFile = pNewZipFile; } diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx index 4a425771fbad..e972aaa7238f 100644 --- a/package/source/zippackage/ZipPackageStream.cxx +++ b/package/source/zippackage/ZipPackageStream.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipPackageStream.cxx,v $ * - * $Revision: 1.10 $ + * $Revision: 1.11 $ * - * last change: $Author: mtg $ $Date: 2000-12-04 11:30:09 $ + * last change: $Author: mtg $ $Date: 2000-12-13 17:00:47 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -139,6 +139,26 @@ void SAL_CALL ZipPackageStream::setInputStream( const uno::Reference< io::XInput bPackageMember = sal_False; aEntry.nTime = -1; } + +uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getRawStream( com::sun::star::package::ZipEntry &rEntry ) + throw(uno::RuntimeException) +{ + if (bPackageMember) + { + try + { + return pZipFile->getRawStream(rEntry); + } + catch (package::ZipException &)//rException) + { + VOS_ENSURE( 0, "ZipException thrown");//rException.Message); + return uno::Reference < io::XInputStream > (); + } + } + else + return xStream; +} + uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getInputStream( ) throw(uno::RuntimeException) { @@ -148,9 +168,9 @@ uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getInputStream( ) { return pZipFile->getInputStream(aEntry); } - catch (package::ZipException &rException) + catch (package::ZipException &)//rException) { - VOS_DEBUG_ONLY(rException.Message); + VOS_ENSURE( 0,"ZipException thrown");//rException.Message); return uno::Reference < io::XInputStream > (); } } |