applayerpluginsandutils/httpprotocolplugins/httpheadercodec/chttpdefaultheaderwriter.cpp
changeset 0 b16258d2340f
--- /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 <httperr.h>
+
+#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<KNumDigitsInMaxInt> 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<KNumCharsInRfc1123Date> dateTimeStringRfc1123;
+		TTime t(value.DateTime());
+		t.FormatL(dateTimeStringRfc1123,KDateFormatRfc1123);
+
+		// Convert from unicode
+		TBuf8<KNumCharsInRfc1123Date> 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();
+	}