diff -r 000000000000 -r b16258d2340f applayerpluginsandutils/httpprotocolplugins/httpheadercodec/chttpdefaultheaderwriter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerpluginsandutils/httpprotocolplugins/httpheadercodec/chttpdefaultheaderwriter.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,121 @@ +// Copyright (c) 2001-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 "chttpdefaultheaderwriter.h" + +#include + +#include "CHeaderField.h" + +// "Sun, 06 Nov 1994 08:49:37 GMT" ; RFC 822, updated by RFC 1123 +_LIT(KDateFormatRfc1123,"%F%*E, %D %*N %Y %H:%T:%S GMT"); + +CHttpDefaultHeaderWriter* CHttpDefaultHeaderWriter::NewL(RStringPool aStringPool) +/** + Factory constructor. + @internalComponent + @param aStringPool The current string pool. + @return A pointer to a fully initialised object. + @leave KErrNoMemory Not enough memory to create object. +*/ + { + return new (ELeave) CHttpDefaultHeaderWriter(aStringPool); + } + +CHttpDefaultHeaderWriter::~CHttpDefaultHeaderWriter() +/** + Destructor + @internalComponent +*/ + { + } + +CHttpDefaultHeaderWriter::CHttpDefaultHeaderWriter(RStringPool aStringPool) +: CHeaderWriter(), iStringPool(aStringPool) +/** + Constructor + @internalComponent + @param aStringPool The current string pool. +*/ + { + } + +/* + * Methods from CHeaderWriter + */ + +void CHttpDefaultHeaderWriter::EncodeHeaderL(RHeaderField& aHeader) +/** + Encodes the header field value. The default behaviour for fields which are + unknown consists of copying the first header part into the raw data. + @internalComponent + @param aHeader The header field to be encoded. + @todo +*/ + { + // By default, the best is to write out the first part verbatim + THeaderFieldPartIter iter = aHeader.PartsL(); + iter.First(); + if( iter.AtEnd() ) + User::Leave(KErrHttpEncodeDefault); + + const CHeaderFieldPart* part = iter(); + if( part == NULL ) + User::Leave(KErrHttpEncodeDefault); + + THTTPHdrVal value = part->Value(); + aHeader.BeginRawDataL(); + + // Encoding depends on value type + switch( value.Type() ) + { + case THTTPHdrVal::KTIntVal: + { + // Integer - convert to descriptor form + const TInt KNumDigitsInMaxInt = 8; + TBuf8 valBuf; + valBuf.Num(value.Int()); + aHeader.WriteRawDataL(valBuf); + } break; + case THTTPHdrVal::KStrFVal: + { + // Folded string - encoce as is. + aHeader.WriteRawDataL(value.StrF().DesC()); + } break; + case THTTPHdrVal::KStrVal: + { + // String - encoce as is. + aHeader.WriteRawDataL(value.Str().DesC()); + } break; + case THTTPHdrVal::KDateVal: + { + // Date value - convert to form given in RFC 822 + const TInt KNumCharsInRfc1123Date = 40; + TBuf dateTimeStringRfc1123; + TTime t(value.DateTime()); + t.FormatL(dateTimeStringRfc1123,KDateFormatRfc1123); + + // Convert from unicode + TBuf8 dateTimeString8; + dateTimeString8.Copy(dateTimeStringRfc1123); + aHeader.WriteRawDataL(dateTimeString8); + } + break; + default: + // Nothing to write if no type is set. The value will be left empty. + break; + } + aHeader.CommitRawData(); + }