diff -r 2b1b11a301d2 -r 4b195f3bea29 homescreenapp/hsapplicationlauncher/src/hsprocessmonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/hsapplicationlauncher/src/hsprocessmonitor.cpp Wed Aug 18 09:40:07 2010 +0300 @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2008 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: process monitor. + * + */ + +#include "hsprocessmonitor.h" + +// ========================= MEMBER FUNCTIONS ================================== + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::NewL() +// Two-phased constructor +// ----------------------------------------------------------------------------- +CHsProcessMonitor* CHsProcessMonitor::NewL( const TInt iProcessId, + MHsProcessMonitorObserver& aObserver ) + { + CHsProcessMonitor* self = new ( ELeave ) CHsProcessMonitor( iProcessId, + aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::~CHsProcessMonitor() +// Destructor. +// ----------------------------------------------------------------------------- +// +CHsProcessMonitor::~CHsProcessMonitor() + { + Cancel(); + SecureProcessHandleAsClosed(); + iProcessId = KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::AttachMonitor() +// Attach monitor +// ----------------------------------------------------------------------------- +// +TInt CHsProcessMonitor::AttachMonitor() + { + SecureProcessHandleAsClosed(); + + TInt error = iProcess.Open( iProcessId, EOwnerProcess ); + + if( error == KErrNone ) + { + iProcessHandleOpen = ETrue; + } + + return error; + } + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::StartMonitor() +// Start monitor +// ----------------------------------------------------------------------------- +// +TInt CHsProcessMonitor::StartMonitor() + { + TInt error = KErrNone; + + if( !iProcessHandleOpen ) + { + error = AttachMonitor(); + } + + if( error == KErrNone ) + { + iProcess.Logon( iStatus ); + SetActive(); + } + + return error; + } + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::CHsProcessMonitor() +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +CHsProcessMonitor::CHsProcessMonitor( const TInt aProcessId, + MHsProcessMonitorObserver& aObserver ) : + CActive( EPriorityStandard ), + iProcessId( aProcessId ), + iObserver( aObserver ), + iProcessHandleOpen( EFalse ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CHsProcessMonitor::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::RunL +// ----------------------------------------------------------------------------- +// +void CHsProcessMonitor::RunL() + { + iProcess.LogonCancel( iStatus ); + + const TInt error = iStatus.Int(); + + if( error == KErrCancel ) + { + } + else if( error == KErrNoMemory ) + { + User::Leave( KErrNoMemory ); + } + else + { + const TExitType exitType = iProcess.ExitType(); + if( exitType == EExitPending ) + { + User::LeaveIfError( StartMonitor() ); + } + else + { + iObserver.ProcessEnded( exitType, + iProcess.ExitReason(), + iProcess.ExitCategory() ); + } + } + } + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::DoCancel() +// From CActive. +// ----------------------------------------------------------------------------- +// +void CHsProcessMonitor::DoCancel() + { + iProcess.LogonCancel( iStatus ); + } + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::RunError() +// From CActive. +// ----------------------------------------------------------------------------- +// +TInt CHsProcessMonitor::RunError( TInt aError ) + { + iObserver.ProcessMonitoringError( aError ); + + // Observer will handle error. Return green light. + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CHsProcessMonitor::SecureProcessHandleAsClosed() +// Close process handle if open +// ----------------------------------------------------------------------------- +// +void CHsProcessMonitor::SecureProcessHandleAsClosed() + { + if( iProcessHandleOpen ) + { + iProcess.Close(); + iProcessHandleOpen = EFalse; + } + } + +// End of File