diff -r e7aa27f58ae1 -r 578830873419 emailservices/emailcommon/src/CFSMailBox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailcommon/src/CFSMailBox.cpp Fri Apr 16 14:51:52 2010 +0300 @@ -0,0 +1,964 @@ +/* +* Copyright (c) 2007-2008 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: common mailbox object +* +*/ + +#include + +#include "emailtrace.h" +#include "CFSMailPlugin.h" +#include "CFSMailBox.h" +#include "CFSMailRequestObserver.h" +// +#include "CFSMailFolder.h" +#include "CFSMailAddress.h" +// + +const TInt KMaxMruEntries( 150 ); + +// ================= MEMBER FUNCTIONS ========================================== +// ----------------------------------------------------------------------------- +// CFSMailBox::NewLC +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailBox* CFSMailBox::NewLC( TFSMailMsgId aMailBoxId ) +{ + FUNC_LOG; + CFSMailBox* api = new (ELeave) CFSMailBox(); + CleanupStack:: PushL(api); + api->ConstructL(aMailBoxId); + return api; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::NewL +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailBox* CFSMailBox::NewL( TFSMailMsgId aMailBoxId ) +{ + FUNC_LOG; + CFSMailBox* api = CFSMailBox::NewLC(aMailBoxId); + CleanupStack:: Pop(api); + return api; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::CFSMailBox +// ----------------------------------------------------------------------------- +CFSMailBox::CFSMailBox() +{ + FUNC_LOG; + // get requesthandler pointer + iRequestHandler = static_cast(Dll::Tls()); +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::~CFSMailBox +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailBox::~CFSMailBox() +{ + FUNC_LOG; + iFolders.ResetAndDestroy(); +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::ConstructL +// ----------------------------------------------------------------------------- +void CFSMailBox::ConstructL( TFSMailMsgId aMailBoxId ) +{ + FUNC_LOG; + CFSMailBoxBase::ConstructL(aMailBoxId); +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::GoOnlineL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::GoOnlineL() +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + plugin->GoOnlineL( GetId() ); + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::GoOfflineL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::GoOfflineL() +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + plugin->GoOfflineL( GetId() ); + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::CancelSyncL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::CancelSyncL() +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + plugin->CancelSyncL( GetId() ); + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::GetLastSyncStatusL +// ----------------------------------------------------------------------------- +EXPORT_C TFSProgress CFSMailBox::GetLastSyncStatusL() +{ + FUNC_LOG; + TFSProgress progress; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + progress = plugin->GetLastSyncStatusL( GetId() ); + } + return progress; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::RefreshNowL +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailBox::RefreshNowL( + MFSMailRequestObserver& aOperationObserver ) +{ + FUNC_LOG; + + TFSPendingRequest request; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + // init asynchronous request + request = iRequestHandler->InitAsyncRequestL( GetId().PluginId(), + aOperationObserver ); + MFSMailRequestObserver* observer = request.iObserver; + TRAPD(err,plugin->RefreshNowL( GetId(), *observer, request.iRequestId)); + if(err != KErrNone) + { + iRequestHandler->CompleteRequest(request.iRequestId); + User::Leave(err); + } + } + return request.iRequestId; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::RefreshNowL +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailBox::RefreshNowL() +{ + FUNC_LOG; + + TFSPendingRequest request; + MFSMailRequestObserver* observer = NULL; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + // init asynchronous request + request = iRequestHandler->InitAsyncRequestL( GetId().PluginId(), *observer ); + + observer = request.iObserver; + TRAPD(err,plugin->RefreshNowL( GetId(), *observer, request.iRequestId)); + if(err != KErrNone) + { + iRequestHandler->CompleteRequest(request.iRequestId); + User::Leave(err); + } + } + return request.iRequestId; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::CreateMessageToSend +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessage* CFSMailBox::CreateMessageToSend() +{ + FUNC_LOG; + + CFSMailMessage* message = NULL; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + TRAPD(err,message = plugin->CreateMessageToSendL( GetId() )); + if(err != KErrNone) + { + message = NULL; + } + } + return message; +} + +// +// ----------------------------------------------------------------------------- +// CFSMailBox::CreateMessageToSendL +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailBox::CreateMessageToSendL( + MFSMailRequestObserver& aOperationObserver ) + { + TFSPendingRequest request; + + CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ); + + if ( plugin ) + { + // init asynchronous request + request = iRequestHandler->InitAsyncRequestL( GetId().PluginId(), + aOperationObserver ); + + MFSMailRequestObserver* observer = request.iObserver; + + TRAPD( err, plugin->CreateMessageToSendL( + GetId(), *observer, request.iRequestId ) ); + + if( err != KErrNone ) + { + iRequestHandler->CompleteRequest( request.iRequestId ); + User::Leave( err ); + } + } + else + { + User::Leave( KErrNotFound ); + } + + return request.iRequestId; + } +// + +// +EXPORT_C int CFSMailBox::UpdateMessageFlagsL( + const TFSMailMsgId aMailboxId, + RPointerArray &messages, + MFSMailRequestObserver& aOperationObserver) +{ + Q_UNUSED(aMailboxId); + TFSPendingRequest request; + + CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ); + + if ( plugin ) + { + // init asynchronous request + request = iRequestHandler->InitAsyncRequestL( GetId().PluginId(), + aOperationObserver ); + + MFSMailRequestObserver* observer = request.iObserver; + + TRAPD( err, plugin->StoreMessagesL( + GetId(), + messages, + *observer, request.iRequestId ) ); + + if( err != KErrNone ) + { + iRequestHandler->CompleteRequest( request.iRequestId ); + User::Leave( err ); + } + } + else + { + User::Leave( KErrNotFound ); + } + + return request.iRequestId; + +} +// + +// ----------------------------------------------------------------------------- +// CFSMailBox::CreateForwardMessage +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessage* CFSMailBox::CreateForwardMessage( TFSMailMsgId aOriginalMessageId, + const TDesC& aHeaderDescriptor ) +{ + FUNC_LOG; + CFSMailMessage* message = NULL; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + TRAPD(err,message = plugin->CreateForwardMessageL( GetId(), + aOriginalMessageId, + aHeaderDescriptor )); + if(err != KErrNone) + { + message = NULL; + } + } + return message; +} + +// +// ----------------------------------------------------------------------------- +// CFSMailBox::CreateForwardMessageL +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailBox::CreateForwardMessageL( const TFSMailMsgId aOriginalMessageId, + MFSMailRequestObserver& aOperationObserver, + const TDesC& aHeaderDescriptor ) + { + TFSPendingRequest request; + + CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ); + + if ( plugin ) + { + // init asynchronous request + request = iRequestHandler->InitAsyncRequestL( GetId().PluginId(), + aOperationObserver ); + + MFSMailRequestObserver* observer = request.iObserver; + + TRAPD( err, plugin->CreateForwardMessageL( + GetId(), aOriginalMessageId, *observer, request.iRequestId, aHeaderDescriptor ) ); + + if( err != KErrNone ) + { + iRequestHandler->CompleteRequest( request.iRequestId ); + User::Leave( err ); + } + } + else + { + User::Leave( KErrNotFound ); + } + + return request.iRequestId; + } +// + +// ----------------------------------------------------------------------------- +// CFSMailBox::CreateReplyMessage +// ----------------------------------------------------------------------------- +EXPORT_C CFSMailMessage* CFSMailBox::CreateReplyMessage( TFSMailMsgId aOriginalMessageId, + TBool aReplyToAll, + const TDesC& aHeaderDescriptor ) +{ + FUNC_LOG; + CFSMailMessage* message = NULL; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + TRAPD(err,message = plugin->CreateReplyMessageL( GetId(), + aOriginalMessageId, + aReplyToAll, + aHeaderDescriptor )); + if(err != KErrNone) + { + message = NULL; + } + } + return message; +} + +// +// ----------------------------------------------------------------------------- +// CFSMailBox::CreateReplyMessageL +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailBox::CreateReplyMessageL( const TFSMailMsgId aOriginalMessageId, + const TBool aReplyToAll, + MFSMailRequestObserver& aOperationObserver, + const TDesC& aHeaderDescriptor ) +{ + TFSPendingRequest request; + + CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ); + + if ( plugin ) + { + // init asynchronous request + request = iRequestHandler->InitAsyncRequestL( GetId().PluginId(), + aOperationObserver ); + + MFSMailRequestObserver* observer = request.iObserver; + + TRAPD( err, plugin->CreateReplyMessageL( + GetId(), aOriginalMessageId, aReplyToAll, *observer, request.iRequestId, aHeaderDescriptor ) ); + + if( err != KErrNone ) + { + iRequestHandler->CompleteRequest( request.iRequestId ); + User::Leave( err ); + } + } + else + { + User::Leave( KErrNotFound ); + } + + return request.iRequestId; +} +// + +// ----------------------------------------------------------------------------- +// CFSMailBox::GetStandardFolderId +// ----------------------------------------------------------------------------- +EXPORT_C TFSMailMsgId CFSMailBox::GetStandardFolderId( TFSFolderType aFolderType ) +{ + FUNC_LOG; + + TFSMailMsgId folderId; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + TRAPD(err, folderId = plugin->GetStandardFolderIdL(GetId(), aFolderType )); + if(err != KErrNone) + { + folderId.SetNullId(); + } + } + return folderId; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::SendMessageL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::SendMessageL( CFSMailMessage& aMessage ) +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + // Not activated yet. + //UpdateMrusL( aMessage.GetToRecipients(), + // aMessage.GetCCRecipients(), + // aMessage.GetBCCRecipients() ); + // + plugin->SendMessageL( aMessage ); + } +} + +// +// ----------------------------------------------------------------------------- +// CFSMailBox::SendMessageL +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailBox::SendMessageL( + CFSMailMessage& aMessage, + MFSMailRequestObserver& aOperationObserver ) + { + FUNC_LOG; + + TFSPendingRequest request; + + CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ); + + if ( plugin ) + { + // Not activated yet. + //UpdateMrusL( aMessage.GetToRecipients(), + // aMessage.GetCCRecipients(), + // aMessage.GetBCCRecipients() ); + // + + // init asynchronous request + request = iRequestHandler->InitAsyncRequestL( GetId().PluginId(), + aOperationObserver ); + + MFSMailRequestObserver* observer = request.iObserver; + + TRAPD( err, plugin->SendMessageL( + aMessage, *observer, request.iRequestId ) ); + + if( err != KErrNone ) + { + iRequestHandler->CompleteRequest( request.iRequestId ); + User::Leave( err ); + } + } + else + { + User::Leave( KErrNotFound ); + } + + return request.iRequestId; + } +// + +// ----------------------------------------------------------------------------- +// CFSMailBox::ListFolders +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::ListFolders( TFSMailMsgId aFolder, + RPointerArray& aFolderList ) +{ + FUNC_LOG; + + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + TRAPD(err, plugin->ListFoldersL(GetId(),aFolder,aFolderList)); + if(err != KErrNone) + { + aFolderList.ResetAndDestroy(); + } + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::ListFolders +// ----------------------------------------------------------------------------- +EXPORT_C RPointerArray& CFSMailBox::ListFolders() +{ + iFolders.ResetAndDestroy(); + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + TRAPD(err,plugin->ListFoldersL(GetId(),iFolders)); + if(err != KErrNone) + { + iFolders.ResetAndDestroy(); + } + } + return iFolders; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::GetBrandingIdL +// ----------------------------------------------------------------------------- +EXPORT_C TDesC& CFSMailBox::GetBrandingIdL() +{ + FUNC_LOG; + return BrandingId(); +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::MoveMessagesL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::MoveMessagesL( const RArray& aMessageIds, + const TFSMailMsgId aSourceFolderId, + const TFSMailMsgId aDestinationFolderId ) +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + plugin->MoveMessagesL(GetId(), aMessageIds, aSourceFolderId, aDestinationFolderId); + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::CopyMessagesL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::CopyMessagesL( const RArray& aMessageIds, + RArray& aNewMessages, + const TFSMailMsgId aSourceFolderId, + const TFSMailMsgId aDestinationFolderId ) +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + plugin->CopyMessagesL(GetId(), aMessageIds, aNewMessages, + aSourceFolderId, aDestinationFolderId ); + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::SearchL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::SearchL( const RPointerArray& /*aSearchStrings*/, + const TFSMailSortCriteria& /*aSortCriteria*/, + MFSMailBoxSearchObserver& /*aSearchObserver*/, + const RArray /*aFolderIds */ ) +{ + FUNC_LOG; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::SearchL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::SearchL( const RPointerArray& aSearchStrings, + const TFSMailSortCriteria& aSortCriteria, + MFSMailBoxSearchObserver& aSearchObserver ) +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + // get mailbox folder list + iFolders.ResetAndDestroy(); + plugin->ListFoldersL(GetId(),iFolders); + + TFSMailMsgId draftsFolderId = GetStandardFolderId( EFSDraftsFolder ); + TFSMailMsgId outboxId = GetStandardFolderId( EFSOutbox ); + + // remove outbox, drafts folder from folder list + RArray folderIds; + folderIds.Reset(); + for(TInt i=0;iGetFolderId(); + if( id != draftsFolderId && id != outboxId ) + { + folderIds.Append(id); + } + } + + // start search + plugin->SearchL( GetId(), folderIds, aSearchStrings, aSortCriteria, aSearchObserver ); + folderIds.Reset(); + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::CancelSearch +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::CancelSearch() +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + plugin->CancelSearch( GetId() ); + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::ClearSearchResultCache +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::ClearSearchResultCache() +{ + FUNC_LOG; + if(CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId())) + { + plugin->ClearSearchResultCache( GetId() ); + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::ListMrusL +// ----------------------------------------------------------------------------- +EXPORT_C MDesCArray* CFSMailBox::ListMrusL() const +{ + FUNC_LOG; + MDesCArray* mruList(0); + if ( CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId() ) ) + { + mruList = plugin->GetMrusL( GetId() ); + } + return mruList; +} + + +// ----------------------------------------------------------------------------- +// CFSMailBox::CurrentSyncState +// ----------------------------------------------------------------------------- +EXPORT_C TSSMailSyncState CFSMailBox::CurrentSyncState() const +{ + FUNC_LOG; + TSSMailSyncState syncState(Idle); + if ( CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ) ) + { + syncState = plugin->CurrentSyncState( GetId() ); + } + return syncState; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::HasCapability +// ----------------------------------------------------------------------------- +EXPORT_C TBool CFSMailBox::HasCapability( const TFSMailBoxCapabilities aCapability ) const +{ + FUNC_LOG; + TBool capability = EFalse; + if ( CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ) ) + { + TRAPD( err,capability = plugin->MailboxHasCapabilityL( aCapability,GetId() )) ; + if ( err != KErrNone ) + { + capability = EFalse; + } + } + return capability; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::GetMailBoxStatus +// ----------------------------------------------------------------------------- +EXPORT_C TFSMailBoxStatus CFSMailBox::GetMailBoxStatus() +{ + FUNC_LOG; + TFSMailBoxStatus status(EFSMailBoxOffline); + if ( CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId() ) ) + { + status = plugin->GetMailBoxStatus( GetId() ); + } + return status; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::SetCredentialsL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::SetCredentialsL( const TDesC& aUsername, const TDesC& aPassword ) +{ + FUNC_LOG; + if ( CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId() ) ) + { + plugin->SetCredentialsL( GetId(), aUsername, aPassword ); + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::RemoveDownLoadedAttachmentsL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailBox::RemoveDownLoadedAttachmentsL() +{ + FUNC_LOG; + + CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ); + if ( plugin ) + { + // get inbox folder from plugin + TFSMailMsgId folderId = GetStandardFolderId( EFSInbox ); + CFSMailFolder* folder = plugin->GetFolderByUidL( GetId(), folderId ); + if ( folder ) + { + folder->RemoveDownLoadedAttachmentsL(); + delete folder; + } + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::GetConnectionId +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailBox::GetConnectionId( TUint32& aConnectionId ) +{ + FUNC_LOG; + TInt rcode = KErrNotSupported; + if ( CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ) ) + { + rcode = plugin->GetConnectionId( GetId(), aConnectionId ); + } + return rcode; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::IsConnectionAllowedWhenRoaming +// ----------------------------------------------------------------------------- +EXPORT_C TInt CFSMailBox::IsConnectionAllowedWhenRoaming( TBool& aConnectionAllowed ) +{ + FUNC_LOG; + TInt rcode = KErrNotSupported; + if ( CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid( GetId() ) ) + { + rcode = plugin->IsConnectionAllowedWhenRoaming( GetId(), aConnectionAllowed ); + } + return rcode; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::UpdateMrusL +// ----------------------------------------------------------------------------- +void CFSMailBox::UpdateMrusL( + const RPointerArray& aRecipients, + const RPointerArray& aCCRecipients, + const RPointerArray& aBCCRecipients ) const +{ + FUNC_LOG; + + // First lets make a copy of the current mru list + // whose content we can later alter as we wish + MDesCArray* currentMruList( NULL ); + + CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetId()); + if ( !plugin ) + { + User::Leave( KErrGeneral ); + } + currentMruList = plugin->GetMrusL( GetId() ); + if ( !currentMruList ) + { + // This should not happen because previous function + // should leave in error cases and if there are no + // entries then the pointer should still be pointing + // to valid array. + User::Leave( KErrGeneral ); + } + + CDesCArraySeg* newMruList( NULL ); + TRAPD( error, newMruList = CopyArrayL( *currentMruList ) ); + + delete currentMruList; + + if ( error != KErrNone ) + { + User::Leave( error ); + } + + CleanupStack::PushL( newMruList ); + + // Now check that all given recipients are found from the + // mru list. + + // Notice that the order here has a meaning. For example + // if the latest used address is appended to the end, then + // the aRecipients' addresses are found from the end because + // they are updated after cc and bcc recipients. + UpdateMruListL( *newMruList, aBCCRecipients ); + UpdateMruListL( *newMruList, aCCRecipients ); + UpdateMruListL( *newMruList, aRecipients ); + + // Finally update the new mru list to the plugin + plugin->SetMrusL( GetId(), newMruList ); + + CleanupStack::PopAndDestroy( newMruList ); +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::CopyArrayL +// ----------------------------------------------------------------------------- +CDesCArraySeg* CFSMailBox::CopyArrayL( MDesCArray& aArrayToBeCopied ) const +{ + FUNC_LOG; + CDesCArraySeg* newArray = new (ELeave) CDesCArraySeg( 10 ); + CleanupStack::PushL( newArray ); + + TInt itemCount( aArrayToBeCopied.MdcaCount() ); + TInt index( 0 ); + while ( index < itemCount ) + { + newArray->AppendL( aArrayToBeCopied.MdcaPoint( index ) ); + ++index; + } + + CleanupStack::Pop( newArray ); + return newArray; +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::UpdateMruListL +// ----------------------------------------------------------------------------- +void CFSMailBox::UpdateMruListL( + CDesCArraySeg& aMruList, + const RPointerArray& aNewRecentlyUsedOnes ) const +{ + FUNC_LOG; + TUint newCount( aNewRecentlyUsedOnes.Count() ); + TUint newIndexer( 0 ); + + while ( newIndexer < newCount ) + { + if ( aNewRecentlyUsedOnes[newIndexer] ) + { + // The address is used as a search string because every + // address does not have a display name + TDesC& searchedAddress( + aNewRecentlyUsedOnes[newIndexer]->GetEmailAddress() ); + TInt position( -1 ); + + TInt found( + FindAddressFromMruList( aMruList, searchedAddress, position ) ); + + if ( found != 0 ) + { + AddAndRemoveExcessMruL( aMruList, + *aNewRecentlyUsedOnes[newIndexer] ); + } + else + { + SetAsMostRecentMruL( aMruList, + position, + *aNewRecentlyUsedOnes[newIndexer] ); + } + } + + ++newIndexer; + } +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::FindAddressFromMruList +// ----------------------------------------------------------------------------- +TInt CFSMailBox::FindAddressFromMruList( CDesCArraySeg& aMruList, + TDesC& searchedAddress, + TInt& aPos ) const +{ + FUNC_LOG; + // CDesCArray::Find() is not used here because there is + // possibility that we have to go through the whole array + // and return the index for one specific match. Find() returns + // only the index of the first match and searching for the rest + // using Find() would cause undesired complexity. + + + const TInt KMruListCount( aMruList.Count() ); + // Start indexing from 1 because the first + // address is on that index if it exists. + TInt mruListIndexer( 1 ); + while( mruListIndexer < KMruListCount ) + { + TPtrC address( aMruList[mruListIndexer] ); + if ( address == searchedAddress ) + { + aPos = mruListIndexer; + return 0; + } + + // We are only interested of the addresses so let's + // check only every other descriptor. + // (the addresses) + mruListIndexer = mruListIndexer + 2; + } + + aPos = aMruList.Count(); + return 1; + } + +// ----------------------------------------------------------------------------- +// CFSMailBox::AddAndRemoveExcessMruL +// ----------------------------------------------------------------------------- +void CFSMailBox::AddAndRemoveExcessMruL( CDesCArraySeg& aMruList, + CFSMailAddress& aToBeAdded ) const +{ + FUNC_LOG; + if ( aMruList.Count() == KMaxMruEntries ) + { + // Remove the oldest entry pair from the beginning + aMruList.Delete( 0, 2 ); + } + // Latest address is always found from the end. + AppendMruItemL( aMruList, aToBeAdded ); +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::SetAsMostRecentMruL +// ----------------------------------------------------------------------------- +void CFSMailBox::SetAsMostRecentMruL( CDesCArraySeg& aMruList, + TInt aPosition, + CFSMailAddress& aMostRecent ) const +{ + FUNC_LOG; + // Position of the address is given so the possible display name is + // in the previous slot. Delete both. + aMruList.Delete( aPosition - 1, 2 ); + // Latest address is always found from the end. + AppendMruItemL( aMruList, aMostRecent ); +} + +// ----------------------------------------------------------------------------- +// CFSMailBox::AppendMruItemL +// ----------------------------------------------------------------------------- +void CFSMailBox::AppendMruItemL( CDesCArraySeg& aMruList, + CFSMailAddress& aToBeAppended ) const +{ + FUNC_LOG; + // In the array, display name is always the first and then comes + // the actual address. + + // avoid setting email address as display name so it won't + // be displayed twice in the list + TDesC* displayName = &aToBeAppended.GetDisplayName(); + TDesC* emailAddress = &aToBeAppended.GetEmailAddress(); + + if( displayName->Length() > 0 && displayName->Compare(*emailAddress) == 0 ) + { + aMruList.AppendL( KNullDesC ); + } + else + { + aMruList.AppendL( *displayName ); + } + + aMruList.AppendL( *emailAddress ); + // +} +