xref: /aoo41x/main/package/source/zipapi/Deflater.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_package.hxx"
30*cdf0e10cSrcweir #include <Deflater.hxx>
31*cdf0e10cSrcweir #ifndef _ZLIB_H
32*cdf0e10cSrcweir #ifdef SYSTEM_ZLIB
33*cdf0e10cSrcweir #include <zlib.h>
34*cdf0e10cSrcweir #else
35*cdf0e10cSrcweir #include <external/zlib/zlib.h>
36*cdf0e10cSrcweir #endif
37*cdf0e10cSrcweir #endif
38*cdf0e10cSrcweir #include <com/sun/star/packages/zip/ZipConstants.hpp>
39*cdf0e10cSrcweir #include <string.h> // for memset
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir using namespace com::sun::star::packages::zip::ZipConstants;
42*cdf0e10cSrcweir using namespace com::sun::star;
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir /** Provides general purpose compression using the ZLIB compression
45*cdf0e10cSrcweir  * library.
46*cdf0e10cSrcweir  */
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir Deflater::~Deflater(void)
49*cdf0e10cSrcweir {
50*cdf0e10cSrcweir 	end();
51*cdf0e10cSrcweir }
52*cdf0e10cSrcweir void Deflater::init (sal_Int32 nLevelArg, sal_Int32 nStrategyArg, sal_Bool bNowrap)
53*cdf0e10cSrcweir {
54*cdf0e10cSrcweir 	pStream = new z_stream;
55*cdf0e10cSrcweir 	/* Memset it to 0...sets zalloc/zfree/opaque to NULL */
56*cdf0e10cSrcweir 	memset (pStream, 0, sizeof(*pStream));
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir 	switch (deflateInit2(pStream, nLevelArg, Z_DEFLATED, bNowrap? -MAX_WBITS : MAX_WBITS,
59*cdf0e10cSrcweir 				DEF_MEM_LEVEL, nStrategyArg))
60*cdf0e10cSrcweir 	{
61*cdf0e10cSrcweir 		case Z_OK:
62*cdf0e10cSrcweir 			break;
63*cdf0e10cSrcweir 		case Z_MEM_ERROR:
64*cdf0e10cSrcweir 			delete pStream;
65*cdf0e10cSrcweir 			break;
66*cdf0e10cSrcweir 		case Z_STREAM_ERROR:
67*cdf0e10cSrcweir 			delete pStream;
68*cdf0e10cSrcweir 			break;
69*cdf0e10cSrcweir 		default:
70*cdf0e10cSrcweir 			 break;
71*cdf0e10cSrcweir 	}
72*cdf0e10cSrcweir }
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir Deflater::Deflater(sal_Int32 nSetLevel, sal_Bool bNowrap)
75*cdf0e10cSrcweir : bFinish(sal_False)
76*cdf0e10cSrcweir , bFinished(sal_False)
77*cdf0e10cSrcweir , bSetParams(sal_False)
78*cdf0e10cSrcweir , nLevel(nSetLevel)
79*cdf0e10cSrcweir , nStrategy(DEFAULT_STRATEGY)
80*cdf0e10cSrcweir , nOffset(0)
81*cdf0e10cSrcweir , nLength(0)
82*cdf0e10cSrcweir {
83*cdf0e10cSrcweir 	init(nSetLevel, DEFAULT_STRATEGY, bNowrap);
84*cdf0e10cSrcweir }
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir sal_Int32 Deflater::doDeflateBytes (uno::Sequence < sal_Int8 > &rBuffer, sal_Int32 nNewOffset, sal_Int32 nNewLength)
87*cdf0e10cSrcweir {
88*cdf0e10cSrcweir 	sal_Int32 nResult;
89*cdf0e10cSrcweir 	if (bSetParams)
90*cdf0e10cSrcweir 	{
91*cdf0e10cSrcweir 		pStream->next_in   = (unsigned char*) sInBuffer.getConstArray() + nOffset;
92*cdf0e10cSrcweir 		pStream->next_out  = (unsigned char*) rBuffer.getArray()+nNewOffset;
93*cdf0e10cSrcweir 		pStream->avail_in  = nLength;
94*cdf0e10cSrcweir 		pStream->avail_out = nNewLength;
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir #if defined SYSTEM_ZLIB || !defined ZLIB_PREFIX
97*cdf0e10cSrcweir 		nResult = deflateParams(pStream, nLevel, nStrategy);
98*cdf0e10cSrcweir #else
99*cdf0e10cSrcweir 		nResult = z_deflateParams(pStream, nLevel, nStrategy);
100*cdf0e10cSrcweir #endif
101*cdf0e10cSrcweir 		switch (nResult)
102*cdf0e10cSrcweir 		{
103*cdf0e10cSrcweir 			case Z_OK:
104*cdf0e10cSrcweir 				bSetParams = sal_False;
105*cdf0e10cSrcweir 				nOffset += nLength - pStream->avail_in;
106*cdf0e10cSrcweir 				nLength = pStream->avail_in;
107*cdf0e10cSrcweir 				return nNewLength - pStream->avail_out;
108*cdf0e10cSrcweir 			case Z_BUF_ERROR:
109*cdf0e10cSrcweir 				bSetParams = sal_False;
110*cdf0e10cSrcweir 				return 0;
111*cdf0e10cSrcweir 			default:
112*cdf0e10cSrcweir 				return 0;
113*cdf0e10cSrcweir 		}
114*cdf0e10cSrcweir 	}
115*cdf0e10cSrcweir 	else
116*cdf0e10cSrcweir 	{
117*cdf0e10cSrcweir 		pStream->next_in   = (unsigned char*) sInBuffer.getConstArray() + nOffset;
118*cdf0e10cSrcweir 		pStream->next_out  = (unsigned char*) rBuffer.getArray()+nNewOffset;
119*cdf0e10cSrcweir 		pStream->avail_in  = nLength;
120*cdf0e10cSrcweir 		pStream->avail_out = nNewLength;
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir #if defined SYSTEM_ZLIB || !defined ZLIB_PREFIX
123*cdf0e10cSrcweir 		nResult = deflate(pStream, bFinish ? Z_FINISH : Z_NO_FLUSH);
124*cdf0e10cSrcweir #else
125*cdf0e10cSrcweir 		nResult = z_deflate(pStream, bFinish ? Z_FINISH : Z_NO_FLUSH);
126*cdf0e10cSrcweir #endif
127*cdf0e10cSrcweir 		switch (nResult)
128*cdf0e10cSrcweir 		{
129*cdf0e10cSrcweir 			case Z_STREAM_END:
130*cdf0e10cSrcweir 				bFinished = sal_True;
131*cdf0e10cSrcweir 			case Z_OK:
132*cdf0e10cSrcweir 				nOffset += nLength - pStream->avail_in;
133*cdf0e10cSrcweir 				nLength = pStream->avail_in;
134*cdf0e10cSrcweir 				return nNewLength - pStream->avail_out;
135*cdf0e10cSrcweir 			case Z_BUF_ERROR:
136*cdf0e10cSrcweir 				bSetParams = sal_False;
137*cdf0e10cSrcweir 				return 0;
138*cdf0e10cSrcweir 			default:
139*cdf0e10cSrcweir 				return 0;
140*cdf0e10cSrcweir 		}
141*cdf0e10cSrcweir 	}
142*cdf0e10cSrcweir }
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir void SAL_CALL Deflater::setInputSegment( const uno::Sequence< sal_Int8 >& rBuffer, sal_Int32 nNewOffset, sal_Int32 nNewLength )
145*cdf0e10cSrcweir {
146*cdf0e10cSrcweir     OSL_ASSERT( !(nNewOffset < 0 || nNewLength < 0 || nNewOffset + nNewLength > rBuffer.getLength()));
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir     sInBuffer = rBuffer;
149*cdf0e10cSrcweir     nOffset = nNewOffset;
150*cdf0e10cSrcweir     nLength = nNewLength;
151*cdf0e10cSrcweir }
152*cdf0e10cSrcweir void SAL_CALL Deflater::setLevel( sal_Int32 nNewLevel )
153*cdf0e10cSrcweir {
154*cdf0e10cSrcweir 	if ((nNewLevel < 0 || nNewLevel > 9) && nNewLevel != DEFAULT_COMPRESSION)
155*cdf0e10cSrcweir 	{
156*cdf0e10cSrcweir 		// do error handling
157*cdf0e10cSrcweir 	}
158*cdf0e10cSrcweir 	if (nNewLevel != nLevel)
159*cdf0e10cSrcweir 	{
160*cdf0e10cSrcweir 		nLevel = nNewLevel;
161*cdf0e10cSrcweir 		bSetParams = sal_True;
162*cdf0e10cSrcweir 	}
163*cdf0e10cSrcweir }
164*cdf0e10cSrcweir sal_Bool SAL_CALL Deflater::needsInput(  )
165*cdf0e10cSrcweir {
166*cdf0e10cSrcweir 	return nLength <=0;
167*cdf0e10cSrcweir }
168*cdf0e10cSrcweir void SAL_CALL Deflater::finish(  )
169*cdf0e10cSrcweir {
170*cdf0e10cSrcweir 	bFinish = sal_True;
171*cdf0e10cSrcweir }
172*cdf0e10cSrcweir sal_Bool SAL_CALL Deflater::finished(  )
173*cdf0e10cSrcweir {
174*cdf0e10cSrcweir 	return bFinished;
175*cdf0e10cSrcweir }
176*cdf0e10cSrcweir sal_Int32 SAL_CALL Deflater::doDeflateSegment( uno::Sequence< sal_Int8 >& rBuffer, sal_Int32 nNewOffset, sal_Int32 nNewLength )
177*cdf0e10cSrcweir {
178*cdf0e10cSrcweir     OSL_ASSERT( !(nNewOffset < 0 || nNewLength < 0 || nNewOffset + nNewLength > rBuffer.getLength()));
179*cdf0e10cSrcweir     return doDeflateBytes(rBuffer, nNewOffset, nNewLength);
180*cdf0e10cSrcweir }
181*cdf0e10cSrcweir sal_Int32 SAL_CALL Deflater::getTotalIn(  )
182*cdf0e10cSrcweir {
183*cdf0e10cSrcweir 	return pStream->total_in;
184*cdf0e10cSrcweir }
185*cdf0e10cSrcweir sal_Int32 SAL_CALL Deflater::getTotalOut(  )
186*cdf0e10cSrcweir {
187*cdf0e10cSrcweir 	return pStream->total_out;
188*cdf0e10cSrcweir }
189*cdf0e10cSrcweir void SAL_CALL Deflater::reset(  )
190*cdf0e10cSrcweir {
191*cdf0e10cSrcweir #if defined SYSTEM_ZLIB || !defined ZLIB_PREFIXB
192*cdf0e10cSrcweir 	deflateReset(pStream);
193*cdf0e10cSrcweir #else
194*cdf0e10cSrcweir 	z_deflateReset(pStream);
195*cdf0e10cSrcweir #endif
196*cdf0e10cSrcweir 	bFinish = sal_False;
197*cdf0e10cSrcweir 	bFinished = sal_False;
198*cdf0e10cSrcweir 	nOffset = nLength = 0;
199*cdf0e10cSrcweir }
200*cdf0e10cSrcweir void SAL_CALL Deflater::end(  )
201*cdf0e10cSrcweir {
202*cdf0e10cSrcweir 	if (pStream != NULL)
203*cdf0e10cSrcweir 	{
204*cdf0e10cSrcweir #if defined SYSTEM_ZLIB || !defined ZLIB_PREFIX
205*cdf0e10cSrcweir 		deflateEnd(pStream);
206*cdf0e10cSrcweir #else
207*cdf0e10cSrcweir 		z_deflateEnd(pStream);
208*cdf0e10cSrcweir #endif
209*cdf0e10cSrcweir 		delete pStream;
210*cdf0e10cSrcweir 	}
211*cdf0e10cSrcweir 	pStream = NULL;
212*cdf0e10cSrcweir }
213