xml/xmldomandxpath/src/xmlengineserializer/xmlenggzipfiledeserializer.cpp
changeset 0 e35f40988205
--- /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 <ezstream.h>
+#include <ezdecompressor.h>
+
+
+    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();
+    	}