email/pop3andsmtpmtm/popservermtm/src/POPSDELE.CPP
changeset 31 ebfee66fde93
parent 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/popservermtm/src/POPSDELE.CPP	Fri Jun 04 10:25:39 2010 +0100
@@ -0,0 +1,222 @@
+// Copyright (c) 2006-2009 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:
+//
+
+#include <e32std.h>
+#include "PopsDele.h"
+#include "POPS.H"
+#include "POPSOP.H" // CImPop3Dele
+
+#include <msventry.h>
+#include <popsmtm.h>
+#include "POPSMBX.H"
+
+#include "POPS.PAN" // imrc's own panic codes
+
+#include "mobilitytestmtmapi.h"
+
+//  Panic function
+GLREF_C void Panic(TPopsPanic aPanic);
+
+CImPop3Delete::CImPop3Delete(CMsvServerEntry& aRemoteEntry, CImPop3Session* aPop3Session, TMsvId aServiceId)
+	: CMsgActive( KMsgPop3RefreshMailboxPriority ),iRemoteEntry(aRemoteEntry) ,iPopSession(aPop3Session), iServiceId(aServiceId)
+	{
+	__DECLARE_NAME(_S("CImPop3Delete"));
+	}
+
+
+CImPop3Delete* CImPop3Delete::NewL(CMsvServerEntry& aRemoteEntry, const CMsvEntrySelection& aMsvSelection, CImPop3Session* aPop3Session, TMsvId aServiceId)
+	{
+	CImPop3Delete* self = new (ELeave) CImPop3Delete(aRemoteEntry, aPop3Session, aServiceId);
+
+	CleanupStack::PushL(self);
+	self->ConstructL(aMsvSelection);
+	CleanupStack::Pop();
+	return self;
+	}
+
+
+void CImPop3Delete::ConstructL( const CMsvEntrySelection& aMsvSelection)
+	{
+	// make our copy of aMsvSelection
+	iSource = aMsvSelection.CopyL();
+
+	iPopDelete=CImPop3Dele::NewL(iPopSession);
+	CActiveScheduler::Add(this);	  // Add CImPop3Delete to scheduler's queue
+	iCancelToMigrate = EFalse;
+	}
+
+
+CImPop3Delete::~CImPop3Delete()
+	{
+	// delete everything here
+	Cancel();
+	delete iSource;
+	delete iPopDelete;
+	}
+
+//
+// Cancel any current operation
+//
+void CImPop3Delete::DoCancel()
+	{
+	if (!iMigratingToNewBearer)
+		{
+		iPopSession->SetOpNotPending();
+		}
+
+	iPopDelete->Cancel();
+	CMsgActive::DoCancel();
+	}
+	
+//
+// Start me up
+//
+void CImPop3Delete::Start(TRequestStatus& aStatus)
+	{
+	iMsgCtr=0;
+	iProgress.iTotalMsgs=iSource->Count();
+	iProgress.iMsgsToProcess=iProgress.iTotalMsgs;
+
+	if(iSource->Count())
+		{
+		DoDelete();
+		Queue(aStatus);
+		}
+	else
+		{
+		aStatus = KRequestPending;
+		TRequestStatus* pS=&aStatus;
+		User::RequestComplete(pS,KErrNone);
+		}
+	}
+
+// ****************************************************************************************** 
+// Resume function called by the POP Server MTM, once it has completed Migrating to new bearer
+// 
+// ******************************************************************************************	
+void CImPop3Delete::ResumeL(CImPop3Session* aPopSession, TRequestStatus& aStatus)
+	{
+	iMigratingToNewBearer = EFalse;
+	iPopSession = aPopSession;
+
+	delete iPopDelete;
+	iPopDelete = NULL;
+	iPopDelete = CImPop3Dele::NewL(iPopSession);
+
+	if(iSource->Count())
+		{
+		DoDelete();
+		Queue(aStatus);
+		}
+	else
+		{
+		aStatus = KRequestPending;
+		TRequestStatus* pS = &aStatus;
+		User::RequestComplete(pS,KErrNone);
+		}
+	}	
+
+//
+// Result of last active call
+//
+void CImPop3Delete::DoRunL()
+    {
+	//  No really good error handling can occur below.
+	TInt err = iRemoteEntry.DeleteEntry(iSource->At(iMsgCtr));
+	//DMC __ASSERT_DEBUG(err == KErrNone, Panic(EPopFailedDebugAssert));
+	 
+	iMsgCtr++;
+	iProgress.iMsgsToProcess--;
+
+	// Decrement iMtmData3 attribute of the service entry - count of messages on POP3 server
+	// NB our handle to the CMsvServerEntry must always be set to the service entry
+	// prior to call to CImPop3Delete::NewL.
+	TMsvEntry serviceEntry  = iRemoteEntry.Entry();
+	serviceEntry.SetMtmData3(serviceEntry.MtmData3()-1);
+	err = iRemoteEntry.ChangeEntry(serviceEntry);
+
+	if(iMsgCtr<iSource->Count())
+		{
+		// If we are migrating halt the operation here
+		if (iMigratingToNewBearer)
+			{			
+			// If we don't SetActive, the RunL will complete the request
+			return;
+			}
+		else
+			{
+			DoDelete();
+			}
+		}
+	else
+		{
+		iProgress.iMsgsToProcess=0;
+		}
+    }
+
+//
+// Fire off the delete process
+//
+void CImPop3Delete::DoDelete()
+	{
+	TMsvId msgId=iSource->At(iMsgCtr);
+//DMC
+	if (iPopDelete->SetMessage(msgId))
+ 		{
+		iPopDelete->Start(iStatus);
+		// activate ourselves
+		SetActive();
+		MOBILITY_TEST_MTM_STATE(iServiceId, KMobilityTestMtmStatePopDeleting);
+		}
+	else
+		{
+		SetActive();
+		iStatus = KRequestPending;
+		TRequestStatus* pS=&iStatus;
+		User::RequestComplete(pS,KErrNone);
+		}
+	}
+
+//
+// Report the refreshing news back to the UI
+//
+TPop3Progress CImPop3Delete::Progress()
+	{
+	return iProgress;
+	}
+
+// ****************************************************************************************** 
+// This is called by the POP Server MTM when it starts Migrating Bearer
+// 
+// ******************************************************************************************
+void CImPop3Delete::Pause()
+	{
+	// Set the Migration flag
+	iMigratingToNewBearer = ETrue;
+	}
+
+// ****************************************************************************************** 
+// This is called by the POP Server MTM when it starts Migrating Bearer
+// 
+// ******************************************************************************************	
+void CImPop3Delete::CancelAllowResume()
+	{
+	iMigratingToNewBearer = ETrue;
+	
+	// Cancel the deletion of the current message  and decrement counters 
+	// so we can restart from this message onwards when we have migrated.
+	// Use the normal cancel, as we really need to cancel here.
+	Cancel();		
+	}