diff -r 48060abbbeaf -r b3cee849fa46 loadgen/ui/avkon/src/loadgen_model.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loadgen/ui/avkon/src/loadgen_model.cpp Tue Aug 31 15:15:20 2010 +0300 @@ -0,0 +1,910 @@ +/* +* 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_cpuload.h" +#include "loadgen_memoryeat.h" +#include "loadgen_phonecall.h" +#include "loadgen_netconn.h" +#include "loadgen_keypress.h" +#include "loadgen_pointerevent.h" +#include "loadgen_messages.h" +#include "loadgen_applications.h" +#include "loadgen_photocapture.h" +#include "loadgen_bluetooth.h" +#include "loadgen_utils.h" + +#include "loadgen_traces.h" +#include "loadgen_editors.h" +#include "loadgen_loadattributes.h" +#include "loadgen_model.h" +#include "loadgen_app.h" +#include "loadgen_settingsviewdlg.h" +#include "loadgen_maincontainer.h" +#include "loadgen.hrh" +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +inline TInt64 INIT_SEED() +{ + TTime now; + now.HomeTime(); + return now.Int64(); +} + +TInt64 CLoadGenModel::iRandomNumberSeed = INIT_SEED(); + +// ===================================== MEMBER FUNCTIONS ===================================== + +CLoadGenModel* CLoadGenModel::NewL() + { + CLoadGenModel* self = new(ELeave) CLoadGenModel; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// -------------------------------------------------------------------------------------------- + +CLoadGenModel::CLoadGenModel() : CActive(EPriorityStandard) + { + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::ConstructL() + { + iDrawState = EDrawStateInvalid; + iReferenceNumber = 0; + + iEnv = CEikonEnv::Static(); + User::LeaveIfError(iLs.Connect()); + + iLoadItemList = new(ELeave) CLoadItemList(64); + + User::LeaveIfError(iTimer.CreateLocal()); + CActiveScheduler::Add(this); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::ActivateModelL() + { + // load settings + //TRAP_IGNORE(LoadSettingsL()); + + // set defaults to attributes + iCpuLoadAttributes.iId = 0; + iCpuLoadAttributes.iPriority = EThreadPriorityTypeNormal; + iCpuLoadAttributes.iMode = ECpuLoadModeYielding; + iCpuLoadAttributes.iType = ECpuLoadTypePeriodic; + iCpuLoadAttributes.iLength = 4000; + iCpuLoadAttributes.iIdle = 2000; + iCpuLoadAttributes.iRandomVariance = 0; + iCpuLoadAttributes.iCpu = KCPUSelection_FreeScheduling; // set CPU as "undefined" (can be >= 0 only in SMP environments) + iCpuLoadAttributes.iCpuCount = UserSvr::HalFunction(EHalGroupKernel, KHalFunction_EKernelHalNumLogicalCpus, 0, 0); + if( iCpuLoadAttributes.iCpuCount < 1 || iCpuLoadAttributes.iCpuCount > KMaxCPUs ) + { + // HAL may not support this function, so let's use CPU count 1: + iCpuLoadAttributes.iCpuCount = 1; + } + iMemoryEatAttributes.iId = 0; + iMemoryEatAttributes.iPriority = EThreadPriorityTypeNormal; + iMemoryEatAttributes.iSource = 0; + iMemoryEatAttributes.iType = EMemoryEatTypeMemoryToBeLeft; + iMemoryEatAttributes.iBuffer = 16*1024; + iMemoryEatAttributes.iIdle = 0; + iMemoryEatAttributes.iAmount = 0; + iMemoryEatAttributes.iRandomMin = 1000000; + iMemoryEatAttributes.iRandomMax = 1500000; + iMemoryEatAttributes.iAmountDes.Copy(KNullDesC); + iMemoryEatAttributes.iRandomMinDes.Copy(KNullDesC); + iMemoryEatAttributes.iRandomMaxDes.Copy(KNullDesC); + iMemoryEatAttributes.iRandomVariance = 0; + + iPhoneCallAttributes.iId = 0; + iPhoneCallAttributes.iPriority = EThreadPriorityTypeNormal; + iPhoneCallAttributes.iDestination.Copy(_L("+358")); + iPhoneCallAttributes.iLength = 60000; + iPhoneCallAttributes.iIdle = 10000; + iPhoneCallAttributes.iRandomVariance = 0; + + iNetConnAttributes.iId = 0; + iNetConnAttributes.iPriority = EThreadPriorityTypeNormal; + iNetConnAttributes.iDestination.Copy(_L("http://www.nokia.com")); + iNetConnAttributes.iIdle = 10000; + iNetConnAttributes.iRandomVariance = 0; + + iKeyPressAttributes.iId = 0; + iKeyPressAttributes.iPriority = EThreadPriorityTypeNormal; + iKeyPressAttributes.iHeartBeat = 100; + iKeyPressAttributes.iRandomVariance = 0; + + iPointerEventAttributes.iId = 0; + iPointerEventAttributes.iPriority = EThreadPriorityTypeNormal; + iPointerEventAttributes.iHeartBeat = 1000; + iPointerEventAttributes.iRandomVariance = 0; + + iMessageAttributes.iId = 0; + iMessageAttributes.iPriority = EThreadPriorityTypeNormal; + iMessageAttributes.iMessageType = EMessageTypeSMS; + iMessageAttributes.iDestination.Copy(_L("+358")); + iMessageAttributes.iAmount = 5; + iMessageAttributes.iLength = 160; + iMessageAttributes.iIdle = 15000; + iMessageAttributes.iRandomVariance = 0; + + iApplicationsAttributes.iId = 0; + iApplicationsAttributes.iLaunchingInterval = 2000; + iApplicationsAttributes.iPriority = EThreadPriorityTypeNormal; + iApplicationsAttributes.iKeyPressType = EApplicationsKeyPressTypeNone; + iApplicationsAttributes.iMaxOpen = 20; + iApplicationsAttributes.iHeartBeat = 50; + iApplicationsAttributes.iRandomVariance = 0; + + iPhotoCaptureAttributes.iId = 0; + iPhotoCaptureAttributes.iPriority = EThreadPriorityTypeNormal; + iPhotoCaptureAttributes.iIdle = 10000; + iPhotoCaptureAttributes.iRandomVariance = 0; + iPhotoCaptureAttributes.iCameraCount = CCamera::CamerasAvailable(); + if(iPhotoCaptureAttributes.iCameraCount > 0) + { + iPhotoCaptureAttributes.iCamera = 0; // Main camera + } + else + { + iPhotoCaptureAttributes.iCamera = -1; + } + + iBluetoothAttributes.iId = 0; + iBluetoothAttributes.iPriority = EThreadPriorityTypeNormal; + iBluetoothAttributes.iIdle = 10000; + iBluetoothAttributes.iRandomVariance = 0; + iBluetoothAttributes.iBluetoothSupported = CFeatureDiscovery::IsFeatureSupportedL(KFeatureIdBt); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::DeActivateModelL() + { + Cancel(); + + // for a faster exit, send the application to background + TApaTask selfTask(iEnv->WsSession()); + selfTask.SetWgId(iEnv->RootWin().Identifier()); + selfTask.SendToBackground(); + } + +// -------------------------------------------------------------------------------------------- + +CLoadGenModel::~CLoadGenModel() + { + if (iLoadItemList) + { + DeleteAllLoadItems(); + delete iLoadItemList; + } + if ( iApplicationsAttributes.iAppsArray ) + { + delete iApplicationsAttributes.iAppsArray; + } + iTimer.Close(); + iLs.Close(); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::DoCancel() + { + iTimer.Cancel(); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::RunL() + { + // continue + //iTimer.After(iStatus, 400000); + //SetActive(); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::SetMainContainer(CLoadGenMainContainer* aContainer) + { + iMainContainer = aContainer; + iDrawState = EDrawStateMain; + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::StartNewLoadL(TInt aCommand) + { + // show new load query + CLoadGenLoadTypeEditorBase* dlg = NULL; + + switch ( aCommand ) + { + case ELoadGenCmdNewLoadCPULoad: + { + dlg = CLoadGenCPULoadEditor::NewL(iCpuLoadAttributes); + break; + } + case ELoadGenCmdNewLoadEatMemory: + { + dlg = CLoadGenMemoryEatEditor::NewL(iMemoryEatAttributes); + break; + } + case ELoadGenCmdNewLoadPhoneCall: + { + dlg = CLoadGenPhoneCallEditor::NewL(iPhoneCallAttributes); + break; + } + case ELoadGenCmdNewLoadNetConn: + { + dlg = CLoadGenNetConnEditor::NewL(iNetConnAttributes); + break; + } + case ELoadGenCmdNewLoadKeyPress: + { + dlg = CLoadGenKeyPressEditor::NewL(iKeyPressAttributes); + break; + } + case ELoadGenCmdNewLoadMessages: + { + dlg = CLoadGenMessagesEditor::NewL( iMessageAttributes ); + break; + } + case ELoadGenCmdNewLoadApplications: + { + dlg = CLoadGenApplicationsEditor::NewL( iApplicationsAttributes ); + break; + } + case ELoadGenCmdNewLoadPhotoCaptures: + { + if( iPhotoCaptureAttributes.iCameraCount > 0 ) + { + dlg = CLoadGenPhotoCaptureEditor::NewL( iPhotoCaptureAttributes ); + } + else + { + _LIT(message, "Cameras not available"); + CAknErrorNote* errorNote = new(ELeave) CAknErrorNote; + errorNote->ExecuteLD(message); + return; + } + break; + } + case ELoadGenCmdNewLoadBluetooth: + { + if( iBluetoothAttributes.iBluetoothSupported ) + { + dlg = CLoadGenBluetoothEditor::NewL(iBluetoothAttributes); + } + else + { + _LIT(message, "Bluetooth device not available"); + CAknErrorNote* errorNote = new(ELeave) CAknErrorNote; + errorNote->ExecuteLD(message); + return; + } + break; + } + case ELoadGenCmdNewLoadPointerEvent: + { + dlg = CLoadGenPointerEventEditor::NewL(iPointerEventAttributes); + break; + } + + default: + { + User::Panic(_L("Wrong new load"), 111); + break; + } + } + + TBool dlgResult = dlg->RunQueryLD(); + + // set back title + if (iMainContainer) + iMainContainer->SetDefaultTitlePaneTextL(); + + // start creating new load if dialog accepted + if (dlgResult) + { + DoStartNewLoadL(aCommand); + } + + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::EditLoadL(CLoadBase* aItem) + { + // suspend current + aItem->Suspend(); + + // show new load query + CLoadGenLoadTypeEditorBase* dlg = NULL; + + switch ( aItem->Type() ) + { + case ELoadGenCmdNewLoadCPULoad: + { + dlg = CLoadGenCPULoadEditor::NewL(static_cast(aItem)->Attributes(), ETrue); + break; + } + case ELoadGenCmdNewLoadEatMemory: + { + dlg = CLoadGenMemoryEatEditor::NewL(static_cast(aItem)->Attributes(), ETrue); + break; + } + case ELoadGenCmdNewLoadPhoneCall: + { + dlg = CLoadGenPhoneCallEditor::NewL(static_cast(aItem)->Attributes(), ETrue); + break; + } + case ELoadGenCmdNewLoadNetConn: + { + dlg = CLoadGenNetConnEditor::NewL(static_cast(aItem)->Attributes(), ETrue); + break; + } + case ELoadGenCmdNewLoadKeyPress: + { + dlg = CLoadGenKeyPressEditor::NewL(static_cast(aItem)->Attributes(), ETrue); + break; + } + case ELoadGenCmdNewLoadMessages: + { + dlg = CLoadGenMessagesEditor::NewL(static_cast(aItem)->Attributes(), ETrue); + break; + } + case ELoadGenCmdNewLoadApplications: + { + dlg = CLoadGenApplicationsEditor::NewL( static_cast(aItem)->Attributes(), ETrue ); + break; + } + case ELoadGenCmdNewLoadPhotoCaptures: + { + dlg = CLoadGenPhotoCaptureEditor::NewL( static_cast(aItem)->Attributes(), ETrue ); + break; + } + case ELoadGenCmdNewLoadBluetooth: + { + dlg = CLoadGenBluetoothEditor::NewL( static_cast(aItem)->Attributes(), ETrue ); + break; + } + case ELoadGenCmdNewLoadPointerEvent: + { + dlg = CLoadGenPointerEventEditor::NewL(static_cast(aItem)->Attributes(), ETrue); + break; + } + default: + { + User::Panic(_L("Wrong edit load"), 114); + break; + } + } + + TBool dlgResult = dlg->RunQueryLD(); + + // set back title + if (iMainContainer) + iMainContainer->SetDefaultTitlePaneTextL(); + + // change priority of the load item + aItem->SetPriority(); + + // resume execution the item + aItem->Resume(); + + if (dlgResult) + RefreshViewL(EFalse); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::DoStartNewLoadL(TInt aCommand) + { + CLoadBase* item = NULL; + + switch ( aCommand ) + { + case ELoadGenCmdNewLoadCPULoad: + { + if( iCpuLoadAttributes.iCpu == KCPUSelection_AllCPUs ) + { + // Call this function recursively for all CPUs: + for( TUint i = 0; i < iCpuLoadAttributes.iCpuCount; ++i ) + { + iCpuLoadAttributes.iCpu = i; + DoStartNewLoadL(aCommand); + } + // And finally set user selection back to "All CPUs" + iCpuLoadAttributes.iCpu = KCPUSelection_AllCPUs; + return; + } + else + { + item = CCPULoad::NewL(iCpuLoadAttributes, iReferenceNumber); + } + break; + } + case ELoadGenCmdNewLoadEatMemory: + { + item = CMemoryEat::NewL(iMemoryEatAttributes, iReferenceNumber); + break; + } + case ELoadGenCmdNewLoadPhoneCall: + { + item = CPhoneCall::NewL(iPhoneCallAttributes, iReferenceNumber); + break; + } + case ELoadGenCmdNewLoadNetConn: + { + item = CNetConn::NewL(iNetConnAttributes, iReferenceNumber); + break; + } + case ELoadGenCmdNewLoadKeyPress: + { + item = CKeyPress::NewL(iKeyPressAttributes, iReferenceNumber); + break; + } + case ELoadGenCmdNewLoadMessages: + { + item = CMessages::NewL( iMessageAttributes, iReferenceNumber ); + break; + } + case ELoadGenCmdNewLoadApplications: + { + iApplicationsAttributes.iAppsArray = ListOfAllAppsL(); + item = CAppLauncher::NewL( iApplicationsAttributes, iReferenceNumber ); + break; + } + case ELoadGenCmdNewLoadPhotoCaptures: + { + item = CPhotoCapture::NewL( iPhotoCaptureAttributes, iReferenceNumber); + break; + } + case ELoadGenCmdNewLoadBluetooth: + { + item = CBluetooth::NewL( iBluetoothAttributes, iReferenceNumber); + break; + } + case ELoadGenCmdNewLoadPointerEvent: + { + item = CPointerEvent::NewL(iPointerEventAttributes, iReferenceNumber); + break; + } + + default: + { + User::Panic(_L("Wrong new load"), 112); + break; + } + } + + iReferenceNumber++; + + // add item to the array + AppendToLoadItemListL(item); + + // update the listbox + RefreshViewL(EFalse); + + // set item index to the end + iMainContainer->ListBox()->SetCurrentItemIndexAndDraw( iMainContainer->ListBox()->Model()->NumberOfItems()-1 ); + + // start the load + item->Resume(); + + // refresh again + RefreshViewL(EFalse); + } + +// -------------------------------------------------------------------------------------------- + + +void CLoadGenModel::StopAllLoadItemsL() + { + DeleteAllLoadItems(); + + RefreshViewL(); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::SuspendAllLoadItemsL() + { + for (TInt i=0; iAt(i) ) + { + iLoadItemList->At(i)->Suspend(); + } + } + + RefreshViewL(); + } +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::ResumeAllLoadItemsL() + { + for (TInt i=0; iAt(i) ) + { + iLoadItemList->At(i)->Resume(); + } + } + + RefreshViewL(); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::RefreshViewL(TBool aClearSelection) + { + if (iMainContainer && iDrawState == EDrawStateMain && iMainContainer->ListBox()) + { + // clear selections if any + iMainContainer->ListBox()->ClearSelection(); + + // set item index to 0 + if (aClearSelection) + iMainContainer->ListBox()->SetCurrentItemIndex(0); + + // set text items + iMainContainer->SetListBoxTextArrayL(GenerateListBoxItemTextArrayL()); + } + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::AppendToLoadItemListL(CLoadBase* aItem) + { + if (iLoadItemList) + iLoadItemList->AppendL( aItem ); + else + User::Leave(KErrNotReady); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::DeleteFromLoadItemListL(TInt aIndex) + { + if (iLoadItemList) + { + if (iLoadItemList->Count() > aIndex && aIndex >= 0) + { + // first call delete on the item + if (iLoadItemList->At(aIndex)) + { + delete iLoadItemList->At(aIndex); + iLoadItemList->At(aIndex) = NULL; + } + + // and them remove the array entry + iLoadItemList->Delete(aIndex); + iLoadItemList->Compress(); + } + else + User::Leave(KErrNotFound); + } + else + User::Leave(KErrNotReady); + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::SuspendOrResumeFromLoadItemListL(TInt aIndex) + { + if (iLoadItemList) + { + if (iLoadItemList->Count() > aIndex && aIndex >= 0) + { + if (iLoadItemList->At(aIndex)) + { + if (iLoadItemList->At(aIndex)->State() == CLoadBase::ELoadStateRunning) + { + iLoadItemList->At(aIndex)->Suspend(); + } + else if (iLoadItemList->At(aIndex)->State() == CLoadBase::ELoadStateSuspended) + { + iLoadItemList->At(aIndex)->Resume(); + } + } + } + else + User::Leave(KErrNotFound); + } + else + User::Leave(KErrNotReady); + } + +// -------------------------------------------------------------------------------------------- + +TInt CLoadGenModel::LoadItemCount() const + { + TInt count(0); + + if (iLoadItemList) + count = iLoadItemList->Count(); + + return count; + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::DeleteAllLoadItems() + { + // call delete for each entry and free memory allocated for the array + for (TInt i=0; iAt(i) ) + { + delete iLoadItemList->At(i); + iLoadItemList->At(i) = NULL; + } + } + + iLoadItemList->Reset(); + } + +// -------------------------------------------------------------------------------------------- + +CDesCArray* CLoadGenModel::GenerateListBoxItemTextArrayL() + { + CDesCArray* textArray = new(ELeave) CDesCArrayFlat(64); + CleanupStack::PushL(textArray); + + _LIT(KEntryTemplateRedIcon, "1\t%S\t\t"); + _LIT(KEntryTemplateGreenIcon, "2\t%S\t\t"); + + for (TInt i=0; i textEntry; + TBuf<256> description = iLoadItemList->At(i)->Description(); + + if (iLoadItemList->At(i)->State() == CLoadBase::ELoadStateRunning) + textEntry.Format(KEntryTemplateGreenIcon, &description); + else + textEntry.Format(KEntryTemplateRedIcon, &description); + + textArray->AppendL(textEntry); + } + + CleanupStack::Pop(); //textArray + return textArray; + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::ShowItemActionMenuL() + { + TInt currentItemIndex = iMainContainer->CurrentListBoxItemIndex(); + + if (LoadItemCount() > currentItemIndex && currentItemIndex >= 0) + { + // show a query dialog + TInt queryIndex(0); + CAknListQueryDialog* listQueryDlg = new(ELeave) CAknListQueryDialog(&queryIndex); + + if (listQueryDlg->ExecuteLD(R_ITEM_ACTION_QUERY)) + { + // stop + if (queryIndex == EItemActionMenuTypeStop) + { + StopSelectedOrHighlightedItemsL(); + } + + // suspend or resume + else if (queryIndex == EItemActionMenuTypeSuspendResume) + { + SuspendOrResumeSelectedOrHighlightedItemsL(); + } + + // edit + else if (queryIndex == EItemActionMenuTypeEdit) + { + EditLoadL(iLoadItemList->At(currentItemIndex)); + } + } + } + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::StopSelectedOrHighlightedItemsL() + { + const CArrayFix* selectionIndexes = iMainContainer->ListBoxSelectionIndexes(); + + TInt err(KErrNone); + + // by default use selected items + if (selectionIndexes && selectionIndexes->Count() > 0) + { + CAknQueryDialog* query = CAknQueryDialog::NewL(); + _LIT(KQueryMessage, "Stop %d selections?"); + TFileName queryMsg; + queryMsg.Format(KQueryMessage, selectionIndexes->Count()); + + + if (query->ExecuteLD(R_GENERAL_CONFIRMATION_QUERY, queryMsg)) + { + TInt deleteIndexCounter(0); + TInt ref(0); + TKeyArrayFix key(0, ECmpTUint16); + TInt index(0); + + TInt loadCount = LoadItemCount(); + + for (TInt i=0; iFind(ref, key, index) == 0) + { + TRAP(err, DeleteFromLoadItemListL(i-deleteIndexCounter)); + deleteIndexCounter++; // amount of indexes decreases after each delete + } + } + + RefreshViewL(); + User::LeaveIfError(err); + } + } + + // or if none selected, use the current item index + else + { + TInt currentItemIndex = iMainContainer->CurrentListBoxItemIndex(); + + if (LoadItemCount() > currentItemIndex && currentItemIndex >= 0) + { + CAknQueryDialog* query = CAknQueryDialog::NewL(); + _LIT(KQueryMessage, "Stop hightlighted item?"); + + if (query->ExecuteLD(R_GENERAL_CONFIRMATION_QUERY, KQueryMessage)) + { + TRAP(err, DeleteFromLoadItemListL(currentItemIndex)); + + RefreshViewL(); + User::LeaveIfError(err); + } + } + } + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::SuspendOrResumeSelectedOrHighlightedItemsL() + { + const CArrayFix* selectionIndexes = iMainContainer->ListBoxSelectionIndexes(); + + // by default use selected items + if (selectionIndexes && selectionIndexes->Count() > 0) + { + TInt ref(0); + TKeyArrayFix key(0, ECmpTUint16); + TInt index(0); + + for (TInt i=0; iFind(ref, key, index) == 0) + { + SuspendOrResumeFromLoadItemListL(i); + } + } + + RefreshViewL(EFalse); + } + + // or if none selected, use the current item index + else + { + TInt currentItemIndex = iMainContainer->CurrentListBoxItemIndex(); + + if (LoadItemCount() > currentItemIndex && currentItemIndex >= 0) + { + SuspendOrResumeFromLoadItemListL(currentItemIndex); + + RefreshViewL(EFalse); + } + } + } +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::LoadSettingsL() + { + } + +// -------------------------------------------------------------------------------------------- + +void CLoadGenModel::SaveSettingsL() + { + } + +// -------------------------------------------------------------------------------------------- + +TInt CLoadGenModel::LaunchSettingsDialogL() + { + return 0; + } + +// -------------------------------------------------------------------------------------------- + +CDesCArray* CLoadGenModel::ListOfAllAppsL() + { + const TInt KMaxAppsArraySize=250; + RApaLsSession ls; + CleanupClosePushL(ls); + + User::LeaveIfError( ls.Connect() ); + CDesCArray* allAppsArray = new(ELeave) CDesCArrayFlat( KMaxAppsArraySize ); + CleanupStack::PushL( allAppsArray ); + // reset the apps list + allAppsArray->Reset(); + + // search all apps + TApaAppInfo appInfo; + User::LeaveIfError(ls.GetAllApps()); + + + while ( ls.GetNextApp( appInfo ) == KErrNone ) + { + allAppsArray->AppendL( appInfo.iFullName ); + } + CleanupStack::Pop( allAppsArray ); + CleanupStack::PopAndDestroy( &ls ); + + + // remove loadgen.* from the list + for ( TInt i = 0; i < allAppsArray->MdcaCount(); i++ ) + { + if ( allAppsArray->MdcaPoint(i).FindF( _L("\\loadgen.") ) != KErrNotFound ) + { + allAppsArray->Delete(i); + allAppsArray->Compress(); + break; + } + } + + // sort the elements + allAppsArray->Sort(); + + return allAppsArray; // ownership transferred + } + +// End of File