diff -r 000000000000 -r 8466d47a6819 ipsservices/ipssosplugin/src/ipsplgpop3fetchoperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ipsservices/ipssosplugin/src/ipsplgpop3fetchoperation.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,381 @@ +/* +* Copyright (c) 2007-2008 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: POP3 fetch message operation class +* +*/ + + +#include "emailtrace.h" +#include "ipsplgheaders.h" + +// Constants and defines +const TInt KFetchOpPriority = CActive::EPriorityStandard; + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +CIpsPlgPop3FetchOperation* CIpsPlgPop3FetchOperation::NewL( + CMsvSession& aMsvSession, + TRequestStatus& aObserverRequestStatus, + TInt aFunctionId, + TMsvId aService, + CIpsPlgTimerOperation& aActivityTimer, + const TImPop3GetMailInfo& aGetMailInfo, + const CMsvEntrySelection& aSel, + TFSMailMsgId aFSMailBoxId, + MFSMailRequestObserver& aFSOperationObserver, + TInt aFSRequestId, + CIpsPlgEventHandler* aEventHandler ) + { + FUNC_LOG; + CIpsPlgPop3FetchOperation* op = new(ELeave) CIpsPlgPop3FetchOperation( + aMsvSession, aObserverRequestStatus, aFunctionId, aService, + aActivityTimer, aGetMailInfo, aFSMailBoxId, aFSOperationObserver, + aFSRequestId, aEventHandler ); + + CleanupStack::PushL(op); + op->ConstructL(aSel); + CleanupStack::Pop( op ); + return op; + } + +// ---------------------------------------------------------------------------- +// ~CIpsPlgPop3FetchOperation +// ---------------------------------------------------------------------------- +CIpsPlgPop3FetchOperation::~CIpsPlgPop3FetchOperation() + { + FUNC_LOG; + delete iFetchErrorProgress; + delete iSelection; + + delete iEntry; + } + +// ---------------------------------------------------------------------------- +// ProgressL +// ---------------------------------------------------------------------------- +const TDesC8& CIpsPlgPop3FetchOperation::ProgressL() + { + FUNC_LOG; + + if(iFetchErrorProgress && (iState == EStateIdle)) + { + // Completed, but with an error during fetch. + return *iFetchErrorProgress; + } + else + { + TPop3Progress progg; + progg.iErrorCode = KErrNone; + TPckgBuf param(progg); + iProgressBuf.Copy(param); + return iProgressBuf; + } + } + +// ---------------------------------------------------------------------------- +// ConstructL +// ---------------------------------------------------------------------------- +void CIpsPlgPop3FetchOperation::ConstructL(const CMsvEntrySelection& aSel) + { + FUNC_LOG; + + BaseConstructL( KUidMsgTypePOP3 ); + + iSelection = aSel.CopyL(); + + iSelection->InsertL( 0, iService ); + // For Get Mail API, first selection element must be service. + + // It is possible that the complete flag is on and we want to + // download the attachment. In these cases we need to clear the + // complete flag. + + TInt count = iSelection->Count(); + + for ( ; iEntryIndex < count && !iOperation; iEntryIndex++ ) + { + delete iEntry; + iEntry = NULL; + + iEntry = iMsvSession.GetEntryL( iSelection->At( iEntryIndex ) ); + + TMsvEntry entry = iEntry->Entry(); + + TBool complete = entry.Complete(); + + if ( complete ) + { + entry.SetComplete( EFalse ); + + iOperation = iEntry->ChangeL( entry, iStatus ); + + SetActive(); + + iState = EStateClearCompleteFlag; + } + } + + if ( !iOperation ) + { + DoConnectL(); + } + } + +// ---------------------------------------------------------------------------- +// DoConnectL +// ---------------------------------------------------------------------------- +void CIpsPlgPop3FetchOperation::DoConnectL() + { + FUNC_LOG; + + + iState = EStateConnecting; + iStatus = KRequestPending; + + // when connecting for the fetch operation, don't let connect operation to do fetch, + // because we do it by ourself. That's why give 0 to connect operation. + CIpsPlgPop3ConnectOp* connOp = CIpsPlgPop3ConnectOp::NewL( + iMsvSession, iStatus, iService, EFalse, *iActivityTimer, + iFSMailboxId, iFSOperationObserver, iFSRequestId, NULL,EFalse ); + + delete iOperation; + iOperation = connOp; + + SetActive(); + } + +// ---------------------------------------------------------------------------- +// DoFetchL +// ---------------------------------------------------------------------------- +void CIpsPlgPop3FetchOperation::DoFetchL() + { + FUNC_LOG; + + iState = EStateFetching; + + // Switch operations. + delete iOperation; + iOperation = NULL; + iStatus = KRequestPending; + + // Filters are not used when performing 'fetch' operation, use normal + // getmail info instead + TPckg param( iGetMailInfo ); + InvokeClientMtmAsyncFunctionL( iFunctionId, *iSelection, iService, param ); + SetActive(); + + if ( iEventHandler ) + { + iEventHandler->SetNewPropertyEvent( + iService, KIpsSosEmailSyncStarted, KErrNone ); + } + + } + + + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +CIpsPlgPop3FetchOperation::CIpsPlgPop3FetchOperation( + CMsvSession& aMsvSession, + TRequestStatus& aObserverRequestStatus, + TInt aFunctionId, + TMsvId aService, + CIpsPlgTimerOperation& aActivityTimer, + const TImPop3GetMailInfo& aGetMailInfo, + TFSMailMsgId aFSMailBoxId, + MFSMailRequestObserver& aFSOperationObserver, + TInt aFSRequestId, + CIpsPlgEventHandler* aEventHandler ) + : + CIpsPlgOnlineOperation( aMsvSession, KFetchOpPriority, + aObserverRequestStatus, aActivityTimer, aFSMailBoxId, + aFSOperationObserver, aFSRequestId), iFunctionId( aFunctionId ), + iGetMailInfo( aGetMailInfo ), iEventHandler( aEventHandler ) + { + FUNC_LOG; + iService = aService; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgPop3FetchOperation::RunL() + { + FUNC_LOG; + + TRAP( iError, DoRunL() ); + + if(iError != KErrNone) + { + // Notify observer we have finished. + CompleteObserver(); + } + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgPop3FetchOperation::DoCancel() + { + FUNC_LOG; + + CIpsPlgOnlineOperation::DoCancel(); + if(iState == EStateFetching) + { + // Cancelled while fetching. Need to disconnect. + iMsvSession.StopService( iService ); + // Ignore return value, nothing we can do. + } + if ( iEventHandler ) + { + iEventHandler->SetNewPropertyEvent( + iService, KIpsSosEmailSyncCompleted, KErrCancel ); + } + } + +// ---------------------------------------------------------------------------- +// DoRunL +// ---------------------------------------------------------------------------- +void CIpsPlgPop3FetchOperation::DoRunL() + { + FUNC_LOG; + + switch(iState) + { + case EStateClearCompleteFlag: + { + // First clean things + delete iOperation; + iOperation = NULL; + + delete iEntry; + iEntry = NULL; + + // Leave if setting the complete flag was a failure. + User::LeaveIfError( iStatus.Int() ); + + TInt count = iSelection->Count(); + + for ( ; iEntryIndex < count && !iOperation; iEntryIndex++ ) + { + delete iEntry; + iEntry = NULL; + + iEntry = iMsvSession.GetEntryL( + iSelection->At( iEntryIndex ) ); + + TMsvEntry entry = iEntry->Entry(); + + TBool complete = entry.Complete(); + + if ( complete ) + { + entry.SetComplete( EFalse ); + + iOperation = iEntry->ChangeL( entry, iStatus ); + + SetActive(); + } + } + + if ( !iOperation ) + { + DoConnectL(); + } + + break; + } + case EStateConnecting: + { + // Connect complete. + TBool connected = + STATIC_CAST( CIpsPlgPop3ConnectOp*, iOperation )->Connected(); + if(!connected) + { + CompleteObserver( KErrCouldNotConnect ); + return; + } + DoFetchL(); + } + break; + case EStateFetching: + { + TInt err = iStatus.Int(); + + if( KErrNone != err ) + { + TPckgBuf paramPack; + if ( iOperation ) + { + paramPack.Copy( iOperation->ProgressL() ); + } + TPop3Progress& progress = paramPack(); + progress.iErrorCode = err; + iFetchErrorProgress = paramPack.AllocL(); + } + + iState = EStateIdle; + CompleteObserver( err ); + if ( iEventHandler ) + { + iEventHandler->SetNewPropertyEvent( + iService, KIpsSosEmailSyncCompleted, err ); + } + } + break; + + default: + break; + } + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +const TDesC8& CIpsPlgPop3FetchOperation::GetErrorProgressL( TInt /* aError */ ) + { + FUNC_LOG; + + return *iFetchErrorProgress; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +TFSProgress CIpsPlgPop3FetchOperation::GetFSProgressL() const + { + FUNC_LOG; + // might not never called, but gives something reasonable if called + TFSProgress result = { TFSProgress::EFSStatus_Waiting, 0, 0, KErrNone }; + result.iError = KErrNone; + switch( iState ) + { + case EStateConnecting: + result.iProgressStatus = TFSProgress::EFSStatus_Connecting; + break; + case EStateFetching: + result.iProgressStatus = TFSProgress::EFSStatus_Connected; + break; + default: + result.iProgressStatus = TFSProgress::EFSStatus_RequestComplete; + break; + } + if ( iStatus.Int() == KErrCancel ) + { + result.iProgressStatus = TFSProgress::EFSStatus_RequestCancelled; + result.iError = KErrCancel; + } + + return result; + } + +// EOF +