--- /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 <impcmtm.h> // CImap4ClientMtm
+#include <SenduiMtmUids.h>
+#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<TImImap4GetPartialMailInfo> 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