diff -r 000000000000 -r 8466d47a6819 ipsservices/ipssosplugin/src/ipsplgimap4plugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ipsservices/ipssosplugin/src/ipsplgimap4plugin.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,811 @@ +/* +* Copyright (c) 2007 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: This file implements class CIpsPlgImap4Plugin. +* +*/ + + + +#include "emailtrace.h" +#include "ipsplgheaders.h" + +const TInt KConnectOpPriority = CActive::EPriorityStandard; + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::CIpsPlgImap4Plugin() +// --------------------------------------------------------------------------- +// +CIpsPlgImap4Plugin::CIpsPlgImap4Plugin() + : CIpsPlgSosBasePlugin( KIpsPlgImap4PluginUidValue ) + { + FUNC_LOG; + // none + } + + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::ConstructL() +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::ConstructL() + { + FUNC_LOG; + BaseConstructL(); + } + + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::NewL() +// --------------------------------------------------------------------------- +// +EXPORT_C CIpsPlgImap4Plugin* CIpsPlgImap4Plugin::NewL() + { + FUNC_LOG; + CIpsPlgImap4Plugin* self = CIpsPlgImap4Plugin::NewLC(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::NewLC() +// --------------------------------------------------------------------------- +// +EXPORT_C CIpsPlgImap4Plugin* CIpsPlgImap4Plugin::NewLC() + { + FUNC_LOG; + CIpsPlgImap4Plugin* self = new( ELeave ) CIpsPlgImap4Plugin; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::~CIpsPlgImap4Plugin() +// --------------------------------------------------------------------------- +// +CIpsPlgImap4Plugin::~CIpsPlgImap4Plugin() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::MailboxHasCapabilityL +// --------------------------------------------------------------------------- +// +TBool CIpsPlgImap4Plugin::MailboxHasCapabilityL( + TFSMailBoxCapabilities aCapability, + TFSMailMsgId /* aMailBoxId */ ) + { + FUNC_LOG; + TBool result( EFalse ); + + switch ( aCapability ) + { + // These should be clear + case EFSMBoxCapaCanBeDeleted: + case EFSMBoxCapaSupportsSaveToDrafts: + case EFSMBoxCapaMeetingRequestRespond: + case EFSMboxCapaSupportsAttahmentsInMR: + case EFSMBoxCapaMeetingRequestCreate: + case EFSMBoxCapaCanUpdateMeetingRequest: + case EFSMBoxCapaMoveToFolder: + case EFSMBoxCapaCopyToFolder: + case EFSMBoxCapaSupportsSync: + case EFSMBoxCapaRemoveFromCalendar: + case EFSMBoxCapaMoveMessageNoConnectNeeded: + { + result = ETrue; + break; + } + // These are positively not supported + case EFSMBoxCapaCreateSubfolder: + case EFSMBoxCapaManipulateUserFolders: + case EFSMBoxCapaMoveMessageToUserFolder: + case EFSMBoxCapaSmartReply: + case EFSMBoxCapaSmartForward: + case EFSMBoxCapaSupportsMRU: + case EFSMBoxCapaSymbianMsgIntegration: + case EFSMBoxCapaNewEmailNotifications: + default: + { + result = EFalse; + break; + } + } + + return result; + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::RefreshNowL( ) +// --------------------------------------------------------------------------- +// +TInt CIpsPlgImap4Plugin::RefreshNowL( ) + { + FUNC_LOG; + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::RefreshNowL() +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::RefreshNowL( + const TFSMailMsgId& aMailBoxId, + MFSMailRequestObserver& aOperationObserver, + TInt aRequestId ) + { + FUNC_LOG; + + TMsvId service = aMailBoxId.Id(); + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL( *this ); + CleanupStack::PushL( watcher ); + + CIpsPlgBaseOperation* op = CIpsPlgImap4ConnectOp::NewL( + *iSession, + KConnectOpPriority, + watcher->iStatus, + service, + ActivityTimerL( aMailBoxId ), + aMailBoxId, + aOperationObserver, + aRequestId, + iEventHandler ); + + watcher->SetOperation( op ); + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + + // send part of refresh + EmptyOutboxL( aMailBoxId ); + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::ListFoldersL() +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::ListFoldersL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + RPointerArray& aFolderList) + { + FUNC_LOG; + DoListFoldersL( aMailBoxId, aFolderId, aFolderList, ETrue ); + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::ListFoldersL() +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::ListFoldersL( + const TFSMailMsgId& aMailBoxId, + RPointerArray& aFolderList) + { + FUNC_LOG; + DoListFoldersL( aMailBoxId, TFSMailMsgId(), aFolderList, EFalse ); + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::GetStandardFolderIdL() +// --------------------------------------------------------------------------- +// +TFSMailMsgId CIpsPlgImap4Plugin::GetStandardFolderIdL( + const TFSMailMsgId& aMailBoxId, + const TFSFolderType aFolderType ) + { + FUNC_LOG; + TFSMailMsgId ret; + + if( aFolderType == EFSInbox ) + { + CMsvEntry* cEntry = iSession->GetEntryL( aMailBoxId.Id() ); + CleanupStack::PushL( cEntry ); + + TInt i( 0 ); + TInt count( cEntry->Count() ); + while ( i < count && ret.IsNullId() ) + { + if ( (*cEntry)[i].iType == KUidMsvFolderEntry && + (*cEntry)[i].iDetails.CompareF( KIpsPlgInbox ) == 0 ) + { + ret.SetId( (*cEntry)[i].Id() ); + } + i++; + } + CleanupStack::PopAndDestroy( cEntry ); + } + else if( aFolderType == EFSOutbox ) + { + ret.SetId( KMsvGlobalOutBoxIndexEntryId ); + } + else if( aFolderType == EFSDraftsFolder ) + { + ret.SetId( KMsvDraftEntryId ); + } + else if( aFolderType == EFSSentFolder ) + { + ret.SetId( KMsvSentEntryId ); + } + else if( aFolderType == EFSDeleted ) + { + ret.SetId( KMsvDeletedEntryFolderEntryId ); + } + else if( aFolderType == EFSOther ) + { + ret.SetId( KMsvUnknownServiceIndexEntryId ); + } + if ( !ret.IsNullId() ) + { + ret.SetPluginId( KIpsPlgImap4PluginUid ); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::FetchMessagesL() +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::FetchMessagesL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + const RArray& aMessageIds, + TFSMailDetails /*aDetails*/, + MFSMailRequestObserver& aObserver, + TInt aRequestId) + { + FUNC_LOG; + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL(*this); + CleanupStack::PushL( watcher ); + + CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(sel); + sel->AppendL( aMailBoxId.Id() ); + + TInt count = aMessageIds.Count(); + + if ( count == 0 ) + { + User::Leave( KErrArgument ); + } + for ( TInt i(0); i < count; i++ ) + { + sel->AppendL( aMessageIds[i].Id() ); + } + + + // fetch body texts only (text/plain, text/html) + TImImap4GetPartialMailInfo info; + info.iMaxEmailSize = KMaxTInt32; + info.iGetMailBodyParts = EGetImap4EmailBodyText; + info.iPartialMailOptions = EBodyTextOnly; + info.iTotalSizeLimit = KMaxTInt32; + info.iBodyTextSizeLimit = KMaxTInt32; + info.iAttachmentSizeLimit = 0; + info.iDestinationFolder = aFolderId.Id(); + + CIpsPlgBaseOperation* op = CIpsPlgImap4PopulateOp::NewL( + *iSession, + watcher->iStatus, + CActive::EPriorityStandard, + aMailBoxId.Id(), + ActivityTimerL( aMailBoxId ), + info, + *sel, + aMailBoxId, + aObserver, + aRequestId, + iEventHandler, + EFalse ); // do not filter mail selection + + watcher->SetOperation( op ); + CleanupStack::PopAndDestroy( sel ); + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::MoveMessagesL( ) +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::MoveMessagesL( + const TFSMailMsgId& aMailBoxId, + const RArray& aMessageIds, + const TFSMailMsgId& aSourceFolderId, + const TFSMailMsgId& aDestinationFolderId ) + { + FUNC_LOG; + if( aDestinationFolderId.Id() == KMsvDraftEntryId ) + { + // Move to Drafts folder + MoveMessagesToDraftL( aMailBoxId, + aMessageIds, + aSourceFolderId, + aDestinationFolderId ); + } + else if( aDestinationFolderId.Id() != aSourceFolderId.Id() ) + { + TMsvId service = aMailBoxId.Id(); + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL(*this); + CleanupStack::PushL( watcher ); + + CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(sel); + sel->AppendL( service ); + + TInt msgIdCount( aMessageIds.Count() ); + for ( TInt i(0); i< msgIdCount; i++ ) + { + sel->AppendL( aMessageIds[i].Id() ); + } + + TPckgBuf optionsBuf; + TImImap4GetMailInfo& options = optionsBuf(); + options.iMaxEmailSize = KMaxTInt32; + options.iGetMailBodyParts = EGetImap4EmailBodyTextAndAttachments; + options.iDestinationFolder = aDestinationFolderId.Id(); + + CIpsPlgImap4MoveRemoteOpObserver* observer = + CIpsPlgImap4MoveRemoteOpObserver::NewL( *iSession, *iEventHandler, + aSourceFolderId, aMessageIds ); + watcher->SetRequestObserver( observer ); + + // Synchronous operation + CIpsPlgBaseOperation* op = CIpsPlgImap4MoveRemoteOp::NewL( + *iSession, + watcher->iStatus, + KIMAP4MTMMoveMailSelectionWhenAlreadyConnected, + service, + ActivityTimerL( aMailBoxId ), + options, + *sel, + aMailBoxId, + *observer, // async not supported + 0 ); // async not supported + + watcher->SetOperation( op ); + CleanupStack::PopAndDestroy( sel ); + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + } + else + { + //do nothing + } + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::MoveMessagesL() +// asynchronic move message function +// --------------------------------------------------------------------------- +// +TInt CIpsPlgImap4Plugin::MoveMessagesL( + const TFSMailMsgId& aMailBoxId, + const RArray& aMessageIds, + const TFSMailMsgId& aSourceFolderId, + const TFSMailMsgId& aDestinationFolderId, + MFSMailRequestObserver& aOperationObserver, + TInt aRequestId ) + { + FUNC_LOG; + TInt ret = KErrNone; + if( aDestinationFolderId.Id() == KMsvDraftEntryId ) + { + // Move to Drafts folder + MoveMessagesToDraftL( aMailBoxId, + aMessageIds, + aSourceFolderId, + aDestinationFolderId ); + TFSProgress progress = { + TFSProgress::EFSStatus_RequestComplete, 0, 0, ret }; + aOperationObserver.RequestResponseL( + progress, aRequestId ); + } + else if( aDestinationFolderId.Id() != aSourceFolderId.Id() ) + { + TMsvId service = aMailBoxId.Id(); + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL(*this); + CleanupStack::PushL( watcher ); + + CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(sel); + sel->AppendL( service ); + + TInt msgIdCount( aMessageIds.Count() ); + for ( TInt i(0); i< msgIdCount; i++ ) + { + sel->AppendL( aMessageIds[i].Id() ); + } + + TPckgBuf optionsBuf; + TImImap4GetMailInfo& options = optionsBuf(); + options.iMaxEmailSize = KMaxTInt32; + options.iGetMailBodyParts = EGetImap4EmailBodyTextAndAttachments; + options.iDestinationFolder = aDestinationFolderId.Id(); + + CIpsPlgBaseOperation* op = CIpsPlgImap4MoveRemoteOp::NewL( + *iSession, + watcher->iStatus, + KIMAP4MTMMoveMailSelectionWhenAlreadyConnected, + service, + ActivityTimerL( aMailBoxId ), + options, + *sel, + aMailBoxId, + aOperationObserver, + aRequestId ); + + watcher->SetOperation( op ); + CleanupStack::PopAndDestroy( sel ); + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + } + else + { + ret = KErrNotSupported; + TFSProgress progress = { + TFSProgress::EFSStatus_RequestComplete, 0, 0, ret }; + aOperationObserver.RequestResponseL( + progress, aRequestId ); + } + return ret; + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::FetchMessagePartsL() +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::FetchMessagePartsL( + const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aFolderId, + const TFSMailMsgId& aMessageId, + const RArray& aMessagePartIds, + MFSMailRequestObserver& aOperationObserver, + const TInt aRequestId, + const TUint /*aPreferredByteCount*/) + { + FUNC_LOG; + + TInt count( aMessagePartIds.Count() ); + if ( 0 == count ) + { + User::Leave( KErrArgument ); + } + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL( *this ); + CleanupStack::PushL( watcher ); + + CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection; + CleanupStack::PushL( sel ); + + TMsvEntry tEntry; + TMsvId service; + + for ( TInt i(0); i < count; i++ ) + { + sel->AppendL( aMessagePartIds[i].Id() ); + + iSession->GetEntry( aMessagePartIds[i].Id(), service, tEntry ); + + if ( tEntry.iType.iUid == KUidMsvEmailHtmlEntryValue || + tEntry.iType.iUid == KUidMsvEmailExternalBodyEntryValue || + tEntry.iType.iUid == KUidMsvEmailRtfEntryValue ) + { + CleanupStack::PopAndDestroy(2);//sel, watcher + + //we need to fetch the whole message in these cases, because + //symbian components ignore these types of parts currently + RArray messages(1); + messages.Append( aMessageId ); + + // not used in function + TFSMailDetails dymmy = EFSMsgDataStructure; + + FetchMessagesL( aMailBoxId, + aFolderId, + messages, + dymmy, + aOperationObserver, + aRequestId ); + + messages.Close(); + + return; + } + + } + + TPckgBuf optionsBuf; + TImImap4GetMailInfo& options = optionsBuf(); + options.iMaxEmailSize = KMaxTInt32; + options.iGetMailBodyParts = EGetImap4EmailAttachments; + options.iDestinationFolder = 0; // not used + + CIpsPlgBaseOperation* op = CIpsPlgImap4FetchAttachmentOp::NewL( + *iSession, watcher->iStatus, KIMAP4MTMPopulate, aMailBoxId.Id(), + ActivityTimerL( aMailBoxId ), options, *sel, aMailBoxId, + aOperationObserver, aRequestId ); + + watcher->SetOperation( op ); + CleanupStack::PopAndDestroy( sel ); + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + } + +// ---------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::PopulateNewMailL( ) +// ---------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::PopulateNewMailL( + const TFSMailMsgId& aMailboxId, TMsvId aNewId, TMsvId /*aParentId*/ ) + { + FUNC_LOG; + if ( aMailboxId.PluginId().iUid != PluginId() ) + { + return; + } + else if ( iSyncStateHandler->GetMailboxIpsState( aMailboxId.Id() ) + == KIpsSosEmailSyncStarted ) + { + return; + } + + + TMsvEntry tEntry; + TMsvId serv; + iSession->GetEntry( aMailboxId.Id(), serv, tEntry ); + if ( !tEntry.Connected() ) + { + return; + } + + CImImap4Settings* settings = new ( ELeave ) CImImap4Settings(); + CleanupStack::PushL( settings ); + CEmailAccounts* accounts = CEmailAccounts::NewLC(); + TImapAccount imapAcc; + accounts->GetImapAccountL( aMailboxId.Id(), imapAcc ); + accounts->LoadImapSettingsL( imapAcc, *settings ); + TImImap4GetPartialMailInfo info; + CIpsSetDataApi::ConstructImapPartialFetchInfo( info, *settings ); + CleanupStack::PopAndDestroy( 2, settings ); + + if ( info.iTotalSizeLimit == KIpsSetDataHeadersOnly ) + { + return; + } + + TPckgBuf package(info); + + CIpsPlgSingleOpWatcher* watcher = CIpsPlgSingleOpWatcher::NewL(*this); + CleanupStack::PushL( watcher ); + + CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(sel); + sel->AppendL( aMailboxId.Id() ); + sel->AppendL( aNewId ); + + CIpsPlgBaseOperation* op = CIpsPlgImap4PopulateOp::NewL( + *iSession, + watcher->iStatus, + KIMAP4MTMPopulateMailSelectionWhenAlreadyConnected, + aMailboxId.Id(), + ActivityTimerL( aMailboxId ), + info, + *sel, + aMailboxId, + *this, + KErrNotFound, + iEventHandler, + EFalse ); // do not block entry changed and created events + + watcher->SetOperation( op ); + CleanupStack::PopAndDestroy( sel ); + iOperations.AppendL( watcher ); + CleanupStack::Pop( watcher ); + + iEventHandler->SetNewPropertyEvent( + aMailboxId.Id(), KIpsSosEmailSyncStarted, KErrNone ); + + } + + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::HandleOpCompletedL() +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::HandleOpCompletedL( + CIpsPlgSingleOpWatcher& /*aOpWatcher*/, + TInt /*aCompletionCode*/ ) + { + FUNC_LOG; + + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::DoListFoldersL( ) +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::DoListFoldersL( + TFSMailMsgId aMailBoxId, + TFSMailMsgId aFolderId, + RPointerArray& aFolderList, + TBool aOnlyDirect ) + + { + FUNC_LOG; + CFSMailFolder* folder( NULL ); + CMsvEntrySelection* folders = new (ELeave) CMsvEntrySelection; + CleanupStack::PushL( folders ); + + if( aFolderId.IsNullId() ) + { + folder = GetFolderByUidL( aMailBoxId, + GetStandardFolderIdL( + aMailBoxId, EFSOutbox ) ); + if( folder ) + { + CleanupStack::PushL( folder ); + aFolderList.Append( folder ); + CleanupStack::Pop( folder ); + } + + folder = GetFolderByUidL( aMailBoxId, + GetStandardFolderIdL( + aMailBoxId, EFSDraftsFolder ) ); + if( folder ) + { + CleanupStack::PushL( folder ); + aFolderList.Append( folder ); + CleanupStack::Pop( folder ); + } + + folder = GetFolderByUidL( aMailBoxId, + GetStandardFolderIdL( + aMailBoxId, EFSSentFolder ) ); + if( folder ) + { + CleanupStack::PushL( folder ); + aFolderList.Append( folder ); + CleanupStack::Pop( folder ); + } + + // List root level (aOnlyDirect==ETrue) or all subfolders of + // given mailbox (aOnlyDirect==EFalse) + HandleFoldersL( aMailBoxId, *folders, aOnlyDirect ); + } + else + { + // Folder id defined, list direct subfolders of given + // folder + HandleFoldersL( aFolderId, *folders, aOnlyDirect ); + } + TInt folderCount( folders->Count() ); + for( TInt i(0); i < folderCount; i++ ) + { + aFolderId.SetId( (*folders).At(i) ); + aFolderId.SetPluginId( KIpsPlgImap4PluginUid ); + + folder = GetFolderByUidL( aMailBoxId, aFolderId ); + + CleanupStack::PushL( folder ); + aFolderList.AppendL( folder ); + CleanupStack::Pop( folder ); + } + CleanupStack::PopAndDestroy( folders ); + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::HandleFoldersL( ) +// --------------------------------------------------------------------------- +// +void CIpsPlgImap4Plugin::HandleFoldersL( + TFSMailMsgId aId, + CMsvEntrySelection& aFolders, + TBool aOnlyDirect ) + { + FUNC_LOG; + if( HasChildFoldersL( aId.Id() ) ) + { + // GetChildrenL is recursive, so we set CMsvEntry once and pass it + // forward instead of creating it several times before the first one + // is deleted. + CMsvEntry* cEntry = iSession->GetEntryL( aId.Id() ); + CleanupStack::PushL( cEntry ); + CMsvEntrySelection* folderEntries = + GetChildrenL( aId.Id(), *cEntry, aOnlyDirect ); + CleanupStack::PopAndDestroy( cEntry ); + CleanupStack::PushL( folderEntries ); + + TInt count = folderEntries->Count(); + for( TInt i(0); i < count; i++ ) + { + aFolders.AppendL( folderEntries->At(i) ); + } + + CleanupStack::PopAndDestroy( folderEntries ); + } + else + { + // Do nothing, only subfolders of given folder will be added to array + } + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::GetChildrenL( ) +// --------------------------------------------------------------------------- +// +CMsvEntrySelection* CIpsPlgImap4Plugin::GetChildrenL( + TMsvId aId, + CMsvEntry& aEntry, + TBool aOnlyDirect ) const + { + FUNC_LOG; + aEntry.SetEntryL( aId ); + CMsvEntrySelection* children = + aEntry.ChildrenWithTypeL( KUidMsvFolderEntry ); + CleanupStack::PushL( children ); + + if( !aOnlyDirect ) + { + TInt count = children->Count(); + for( TInt i = 0; i < count; i++ ) + { + if( HasChildFoldersL( children->At(i) ) ) + { + // Recursive + CMsvEntrySelection* grandChildren = + GetChildrenL( children->At(i), aEntry, aOnlyDirect ); + CleanupStack::PushL( grandChildren ); + + TInt count = grandChildren->Count(); + for( TInt k(0); k < count; k++ ) + { + children->AppendL( grandChildren->At(k) ); + } + CleanupStack::PopAndDestroy( grandChildren ); + } + } + } + CleanupStack::Pop( children ); + return children; + } + +// --------------------------------------------------------------------------- +// CIpsPlgImap4Plugin::HasChildFoldersL( ) +// --------------------------------------------------------------------------- +// +TBool CIpsPlgImap4Plugin::HasChildFoldersL( TMsvId aId ) const + { + FUNC_LOG; + CMsvEntry* cEntry = iSession->GetEntryL( aId ); + CleanupStack::PushL( cEntry ); + TInt index = cEntry->Count()-1; + while ( index >= 0 && (*cEntry)[index].iType != KUidMsvFolderEntry ) + { + index--; + } + CleanupStack::PopAndDestroy( cEntry ); + + return ( index != -1 ); + } + +// End of File +