diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstarter/amastartsrc/amastartasync.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstarter/amastartsrc/amastartasync.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,224 @@ +// Copyright (c) 2007-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: +// + +/** + @file + @internalComponent +*/ + +#include "amastartasync.h" + +#include "ssmdebug.h" + +CAmaStartAsync* CAmaStartAsync::NewL( RMessage2 aMessage ) + { + DEBUGPRINT1A( ">CAmaStartAsync::NewL" ); + + CAmaStartAsync* self = NewLC( aMessage ); + CleanupStack::Pop(); + + DEBUGPRINT1A( "CAmaStartAsync::NewL>" ); + return self; + } + + + +CAmaStartAsync* CAmaStartAsync::NewLC( RMessage2 aMessage ) + { + DEBUGPRINT1A( ">CAmaStartAsync::NewLC" ); + + CAmaStartAsync* self = new(ELeave) CAmaStartAsync( aMessage ); + CleanupStack::PushL( self ); + self->ConstructL(); + + DEBUGPRINT1A( ">CAmaStartAsync::NewLC" ); + return self; + } + + + +CAmaStartAsync::~CAmaStartAsync() + { + DEBUGPRINT1A( ">CAmaStartAsync::~CAmaStartAsync" ); + + Cancel(); + + delete iStartSafe; + if (iDscStore.IsOpened()) + { + iDscStore.Close(); + } + iSysMon.Close(); + + DEBUGPRINT1A( "CAmaStartAsync::~CAmaStartAsync>" ); + } + + + +/** + * Initiate AMA processing. + */ +void CAmaStartAsync::StartL( const TUid& aDscId ) + { + DEBUGPRINT1A( ">CAmaStartAsync::StartL" ); + + if( iRunning ) + { + User::Leave( KErrInUse ); + } + + DEBUGPRINT1( _L("***** Set running") ); + + iRunning = ETrue; + iDscStore.EnumOpenLC(aDscId); + CleanupStack::Pop(); + + SetActive(); + TRequestStatus* trs = &iStatus; + User::RequestComplete( trs, KErrNone ); + + DEBUGPRINT1A( "CAmaStartAsync::StartL>" ); + } + + + +/** + * Succsessive calls to StartDscItemL, but only one per RunL in order for + * the scheduler/ server to remain responsive. + */ +void CAmaStartAsync::RunL() + { + DEBUGPRINT1A( ">CAmaStartAsync::RunL %d" ); + CDscItem* item = iDscStore.EnumReadNextL(); + if (item) + { + //if loading of one AMA from the DSC fails we should move to next AMA - so we trap here + TRAP_IGNORE(StartDscItemL(*item)); + + delete item; + + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + + } + else // No more items in store, so finish here + { + iDscStore.EnumClose(); + iDscStore.Close(); + iMessage.Complete(KErrNone); + } + + DEBUGPRINT1A( "CAmaStartAsync::RunL>" ); + } + + + +TInt CAmaStartAsync::RunError( TInt aError ) + { + DEBUGPRINT1A( ">CAmaStartAsync::RunError" ); + + iDscStore.EnumClose(); + iDscStore.Close(); + iMessage.Complete(aError); + + DEBUGPRINT1A( "CAmaStartAsync::RunError>" ); + return KErrNone; + } + + + +/** + * Cancel the current command. + */ +void CAmaStartAsync::DoCancel() + { + DEBUGPRINT1A( ">CAmaStartAsync::DoCancel" ); + + if( iRunning ) + { + iDscStore.EnumClose(); + iMessage.Complete(KErrCancel); + iRunning = EFalse; + } + + DEBUGPRINT1A( "CAmaStartAsync::DoCancel>" ); + } + + + +void CAmaStartAsync::ConstructL() + { + DEBUGPRINT1A( ">CAmaStartAsync::ConstructL" ); + + iStartSafe = CStartSafe::NewL(); + iDscStore.OpenL(); + CActiveScheduler::Add( this ); + + DEBUGPRINT1A( "CAmaStartAsync::ConstructL>" ); + } + + + +CAmaStartAsync::CAmaStartAsync( RMessage2 aMessage ) +: CActive( EPriorityStandard ), iMessage( aMessage ) + { + DEBUGPRINT1A( ">CAmaStartAsync::CAmaStartAsync> (Empty constructor)" ); + } + + + +void CAmaStartAsync::StartDscItemL(const CDscItem& aDscItem) + { + DEBUGPRINT1A( ">CAmaStartAsync::StartDscItemL" ); + + //A process to be created inside iStartSafe->StartL(); + RProcess process; + + //Number of retries made for starting the process. + TInt tried=0; + + // start the process + const CStartupProperties& properties = aDscItem.StartupProperties(); + iStartSafe->StartL(properties, process, tried); + + DEBUGPRINT2(_L("%d times has been retried to start the process successfully"), tried); + + TInt error=KErrNone; + //monitor the process if indicated + if(aDscItem.Monitored()) + { + // first time monitoring, so connect with the SysMon server + if (iSysMon.Handle() == KNullHandle) + { + TRAP(error, iSysMon.OpenL()); + } + // monitor the process + if (KErrNone==error) + { + TRAP(error, iSysMon.MonitorL(properties, process)); + } + //Connect to SysMon fail or register to monitor the process fail + //Kill the started process because Start and Monitor should be one atomic function. + if (KErrNone !=error) + { + process.Kill(error); + process.Close(); + } + User::LeaveIfError(error); + } + + DEBUGPRINT1A( "CAmaStartAsync::StartDscItemL>" ); + }