diff -r b3cee849fa46 -r fad26422216a loadgen/engine/src/loadgen_applications.cpp --- a/loadgen/engine/src/loadgen_applications.cpp Tue Aug 31 15:15:20 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,686 +0,0 @@ -/* -* Copyright (c) 2010 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 FILES -#include "loadgen_applications.h" -#include "loadgen_utils.h" -#include "loadgen.hrh" -#include - -#include -#include "loadgen_traces.h" - -_LIT(KThreadName, "Applications %d"); - -const TInt KDefaultStartDelay = 500; -const TInt KThreadNameLength = 64; -const TInt KDescriptorBufSize = 256; -const TInt KPriorityBufSize = 16; -const TInt KScanCodeStart = 32; - -// ===================================== MEMBER FUNCTIONS ===================================== - -CAppLauncher* CAppLauncher::NewL( TApplicationsAttributes& aAttributes, TInt aReferenceNumber ) - { - CAppLauncher* self = new(ELeave) CAppLauncher( aAttributes, aReferenceNumber ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// -------------------------------------------------------------------------------------------- - -CAppLauncher::~CAppLauncher() - { - Close(); - } - -// -------------------------------------------------------------------------------------------- - -CAppLauncher::CAppLauncher( - TApplicationsAttributes& aAttributes, TInt aReferenceNumber ) : - iAttributes( aAttributes ) - { - iAttributes.iId = aReferenceNumber; - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncher::ConstructL() - { - CLoadBase::ConstructL(); - - iType = ELoadGenCmdNewLoadApplications; - - TBuf threadName; - threadName.Format( KThreadName, iAttributes.iId ); - - // create a thread - User::LeaveIfError( iThread.Create( threadName, ThreadFunction, - KDefaultStackSize*2, KMinHeapSize, - KKilo * KMinHeapSize, (TAny*) &iAttributes ) ); - - // set priority of the thread - SetPriority(); - } - -// -------------------------------------------------------------------------------------------- - -TInt CAppLauncher::ThreadFunction( TAny* aThreadArg ) - { - CTrapCleanup* pC = CTrapCleanup::New(); - CActiveScheduler* pS = new CActiveScheduler; - CActiveScheduler::Install( pS ); - - // start generating load, pass pointer to arguments - GenerateLoad( *( ( TApplicationsAttributes* ) aThreadArg ) ); - - delete pS; - delete pC; - - return KErrNone; - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncher::GenerateLoad( TApplicationsAttributes& aAttributes ) - { - CAppLauncherManager* appLauncherManager = NULL; - TRAPD( err, appLauncherManager = CAppLauncherManager::NewL( aAttributes ) ); - if ( err == KErrNone ) - { - CActiveScheduler::Start(); - } - delete appLauncherManager; - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncher::Resume() - { - CLoadBase::Resume(); - - iThread.Resume(); - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncher::Suspend() - { - CLoadBase::Suspend(); - - iThread.Suspend(); - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncher::SetPriority() - { - CLoadBase::SetPriority(); - - iThread.SetPriority( CLoadGenUtils::SettingItemToThreadPriority( iAttributes.iPriority ) ); - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncher::Close() - { - CLoadBase::Close(); - - if ( iThread.ExitReason() == 0 ) // check if the thread is still alive - { - // signal the thread that it needs to close - iThread.RequestComplete( iAttributes.iDeathStatus, KErrCancel ); - - // wait the thread to die - TRequestStatus waiter; - iThread.Logon( waiter ); - User::WaitForRequest( waiter ); - iThread.Close(); - } - } - -// -------------------------------------------------------------------------------------------- - -TPtrC CAppLauncher::Description() - { - TBuf buf; - TBuf prioBuf; - CLoadGenUtils::SettingItemToThreadDescription( iAttributes.iPriority, prioBuf ); - - _LIT(KAppLauncherEntry, "[%d] Appls prio=%S max apps=%d heartbeat=%dms random=%d%%"); - buf.Format( KAppLauncherEntry, iAttributes.iId, &prioBuf, iAttributes.iMaxOpen, - iAttributes.iHeartBeat, iAttributes.iRandomVariance ); - - return TPtrC( buf ); - } - -// -------------------------------------------------------------------------------------------- -// -------------------------------------------------------------------------------------------- - -CAppLauncherManager* CAppLauncherManager::NewL( TApplicationsAttributes& aAttributes ) - { - CAppLauncherManager* self = new(ELeave) CAppLauncherManager(aAttributes); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// -------------------------------------------------------------------------------------------- - -CAppLauncherManager::CAppLauncherManager( TApplicationsAttributes& aAttributes ) : - CActive( EPriorityStandard ), iAttributes( aAttributes ) - { - iAppEventType = EApplicationsLaunchApplication; - } - -// -------------------------------------------------------------------------------------------- - -CAppLauncherManager::~CAppLauncherManager() - { - if ( iPeriodicTimer ) - { - iPeriodicTimer->Cancel(); - delete iPeriodicTimer; - } - delete iLauncherEngine; - Cancel(); - - iWsSession.Close(); - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncherManager::ConstructL() - { - CActiveScheduler::Add( this ); - - // create instance to application launcher - iLauncherEngine = CLauncherEngine::NewL( iAttributes ); - - // set the status as pending - iStatus = KRequestPending; - SetActive(); - - // set the death status pointer point to the request status of this ao - iAttributes.iDeathStatus = &iStatus; - - // init - User::LeaveIfError( iWsSession.Connect() ); - - // start timer - iPeriodicTimer = CPeriodic::NewL( CActive::EPriorityStandard ); - iPeriodicTimer->Start( KDefaultStartDelay, - CLoadGenUtils::MilliSecondsToMicroSeconds( - iAttributes.iLaunchingInterval, iAttributes.iRandomVariance ), - TCallBack( PeriodicTimerCallBack, this ) ); - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncherManager::RunL() - { - // request status has completed by the main thread meaning that we need to stop now - CActiveScheduler::Stop(); - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncherManager::DoCancel() - { - } - -// -------------------------------------------------------------------------------------------- - -TInt CAppLauncherManager::PeriodicTimerCallBack( TAny* aAny ) - { - CAppLauncherManager* self = static_cast( aAny ); - - TRAPD( err, self->SimulateEventL() ); - if ( KErrNone != err ) - { - return err; - } - return KErrNone; - } - -// -------------------------------------------------------------------------------------------- - -void CAppLauncherManager::SimulateEventL() - { - // Randomly start new applications. - // After maximum applications launched stop one application. - // And after that start launching again. - if ( iAppEventType == EApplicationsLaunchApplication && - iAttributes.iMaxOpen == iLauncherEngine->AppLaunchCounter() ) - { - iAppEventType = EApplicationsCloseApplication; - } - if ( iAppEventType == EApplicationsCloseApplication && - iAttributes.iMaxOpen -1 == iLauncherEngine->AppLaunchCounter() ) - { - iAppEventType = EApplicationsLaunchApplication; - } - - // Launch or stop - if ( iAppEventType == EApplicationsLaunchApplication ) - { - iLauncherEngine->StartAppLaunchingL(); - } - else - { - iLauncherEngine->StopApplication( ETrue ); - } - } - -// -------------------------------------------------------------------------------------------- - -#include -#include -#include -#include -#include -#include -#include - -// --------------------------------------------------------------------------- - -CLauncherEngine* CLauncherEngine::NewL( TApplicationsAttributes& aAttributes ) - { - CLauncherEngine* self = new(ELeave) CLauncherEngine( aAttributes ); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// --------------------------------------------------------------------------- - -CLauncherEngine::CLauncherEngine( TApplicationsAttributes& aAttributes ) : - iAttributes( aAttributes ) - { - } - -// --------------------------------------------------------------------------- - -void CLauncherEngine::ConstructL() - { - LOGSTRING("LoadGen: CLauncherEngine::ConstructL"); - iAppKeyPressManager = CAppKeyPressManager::NewL( iAttributes ); - iAppLaunchCounter = 0; - User::LeaveIfError( iTimer.CreateLocal() ); - - User::LeaveIfError( iLs.Connect() ); - User::LeaveIfError( iWs.Connect() ); - - } - -// --------------------------------------------------------------------------- - -CLauncherEngine::~CLauncherEngine() - { - LOGSTRING("LoadGen: CLauncherEngine::~CLauncherEngine"); - StopApplication( EFalse ); - iWs.Close(); - iLs.Close(); - iTimer.Close(); - delete iAppKeyPressManager; - } - -// --------------------------------------------------------------------------- - -void CLauncherEngine::StartAppLaunchingL() - { - LOGSTRING("LoadGen: CLauncherEngine::StartAppLaunchingL"); - if ( iAppLaunchCounter == iAttributes.iMaxOpen ) - { - return; - } - - // start launching - TBool launched( EFalse ); - while ( !launched ) - { - launched = LaunchApplicationL(); - } - } - -// --------------------------------------------------------------------------- - -TBool CLauncherEngine::LaunchApplicationL() - { - LOGSTRING("LoadGen: CLauncherEngine::LaunchApplicationL"); - TBool result( EFalse ); - // get the uid of the current app - iCurrentAppUid = KNullUid; - TApaAppInfo appInfo; - - // get application list size - TInt appsListSize = iAttributes.iAppsArray->MdcaCount(); - // get random application number in the list - TInt appTolaunch = CLoadGenUtils::RandomNumber( 0, appsListSize - 1 ); - // get file name of the application to be launched - TFileName launchFileName = iAttributes.iAppsArray->MdcaPoint( appTolaunch ); - iLs.GetAllApps(); - while ( iLs.GetNextApp( appInfo ) == KErrNone ) - { - // get file name in current appInfo - TFileName appFileName = appInfo.iFullName; - // get AppUid - if ( appFileName.CompareF( launchFileName ) == 0 ) - { - iCurrentAppUid = appInfo.iUid; - break; - } - } - - if ( iCurrentAppUid != KNullUid ) - { - // parse the filename - TParse nameParser; - nameParser.SetNoWild( iAttributes.iAppsArray->MdcaPoint( appTolaunch ), NULL, NULL ); - iCurrentAppNameAndExt.Copy( nameParser.Drive() ); - iCurrentAppNameAndExt.Append( nameParser.NameAndExt() ); - - // do not try to launch these apps - if ( iCurrentAppUid != KNullUid && - iAttributes.iAppsArray->MdcaPoint( appTolaunch).FindF(_L("\\loadgen.")) == KErrNotFound && - iAttributes.iAppsArray->MdcaPoint( appTolaunch ).FindF( _L("\\Phone." ) ) == KErrNotFound && - iAttributes.iAppsArray->MdcaPoint( appTolaunch).FindF( _L("\\Startup.") ) == KErrNotFound && - iAttributes.iAppsArray->MdcaPoint( appTolaunch ).FindF( _L("\\SplashScreen.") ) == KErrNotFound && - iAttributes.iAppsArray->MdcaPoint( appTolaunch ).FindF( _L("\\cameraapp.") ) == KErrNotFound && - iAttributes.iAppsArray->MdcaPoint( appTolaunch ).FindF( _L("\\eshell.") ) == KErrNotFound && - iAttributes.iAppsArray->MdcaPoint( appTolaunch ).FindF( _L("\\ConnTest.") ) == KErrNotFound && - iAttributes.iAppsArray->MdcaPoint( appTolaunch ).FindF( _L("\\Launcher.") ) == KErrNotFound && - -#ifdef __WINS__ - iAttributes.iAppsArray->MdcaPoint( appTolaunch ).FindF( _L("\\DebugAgent.") ) == KErrNotFound && - iAttributes.iAppsArray->MdcaPoint( appTolaunch ).FindF( _L("\\redirect.") ) == KErrNotFound && -#endif - iAttributes.iAppsArray->MdcaPoint( appTolaunch ).FindF( _L("\\VoiceRecorder.") ) == KErrNotFound ) - { - - // check if the app is already running - TApaTaskList taskList( iWs ); - TApaTask thisTask = taskList.FindApp( iCurrentAppUid ); - if ( !thisTask.Exists( )) - { - // check the program's capabilities - TApaAppCapabilityBuf buf; - iLs.GetAppCapability( buf, iCurrentAppUid ); - TApaAppCapability cap = buf(); - - // if it's embeddable only, don't launch if setting is enabled - // if it's hidden, don't launch if setting is enabled - if ( cap.iEmbeddability != TApaAppCapability::EEmbeddableOnly && - !cap.iAppIsHidden ) - { - LOGSTRING2("launchFileName = %S", &launchFileName); - - DoLaunchApplicationL(); - result = ETrue; - } - } - } - } - return result; - } - - -// --------------------------------------------------------------------------- - -void CLauncherEngine::DoLaunchApplicationL() - { - LOGSTRING("LoadGen: CLauncherEngine::DoLaunchApplicationL"); - - // Find the task with uid3 - TApaTaskList tasklist( iWs ); - TApaTask task=tasklist.FindApp( iCurrentAppUid ); - - if ( !task.Exists() ) - // Task doesn't exist, launch a new instance of an application - { - TApaAppInfo appInfo; - User::LeaveIfError( iLs.GetAppInfo( appInfo, iCurrentAppUid ) ); - TApaAppCapabilityBuf capBuf; - User::LeaveIfError( iLs.GetAppCapability( capBuf, iCurrentAppUid ) ); - TApaAppCapability& caps = capBuf(); - - CApaCommandLine* cmdLine=CApaCommandLine::NewLC(); - cmdLine->SetExecutableNameL( appInfo.iFullName ); - - // app is launched in background - cmdLine->SetCommandL( EApaCommandBackground ); - - // start the app - User::LeaveIfError( iLs.StartApp( *cmdLine ) ); - iAppKeyPressManager->AddNewApplicationUidToKeyEventsL( iCurrentAppUid ); - iAppLaunchCounter++; - - CleanupStack::PopAndDestroy( cmdLine ); - } - } - -// --------------------------------------------------------------------------- - -void CLauncherEngine::StopApplication( TBool aRandomApplication ) - { - LOGSTRING("LoadGen: CLauncherEngine::StopApplication"); - - // remove key pressing instance - TUid appToDelete = iAppKeyPressManager->KillApplication( aRandomApplication ); - if ( appToDelete != KNullUid ) - { - TApaTaskList taskList( iWs ); - TApaTask thisTask = taskList.FindApp( appToDelete ); - - if ( thisTask.Exists() ) - { - // since the application is still open, let's close it - thisTask.EndTask(); - } - iAppLaunchCounter--; - } - - // return if only one application requested - if ( aRandomApplication ) - { - return; - } - - // remove all launched applications because load is requested to be closed - while ( appToDelete != KNullUid ) - { - appToDelete = iAppKeyPressManager->KillApplication( aRandomApplication ); - - if ( appToDelete != KNullUid ) - { - TApaTaskList taskList( iWs ); - TApaTask thisTask = taskList.FindApp( appToDelete ); - - if ( thisTask.Exists() ) - { - // since the application is still open, let's close it - thisTask.EndTask(); - } - iAppLaunchCounter--; - } - } - } - -// -------------------------------------------------------------------------------------------- -// -------------------------------------------------------------------------------------------- - -CAppKeyPressManager* CAppKeyPressManager::NewL( TApplicationsAttributes& aAttributes ) - { - LOGSTRING("LoadGen: CAppKeyPressManager::NewL"); - CAppKeyPressManager* self = new(ELeave) CAppKeyPressManager( aAttributes ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// -------------------------------------------------------------------------------------------- - -CAppKeyPressManager::CAppKeyPressManager( TApplicationsAttributes& aAttributes ) : - iAttributes( aAttributes ) - { - LOGSTRING("LoadGen: CAppKeyPressManager::CAppKeyPressManager"); - } - -// -------------------------------------------------------------------------------------------- - -CAppKeyPressManager::~CAppKeyPressManager() - { - LOGSTRING("LoadGen: CAppKeyPressManager::~CAppKeyPressManager"); - if ( iKeyPresses.Count() != 0 ) - { - iKeyPresses.ResetAndDestroy(); - } - - iKeyPresses.Close(); - } - -// -------------------------------------------------------------------------------------------- - -void CAppKeyPressManager::ConstructL() - { - LOGSTRING("LoadGen: CAppKeyPressManager::ConstructL"); - } - - -// -------------------------------------------------------------------------------------------- -void CAppKeyPressManager::AddNewApplicationUidToKeyEventsL( TUid aUid ) - { - LOGSTRING("LoadGen: CAppKeyPressManager::AddNewApplicationUidToKeyEventsL"); - CApplicationKeyPresses* applicationKP = CApplicationKeyPresses::NewL( aUid, - iAttributes ); - CleanupStack::PushL( applicationKP ); - User::LeaveIfError( iKeyPresses.Append( applicationKP ) ); - CleanupStack::Pop( applicationKP ); - } - -// -------------------------------------------------------------------------------------------- -TUid CAppKeyPressManager::KillApplication( TBool aRandomApplication ) - { - TUid applicationUid = KNullUid; - TInt appToDelete = iKeyPresses.Count() - 1 ; - // remove the newest application if not random - if ( aRandomApplication ) - { - appToDelete = CLoadGenUtils::RandomNumber( 0, iKeyPresses.Count() - 1 ); - } - if ( iKeyPresses.Count() ) - { - // get random application and delete it - - applicationUid = iKeyPresses[appToDelete]->ApplicationUid(); - delete iKeyPresses[appToDelete]; - iKeyPresses.Remove( appToDelete ); - } - return applicationUid; - } -// -------------------------------------------------------------------------------------------- -// -------------------------------------------------------------------------------------------- - -CApplicationKeyPresses* CApplicationKeyPresses::NewL( TUid aUid, TApplicationsAttributes& - aAttributes ) - { - LOGSTRING("LoadGen: CApplicationKeyPresses::NewL"); - CApplicationKeyPresses* self = new(ELeave) CApplicationKeyPresses( aUid, aAttributes ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// -------------------------------------------------------------------------------------------- - -CApplicationKeyPresses::CApplicationKeyPresses( TUid aUid, - TApplicationsAttributes& aAttributes ) : - iUid( aUid ), iAttributes( aAttributes ) - { - LOGSTRING("LoadGen: CApplicationKeyPresses::CApplicationKeyPresses"); - } - -// -------------------------------------------------------------------------------------------- - -CApplicationKeyPresses::~CApplicationKeyPresses() - { - LOGSTRING("LoadGen: CApplicationKeyPresses::~CApplicationKeyPresses"); - if ( iPeriodicTimer ) - { - iPeriodicTimer->Cancel(); - delete iPeriodicTimer; - } - - iWsSession.Close(); - } - -// -------------------------------------------------------------------------------------------- - -void CApplicationKeyPresses::ConstructL() - { - LOGSTRING("LoadGen: CApplicationKeyPresses::ConstructL"); - // init - User::LeaveIfError( iWsSession.Connect() ); - - // start timer - iPeriodicTimer = CPeriodic::NewL( CActive::EPriorityStandard ); - if ( iAttributes.iKeyPressType ) - { - iPeriodicTimer->Start( KDefaultStartDelay, - CLoadGenUtils::MilliSecondsToMicroSeconds( - iAttributes.iHeartBeat, - iAttributes.iRandomVariance ), - TCallBack( PeriodicTimerCallBack, this ) ); - } - } - -// -------------------------------------------------------------------------------------------- - -TInt CApplicationKeyPresses::PeriodicTimerCallBack( TAny* aAny ) - { - CApplicationKeyPresses* self = static_cast( aAny ); - self->SimulateKeyEvent(); - return KErrNone; - } - -// -------------------------------------------------------------------------------------------- - -void CApplicationKeyPresses::SimulateKeyEvent() - { - LOGSTRING("LoadGen: CApplicationKeyPresses::SimulateKeyEvent"); - // for arrow key events - - TInt wgId(0); - CApaWindowGroupName::FindByAppUid( iUid, iWsSession, wgId ); - // generate a random arrow key event - TWsEvent event; - event.SetType( EEventKey ); - event.Key()->iCode = CLoadGenUtils::RandomNumber( EKeyLeftArrow, EKeyDownArrow ); - event.Key()->iScanCode = event.Key()->iCode - KScanCodeStart; - event.Key()->iModifiers = 0; - event.Key()->iRepeats = 0; - iWsSession.SendEventToWindowGroup( wgId, event ); - } - -// End of File