diff -r 000000000000 -r 8466d47a6819 ipsservices/ipssosplugin/src/ipsplgimap4fetchattachmentop.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ipsservices/ipssosplugin/src/ipsplgimap4fetchattachmentop.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,410 @@ +/* +* 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: +* IpsPlgImap4FetchAttachmentOp implementation file +* +*/ + + +#include "emailtrace.h" +#include "ipsplgheaders.h" + +// Constants and defines +const TInt KFetchOpPriority = CActive::EPriorityStandard; +const TInt KIpsAttaFetchProgressReportInterval = 1000000; // 1 sec + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +CIpsFetchProgReport* CIpsFetchProgReport::NewL( + CIpsPlgImap4FetchAttachmentOp& aAttaOp ) + { + FUNC_LOG; + CIpsFetchProgReport* self = new (ELeave) CIpsFetchProgReport( aAttaOp ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +CIpsFetchProgReport::CIpsFetchProgReport( + CIpsPlgImap4FetchAttachmentOp& aAttaOp ) : + CActive( CActive::EPriorityStandard ), + iAttaOp(aAttaOp) + { + FUNC_LOG; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +CIpsFetchProgReport::~CIpsFetchProgReport() + { + FUNC_LOG; + Cancel(); + iTimer.Close(); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsFetchProgReport::ConstructL() + { + FUNC_LOG; + CActiveScheduler::Add(this); + User::LeaveIfError( iTimer.CreateLocal() ); + AdjustTimer(); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsFetchProgReport::AdjustTimer() + { + FUNC_LOG; + TTimeIntervalMicroSeconds32 sec( KIpsAttaFetchProgressReportInterval ); + TTime time; + time.HomeTime(); + time = time + sec; + iTimer.At(iStatus, time); + SetActive(); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsFetchProgReport::DoCancel() + { + FUNC_LOG; + iTimer.Cancel(); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsFetchProgReport::RunL() + { + FUNC_LOG; + iAttaOp.ReportProgressL(); + AdjustTimer(); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +CIpsPlgImap4FetchAttachmentOp* CIpsPlgImap4FetchAttachmentOp::NewL( + CMsvSession& aMsvSession, + TRequestStatus& aObserverRequestStatus, + TInt aFunctionId, + TMsvId aService, + CIpsPlgTimerOperation& aActivityTimer, + const TImImap4GetMailInfo& aGetMailInfo, + const CMsvEntrySelection& aSel, + TFSMailMsgId aFSMailBoxId, + MFSMailRequestObserver& aFSOperationObserver, + TInt aFSRequestId ) + { + FUNC_LOG; + CIpsPlgImap4FetchAttachmentOp* op = new ( + ELeave) CIpsPlgImap4FetchAttachmentOp( + aMsvSession, + aObserverRequestStatus, + aFunctionId, + aService, + aActivityTimer, + aGetMailInfo, + aFSMailBoxId, + aFSOperationObserver, + aFSRequestId ); + + CleanupStack::PushL( op ); + op->ConstructL( aSel ); + CleanupStack::Pop( op ); + return op; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +CIpsPlgImap4FetchAttachmentOp::CIpsPlgImap4FetchAttachmentOp( + CMsvSession& aMsvSession, + TRequestStatus& aObserverRequestStatus, + TInt aFunctionId, + TMsvId aService, + CIpsPlgTimerOperation& aActivityTimer, + const TImImap4GetMailInfo& aGetMailInfo, + TFSMailMsgId aFSMailBoxId, + MFSMailRequestObserver& aFSOperationObserver, + TInt aFSRequestId ) + : + CIpsPlgOnlineOperation( + aMsvSession, + KFetchOpPriority, + aObserverRequestStatus, + aActivityTimer, + aFSMailBoxId, + aFSOperationObserver, + aFSRequestId), + iSelection( NULL ), + iGetMailInfo(aGetMailInfo), + iFunctionId(aFunctionId) + { + FUNC_LOG; + iService = aService; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +CIpsPlgImap4FetchAttachmentOp::~CIpsPlgImap4FetchAttachmentOp() + { + FUNC_LOG; + delete iSelection; + delete iProgReport; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgImap4FetchAttachmentOp::ConstructL( const CMsvEntrySelection& aSel ) + { + FUNC_LOG; + BaseConstructL( KUidMsgTypeIMAP4 ); + iSelection = aSel.CopyL(); + DoConnectL(); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgImap4FetchAttachmentOp::DoConnectL() + { + FUNC_LOG; + iState = EStateConnecting; + iStatus = KRequestPending; + + CIpsPlgImap4ConnectOp* connOp = CIpsPlgImap4ConnectOp::NewL( + iMsvSession, + KFetchOpPriority, + iStatus, + iService, + *iActivityTimer, + iFSMailboxId, + iFSOperationObserver, + iFSRequestId, + NULL, // event handler not needed whin plain connect + ETrue, + EFalse ); + + delete iOperation; + iOperation = connOp; + + SetActive(); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgImap4FetchAttachmentOp::RunL() + { + FUNC_LOG; + TRAPD(err, DoRunL()); + if(err != KErrNone) + { + iProgress().iGenericProgress.iErrorCode = err; + Complete(); + } + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgImap4FetchAttachmentOp::DoRunL() + { + FUNC_LOG; + switch( iState ) + { + case EStateConnecting: + { + TBool connected = STATIC_CAST( + CIpsPlgImap4ConnectOp*, iOperation)->Connected(); + if(!connected) + { + CompleteObserver( KErrCouldNotConnect ); + return; + } + DoFetchAttachmentL(); + break; + } + case EStateFetching: + { + delete iProgReport; + iProgReport = NULL; + + TInt err = iStatus.Int(); + + if( err != KErrNone && iOperation ) + { + iFetchErrorProgress = iOperation->ProgressL().AllocL(); + } + + iState = EStateIdle; + CompleteObserver( err ); + break; + } + default: + break; + } + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +const TDesC8& CIpsPlgImap4FetchAttachmentOp::ProgressL() + { + FUNC_LOG; + if(iFetchErrorProgress && (iState == EStateIdle)) + { + // Completed, but with an error during fetch. + return *iFetchErrorProgress; + } + + if ( iOperation ) + { + iProgress.Copy( iOperation->ProgressL() ); + } + else + { + TImap4CompoundProgress progg; + progg.iGenericProgress.iErrorCode = KErrNone; + progg.iGenericProgress.iState = TImap4GenericProgress::EIdle; + iProgress.Copy( TPckgBuf(progg) ); + } + + return iProgress; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgImap4FetchAttachmentOp::ReportProgressL() + { + FUNC_LOG; + TInt error = KErrNone; + TFSProgress fsProgress = { TFSProgress::EFSStatus_Waiting, 0, 0, KErrNone }; + if ( iOperation && iState == EStateFetching ) + { + TRAP(error, iProgress.Copy( iOperation->ProgressL() ) ); + } + + if ( error == KErrNone ) + { + const TImap4GenericProgress& progg = iProgress().iGenericProgress; + fsProgress.iProgressStatus = TFSProgress::EFSStatus_Status; + fsProgress.iMaxCount = progg.iBytesToDo; + fsProgress.iCounter = progg.iBytesDone; + fsProgress.iError = progg.iErrorCode; + } + else if ( error == KErrNotReady ) + { + // This error indicates that operation not started yet + // and waiting to other operation compleion + fsProgress.iProgressStatus = TFSProgress::EFSStatus_Waiting; + fsProgress.iMaxCount = 1; + fsProgress.iCounter = 0; + fsProgress.iError = KErrNone; + } + else + { + User::Leave( error ); + } + + iFSOperationObserver.RequestResponseL( fsProgress, iFSRequestId ); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +const TDesC8& CIpsPlgImap4FetchAttachmentOp::GetErrorProgressL(TInt /*aError*/ ) + { + return *iFetchErrorProgress; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +TFSProgress CIpsPlgImap4FetchAttachmentOp::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; + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgImap4FetchAttachmentOp::Complete() + { + FUNC_LOG; + TRequestStatus* observer=&iObserverRequestStatus; + User::RequestComplete(observer, KErrNone); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +void CIpsPlgImap4FetchAttachmentOp::DoFetchAttachmentL( ) + { + FUNC_LOG; + iState = EStateFetching; + + // Switch operations. + delete iOperation; + iOperation = NULL; + iStatus = KRequestPending; + + iProgReport = CIpsFetchProgReport::NewL( *this ); + + // Filters are not used when performing 'fetch' operation, + // use normal getmail info instead + TPckg param(iGetMailInfo); + InvokeClientMtmAsyncFunctionL( iFunctionId, *iSelection, iService, param ); + SetActive(); + } + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +TInt CIpsPlgImap4FetchAttachmentOp::GetEngineProgress( const TDesC8& aProgress ) + { + FUNC_LOG; + if( !aProgress.Length() ) + { + return KErrNone; + } + else + { + TPckgBuf paramPack; + paramPack.Copy( aProgress ); + const TImap4GenericProgress& progress = paramPack().iGenericProgress; + + return progress.iErrorCode; + } + } + + +// End of File +