diff -r 000000000000 -r 72b543305e3a email/mail/EditorSrc/cmsgmailrestoreattasop.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/mail/EditorSrc/cmsgmailrestoreattasop.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,271 @@ +/* +* Copyright (c) 2002-2007 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: +* State machine -based operation for restoring message's attachments. +* +*/ + + + +// INCLUDE FILES +#include "cmsgmailrestoreattasop.h" +#include "cmsgmailrestoreattaop.h" +#include "MsgMailEditorDocument.h" +#include "MailLog.h" +#include +#include +#include + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::CMsgMailRestoreAttasOp +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMsgMailRestoreAttasOp::CMsgMailRestoreAttasOp( + CMsgMailEditorDocument& aDocument ) + : CMsgMailBaseOp( aDocument ) + { + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttasOp::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CMsgMailRestoreAttasOp* CMsgMailRestoreAttasOp::NewL( + CMsgMailEditorDocument& aDocument ) + { + CMsgMailRestoreAttasOp* self = + new( ELeave ) CMsgMailRestoreAttasOp( aDocument ); + CleanupStack::PushL( self ); + self->ConstructL(); + + CleanupStack::Pop(self); + return self; + } + +// Destructor +CMsgMailRestoreAttasOp::~CMsgMailRestoreAttasOp() + { + LOG( "CMsgMailRestoreAttasOp::~CMsgMailRestoreAttasOp" ); + Cancel(); + // just to be sure that allocations are freed: + delete iRestoreOneAtta; + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::HandleStateActionL +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttasOp::HandleStateActionL() + { + switch ( iState ) + { + case EInitialize: + { + InitializeL(); + break; + } + case ERestoreAtta: + { + RestoreAttaL(); + break; + } + case EFinalize: + { + Finalize(); + break; + } + default: + { + // should never come here + ASSERT( EFalse ); + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::SetNextState +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttasOp::SetNextState() + { + switch ( iState ) + { + case EIdleState: + { + iState = EInitialize; + break; + } + case EInitialize: + { + if ( iManager->AttachmentCount() > 0 ) + { + iState = ERestoreAtta; + } + else + { + iState = EFinalize; + } + break; + } + case ERestoreAtta: + { + if ( iIndex < iManager->AttachmentCount() ) + { // proceed to next attachment + iState = ERestoreAtta; + } + else + { // all attas handled -> finalize operation + iState = EFinalize; + } + break; + } + case EFinalize: // fall through + default: + { + iState = EIdleState; + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::HandleOperationCancel +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttasOp::HandleOperationCancel() + { + LOG( "CMsgMailRestoreAttasOp::HandleOperationCancel" ); + // deletion cancels possibly running asynchronous task + delete iRestoreOneAtta; + iRestoreOneAtta = NULL; + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::HandleStateActionError +// ----------------------------------------------------------------------------- +// +TBool CMsgMailRestoreAttasOp::HandleStateActionError( TInt aError ) + { + TBool retVal( EFalse ); + LOG( "CMsgMailRestoreAttasOp::HandleStateActionError" ); + if ( iState == ERestoreAtta ) + { // record the problem and return ETrue to indicate that operation + // can be continued + if ( aError == KErrCANoPermission ) + { + iDRMAttaCount++; + // atta was removed and rest of the attachments move in the list, + // so we must adjust index properly + iIndex--; + } + else + { + iInvalidAttaCount++; + } + retVal = ETrue; + } + return retVal; + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::InitializeL +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttasOp::InitializeL() + { + LOG( "CMsgMailRestoreAttasOp::InitializeL" ); + iManager = &( iDocument.GetAttachmentManagerL() ); + iAllAttaCount = iManager->AttachmentCount(); + iDRMAttaCount = 0; + iInvalidAttaCount = 0; + iIndex = 0; // in the beginning we start with index 0 + // hide confirmation note when restoring + iDocument.SetConfirmation( EFalse ); + iDocument.AttachmentModel().Reset(); + CompleteStateAction(); + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::RestoreAttaL +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttasOp::RestoreAttaL() + { + LOG( "CMsgMailRestoreAttasOp::RestoreAttaL" ); + delete iRestoreOneAtta; + iRestoreOneAtta = NULL; + iRestoreOneAtta = CMsgMailRestoreAttaOp::NewL( iIndex, iDocument ); + iRestoreOneAtta->StartOp( iStatus ); // will complete when atta restored + SetActive(); + iIndex++; // increment index by one for each new atta + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::Finalize +// ----------------------------------------------------------------------------- +// +void CMsgMailRestoreAttasOp::Finalize() + { + delete iRestoreOneAtta; + iRestoreOneAtta = NULL; + LOG( "CMsgMailRestoreAttasOp::Finalize" ); + iDocument.SetConfirmation( ETrue ); + // this was updated incorrectly to ETrue in Document's NotifyChanges + iDocument.SetChanged( EFalse ); + CompleteStateAction(); + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::CountAllAttas +// ----------------------------------------------------------------------------- +// +TInt CMsgMailRestoreAttasOp::CountAllAttas() const + { + return iAllAttaCount; + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::CountDRMAttas +// ----------------------------------------------------------------------------- +// +TInt CMsgMailRestoreAttasOp::CountDRMAttas() const + { + return iDRMAttaCount; + } + +// ----------------------------------------------------------------------------- +// CMsgMailRestoreAttasOp::CountInvalidAttas +// ----------------------------------------------------------------------------- +// +TInt CMsgMailRestoreAttasOp::CountInvalidAttas() const + { + return iInvalidAttaCount; + } + +// End Of File