diff -r 000000000000 -r 72b543305e3a email/alwaysonlineemailplugin/src/AlwaysOnlineImap4FolderPopulate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/alwaysonlineemailplugin/src/AlwaysOnlineImap4FolderPopulate.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,296 @@ +/* +* Copyright (c) 2004 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: +* Populates imap4 folders using current populate settings. +* +*/ + + +#include // CImap4ClientMtm +#include +#include "AlwaysOnlineEmailPluginLogging.h" +#include "AlwaysOnlineEmailLoggingTools.h" +#include "AlwaysOnlineImap4FolderPopulate.h" + + + +//-------------------------------- +// CAlwaysOnlineImap4Agent() +//-------------------------------- +CAlwaysOnlineImap4FolderPopulate::CAlwaysOnlineImap4FolderPopulate( + CMsvSession& aMsvSession, + CImap4ClientMtm& aImap4ClientMtm, + TMsvId aServiceId, + TMsvId aInboxId, + TImImap4GetPartialMailInfo& aPartialInfo, + TRequestStatus& aObserverRequestStatus ) + : + CMsvOperation( + aMsvSession, + CActive::EPriorityStandard, + aObserverRequestStatus), + iServiceId( aServiceId ), + iPartialInfo( aPartialInfo), + iImap4ClientMtm( aImap4ClientMtm ), + iInboxId( aInboxId ) + { + CActiveScheduler::Add(this); + iMtm = KSenduiMtmImap4Uid; + } + +//-------------------------------- +// NewL +//-------------------------------- +CAlwaysOnlineImap4FolderPopulate* CAlwaysOnlineImap4FolderPopulate::NewL( + CMsvSession& aMsvSession, + CImap4ClientMtm& aImap4ClientMtm, + TMsvId aServiceId, + TMsvId aInboxId, + TImImap4GetPartialMailInfo& aPartialInfo, + const CMsvEntrySelection* aSelection, // folder ids + TRequestStatus& aObserverRequestStatus ) + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::NewL" ); + CAlwaysOnlineImap4FolderPopulate* self=new (ELeave) CAlwaysOnlineImap4FolderPopulate( + aMsvSession, + aImap4ClientMtm, + aServiceId, + aInboxId, + aPartialInfo, + aObserverRequestStatus ); + CleanupStack::PushL(self); + self->ConstructL(aSelection); + CleanupStack::Pop(self); + return self; + } + + +//-------------------------------- +// ConstructL() +//-------------------------------- + +void CAlwaysOnlineImap4FolderPopulate::ConstructL( const CMsvEntrySelection* aSelection) + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::ConstructL" ); + iFolderSelection = aSelection->CopyL(); + + // if selection is empty, following just completes + StartNextFolderPopulateOperation(); + } + + +//-------------------------------- +// ~CAlwaysOnlineImap4Agent() +//-------------------------------- + +CAlwaysOnlineImap4FolderPopulate::~CAlwaysOnlineImap4FolderPopulate() + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::~CAlwaysOnlineImap4FolderPopulate" ); + Cancel(); + delete iOperation; + delete iFolderSelection; + } + +// ---------------------------------------------------- +// CAlwaysOnlineImap4FolderPopulate::StartNextFolderPopulateOperation +// ---------------------------------------------------- +void CAlwaysOnlineImap4FolderPopulate::StartNextFolderPopulateOperation() + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::StartNextFolderPopulateOperation" ); + delete iOperation; + iOperation = NULL; + TInt err = KErrNotFound; // if folder selection is empty, operation is completed with this error + if ( iFolderSelection->Count() ) + { + TRAP(err, DoNewFolderPopulateOperationL()); + // whether error or not, remove the data for this operation + iFolderSelection->Delete(0); + } + // and set active + iStatus=KRequestPending; + SetActive(); + // if error, then complete this pass with the error code + if (err) + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, err); + } + } + +// ---------------------------------------------------- +// CAlwaysOnlineImap4FolderPopulate::DoNewFolderPopulateOperationL +// ---------------------------------------------------- +void CAlwaysOnlineImap4FolderPopulate::DoNewFolderPopulateOperationL() + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::DoNewFolderPopulateOperationL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineImap4FolderPopulate::DoNewFolderPopulateOperationL"); + if ( HasFolderNewMailL( (*iFolderSelection)[0] ) ) + { + // here do folder populate operation + CMsvEntrySelection* selection=new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(selection); + selection->AppendL( iServiceId ); + selection->AppendL( (*iFolderSelection)[0] ); + + TPckg param( iPartialInfo ); + + iOperation = iImap4ClientMtm.InvokeAsyncFunctionL( + KIMAP4MTMPopulateNewMailWhenAlreadyConnected, + *selection, + param, + iStatus); + KAOEMAIL_LOGGER_WRITE_FORMAT("Started populate folder 0x%x", (*selection)[1]); // CSI: 2 # 2 items added above + + CleanupStack::PopAndDestroy( selection ); + } + else + { + // no new mail found, just complete + KAOEMAIL_LOGGER_WRITE_FORMAT("No new mail found if folder 0x%x, just complete", (*iFolderSelection)[0]); + iOperation = CMsvCompletedOperation::NewL( + iMsvSession, + KSenduiMtmImap4Uid, + KNullDesC8, + KMsvLocalServiceIndexEntryId, + iStatus, + KErrCancel); + } + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineImap4FolderPopulate::DoNewFolderPopulateOperationL"); + } + +// ---------------------------------------------------- +// CAlwaysOnlineImap4FolderPopulate::DoCancel +// ---------------------------------------------------- +void CAlwaysOnlineImap4FolderPopulate::DoCancel() + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::DoCancel" ); + if (iOperation) + { + iOperation->Cancel(); + } + TRequestStatus* status = &iObserverRequestStatus; + User::RequestComplete(status, iStatus.Int()); + } + +// ---------------------------------------------------- +// CAlwaysOnlineImap4FolderPopulate::RunL +// ---------------------------------------------------- +void CAlwaysOnlineImap4FolderPopulate::RunL() + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::RunL" ); + KAOEMAIL_LOGGER_WRITE_FORMAT("CAlwaysOnlineImap4FolderPopulate::RunL iStatus %d", iStatus.Int() ); + if (iFolderSelection->Count()==0) + { + // nothing left to process, so complete the observer + TRequestStatus* status = &iObserverRequestStatus; + User::RequestComplete(status, iStatus.Int()); + } + else + { + // start the next pass + StartNextFolderPopulateOperation(); + } + } + +// ---------------------------------------------------- +// CAlwaysOnlineImap4FolderPopulate::ProgressL +// ---------------------------------------------------- +const TDesC8& CAlwaysOnlineImap4FolderPopulate::ProgressL() + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::ProgressL" ); + if (iOperation) + { + return iOperation->ProgressL(); + } + return KNullDesC8(); + } + +// ---------------------------------------------------- +// CAlwaysOnlineImap4FolderPopulate::SelectInbox +// ---------------------------------------------------- +void CAlwaysOnlineImap4FolderPopulate::SelectInbox() + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::SelectInbox" ); + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineImap4FolderPopulate::SelectInbox"); + delete iOperation; + iOperation = NULL; + TRAPD(err, DoSelectInboxL()); + // and set active + iStatus=KRequestPending; + SetActive(); + // if error, then complete this pass with the error code + if (err) + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, err); + } + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineImap4FolderPopulate::SelectInbox"); + } + +// ---------------------------------------------------- +// CAlwaysOnlineImap4FolderPopulate::DoSelectInboxL +// ---------------------------------------------------- +void CAlwaysOnlineImap4FolderPopulate::DoSelectInboxL() + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::DoSelectInboxL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineImap4FolderPopulate::DoSelectInboxL"); + // here do folder populate operation + CMsvEntrySelection* selection=new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(selection); + selection->AppendL( iInboxId ); + + TBuf8<1> dummyParams; + dummyParams.Zero(); + + iOperation = iImap4ClientMtm.InvokeAsyncFunctionL( + //KIMAP4MTMPopulateAllMailWhenAlreadyConnected, + KIMAP4MTMInboxNewSync, + //KIMAP4MTMSelect, + *selection, + dummyParams, + iStatus); + KAOEMAIL_LOGGER_WRITE_FORMAT("Started inbox select 0x%x", iInboxId); + + iInboxId = -1; + + CleanupStack::PopAndDestroy( selection ); + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineImap4FolderPopulate::DoSelectInboxL"); + } + +// ---------------------------------------------------- +// CAlwaysOnlineImap4FolderPopulate::HasFolderNewMailL +// ---------------------------------------------------- +TBool CAlwaysOnlineImap4FolderPopulate::HasFolderNewMailL( TMsvId aFolderId ) + { + AOLOG_IN( "CAlwaysOnlineImap4FolderPopulate::HasFolderNewMailL" ); + KAOEMAIL_LOGGER_FN1("CAlwaysOnlineImap4FolderPopulate::HasFolderNewMailL"); + TInt count = 0; // number of NEW mails in this folder + CMsvEntry* folderEntry = iMsvSession.GetEntryL( aFolderId ); + CleanupStack::PushL( folderEntry ); + const TInt entryCount = folderEntry->Count(); + TInt i=0; + for (i=0; i < entryCount && count == 0 ; i++) + { + if ( (*folderEntry)[i].New() ) + { + count++; + } + } + CleanupStack::PopAndDestroy( folderEntry ); + KAOEMAIL_LOGGER_WRITE_FORMAT("New mail count %d", count); + KAOEMAIL_LOGGER_FN2("CAlwaysOnlineImap4FolderPopulate::HasFolderNewMailL"); + return (count>0); + } + +//EOF