email/pop3andsmtpmtm/clientmtms/src/cimapsyncdownloadrules.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/clientmtms/src/cimapsyncdownloadrules.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,343 @@
+// Copyright (c) 2007-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 "cimapsyncdownloadrules.h"
+#include "MIUT_ERR.H"
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS  
+#include "miut_errconsts.h"
+#endif
+
+/**
+Factory constructor.
+*/
+EXPORT_C CImapSyncDownloadRules* CImapSyncDownloadRules::NewL()
+	{
+	CImapSyncDownloadRules* self = NewLC();
+	CleanupStack::Pop();
+	return self;
+	}
+
+/**
+Factory constructor.
+*/
+EXPORT_C CImapSyncDownloadRules* CImapSyncDownloadRules::NewLC()
+	{
+	CImapSyncDownloadRules* self = new(ELeave) CImapSyncDownloadRules();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+/**
+Class constructor
+*/
+CImapSyncDownloadRules::CImapSyncDownloadRules()
+	{
+	}
+
+/**
+Second phase constructor
+*/
+void CImapSyncDownloadRules::ConstructL()
+	{
+	}
+
+/**
+Class destructor
+*/
+CImapSyncDownloadRules::~CImapSyncDownloadRules()
+	{
+	Reset();
+	}
+
+/**
+Make copy of an instance of the class.
+
+@return Pointer to new class on the heap. Ownership is transferred to the caller.
+*/
+EXPORT_C CImapSyncDownloadRules* CImapSyncDownloadRules::CopyL()
+	{
+	CImapSyncDownloadRules* dest = CopyLC();
+	CleanupStack::Pop();
+	return dest;
+	}
+
+/**
+Make new copy of an instance of the class.
+On return the copy will be on the cleanup stack.
+
+@return Pointer to new class on the heap. Ownership is transferred to the caller.
+*/
+EXPORT_C CImapSyncDownloadRules* CImapSyncDownloadRules::CopyLC()
+	{
+	CImapSyncDownloadRules* dest = NewLC();
+
+	TImapSyncDownloadRules newRule;
+	TInt numRules;
+
+	for (TInt type = EInboxRulesType; type <= EFolderRulesType; ++type)
+		{
+		numRules = iRulesList[type].Count();
+
+		for (TInt rule = 0; rule < numRules; ++rule)
+			{
+			newRule.iBearerTypes = iRulesList[type][rule].iBearerTypes;
+			newRule.iMailInfo = iRulesList[type][rule].iMailInfo;
+
+			dest->iRulesList[type].AppendL(newRule);
+			}
+		}
+
+	return dest;
+	}
+
+/**
+Adds a new synchronisation download rule.
+
+The position for the new rule is specified in the parameter list. If the
+position is greater than the number of rules already in the list then the
+new rule is added at the end of the list. If the position is less than the
+number of rules already in the list, then the new rule is inserted at that
+position and all subsequent rules moved down by one position. The actual
+position where the rule was added is given by the return value.
+
+Invalid arguments passed to the routine will cause a panic on debug builds
+but a leave with KErrArgument on a release build.
+
+@param aType Type of folder the rule is for (inbox or other folder)
+@param aPos Position in the list to add the rule.
+@param aBearerTypes Bearer types that will use the rule.
+@param aMailInfo Partial mail info options to use during synchronisation
+
+@return The position in the list where the rule was added, or KErrOverflow
+        if the list is full up, or KErrAlreadyExists if there is already a
+        rule for one of the bearer types.
+
+@leave KErrArgument Argument passed in is invalid
+*/
+EXPORT_C TInt CImapSyncDownloadRules::AddRuleL(TRulesType aType, TInt aPos, TUint32 aBearerTypes, const TImImap4GetPartialMailInfo& aMailInfo)
+	{
+	__ASSERT_DEBUG(aPos >= 0 && aPos < KMaxImapSyncDownloadRules, gPanic(EImcmSyncDownloadRulesInvalidPos1));
+	__ASSERT_DEBUG(aBearerTypes != 0, gPanic(EImcmSyncDownloadRulesInvalidBearerTypes1));
+
+	if (aPos < 0 || aPos >= KMaxImapSyncDownloadRules || aBearerTypes == 0)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	TInt numRules = iRulesList[aType].Count();
+
+	if (numRules >= KMaxImapSyncDownloadRules)
+		{
+		return KErrOverflow;
+		}
+
+	for (TInt rule = 0; rule < numRules; ++rule)
+		{
+		if ((iRulesList[aType][rule].iBearerTypes & aBearerTypes) != 0)
+			{
+			return KErrAlreadyExists;
+			}
+		}
+
+	TImapSyncDownloadRules newRule;
+	newRule.iBearerTypes = aBearerTypes;
+	newRule.iMailInfo = aMailInfo;
+
+	TInt insertedPos = aPos;
+
+	if (aPos < numRules)
+		{
+		iRulesList[aType].InsertL(newRule, aPos);
+		}
+	else
+		{
+		iRulesList[aType].AppendL(newRule);
+		insertedPos = numRules;
+		}
+
+	return insertedPos;
+	}
+
+/**
+Deletes a synchronisation download rule from a given position
+
+Invalid arguments passed to the routine will cause a panic on debug builds
+but a leave with KErrArgument on a release build.
+
+@param aType Type of folder the rule is for (inbox or other folder)
+@param aPos Position in the list to add the rule.
+
+@return ETrue if the rule was deleted, EFalse otherwise
+
+@leave KErrArgument Argument passed in is invalid
+*/
+EXPORT_C TBool CImapSyncDownloadRules::DeleteRuleL(TRulesType aType, TInt aPos)
+	{
+	__ASSERT_DEBUG(aPos >= 0 && aPos < KMaxImapSyncDownloadRules, gPanic(EImcmSyncDownloadRulesInvalidPos2));
+
+	if (aPos < 0 || aPos >= KMaxImapSyncDownloadRules)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	if (aPos < iRulesList[aType].Count())
+		{
+		iRulesList[aType].Remove(aPos);
+		return ETrue;
+		}
+	
+	return EFalse;
+	}
+
+/**
+Deletes bearer types from the synchronisation download rules.
+
+Every rule is examined to see if the bearer types associated with that rule
+contain all of the passed in bearer types. If there is a match then the bearer
+types are removed from the rule. If this results in all the bearer types for
+the rule being removed then the rule is deleted and all subsequent rules
+are moved up one position.
+
+Invalid arguments passed to the routine will cause a panic on debug builds
+but a leave with KErrArgument on a release build.
+
+@param aType Type of folder the rule is for (inbox or other folder)
+@param aBearerTypes Bearer types to remove.
+@param aRuleRemoved If the bearer types are removed, this flag indicates if
+       the removal resulted in the rule being removed as well.
+
+@return The position of the rule in the list that contained all the bearer types,
+        or KErrNotFound if no rule was found.
+
+@leave KErrArgument Argument passed in is invalid
+*/
+EXPORT_C TInt CImapSyncDownloadRules::DeleteBearerTypesL(TRulesType aType, TUint32 aBearerTypes, TBool& aRuleRemoved)
+	{
+	__ASSERT_DEBUG(aBearerTypes != 0, gPanic(EImcmSyncDownloadRulesInvalidBearerTypes2));
+
+	if (aBearerTypes == 0)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	aRuleRemoved = EFalse;
+	
+	TInt numRules = iRulesList[aType].Count();
+
+	for (TInt rule = 0; rule < numRules; ++rule)
+		{
+		if ((iRulesList[aType][rule].iBearerTypes & aBearerTypes) == aBearerTypes)
+			{
+			iRulesList[aType][rule].iBearerTypes &= ~aBearerTypes;
+
+			if (iRulesList[aType][rule].iBearerTypes == 0)
+				{
+				iRulesList[aType].Remove(rule);
+				aRuleRemoved = ETrue;
+				}
+
+			return rule;
+			}
+		}
+
+	return KErrNotFound;
+	}
+
+/**
+Gets the synchronisation download rule at a given position.
+
+Invalid arguments passed to the routine will cause a panic on debug builds
+but a leave with KErrArgument on a release build.
+
+@param aType Type of folder the rule is for (inbox or other folder)
+@param aPos Position of the rule in the list
+@param aBearerTypes On successful completion, this holds the bearer types for the rule
+@param aMailInfo On successful completion, this holds the mail info for the rule
+
+@return ETrue if the rule was found, EFalse otherwise
+
+@leave KErrArgument Argument passed in is invalid
+*/
+EXPORT_C TBool CImapSyncDownloadRules::GetRuleL(TRulesType aType, TInt aPos, TUint32& aBearerTypes, TImImap4GetPartialMailInfo& aMailInfo) const
+	{
+	__ASSERT_DEBUG(aPos >= 0 && aPos < KMaxImapSyncDownloadRules, gPanic(EImcmSyncDownloadRulesInvalidPos3));
+
+	if (aPos < 0 || aPos >= KMaxImapSyncDownloadRules)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	if (aPos < iRulesList[aType].Count())
+		{
+		aBearerTypes = iRulesList[aType][aPos].iBearerTypes;
+		aMailInfo = iRulesList[aType][aPos].iMailInfo;
+		return ETrue;
+		}
+
+	return EFalse;
+	}
+
+/**
+Gets the partial mail info object from the synchronisation download rule for
+a given bearer type.
+
+The mail info is returned only if its associated bearer types contain all the
+bearer types specified in the passed in value.
+
+Invalid arguments passed to the routine will cause a panic on debug builds
+but a leave with KErrArgument on a release build.
+
+@param aType Type of folder the rule is for (inbox or other folder)
+@param aBearerTypes The bearer types to search for
+@param aMailInfo On successful completion, this holds the mail info for the rule
+
+@return The position of the rule in the list that matched the bearer types, or
+        KErrNotFound if no matching bearer type was found.
+
+@leave KErrArgument Argument passed in is invalid
+*/
+EXPORT_C TInt CImapSyncDownloadRules::GetMailInfoL(TRulesType aType, TUint32 aBearerTypes, TImImap4GetPartialMailInfo& aMailInfo) const
+	{
+	__ASSERT_DEBUG(aBearerTypes != 0, gPanic(EImcmSyncDownloadRulesInvalidBearerTypes3));
+
+	if (aBearerTypes == 0)
+		{
+		User::Leave(KErrArgument);
+		}
+
+	TInt numRules = iRulesList[aType].Count();
+
+	for (TInt rule = 0; rule < numRules; ++rule)
+		{
+		if ((iRulesList[aType][rule].iBearerTypes & aBearerTypes) == aBearerTypes)
+			{
+			aMailInfo = iRulesList[aType][rule].iMailInfo;
+			return rule;
+			}
+		}
+
+	return KErrNotFound;
+	}
+
+/**
+Reset the rules lists so that they are empty
+*/
+EXPORT_C void CImapSyncDownloadRules::Reset()
+	{
+	iRulesList[EInboxRulesType].Reset();
+	iRulesList[EFolderRulesType].Reset();
+	}