diff -r 000000000000 -r 8e480a14352b messagingfw/msgsrvnstore/server/src/MENTACT.CPP --- /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 +#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 +// + {}