email/imum/Mtms/Src/ImapFolderSyncOperation.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Mtms/Src/ImapFolderSyncOperation.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,252 @@
+/*
+* Copyright (c) 2006 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:  ImapFolderSyncOperation.cpp
+*
+*
+*/
+
+#include <MuiuOperationWait.h>
+#include <mtmuibas.h>
+#include <imapcmds.h>
+#include <msvuids.h>
+#include <imapset.h>
+#include "ImapFolderSyncOperation.h"
+#include "EmailUtils.H"
+#include "ImumMtmLogging.h"
+
+// ----------------------------------------------------------------------------
+// CImapFolderSyncOperation::NewL
+// ----------------------------------------------------------------------------
+CImapFolderSyncOperation* CImapFolderSyncOperation::NewL( CImumInternalApi& aMailboxApi, TRequestStatus& aStatus, TMsvId aMailbox, CBaseMtmUi& aMtmUi )
+    {
+    IMUM_STATIC_CONTEXT( CImapFolderSyncOperation::NewL, 0, mtm, KImumMtmLog );
+    IMUM_IN();
+
+    CImapFolderSyncOperation* self = new( ELeave ) CImapFolderSyncOperation( aMailboxApi, CActive::EPriorityIdle, aStatus, aMtmUi );
+    CleanupStack::PushL( self );
+    self->ConstructL( aMailbox );
+    CleanupStack::Pop( self );
+    IMUM_OUT();
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CImapFolderSyncOperation::CImapFolderSyncOperation
+// ----------------------------------------------------------------------------
+CImapFolderSyncOperation::CImapFolderSyncOperation(CImumInternalApi& aMailboxApi, TInt aPriority, TRequestStatus& aObserverRequestStatus, CBaseMtmUi& aMtmUi)
+: CMsvOperation(aMailboxApi.MsvSession(), aPriority, aObserverRequestStatus),
+iMtmUi( aMtmUi ),
+iMailboxApi( aMailboxApi )
+    {
+    IMUM_CONTEXT( CImapFolderSyncOperation::CImapFolderSyncOperation, 0, KImumMtmLog );
+    IMUM_IN();
+    IMUM_OUT();
+
+    }
+
+
+// ----------------------------------------------------------------------------
+// CImapFolderSyncOperation::~CImapFolderSyncOperation()
+// ----------------------------------------------------------------------------
+CImapFolderSyncOperation::~CImapFolderSyncOperation()
+    {
+    IMUM_CONTEXT( CImapFolderSyncOperation::~CImapFolderSyncOperation, 0, KImumMtmLog );
+    IMUM_IN();
+
+    iTimer.Close();
+    delete iOperation;
+    IMUM_OUT();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CImapFolderSyncOperation::ConstructL()
+// ----------------------------------------------------------------------------
+void CImapFolderSyncOperation::ConstructL( TMsvId aMailbox )
+    {
+    IMUM_CONTEXT( CImapFolderSyncOperation::ConstructL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    iMailboxId = aMailbox;
+
+    //get syncRate from imap4 settings. We use that for folder updates
+    /*CImumMboxData* accountSettings = CImumMboxData::NewLC();
+    accountSettings->iImap4Settings = new(ELeave) CImImap4Settings;
+    CMsvEntry* cEntry = iSession.GetEntryL( iMailboxId );
+    CleanupStack::PushL( cEntry );
+    MsvEmailMtmUiUtils::RestoreSettingsL( *cEntry, *( accountSettings->iImap4Settings ) );
+    iInterval = ( accountSettings->iImap4Settings->SyncRate() / KImumSecondsInMinute );//syncRate is in seconds
+    CleanupStack::PopAndDestroy(2);//cEntry, accountSettings
+
+    User::LeaveIfError( iTimer.CreateLocal() );*/
+    CActiveScheduler::Add(this);
+    IMUM_OUT();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CImapFolderSyncOperation::ProgressL
+// ----------------------------------------------------------------------------
+const TDesC8& CImapFolderSyncOperation::ProgressL()
+    {
+    IMUM_CONTEXT( CImapFolderSyncOperation::ProgressL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    IMUM_OUT();
+    return iProgress;
+    }
+
+// ----------------------------------------------------------------------------
+// CImapFolderSyncOperation::SetInterval
+// ----------------------------------------------------------------------------
+void CImapFolderSyncOperation::SetInterval()
+    {
+    IMUM_CONTEXT( CImapFolderSyncOperation::SetInterval, 0, KImumMtmLog );
+    IMUM_IN();
+
+    TTime home;
+    home.HomeTime();
+    home+=iInterval;
+
+    iTimer.Cancel();
+    iTimer.At(iStatus, home);
+    iStatus = KRequestPending;
+    SetActive();
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImapFolderSyncOperation::DoCancel
+// ----------------------------------------------------------------------------
+void CImapFolderSyncOperation::DoCancel()
+    {
+    IMUM_CONTEXT( CImapFolderSyncOperation::DoCancel, 0, KImumMtmLog );
+    IMUM_IN();
+
+    iTimer.Cancel();
+    TRequestStatus* status = &iObserverRequestStatus;
+    User::RequestComplete( status, KErrCancel );
+    IMUM_OUT();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CImapFolderSyncOperation::RunL
+// ----------------------------------------------------------------------------
+void CImapFolderSyncOperation::RunL()
+    {
+    IMUM_CONTEXT( CImapFolderSyncOperation::RunL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    if ( iOperation )
+        {
+        // operation completed, start new timer
+        delete iOperation;
+        iOperation = NULL;
+        SetInterval();
+        }
+    else
+        {
+        TBool operationStarted = EFalse;
+        // timer completed, start folder sync operation
+        TMsvEntry tEntry;
+        TMsvId service;
+        if ( iMailboxApi.MsvSession().GetEntry( iMailboxId, service, tEntry ) == KErrNone )
+            {
+            if ( iMailboxApi.MsvSession().ServiceActive( iMailboxId ) )
+                {
+                // mailbox is doing something else, wait...
+                SetInterval();
+                return;
+                }
+            //do sync only if connected.
+            if( tEntry.Connected() && HasSubscribedFoldersL() )
+                {
+                TBuf8<1> dummyParam;
+
+                CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection;
+                CleanupStack::PushL( sel );
+                sel->AppendL( iMailboxId );
+
+                //fullsync used to sync folders. Less code and less traffic than
+                //if we would sync each folder separately
+                iOperation = iMtmUi.InvokeAsyncFunctionL(
+                    KIMAP4MTMFullSync,
+                    *sel,
+                    iStatus,
+                    dummyParam);
+
+                CleanupStack::PopAndDestroy( sel );
+                iStatus = KRequestPending;
+                SetActive();
+                operationStarted = ETrue;
+                }
+            }
+        if ( !operationStarted )
+            {
+            // something wrong, complete observer
+            TRequestStatus* status = &iObserverRequestStatus;
+            User::RequestComplete(status, KErrNone);
+            }
+        }
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImapFolderSyncOperation::HasSubscribedFoldersL
+// ----------------------------------------------------------------------------
+TBool CImapFolderSyncOperation::HasSubscribedFoldersL()
+    {
+    IMUM_CONTEXT( CImapFolderSyncOperation::HasSubscribedFoldersL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    TInt count = 0;
+    CountSubscribedFoldersL( iMailboxId, count );
+    IMUM_OUT();
+    return count > 1; // return ETrue if more than inbox is subscribed
+    }
+
+// ----------------------------------------------------
+// CAlwaysOnlineImap4Agent::AddSubscribedFoldersL()
+// NOTE: This is recursive!
+// ----------------------------------------------------
+void CImapFolderSyncOperation::CountSubscribedFoldersL(
+    TMsvId aFolderId, TInt& aCount )
+    {
+    IMUM_CONTEXT( CImapFolderSyncOperation::CountSubscribedFoldersL, 0, KImumMtmLog );
+    IMUM_IN();
+
+    CMsvEntry* entry = iMailboxApi.MsvSession().GetEntryL( aFolderId );
+    CleanupStack::PushL( entry );
+
+    const TInt count = entry->Count();
+    for ( TInt loop = 0; loop < count; loop++ )
+        {
+        TMsvEmailEntry mailEntry = (*entry)[loop];
+        if ( mailEntry.iType.iUid == KUidMsvFolderEntryValue )
+            {
+            if ( mailEntry.LocalSubscription() )
+                {
+                aCount++;
+                }
+            CountSubscribedFoldersL( mailEntry.Id(), aCount );
+            }
+        }
+
+    CleanupStack::PopAndDestroy(); // entry
+
+    IMUM_OUT();
+    }
+
+// End of File