diff -r 000000000000 -r e35f40988205 xml/xmldomandxpath/src/xmlengineserializer/xmlenggzipfiledeserializer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/xmldomandxpath/src/xmlengineserializer/xmlenggzipfiledeserializer.cpp Thu Dec 17 09:29:21 2009 +0200 @@ -0,0 +1,114 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// GZIP output stream functions +// + +#include "xmlenggzipfiledeserializer.h" +#include +#include + + + CXmlEngGZipFileDeserializer* CXmlEngGZipFileDeserializer::NewLC( Xml::CParser* aParser, RFs& aRfs, const TDesC& aGzFileName, TInt aBufSize ) + { + CXmlEngGZipFileDeserializer* bm = new (ELeave) CXmlEngGZipFileDeserializer( aParser ); + CleanupStack::PushL( bm ); + bm->ConstructL( aRfs, aGzFileName, aBufSize ); + return bm; + } + + CXmlEngGZipFileDeserializer* CXmlEngGZipFileDeserializer::NewL( Xml::CParser* aParser, RFs& aRfs, const TDesC& aGzFileName, TInt aBufSize ) + { + CXmlEngGZipFileDeserializer* bm = CXmlEngGZipFileDeserializer::NewLC( aParser, aRfs, aGzFileName, aBufSize ); + CleanupStack::Pop( bm ); + return bm; + } + + CXmlEngGZipFileDeserializer::CXmlEngGZipFileDeserializer( Xml::CParser* aParser ) + : iInputDescriptor(NULL,0), iOutputDescriptor(NULL,0) + { + iParser = aParser; + } + + void CXmlEngGZipFileDeserializer::ConstructL( RFs& aRfs, const TDesC& aGzFileName, TInt aBufSize ) + { + EZGZipFile::LocateAndReadTrailerL(aRfs,aGzFileName,iTrailer); + User::LeaveIfError(iInputFile.Open(aRfs,aGzFileName,EFileStream | EFileRead | EFileShareAny)); + EZGZipFile::ReadHeaderL(iInputFile,iHeader); + iCrc = crc32(iCrc,NULL,0); + + if ( aBufSize <= 0 ) + { + User::Leave(KErrArgument); + } + iInputBuffer = new (ELeave) TUint8[aBufSize]; + iOutputBuffer = new (ELeave) TUint8[aBufSize]; + + iInputDescriptor.Set(iInputBuffer,0,aBufSize); + iOutputDescriptor.Set(iOutputBuffer,0,aBufSize); + + + iDecompressor = CEZDecompressor::NewL(*this,-CEZDecompressor::EMaxWBits); + } + + CXmlEngGZipFileDeserializer::~CXmlEngGZipFileDeserializer() + { + //do NOT destroy iParser + delete iDecompressor; + delete[] iInputBuffer; + delete[] iOutputBuffer; + iInputFile.Close(); + } + + TBool CXmlEngGZipFileDeserializer::InflateL() + { + TBool keepGoing = iDecompressor->InflateL(); + + if (!keepGoing) + { + if (iCrc != iTrailer.iCrc32) + User::Leave(KEZlibErrBadGZipCrc); + iInputFile.Close(); + } + return keepGoing; + } + + void CXmlEngGZipFileDeserializer::InitializeL( CEZZStream& aZStream ) + { + iParser->ParseBeginL(); + User::LeaveIfError(iInputFile.Read(iInputDescriptor)); + aZStream.SetInput(iInputDescriptor); + aZStream.SetOutput( iOutputDescriptor ); + } + + void CXmlEngGZipFileDeserializer::NeedInputL( CEZZStream& aZStream ) + { + User::LeaveIfError(iInputFile.Read(iInputDescriptor)); + aZStream.SetInput(iInputDescriptor); + } + + void CXmlEngGZipFileDeserializer::NeedOutputL( CEZZStream& aZStream ) + { + TPtrC8 od = aZStream.OutputDescriptor(); + iCrc = crc32(iCrc,od.Ptr(),od.Size()); + iParser->ParseL( od ); + aZStream.SetOutput( iOutputDescriptor ); + } + + void CXmlEngGZipFileDeserializer::FinalizeL( CEZZStream& aZStream ) + { + TPtrC8 od = aZStream.OutputDescriptor(); + iCrc = crc32(iCrc,od.Ptr(),od.Size()); + iParser->ParseL( od ); + iParser->ParseEndL(); + }