email/imap4mtm/imapsession/src/tmessageflaginfo.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imapsession/src/tmessageflaginfo.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,166 @@
+// 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 "tmessageflaginfo.h"
+
+#include "cimapcommand.h"
+#include "cimapsessionconsts.h"
+
+/**
+Default constructor - initialises its data members to zero.
+Note this is not a CBase class, so this does not happen automatically.
+*/
+TMessageFlagInfo::TMessageFlagInfo()
+	: iMessageUid(0), iFlags(0)
+	{}
+
+/**
+Set the flag identified by aFlagId to the value of aValue.
+@param aFlagId Identifies which flag to set.
+@param aValue The value to apply to the flag.
+*/
+void TMessageFlagInfo::SetFlag(TImapMessageFlags aFlagId, TBool aValue)
+	{
+	if (aValue)
+		{
+		iFlags |= aFlagId;
+		}
+	else
+		{
+		iFlags &= ~aFlagId;
+		}
+	}
+	
+/**
+Retrieve the value of the flag identified by aFlagId.
+@param aFlagId Identifies which flag to query.
+@return The value of the querried flag.
+*/
+EXPORT_C TBool TMessageFlagInfo::QueryFlag(TImapMessageFlags aFlagId)
+	{
+	return iFlags & aFlagId;
+	}
+
+/**
+Parse the flags data and update to iFlags.
+@param aFlagsData contains list of flags to be parsed.
+@return The remaining portion of the aFlagsData parameter that was not parsed.
+*/
+TPtrC8 TMessageFlagInfo::ParseFlagsL(const TDesC8& aFlagsData)
+	{
+	// formal definition of the FLAGS data item of a FETCH FLAGS is
+	//
+	// msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")"
+	//
+	// flag-fetch = flag / "\Recent"
+	// flag = "\Answered" / "\Flagged" / "\Deleted" / "\Seen" / "\Draft" / flag-keyword / flag-extension
+	// flag-extension = "\" atom
+	// flag-keyword = atom
+	//
+	//
+
+	TPtrC8 parseData(aFlagsData);
+	
+	TInt start = aFlagsData.Locate('(');
+	TInt end = aFlagsData.Locate(')');
+
+	// Reset the flags, prior to setting them.
+	iFlags = 0;
+
+	// Now set them.
+	if ((start >= 0) && (end > start))
+		{
+		RDesParts flags;
+		CleanupClosePushL(flags);
+		
+		// lose the brackets
+		parseData.Set(aFlagsData.Mid(start+1, end-start-1));
+		
+		CImapCommand::GetDelimitedPartsL(' ', parseData, flags);
+		TInt flagsCount = flags.Count();
+		for (TInt i = 0; i < flagsCount; ++i)
+			{
+			TPtrC8 flag = flags[i];
+
+			if(flag.CompareF(KImapTxtFlagDeleted) == 0)
+				{
+				SetFlag(TMessageFlagInfo::EDeleted, ETrue);
+				}
+			else if (flag.CompareF(KImapTxtFlagSeen) == 0)
+				{
+				SetFlag(TMessageFlagInfo::ESeen, ETrue);
+				}
+			else if(flag.CompareF(KImapTxtFlagFlagged) == 0)
+				{
+				SetFlag(TMessageFlagInfo::EFlagged, ETrue);			
+				}
+			else if(flag.CompareF(KImapTxtFlagAnswered) == 0)
+				{
+				SetFlag(TMessageFlagInfo::EAnswered, ETrue);
+				}
+			else if(flag.CompareF(KImapTxtFlagDraft) == 0)
+				{
+				SetFlag(TMessageFlagInfo::EDraft, ETrue);
+				}
+			else if(flag.CompareF(KImapTxtFlagRecent) == 0)
+				{
+				SetFlag(TMessageFlagInfo::ERecent, ETrue);	
+				}
+			}
+
+		// return the remainder.
+		// if there is a space after the closing bracket, 
+		// then remainder should start after the space.
+		if (aFlagsData.Length() > end + 1)
+			{
+			if (aFlagsData[end+1] == ' ')
+				{
+				++end;
+				}
+			}		
+		
+		if (aFlagsData.Length() > end)
+			{
+			parseData.Set(aFlagsData.Mid(end + 1));
+			}
+		else
+			{
+			parseData.Set(aFlagsData.Right(0));
+			}
+			
+		CleanupStack::PopAndDestroy(&flags);
+		}
+
+	return parseData;
+	}
+
+/**
+Sets the Message UID by converting the given string value into an integer.
+@param aMessageUid string containing the UID value.
+@return KErrNone if the coversion was successful.  Otherwise a system-wide error code will be given.
+*/
+TInt TMessageFlagInfo::SetMessageUid(const TDesC8& aMessageUid)
+	{
+	TLex8 lex(aMessageUid);
+	return lex.Val(iMessageUid);
+	}
+
+/**
+@return The UID for this message
+*/
+EXPORT_C TUint TMessageFlagInfo::MessageUid() const
+	{
+	return iMessageUid;
+	}