From f987a8b5e957b2bc013effef594c26938a142923 Mon Sep 17 00:00:00 2001 From: Martin Gallwey Date: Thu, 16 Nov 2000 21:50:51 +0000 Subject: [PATCH] Fixed some problems with the buffering --- package/source/zipapi/Deflater.cxx | 88 ++++++++++++++--------- package/source/zipapi/Inflater.cxx | 12 ++-- package/source/zipapi/ZipOutputStream.cxx | 26 +++---- 3 files changed, 69 insertions(+), 57 deletions(-) diff --git a/package/source/zipapi/Deflater.cxx b/package/source/zipapi/Deflater.cxx index 3bcff5fd2971..002c78cd54b6 100644 --- a/package/source/zipapi/Deflater.cxx +++ b/package/source/zipapi/Deflater.cxx @@ -2,9 +2,9 @@ * * $RCSfile: Deflater.cxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mtg $ $Date: 2000-11-13 13:38:01 $ + * last change: $Author: mtg $ $Date: 2000-11-16 22:50:51 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -81,7 +81,7 @@ Deflater::~Deflater(void) if (pStream) delete pStream; } -void Deflater::init (sal_Int16 nLevel, sal_Int16 nStrategy, sal_Bool bNowrap) +void Deflater::init (sal_Int32 nLevel, sal_Int32 nStrategy, sal_Bool bNowrap) { pStream = new z_stream; /* Memset it to 0...sets zalloc/zfree/opaque to NULL */ @@ -114,7 +114,7 @@ Deflater::Deflater() init(DEFAULT_COMPRESSION, DEFAULT_STRATEGY, sal_False); } -Deflater::Deflater(sal_Int16 nSetLevel) +Deflater::Deflater(sal_Int32 nSetLevel) : nLevel(nSetLevel) , nStrategy(DEFAULT_STRATEGY) , bFinish(sal_False) @@ -126,7 +126,7 @@ Deflater::Deflater(sal_Int16 nSetLevel) init(nSetLevel, DEFAULT_STRATEGY, sal_False); } -Deflater::Deflater(sal_Int16 nSetLevel, sal_Bool bNowrap) +Deflater::Deflater(sal_Int32 nSetLevel, sal_Bool bNowrap) : nLevel(nSetLevel) , nStrategy(DEFAULT_STRATEGY) , bFinish(sal_False) @@ -138,38 +138,58 @@ Deflater::Deflater(sal_Int16 nSetLevel, sal_Bool bNowrap) init(nSetLevel, DEFAULT_STRATEGY, bNowrap); } -sal_Int16 Deflater::doDeflateBytes (uno::Sequence < sal_Int8 > &rBuffer, sal_Int16 nNewOffset, sal_Int16 nNewLength) +sal_Int32 Deflater::doDeflateBytes (uno::Sequence < sal_Int8 > &rBuffer, sal_Int32 nNewOffset, sal_Int32 nNewLength) { - sal_Int16 nResult; + sal_Int32 nResult; if (bSetParams) { + pStream->next_in = (unsigned char*) sInBuffer.getConstArray(); + pStream->next_out = (unsigned char*) rBuffer.getArray()+nNewOffset; + pStream->avail_in = nLength; + pStream->avail_out = nNewLength; + nResult = z_deflateParams(pStream, nLevel, nStrategy); - bSetParams = sal_False; + switch (nResult) + { + case Z_OK: + bSetParams = sal_False; + nOffset += nLength - pStream->avail_in; + nLength = pStream->avail_in; + return nNewLength - pStream->avail_out; + case Z_BUF_ERROR: + bSetParams = sal_False; + DBG_ERROR( pStream->msg ); + return 0; + default: + DBG_ERROR( pStream->msg ); + return 0; + } } - pStream->next_in = (unsigned char*) sInBuffer.getConstArray(); - pStream->next_out = (unsigned char*) rBuffer.getArray()+nNewOffset; - pStream->avail_in = nLength; - pStream->avail_out = nNewLength; - - - nResult = z_deflate(pStream, Z_FINISH); - switch (nResult) + else { - case Z_STREAM_END: - bFinished = sal_True; - case Z_OK: - nOffset += nLength - pStream->avail_in; - nLength = pStream->avail_in; - return nNewLength - pStream->avail_out; - case Z_BUF_ERROR: - bSetParams = sal_False; - DBG_ERROR( pStream->msg ); - return 0; - default: - DBG_ERROR( pStream->msg ); - return 0; + pStream->next_in = (unsigned char*) sInBuffer.getConstArray(); + pStream->next_out = (unsigned char*) rBuffer.getArray()+nNewOffset; + pStream->avail_in = nLength; + pStream->avail_out = nNewLength; + + nResult = z_deflate(pStream, bFinish ? Z_FINISH : Z_NO_FLUSH); + switch (nResult) + { + case Z_STREAM_END: + bFinished = sal_True; + case Z_OK: + nOffset += nLength - pStream->avail_in; + nLength = pStream->avail_in; + return nNewLength - pStream->avail_out; + case Z_BUF_ERROR: + bSetParams = sal_False; + DBG_ERROR( pStream->msg ); + return 0; + default: + DBG_ERROR( pStream->msg ); + return 0; + } } - return 0; } void SAL_CALL Deflater::setInputSegment( const uno::Sequence< sal_Int8 >& rBuffer, sal_Int32 nNewOffset, sal_Int32 nNewLength ) @@ -201,7 +221,7 @@ void SAL_CALL Deflater::setDictionarySegment( const uno::Sequence< sal_Int8 >& r { // do error handling } - sal_Int16 nResult = z_deflateSetDictionary(pStream, (const unsigned char*)rBuffer.getConstArray()+nOffset, nLength); + sal_Int32 nResult = z_deflateSetDictionary(pStream, (const unsigned char*)rBuffer.getConstArray()+nOffset, nLength); } void SAL_CALL Deflater::setDictionary( const uno::Sequence< sal_Int8 >& rBuffer ) throw(uno::RuntimeException) @@ -212,7 +232,7 @@ void SAL_CALL Deflater::setDictionary( const uno::Sequence< sal_Int8 >& rBuffer DBG_ERROR("No stream!"); } - sal_Int16 nResult = z_deflateSetDictionary(pStream, (const unsigned char*)rBuffer.getConstArray(), rBuffer.getLength()); + sal_Int32 nResult = z_deflateSetDictionary(pStream, (const unsigned char*)rBuffer.getConstArray(), rBuffer.getLength()); } void SAL_CALL Deflater::setStrategy( sal_Int32 nNewStrategy ) throw(uno::RuntimeException) @@ -261,9 +281,7 @@ sal_Int32 SAL_CALL Deflater::doDeflateSegment( uno::Sequence< sal_Int8 >& rBuffe throw(uno::RuntimeException) { if (nNewOffset < 0 || nNewLength < 0 || nNewOffset + nNewLength > rBuffer.getLength()) - { - // do error handling - } + DBG_ERROR("Invalid Offset or Length passed to doDeflateSegment"); return doDeflateBytes(rBuffer, nNewOffset, nNewLength); } sal_Int32 SAL_CALL Deflater::doDeflate( uno::Sequence< sal_Int8 >& rBuffer ) diff --git a/package/source/zipapi/Inflater.cxx b/package/source/zipapi/Inflater.cxx index f7f9501ad6ac..a5b3b2e4fe25 100644 --- a/package/source/zipapi/Inflater.cxx +++ b/package/source/zipapi/Inflater.cxx @@ -2,9 +2,9 @@ * * $RCSfile: Inflater.cxx,v $ * - * $Revision: 1.1 $ + * $Revision: 1.2 $ * - * last change: $Author: mtg $ $Date: 2000-11-13 13:38:01 $ + * last change: $Author: mtg $ $Date: 2000-11-16 22:50:51 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -71,7 +71,7 @@ void Inflater::init (sal_Bool bNowrap) pStream = new z_stream; /* memset to 0 to set zalloc/opaque etc */ memset (pStream, 0, sizeof(*pStream)); - sal_Int16 nRes; + sal_Int32 nRes; nRes = inflateInit2(pStream, bNowrap ? -MAX_WBITS : MAX_WBITS); switch (nRes) { @@ -235,9 +235,9 @@ void SAL_CALL Inflater::end( ) pStream = NULL; } -sal_Int16 Inflater::doInflateBytes (com::sun::star::uno::Sequence < sal_Int8 > &rBuffer, sal_Int16 nNewOffset, sal_Int16 nNewLength) +sal_Int32 Inflater::doInflateBytes (com::sun::star::uno::Sequence < sal_Int8 > &rBuffer, sal_Int32 nNewOffset, sal_Int32 nNewLength) { - sal_Int16 nResult; + sal_Int32 nResult; pStream->next_in = (unsigned char*) sInBuffer.getConstArray()+ nOffset; pStream->avail_in = nLength; pStream->next_out = (unsigned char*) rBuffer.getArray() + nNewOffset; @@ -252,7 +252,7 @@ sal_Int16 Inflater::doInflateBytes (com::sun::star::uno::Sequence < sal_Int8 > case Z_OK: nOffset += nLength - pStream->avail_in; nLength = pStream->avail_in; - return nLength - pStream->avail_out; + return nNewLength - pStream->avail_out; case Z_NEED_DICT: bNeedDict = sal_True; nOffset += nLength - pStream->avail_in; diff --git a/package/source/zipapi/ZipOutputStream.cxx b/package/source/zipapi/ZipOutputStream.cxx index a1766937b0f7..9fbb83150eac 100644 --- a/package/source/zipapi/ZipOutputStream.cxx +++ b/package/source/zipapi/ZipOutputStream.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ZipOutputStream.cxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: mtg $ $Date: 2000-11-16 11:55:52 $ + * last change: $Author: mtg $ $Date: 2000-11-16 22:50:51 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -119,10 +119,10 @@ void SAL_CALL ZipOutputStream::putNextEntry( const package::ZipEntry& rEntry ) case DEFLATED: if (pNonConstEntry->nSize == -1 || pNonConstEntry->nCompressedSize == -1 || pNonConstEntry->nCrc == -1) - pNonConstEntry->nFlag |= 8; + pNonConstEntry->nFlag = 8; else if (pNonConstEntry->nSize != -1 && pNonConstEntry->nCompressedSize != -1 && pNonConstEntry->nCrc != -1) - pNonConstEntry->nFlag &= 8; + pNonConstEntry->nFlag = 0; pNonConstEntry->nVersion = 20; break; case STORED: @@ -131,7 +131,7 @@ void SAL_CALL ZipOutputStream::putNextEntry( const package::ZipEntry& rEntry ) else if (pNonConstEntry->nCompressedSize == -1) pNonConstEntry->nCompressedSize = pNonConstEntry->nSize; pNonConstEntry->nVersion = 10; - pNonConstEntry->nFlag &= 8; + pNonConstEntry->nFlag = 0; break; } pNonConstEntry->nOffset = aChucker.getPosition(); @@ -161,17 +161,17 @@ void SAL_CALL ZipOutputStream::closeEntry( ) { if (pEntry->nSize != aDeflater.getTotalIn()) { - // boom DBG_ERROR("Invalid entry size"); } if (pEntry->nCompressedSize != aDeflater.getTotalOut()) { - // boom - DBG_ERROR("Invalid entry compressed size"); + //DBG_ERROR("Invalid entry compressed size"); + // Different compression strategies make the merit of this + // test somewhat dubious + pEntry->nCompressedSize = aDeflater.getTotalOut(); } if (pEntry->nCrc != aCRC.getValue()) { - // boom DBG_ERROR("Invalid entry CRC-32"); } } @@ -185,12 +185,6 @@ void SAL_CALL ZipOutputStream::closeEntry( ) aDeflater.reset(); break; case STORED: - { - sal_uInt32 na= pEntry->nCrc; - sal_uInt32 nb = aCRC.getValue(); - int i=0; - } - if (static_cast < sal_uInt32 > (pEntry->nCrc) != static_cast (aCRC.getValue())) { // boom @@ -246,7 +240,7 @@ void SAL_CALL ZipOutputStream::finish( ) } void ZipOutputStream::doDeflate() { - sal_Int16 nLength = aDeflater.doDeflateSegment(aBuffer, 0, aBuffer.getLength()); + sal_Int32 nLength = aDeflater.doDeflateSegment(aBuffer, 0, aBuffer.getLength()); if (nLength > 0 ) { aChucker.writeBytes(aBuffer);