xml/xmldomandxpath/src/xmlengineserializer/xmlenggzipfileoutputstream.cpp
changeset 0 e35f40988205
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/xmldomandxpath/src/xmlengineserializer/xmlenggzipfileoutputstream.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,188 @@
+// 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 "xmlenggzipfileoutputstream.h"
+#include <ezstream.h>
+#include <ezcompressor.h>
+
+/**
+ * Default input buffers size.
+ */
+const TInt CXmlEngGZIPFileOutputStream::KDefaultInputBufferSize = 4096;
+	    
+/**
+ * Output buffer size. It determines, how often output data will be written
+ * to disk. (it's written to disk, when buffer is full.
+ *
+ */
+const TInt CXmlEngGZIPFileOutputStream::KOutputBufferSize = 0x8000;
+
+CXmlEngGZIPFileOutputStream* CXmlEngGZIPFileOutputStream::NewLC( RFile& aOutputFile, 
+                                                                RFs& aRFs )
+    {
+    CXmlEngGZIPFileOutputStream* gzfos = new (ELeave) CXmlEngGZIPFileOutputStream( aOutputFile, 
+	                                                                                aRFs );
+    CleanupStack::PushL( gzfos );
+    gzfos->ConstructL();
+    return gzfos;	
+    }
+
+CXmlEngGZIPFileOutputStream* CXmlEngGZIPFileOutputStream::NewL( RFile& aOutputFile, 
+                                                                RFs& aRFs )
+    {
+    CXmlEngGZIPFileOutputStream* gzfos = CXmlEngGZIPFileOutputStream::NewLC( aOutputFile, 
+	                                                                                aRFs );
+    CleanupStack::Pop( gzfos );
+    return gzfos;	
+    }
+
+CXmlEngGZIPFileOutputStream::CXmlEngGZIPFileOutputStream( RFile& aOutputFile, RFs& aRFs )
+    {
+    iKeepGoing = ETrue;
+    iOutputFile = aOutputFile;
+    iRFs = aRFs;
+    iCrc = crc32( iCrc, NULL, 0 );
+    }
+
+void CXmlEngGZIPFileOutputStream::ConstructL()
+    {
+    EZGZipFile::WriteHeaderL( iOutputFile, iHeader );
+    //we can't create compressor here, because we heve no input at this moment
+    iOutputDescriptor.CreateL( KOutputBufferSize );
+    iInputDescriptor.CreateL( KDefaultInputBufferSize );
+    iOldInputDescriptor.CreateL( KDefaultInputBufferSize );
+    }
+
+CXmlEngGZIPFileOutputStream::~CXmlEngGZIPFileOutputStream()
+    {
+    delete iCompressor;
+    iOutputDescriptor.Close();
+    iInputDescriptor.Close();
+    iOldInputDescriptor.Close();
+    }
+
+TInt CXmlEngGZIPFileOutputStream::Write( const TDesC8& aBuffer )
+    {
+    TRAP ( iError, WriteL( aBuffer ) );
+    if ( iError )
+        {
+        return KErrNotFound;
+        }
+    
+    TInt bufferSize = aBuffer.Size();
+    iUncompressedDataSize += bufferSize;
+						
+    return bufferSize;
+    }
+
+void CXmlEngGZIPFileOutputStream::WriteL( const TDesC8& aBuffer )
+    {
+    iNoInputNeeded = ETrue;
+    if ( !iCompressor )
+        {
+        const TInt newLength = aBuffer.Length();
+        if ( newLength > iInputDescriptor.MaxLength() )
+            {
+            iInputDescriptor.ReAllocL( newLength );
+            }
+        iInputDescriptor.Copy( aBuffer );
+        iCompressor = CEZCompressor::NewL( *this, CEZCompressor::EDefaultCompression,
+		                                                             -CEZCompressor::EMaxWBits );    
+        }
+    else
+        {
+        iInputDescriptor.Swap( iOldInputDescriptor );
+        const TInt newLength = aBuffer.Length();
+        if ( newLength > iInputDescriptor.MaxLength() )
+            {
+            iInputDescriptor.ReAllocL( newLength );
+            }
+        iInputDescriptor.Copy( aBuffer );		    
+		    
+        while ( iNoInputNeeded )
+            {
+            iCompressor->DeflateL();
+            }		        
+        }       		
+    }
+	
+TInt CXmlEngGZIPFileOutputStream::Close()
+    {
+    iCloseInvoked = ETrue;
+    if ( iError )
+		    {
+	        return -1;
+		    }
+    TRAP ( iError, CloseL() );
+    if ( iError )
+        {
+        return KErrNotFound;
+        }		
+    return KErrNone;
+    }
+
+void CXmlEngGZIPFileOutputStream::CloseL()
+    {
+    while ( iKeepGoing )
+        {
+        iKeepGoing = iCompressor->DeflateL();
+        }
+    TEZGZipTrailer trailer( iCrc, iUncompressedDataSize );
+    EZGZipFile::WriteTrailerL( iOutputFile, trailer );
+    }
+		
+TInt CXmlEngGZIPFileOutputStream::CheckError()
+    {
+    return iError;
+    }
+    
+void CXmlEngGZIPFileOutputStream::InitializeL( CEZZStream& aZStream )
+    {
+    aZStream.SetInput(iInputDescriptor);
+    aZStream.SetOutput(iOutputDescriptor);
+    iCrc = crc32(iCrc,iInputDescriptor.Ptr(),iInputDescriptor.Size());
+    iNoInputNeeded = EFalse;
+    }
+
+void CXmlEngGZIPFileOutputStream::NeedInputL( CEZZStream& aZStream )
+    {
+    if ( iCloseInvoked )
+        {
+        aZStream.SetInput( KNullDesC8 );
+        iCrc = crc32( iCrc, (unsigned char*)18, 0 );    
+        //second argument can't be null, and third should be 0 !!!
+        }
+    else        
+        {
+        aZStream.SetInput( iInputDescriptor );
+        iCrc = crc32( iCrc, iInputDescriptor.Ptr(), iInputDescriptor.Size() );
+        iNoInputNeeded = EFalse;
+        }
+    }
+
+void CXmlEngGZIPFileOutputStream::NeedOutputL( CEZZStream& aZStream )
+    {
+    TPtrC8 od = aZStream.OutputDescriptor();    	
+    User::LeaveIfError( iOutputFile.Write(od) );
+    aZStream.SetOutput( iOutputDescriptor );
+    }
+
+void CXmlEngGZIPFileOutputStream::FinalizeL( CEZZStream& aZStream )
+    {
+    TPtrC8 od = aZStream.OutputDescriptor();    	
+    User::LeaveIfError( iOutputFile.Write(od) );    
+    }
+