diff -r 000000000000 -r b16258d2340f applayerprotocols/httptransportfw/httpmessage/thttpdatacomposer.cpp --- /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; + }; + }