diff -r 000000000000 -r 72b543305e3a email/imum/Mtms/Src/ImapFolderSyncOperation.cpp --- /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 +#include +#include +#include +#include +#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