diff -r 000000000000 -r 72b543305e3a email/pop3andsmtpmtm/clientmtms/src/cimapsyncdownloadrules.cpp --- /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(); + }