email/imap4mtm/imapsession/src/cimaprfc822headerfields.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imapsession/src/cimaprfc822headerfields.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,252 @@
+// 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:
+// cimaprfc822headerfields.cpp
+//
+
+#include "cimaprfc822headerfields.h"
+#include "cimapsessionconsts.h"
+
+class CDesC8Array;
+
+#include <imcvutil.h>
+#include <miuthdr.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS  
+#include "timrfc822datefield.h"
+#endif
+
+CImapRfc822HeaderFields* CImapRfc822HeaderFields::NewL()
+	{
+	CImapRfc822HeaderFields* self = new (ELeave) CImapRfc822HeaderFields();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CImapRfc822HeaderFields::CImapRfc822HeaderFields()
+	{
+	}
+
+void CImapRfc822HeaderFields::ConstructL()
+	{
+	CImapHeaderFields::ConstructL(EImapCountFields);
+	}
+
+CImapRfc822HeaderFields::~CImapRfc822HeaderFields()
+	{
+	}
+
+/**
+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.
+*/
+EXPORT_C const TDesC8& CImapRfc822HeaderFields::FieldValue(THeaderFields aFieldId)
+	{
+	return CImapHeaderFields::FieldValue(aFieldId);
+	}
+
+/**
+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.
+*/
+EXPORT_C TBool CImapRfc822HeaderFields::FieldExists(THeaderFields aFieldId)
+	{
+	return CImapHeaderFields::FieldExists(aFieldId);
+	}
+
+/**
+Returns the numerical priority for an email based on the various priority fields that can
+be received in the header fields.
+If no priority is found, then the returned value will be set to medium priority.
+@return Extracted numerical priority. If no priority is found, then medium priority is returned.
+*/
+EXPORT_C TMsvPriority CImapRfc822HeaderFields::PriorityL()
+	{
+	CImcvUtils* imcvUtils = CImcvUtils::NewLC();
+	TMsvPriority priority(EMsvMediumPriority);
+
+	if (FieldExists(EImapPriority))
+		{
+		priority = imcvUtils->EvaluatePriorityText(FieldValue(EImapPriority));
+		}
+	else if (FieldExists(EImapXPriority))
+		{
+		priority = imcvUtils->EvaluatePriorityText(FieldValue(EImapXPriority));
+		}
+	else if (FieldExists(EImapXMSMailPriority))
+		{
+		priority = imcvUtils->EvaluatePriorityText(FieldValue(EImapXMSMailPriority));
+		}
+	else if (FieldExists(EImapImportance))
+		{
+		priority = imcvUtils->EvaluatePriorityText(FieldValue(EImapImportance));
+		}
+
+	CleanupStack::PopAndDestroy(imcvUtils);
+
+	return priority;
+	}
+
+/**
+Returns a date for an email. If the 'date' header field exists, then this is used. If not,
+then a check is made to see if a 'received' header field exists containing a date.
+@return Date value. If no date found, then the date value will be set to 0.
+*/
+EXPORT_C TTime CImapRfc822HeaderFields::Date()
+	{
+	TTime date(0);
+	TImRfc822DateField dateField;
+
+	if (FieldExists(EImapDate))
+		{
+		dateField.ParseDateField(FieldValue(EImapDate), date);
+		}
+	else if (FieldExists(EImapReceived))
+		{
+		TPtrC8 ptr(FieldValue(EImapReceived));
+
+		_LIT8(KSemiColonSpace, "; ");
+		TInt semicolonPos = ptr.Find(KSemiColonSpace);
+
+		if (semicolonPos >= 0)
+			{
+			ptr.Set(ptr.Right(ptr.Length() - semicolonPos - 2));
+
+			if (ptr.Length() > 0)
+				{
+				dateField.ParseDateField(ptr, date);
+				}
+			}
+		}
+
+	return date;
+	}
+
+/**
+Returns the return receipt value from the header fields based on the various 'return receipt'
+header fields that can be received.
+@return Return receipt field value. Null descriptor if no 'return receipt' fields exist.
+*/
+EXPORT_C const TDesC8& CImapRfc822HeaderFields::ReturnReceiptField()
+	{
+	if (FieldExists(EImapReturnReceiptTo))
+		{
+		return FieldValue(EImapReturnReceiptTo);
+		}
+
+	if (FieldExists(EImapXReturnReceiptTo))
+		{
+		return FieldValue(EImapXReturnReceiptTo);
+		}
+
+	if (FieldExists(EImapDispositionNotificationTo))
+		{
+		return FieldValue(EImapDispositionNotificationTo);
+		}
+
+	return KNullDesC8();
+	}
+
+
+TInt CImapRfc822HeaderFields::Match(const TDesC8& aFieldName, TBool& /*aNeedToStripSpaces*/)
+	{
+	THeaderFields fieldId;
+
+	if (aFieldName.CompareF(KImapTxtFrom) == 0)
+		{
+		fieldId = EImapFrom;
+		}
+	else if (aFieldName.CompareF(KImapTxtReplyTo) == 0)
+		{
+		fieldId = EImapReplyTo;
+		}
+	else if (aFieldName.CompareF(KImapTxtTo) == 0)
+		{
+		fieldId = EImapTo;
+		}
+	else if (aFieldName.CompareF(KImapTxtCc) == 0)
+		{
+		fieldId = EImapCc;
+		}
+	else if (aFieldName.CompareF(KImapTxtBcc) == 0)
+		{
+		fieldId = EImapBcc;
+		}
+	else if (aFieldName.CompareF(KImapTxtSubject) == 0)
+		{
+		fieldId = EImapSubject;
+		}
+	else if (aFieldName.CompareF(KImapTxtReceived) == 0)
+		{
+		fieldId = EImapReceived;
+		}
+	else if (aFieldName.CompareF(KImapTxtDate) == 0)
+		{
+		fieldId = EImapDate;
+		}
+	else if (aFieldName.CompareF(KImapTxtMessageId) == 0)
+		{
+		fieldId = EImapMessageId;
+		}
+	else if (aFieldName.CompareF(KImapTxtXMailer) == 0)
+		{
+		fieldId = EImapXMailer;
+		}		
+	else if (aFieldName.CompareF(KImapTxtPriority) == 0)
+		{
+		fieldId = EImapPriority;
+		}
+	else if (aFieldName.CompareF(KImapTxtXPriority) == 0)
+		{
+		fieldId = EImapXPriority;
+		}
+	else if (aFieldName.CompareF(KImapTxtXMSMailPriority) == 0)
+		{
+		fieldId = EImapXMSMailPriority;
+		}
+	else if (aFieldName.CompareF(KImapTxtPrecedence) == 0)
+		{
+		fieldId = EImapPrecedence;
+		}
+	else if (aFieldName.CompareF(KImapTxtImportance) == 0)
+		{
+		fieldId = EImapImportance;
+		}
+	else if (aFieldName.CompareF(KImapTxtReturnReceiptTo) == 0)
+		{
+		fieldId = EImapReturnReceiptTo;
+		}
+	else if (aFieldName.CompareF(KImapTxtXReturnReceiptTo) == 0)
+		{
+		fieldId = EImapXReturnReceiptTo;
+		}
+	else if (aFieldName.CompareF(KImapTxtDispositionNotificationTo) == 0)
+		{
+		fieldId = EImapDispositionNotificationTo;
+		}
+	else if (aFieldName.CompareF(KImapTxtDispositionNotificationOptions) == 0)
+		{
+		fieldId = EImapDispositionNotificationOptions;
+		}
+	else
+		{
+		return KErrNotFound;
+		}
+
+	return fieldId;
+	}