xml/xmldomandxpath/src/xmlengineserializer/xmlenggzipbufferoutputstream.cpp
changeset 0 e35f40988205
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml/xmldomandxpath/src/xmlengineserializer/xmlenggzipbufferoutputstream.cpp	Thu Dec 17 09:29:21 2009 +0200
@@ -0,0 +1,186 @@
+// 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 "xmlenggzipbufferoutputstream.h"
+#include <ezstream.h>
+#include <ezcompressor.h>
+
+
+    CXmlEngGZIPBufferOutputStream* CXmlEngGZIPBufferOutputStream::NewLC( RBuf8& aOutputBuffer )
+	    {
+	    CXmlEngGZIPBufferOutputStream* gzbos = new (ELeave) CXmlEngGZIPBufferOutputStream( aOutputBuffer );
+	    CleanupStack::PushL( gzbos );
+	    gzbos->ConstructL();
+	    return gzbos;	
+	    }
+
+    CXmlEngGZIPBufferOutputStream* CXmlEngGZIPBufferOutputStream::NewL( RBuf8& aOutputBuffer )
+	    {
+	    CXmlEngGZIPBufferOutputStream* gzbos = CXmlEngGZIPBufferOutputStream::NewLC( aOutputBuffer );
+	    CleanupStack::Pop( gzbos );
+	    return gzbos;	
+	    }
+
+   CXmlEngGZIPBufferOutputStream::CXmlEngGZIPBufferOutputStream( RBuf8& aOutputBuffer ) : iOutputString(aOutputBuffer)
+        {
+        iKeepGoing = ETrue;
+        }
+
+   void CXmlEngGZIPBufferOutputStream::ConstructL()
+        {
+        if(!iOutputString.MaxSize())
+            {
+            iOutputString.ReAllocL(KOutputBufferSize);
+            }
+        //we can't create compressor here, because we heve no input at this moment
+        iOutputDescriptor.CreateL( KOutputBufferSize );
+        iInputDescriptor.CreateL( KDefaultInputBufferSize );
+        iOldInputDescriptor.CreateL( KDefaultInputBufferSize );
+        }
+
+   CXmlEngGZIPBufferOutputStream::~CXmlEngGZIPBufferOutputStream()
+        {
+        delete iCompressor;
+        iOutputDescriptor.Close();
+        iInputDescriptor.Close();
+        iOldInputDescriptor.Close();
+        }
+
+	TInt CXmlEngGZIPBufferOutputStream::Write( const TDesC8& aBuffer )
+		{
+		TRAP ( iError, WriteL( aBuffer ) );
+		if ( iError )
+		    {
+	        return -1;
+		    }
+		
+		return aBuffer.Size();
+		}
+
+	void CXmlEngGZIPBufferOutputStream::WriteL( const TDesC8& aBuffer )
+		{
+		iNoInputNeeded = ETrue;
+		if ( !iCompressor )
+		    {
+		    const TInt newLength = aBuffer.Size();
+		    if ( newLength > iInputDescriptor.Size() )
+		        {
+		        iInputDescriptor.ReAllocL( newLength );
+		        }
+		    iInputDescriptor.Copy( aBuffer );
+		    iCompressor = CEZCompressor::NewL( *this );
+		    }
+		else
+		    {
+		    iInputDescriptor.Swap( iOldInputDescriptor );
+		    const TInt newLength = aBuffer.Length();
+		    if ( newLength > iInputDescriptor.MaxLength() )
+		        {
+		        iInputDescriptor.ReAllocL( newLength );
+		        }
+		    iInputDescriptor.Copy( aBuffer );		    
+		    
+		    while ( iNoInputNeeded )
+		        {
+		        iCompressor->DeflateL();
+		        }		        
+		    }       		
+		}
+		
+	TInt CXmlEngGZIPBufferOutputStream::Close()
+		{
+		iCloseInvoked = ETrue;
+        if ( iError )
+            {
+            return -1;
+            }		
+		TRAP ( iError, CloseL() );
+		if ( iError )
+		    {
+	        return -1;
+		    }		
+		return KErrNone;
+		}
+
+	void CXmlEngGZIPBufferOutputStream::CloseL()
+		{
+		while ( iKeepGoing )
+		    {
+		    iKeepGoing = iCompressor->DeflateL();
+		    }
+		}
+		
+	TInt CXmlEngGZIPBufferOutputStream::CheckError()
+	    {
+	    return iError;
+	    }
+    
+    void CXmlEngGZIPBufferOutputStream::InitializeL( CEZZStream& aZStream )
+    	{
+    	aZStream.SetInput( iInputDescriptor );
+    	aZStream.SetOutput( iOutputDescriptor );
+    	iNoInputNeeded = EFalse;
+    	}
+
+    void CXmlEngGZIPBufferOutputStream::NeedInputL( CEZZStream& aZStream )
+    	{
+        if ( iCloseInvoked )
+            {
+            aZStream.SetInput( KNullDesC8 );
+            }
+        else        
+            {
+        	aZStream.SetInput( iInputDescriptor );
+        	iNoInputNeeded = EFalse;
+        	}
+    	}
+
+    void CXmlEngGZIPBufferOutputStream::NeedOutputL( CEZZStream& aZStream )
+    	{
+    	TPtrC8 od = aZStream.OutputDescriptor();
+    	while(TRUE)
+    	    {
+    	    if (od.Size() > (iOutputString.MaxSize() - iOutputString.Size()))
+		        {
+		        iOutputString.ReAllocL( iOutputString.MaxSize()*2 );
+		        }
+		    else
+		        {
+		        break;
+		        }    	    
+    	    }
+    	iOutputString.Append( od );
+    	aZStream.SetOutput( iOutputDescriptor );
+    	}
+
+    void CXmlEngGZIPBufferOutputStream::FinalizeL( CEZZStream& aZStream )
+        {
+        TPtrC8 od = aZStream.OutputDescriptor();
+    	while(TRUE)
+    	    {
+    	    if (od.Size() > (iOutputString.MaxSize() - iOutputString.Size()))
+		        {
+		        iOutputString.ReAllocL( iOutputString.MaxSize()*2 );
+		        }
+		    else
+		        {
+		        break;
+		        }    	    
+    	    }
+    	iOutputString.Append( od );
+    	}
+
+