applayerprotocols/httptransportfw/httpmessage/thttpdatacomposer.cpp
changeset 0 b16258d2340f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httptransportfw/httpmessage/thttpdatacomposer.cpp	Tue Feb 02 01:09:52 2010 +0200
@@ -0,0 +1,126 @@
+// Copyright (c) 2003-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:
+//
+
+#include "thttpdatacomposer.h"
+
+#include "mhttpbuffersupplier.h"
+#include "thttpmessagepanic.h"
+
+const TUint KCarriageReturn	= '\r';
+const TUint KLineFeed		= '\n';
+const TUint KSpace			= ' ';
+const TUint KColon			= ':';
+
+THttpDataComposer::THttpDataComposer(MHttpBufferSupplier& aBufferSupplier)
+: iBufferSupplier(aBufferSupplier), iBuffer(TPtr8(NULL, 0))
+/**
+	Constructor.
+	@param		aBufferSupplier	The buffer supplier.
+*/
+	{
+	iRequiredLength = 0;
+	}
+
+void THttpDataComposer::Release()
+/**
+	Release the current data.
+	@post		The buffer is empty.
+*/
+	{
+	iBuffer.Zero();
+	iRequiredLength = 0;
+	}
+
+void THttpDataComposer::Reset()
+/**
+	Reset the data composer. The data buffer is deleted.
+	@post		The data buffer is deleted.
+*/
+	{
+	iBuffer.Set(NULL, 0, 0);
+	iRequiredLength = 0;
+	iBufferSupplier.DeleteBuffer();
+	}
+
+void THttpDataComposer::AddTokenL(const TDesC8& aToken, TDelimiterType aDelimiter)
+/**
+	Adds the token followed by the specified delimiter to the data buffer. The 
+	delimiter types can be Space, Colon or CRLF. The Colon delimiter includes a
+	following Space character.
+	@param		aToken		The token to be added to the data buffer.
+	@param		aDelimiter	The type of delimiter that should follow the token.
+	@panic		EHttpMessagePanicBadDelimiterType	An illegal delimiter type 
+													was specified.												
+*/
+	{
+	// Update the required length - add token and delimiter length
+	iRequiredLength += aToken.Length();
+	switch( aDelimiter )
+		{
+	case EColonSpace:
+	case ECRLF:
+		{
+		// These delimiters have two characters.
+		++iRequiredLength;
+		// Drop into the Space delimiter case...
+		}
+	case ESpace:
+		{
+		// Only a single character
+		++iRequiredLength;
+		// Drop into the None delimiter case...
+		}
+	case ENone:
+		// No change to required length.
+		break;
+	default:
+		THttpMessagePanic::Panic(THttpMessagePanic::EHttpMessagePanicBadDelimiterType);
+		break;
+		};
+
+	// Is there enough space in the buffer?
+	if( iRequiredLength > iBuffer.MaxLength() )
+		{
+		// Re-allocate the buffer.
+		iBufferSupplier.ReAllocBufferL(iRequiredLength, iBuffer);
+		}
+
+	// Append the token and delimiter
+	iBuffer.Append(aToken);
+	switch( aDelimiter )
+		{
+	case EColonSpace:
+		{
+		// Append the colon - drop into the Space case to add a space char
+		iBuffer.Append(KColon);
+		}
+	case ESpace:
+		{
+		iBuffer.Append(KSpace);
+		} break;
+	case ECRLF:
+		{
+		// Append the CR followed by the LF.
+		iBuffer.Append(KCarriageReturn);
+		iBuffer.Append(KLineFeed);
+		} break;
+	case ENone:
+		// Do nothing...
+		break;
+	default:
+		THttpMessagePanic::Panic(THttpMessagePanic::EHttpMessagePanicBadDelimiterType);
+		break;
+		};
+	}