--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgsrvnstore/server/src/MENTACT.CPP Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,98 @@
+// Copyright (c) 1998-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 "MENTACT.H"
+#include "MSVPANIC.H"
+
+
+//
+// CMsgActive framework
+//
+
+
+EXPORT_C CMsgActive::CMsgActive(TInt aPriority)
+ :CActive(aPriority)
+ {}
+
+
+EXPORT_C CMsgActive::~CMsgActive()
+ {
+ Cancel(); // framework requirement
+ }
+
+
+EXPORT_C void CMsgActive::Queue(TRequestStatus& aStatus)
+//
+// call this last when an asynch operation has been requested
+//
+ {
+ __ASSERT_DEBUG(iReport==NULL, PanicServer(EMsvCMsgActiveAlreadyActive));
+//
+ aStatus=KRequestPending;
+ iReport=&aStatus;
+ }
+
+
+EXPORT_C void CMsgActive::DoCancel()
+//
+// must be called at end of derived classes DoCancel()
+//
+ {
+ TInt result=KErrCancel;
+ Complete(result); // can be done safely as asynch reporting
+ }
+
+
+EXPORT_C void CMsgActive::RunL()
+//
+// When the AO is state driven, this form of Run() is very effective
+// DoRunL() takes the AO through the states, queuing another asynch step as required
+// if DoRunL() detects the end of the cycle it returns without queuing another cycle.
+//
+// If Run() would exit without queuing another cycle it reports completion to the client.
+// This is true if the asynch step or DoRunL fails, or the state cycle is complete
+//
+ {
+ TInt status=iStatus.Int();
+ if (status>=KErrNone)
+ {
+ TRAPD(error,DoRunL()); // continue operations, may re-queue
+ __ASSERT_DEBUG(error==KErrNone || !IsActive(),User::Invariant()); // must not requeue in error situations
+ if (IsActive()) // requeud
+ return;
+ status=error;
+ }
+ Complete(status);
+ }
+
+
+EXPORT_C void CMsgActive::Complete(TInt aStatus)
+ {
+ if (iReport)
+ {
+ // only complete properly once.
+ // this allows a derived class to complete and then cancel, reporting the desired state instead of KErrCancel
+ DoComplete(aStatus);
+ User::RequestComplete(iReport,aStatus);
+ }
+ }
+
+
+EXPORT_C void CMsgActive::DoComplete(TInt&)
+//
+// Default implementation does nothing
+//
+ {}