--- /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 <mmsvattachmentmanager.h>
+#include <MsgAttachmentModel.h>
+#include <caf/caferr.h>
+
+// ============================ 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