email/imap4mtm/imapsession/src/cimapheaderfields.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imapsession/src/cimapheaderfields.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,119 @@
+// 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:
+//
+
+#include "cimapheaderfields.h"
+
+CImapHeaderFields::CImapHeaderFields()
+	{
+	}
+
+void CImapHeaderFields::ConstructL(TInt aStartFieldCount)
+	{
+	for (TInt field = 0; field < aStartFieldCount; ++field)
+		{
+		iImapFieldValueArray.AppendL(NULL);
+		}
+	}
+
+CImapHeaderFields::~CImapHeaderFields()
+	{
+	iImapFieldValueArray.ResetAndDestroy();
+	}
+
+/**
+Sets the value of the field identified by the supplied field name
+@param aFieldname Name of the field to set
+@param aValue Value to set the field to. This routine takes immediate
+       ownership of the buffer
+@return Whether field has been set to the new value
+*/
+TBool CImapHeaderFields::SetFieldL(const TDesC8& aFieldName, HBufC8* aValue)
+	{
+	CleanupStack::PushL(aValue);
+
+	TBool needToStripSpaces = EFalse;
+
+	TInt fieldId = Match(aFieldName, needToStripSpaces);
+
+	if (fieldId != KErrNotFound)
+		{
+		ASSERT(fieldId < iImapFieldValueArray.Count());
+
+		if (needToStripSpaces)
+			{
+			HBufC8* strippedValue = StripSpacesL(*aValue);
+			CleanupStack::PopAndDestroy(aValue);
+			aValue = strippedValue;
+			CleanupStack::PushL(aValue);
+			}
+
+		delete iImapFieldValueArray[fieldId];
+		iImapFieldValueArray[fieldId] = aValue;
+		CleanupStack::Pop(aValue);
+		return ETrue;
+		}
+
+	CleanupStack::PopAndDestroy(aValue);
+	return EFalse;
+	}
+
+/**
+Returns the value of the field identified by the supplied field index.
+If the field has not been populated, a null descriptor is returned.
+@param aFieldId index of the field value to return.
+@return The value of the filed or a null descriptor.
+*/
+const TDesC8& CImapHeaderFields::FieldValue(TInt aFieldId)
+	{
+	ASSERT(aFieldId < iImapFieldValueArray.Count());
+
+	return (iImapFieldValueArray[aFieldId] != NULL) ? *(iImapFieldValueArray[aFieldId]) : KNullDesC8();
+	}
+
+/**
+Returns whether the field identified by the supplied field index has been populated.
+This indicates whether the field value was supplied by the server.
+@param aFieldId index of the field value to return.
+@return Whether field has been populated.
+*/
+TBool CImapHeaderFields::FieldExists(TInt aFieldId)
+	{
+	ASSERT(aFieldId < iImapFieldValueArray.Count());
+
+	return (iImapFieldValueArray[aFieldId] != NULL) ? ETrue : EFalse;
+	}
+
+/**
+Strips all spaces from a header field
+@param aValue Field value to strip spaces from
+@return Buffer containing stripped value. Ownership is passed back to caller
+*/
+HBufC8* CImapHeaderFields::StripSpacesL(const TDesC8& aBuffer)
+	{
+	TInt bufferLen = aBuffer.Length();
+
+	HBufC8* strippedValue = HBufC8::NewL(bufferLen);
+	TPtr8 strippedBuffer = strippedValue->Des();
+
+	for (TInt bufferPos = 0; bufferPos < bufferLen; ++bufferPos)
+		{
+		if (aBuffer[bufferPos] > ' ')
+			{
+			strippedBuffer.Append(aBuffer[bufferPos]);
+			}
+		}
+
+	return strippedValue;
+	}