// 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
//
{}