xref: /aoo41x/main/package/source/zipapi/CRC32.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_package.hxx"
30 #include <CRC32.hxx>
31 #ifndef _ZLIB_H
32 #ifdef SYSTEM_ZLIB
33 #include <zlib.h>
34 #else
35 #include <external/zlib/zlib.h>
36 #endif
37 #endif
38 #include <PackageConstants.hxx>
39 #include <com/sun/star/io/XInputStream.hpp>
40 
41 using namespace rtl;
42 using namespace com::sun::star::uno;
43 using namespace com::sun::star::io;
44 
45 /** A class to compute the CRC32 value of a data stream
46  */
47 
48 CRC32::CRC32()
49 : nCRC(0)
50 {
51 }
52 CRC32::~CRC32()
53 {
54 }
55 void SAL_CALL CRC32::reset()
56 	throw(RuntimeException)
57 {
58 	nCRC=0;
59 }
60 sal_Int32 SAL_CALL CRC32::getValue()
61 	throw(RuntimeException)
62 {
63 	return nCRC & 0xFFFFFFFFL;
64 }
65 /** Update CRC32 with specified sequence of bytes
66  */
67 void SAL_CALL CRC32::updateSegment(const Sequence< sal_Int8 > &b,
68 									sal_Int32 off,
69 									sal_Int32 len)
70 		throw(RuntimeException)
71 {
72 	nCRC = crc32(nCRC, (const unsigned char*)b.getConstArray()+off, len );
73 }
74 /** Update CRC32 with specified sequence of bytes
75  */
76 void SAL_CALL CRC32::update(const Sequence< sal_Int8 > &b)
77 		throw(RuntimeException)
78 {
79 	nCRC = crc32(nCRC, (const unsigned char*)b.getConstArray(),b.getLength());
80 }
81 
82 sal_Int32 SAL_CALL CRC32::updateStream( Reference < XInputStream > & xStream )
83 	throw ( RuntimeException )
84 {
85 	sal_Int32 nLength, nTotal = 0;
86 	Sequence < sal_Int8 > aSeq ( n_ConstBufferSize );
87 	do
88 	{
89 		nLength = xStream->readBytes ( aSeq, n_ConstBufferSize );
90 		updateSegment ( aSeq, 0, nLength );
91 		nTotal += nLength;
92 	}
93 	while ( nLength == n_ConstBufferSize );
94 
95 	return nTotal;
96 }
97