memana/analyzetoolclient/configurationappgui/src/atconfigurationappguilistboxview.cpp
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:52:57 +0200
changeset 1 3ff3fecb12fe
parent 0 f0f2b8682603
permissions -rw-r--r--
Add initial version of PI Profiler under EPL

/*
* Copyright (c) 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 <aknviewappui.h>
#include <eikmenub.h>
#include <avkon.hrh>
#include <barsread.h>
#include <stringloader.h>
#include <aknlists.h>
#include <eikenv.h>
#include <akniconarray.h>
#include <eikclbd.h>
#include <akncontext.h>
#include <akntitle.h>
#include <eikbtgpc.h>
#include <atconfigurationappgui.rsg>
#include <aknmessagequerydialog.h>
#include <aknnotewrappers.h>
#include <apgtask.h>

#include "atconfigurationappgui.hrh"
#include "atconfigurationappguilistboxview.h"
#include "atconfigurationappguilistbox.hrh"
#include "atconfigurationappguilistbox.h"
#include "atconfigurationappguiappui.h"
#include "atlog.h"

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::CATConfigurationAppGuiListBoxView()
// First phase of Symbian two-phase construction.
// -----------------------------------------------------------------------------
//
CATConfigurationAppGuiListBoxView::CATConfigurationAppGuiListBoxView()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::CATConfigurationAppGuiListBoxView()" );
    
    iATConfigurationAppGuiListBox = NULL;
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::~CATConfigurationAppGuiListBoxView()
// Destructor.
// -----------------------------------------------------------------------------
//
CATConfigurationAppGuiListBoxView::~CATConfigurationAppGuiListBoxView()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::~CATConfigurationAppGuiListBoxView()" );
    
    delete iATConfigurationAppGuiListBox;
    iATConfigurationAppGuiListBox = NULL;
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::NewL()
// Symbian two-phase constructor.
// -----------------------------------------------------------------------------
//
CATConfigurationAppGuiListBoxView* CATConfigurationAppGuiListBoxView::NewL()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::NewL()" );
    
    CATConfigurationAppGuiListBoxView* self = CATConfigurationAppGuiListBoxView::NewLC();
    CleanupStack::Pop( self );
    return self;
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::NewLC()
// Symbian two-phase constructor.
// -----------------------------------------------------------------------------
//
CATConfigurationAppGuiListBoxView* CATConfigurationAppGuiListBoxView::NewLC()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::NewLC()" );
    
    CATConfigurationAppGuiListBoxView* self = new ( ELeave ) CATConfigurationAppGuiListBoxView();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::ConstructL()
// Second-phase constructor for view.
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::ConstructL()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::ConstructL()" );
    
    BaseConstructL( R_ATCONFIGURATION_APP_GUI_LIST_BOX_ATCONFIGURATION_APP_GUI_LIST_BOX_VIEW );
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::Id()
// Returns The UID for this view.
// -----------------------------------------------------------------------------
//
TUid CATConfigurationAppGuiListBoxView::Id() const
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::Id()" );
    
    return TUid::Uid( EATConfigurationAppGuiListBoxViewId );
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::HandleCommandL()
// Handle a command for this view.
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::HandleCommandL( TInt aCommand )
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::HandleCommandL()" );
    
    TBool commandHandled = EFalse;
    switch ( aCommand )
        { // Code to dispatch to the AknView's menu and CBA commands is generated here
        case EATConfigurationAppGuiListBoxViewVersionMenuItemCommand:
            commandHandled = HandleVersionMenuItemSelectedL( aCommand );
            break;
        case EATConfigurationAppGuiListBoxViewDetailsMenuItemCommand:
            {
            // Listbox items are in the same order as in storage server
            // thus using current index
            if ( iATConfigurationAppGuiListBox )
                {
                TInt current = iATConfigurationAppGuiListBox->GetCurrentItemIndex();
                RArray<TATProcessInfo> processes;
                CATConfigurationAppGuiAppUi* appUi = ( CATConfigurationAppGuiAppUi* )AppUi();
                appUi->StorageServer().GetProcessesL( processes );
                if ( current >= KErrNone && current < processes.Count() )
                    {
                    TUint processId = processes[ current ].iProcessId;
                    TInt64 processStartTime = processes[ current ].iStartTime;
                    appUi->SetCurrentProcessId( processId );
                    appUi->SetCurrentProcessStartTime( processStartTime );
                    AppUi()->ActivateLocalViewL( TUid::Uid( EATConfigurationAppGuiProcessViewId ) );
                    }
                // Closes the array and frees all memory allocated to the array.
                processes.Close();
                }
            break;
            }
        /*case EATConfigurationAppGuiListBoxViewEnd_processMenuItemCommand:
            {
            EndProcessL( EATConfigurationAppGuiListBoxViewEndTaskMenuItemCommand );
            break;
            }*/
        case EATConfigurationAppGuiListBoxViewEndTaskMenuItemCommand:
            {
            EndProcessL( EATConfigurationAppGuiListBoxViewEndTaskMenuItemCommand );
            break;
            }
        case EATConfigurationAppGuiListBoxViewKillProcessMenuItemCommand:
            {
            EndProcessL( EATConfigurationAppGuiListBoxViewKillProcessMenuItemCommand );
            break;
            }
        case EATConfigurationAppGuiListBoxViewTerminateProcessMenuItemCommand:
            {
            EndProcessL( EATConfigurationAppGuiListBoxViewTerminateProcessMenuItemCommand );
            break;
            }
        case EATConfigurationAppGuiListBoxViewPanicProcessMenuItemCommand:
            {
            EndProcessL( EATConfigurationAppGuiListBoxViewPanicProcessMenuItemCommand );
            break;
            }
        case EATConfigurationAppGuiListBoxViewCancel_loggingMenuItemCommand:
            {
            // Listbox items are in the same order as in storage server
            // thus using current index
            if ( iATConfigurationAppGuiListBox )
                {
                TInt current = iATConfigurationAppGuiListBox->GetCurrentItemIndex();
                RArray<TATProcessInfo> processes;
                CATConfigurationAppGuiAppUi* appUi = ( CATConfigurationAppGuiAppUi* )AppUi();
                appUi->StorageServer().GetProcessesL( processes );
                if ( current >= KErrNone && current < processes.Count() )
                    {
                    TUint processId = processes[ current ].iProcessId;
                    // Stop subtesting for this process
                    //if ( appUi->IsSubTestRunning( processId ) )
                        //appUi->SetProcessSubTestStopL( processId );
                    
                    TInt cancelErr = appUi->StorageServer().CancelLogging( processId );
                    if ( cancelErr != KErrNone )
                        {
                        // Logging could not be cancelled
                        appUi->ShowErrorNoteL( R_ATCONFIGURATION_APP_GUI_LISTBOX_CANCEL_FAILURE_NOTE );
                        }
                    else
                        {
                        iATConfigurationAppGuiListBox->UpdateViewL();
                        }
                    }
				// Closes the array and frees all memory allocated to the array.
                processes.Close();
                }
            break;
            }
        case EATConfigurationAppGuiListBoxViewLog_settingMenuItemCommand:
            {
            AppUi()->ActivateLocalViewL( TUid::Uid( EATConfigurationAppGuiSettingItemListViewId ),
                    TUid::Uid( EATConfigurationAppGuiListBoxViewId ), KNullDesC8 );
            break;
            }
        case EATConfigurationAppGuiListBoxViewStart_subtestMenuItemCommand:
            {
            if ( iATConfigurationAppGuiListBox )
                {
                TInt current = iATConfigurationAppGuiListBox->GetCurrentItemIndex();
                RArray<TATProcessInfo> processes;
                CATConfigurationAppGuiAppUi* appUi = ( CATConfigurationAppGuiAppUi* )AppUi();
                appUi->StorageServer().GetProcessesL( processes );
                if ( current >= KErrNone && current < processes.Count() )
                    {
                    TUint processId = processes[ current ].iProcessId;
                    appUi->SetProcessSubTestStartL( processId );
                    iATConfigurationAppGuiListBox->UpdateViewL();
                    }
				// Closes the array and frees all memory allocated to the array.
                processes.Close();
                }
            break;
            }
        case EATConfigurationAppGuiListBoxViewStop_subtestMenuItemCommand:
            {
            if ( iATConfigurationAppGuiListBox )
                {
                TInt current = iATConfigurationAppGuiListBox->GetCurrentItemIndex();
                RArray<TATProcessInfo> processes;
                CATConfigurationAppGuiAppUi* appUi = ( CATConfigurationAppGuiAppUi* )AppUi();
                appUi->StorageServer().GetProcessesL( processes );
                if ( current >= KErrNone && current < processes.Count() )
                    {
                    TUint processId = processes[ current ].iProcessId;
                    appUi->SetProcessSubTestStopL( processId );
                    iATConfigurationAppGuiListBox->UpdateViewL();
                    }
				// Closes the array and frees all memory allocated to the array.
                processes.Close();
                }
            break;
            }
        default:
            break;
        }
     
    if ( !commandHandled ) 
        {
    
        if ( aCommand == EAknSoftkeyExit || aCommand == EAknSoftkeyExit )
            {
            AppUi()->HandleCommandL( EEikCmdExit );
            }
    
        }
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::DoActivateL()
// Handles user actions during activation of the view.
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::DoActivateL( 
        const TVwsViewId& /*aPrevViewId*/,
        TUid /*aCustomMessageId*/,
        const TDesC8& /*aCustomMessage*/ )
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::DoActivateL()" );
    
    SetupStatusPaneL();
    
    if ( iATConfigurationAppGuiListBox == NULL )
        {
        iATConfigurationAppGuiListBox = CreateContainerL();
        iATConfigurationAppGuiListBox->SetMopParent( this );
        AppUi()->AddToStackL( *this, iATConfigurationAppGuiListBox );
        // For supporting MSK context menu
        MenuBar()->SetContextMenuTitleResourceId( R_ATCONFIGURATION_APP_GUI_LIST_BOX_OPTIONS_MENU );
        // Start update timer
        ( (CATConfigurationAppGuiAppUi*)AppUi() )->StartTimerL();
        } 
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::DoDeactivate()
// Handles user actions during deactivation of the view.
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::DoDeactivate()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::DoDeactivate()" );
    
    CleanupStatusPane();
    
    if ( iATConfigurationAppGuiListBox != NULL )
        {
        // Cancel timer events
        TRAP_IGNORE( ( (CATConfigurationAppGuiAppUi*)AppUi() )->TimerNotifyL( EFalse ) );
        AppUi()->RemoveFromViewStack( *this, iATConfigurationAppGuiListBox );
        delete iATConfigurationAppGuiListBox;
        iATConfigurationAppGuiListBox = NULL;
        }
    CleanupStatusPane();
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::DynInitMenuPaneL()
// Handles dynamical menu item dimming.
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::DynInitMenuPaneL( TInt aResourceId, 
	CEikMenuPane* aMenuPane )
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::DynInitMenuPaneL()" );
    
    if ( R_ATCONFIGURATION_APP_GUI_LIST_BOX_MENU_PANE1_MENU_PANE == aResourceId )
        {
        if( iATConfigurationAppGuiListBox->GetCurrentItemIndex() < 0 ) 
            {
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewDetailsMenuItemCommand, ETrue );
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewStart_subtestMenuItemCommand, ETrue );
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewStop_subtestMenuItemCommand, ETrue );
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewEnd_processMenuItemCommand, ETrue );
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewLog_settingMenuItemCommand, ETrue );
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewHelpMenuItemCommand, ETrue );
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewCancel_loggingMenuItemCommand, ETrue );
            } 
        else 
            {
            TInt subTest( KErrNotFound );
            TATLogOption loggingMode = EATUseDefault;//lint !e644
            if ( iATConfigurationAppGuiListBox )
                {
                TInt current = iATConfigurationAppGuiListBox->GetCurrentItemIndex();
                RArray<TATProcessInfo> processes;
                CATConfigurationAppGuiAppUi* appUi = ( CATConfigurationAppGuiAppUi* )AppUi();
                appUi->StorageServer().GetProcessesL( processes );
                if ( current >= KErrNone && current < processes.Count() )
                    {
                    TUint processId = processes[ current ].iProcessId;
                    subTest = appUi->IsSubTestRunning( processId );
                    // Get logging mode
                    appUi->StorageServer().GetLoggingModeL( processId, loggingMode );
                    }
				// Closes the array and frees all memory allocated to the array.
                processes.Close();
                }
            if ( subTest > KErrNotFound )
                {
                aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewStart_subtestMenuItemCommand, ETrue );
                aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewStop_subtestMenuItemCommand, EFalse );
                }
            else
                {
                aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewStart_subtestMenuItemCommand, EFalse );
                aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewStop_subtestMenuItemCommand, ETrue );
                }
            
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewDetailsMenuItemCommand, EFalse );
            
            if ( loggingMode == EATLoggingOff )
                {
                aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewCancel_loggingMenuItemCommand, ETrue );
                // Logging cancelled -> hide necessary items
                aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewDetailsMenuItemCommand, ETrue );
                aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewStart_subtestMenuItemCommand, ETrue );
                aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewStop_subtestMenuItemCommand, ETrue );
                }
            else
                {
                aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewCancel_loggingMenuItemCommand, EFalse );
                }
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewLog_settingMenuItemCommand, ETrue );
            aMenuPane->SetItemDimmed( EATConfigurationAppGuiListBoxViewHelpMenuItemCommand, ETrue );
            }
        }
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::HandleStatusPaneSizeChange()
// Handle status pane size change for this view.
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::HandleStatusPaneSizeChange()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::HandleStatusPaneSizeChange()" );
    
    CAknView::HandleStatusPaneSizeChange();
    
    // This may fail, but we're not able to propagate exceptions here
    TInt result;
    TRAP( result, SetupStatusPaneL() ); 
    }  

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::SetupStatusPaneL()
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::SetupStatusPaneL()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::SetupStatusPaneL()" );
    
    // Reset the context pane
    TUid contextPaneUid = TUid::Uid( EEikStatusPaneUidContext );
    CEikStatusPaneBase::TPaneCapabilities subPaneContext = 
        StatusPane()->PaneCapabilities( contextPaneUid );
    if ( subPaneContext.IsPresent() && subPaneContext.IsAppOwned() )
        {
        CAknContextPane* context = static_cast< CAknContextPane* > ( 
            StatusPane()->ControlL( contextPaneUid ) );
        context->SetPictureToDefaultL();
        }
    
    // Setup the title pane
    TUid titlePaneUid = TUid::Uid( EEikStatusPaneUidTitle );
    CEikStatusPaneBase::TPaneCapabilities subPaneTitle = 
        StatusPane()->PaneCapabilities( titlePaneUid );
    if ( subPaneTitle.IsPresent() && subPaneTitle.IsAppOwned() )
        {
        CAknTitlePane* title = static_cast< CAknTitlePane* >( 
            StatusPane()->ControlL( titlePaneUid ) );
        TResourceReader reader;
        iEikonEnv->CreateResourceReaderLC( reader, R_ATCONFIGURATION_APP_GUI_LIST_BOX_TITLE_RESOURCE );
        title->SetFromResourceL( reader );
        CleanupStack::PopAndDestroy(); // reader internal state
        }
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::CleanupStatusPane()
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::CleanupStatusPane()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::CleanupStatusPane()" );
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::CreateContainerL()
// Creates the top-level container for the view.
// -----------------------------------------------------------------------------
//
CATConfigurationAppGuiListBox* CATConfigurationAppGuiListBoxView::CreateContainerL()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::CreateContainerL()" );
    
    return CATConfigurationAppGuiListBox::NewL( ClientRect(), this, this );
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::HandleVersionMenuItemSelectedL()
// Shows About dialog of the application.
// -----------------------------------------------------------------------------
//
TBool CATConfigurationAppGuiListBoxView::HandleVersionMenuItemSelectedL( 
	TInt /*aCommand*/ )
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::HandleVersionMenuItemSelectedL()" );
    CAknMessageQueryDialog* dlg = new (ELeave) CAknMessageQueryDialog;
    dlg->ExecuteLD( R_ABOUT_HEADING_PANE );
    
    return ETrue;
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::UpdateViewL()
// Updates view.
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::UpdateViewL()
    {
    LOGSTR1( "ATCU CATConfigurationAppGuiListBoxView::UpdateViewL()" );
    
    if ( iATConfigurationAppGuiListBox )
        {
        iATConfigurationAppGuiListBox->UpdateViewL();
        } 
    }

// -----------------------------------------------------------------------------
// CATConfigurationAppGuiListBoxView::EndProcessL()
// Ends process with a specific method.
// -----------------------------------------------------------------------------
//
void CATConfigurationAppGuiListBoxView::EndProcessL( TInt aCommand )
    {
    LOGSTR1( "CATConfigurationAppGuiListBoxView::EndProcessL" );  
                    
    TInt current = iATConfigurationAppGuiListBox->GetCurrentItemIndex();
    RArray<TATProcessInfo> processes;
    CATConfigurationAppGuiAppUi* appUi = ( CATConfigurationAppGuiAppUi* )AppUi();
    appUi->StorageServer().GetProcessesL( processes );
     if ( current >= KErrNone && current < processes.Count() )
         {
         RProcess endProcess;
         TUint processId = processes[ current ].iProcessId;
         TBuf<KMaxProcessName> processName;
         processName.Copy( processes[ current ].iProcessName );
         TInt find = processName.Find( _L( "." ) );
         if ( find > KErrNotFound )
             processName.Delete( find, processName.Length() - find );
         
         TInt openErr = endProcess.Open( TProcessId( processId ) );
         if ( openErr ==KErrNone )
             {
             if ( aCommand == EATConfigurationAppGuiListBoxViewEndTaskMenuItemCommand )
                 {
                 LOGSTR1( "CATConfigurationAppGuiListBoxView::EndProcessL - end task" );
                 endProcess.Close();

                 TApaTaskList apList = TApaTaskList( iEikonEnv->WsSession() );
                 TApaTask apTask = apList.FindApp( processName );
                 if ( apTask.Exists() )
                     {
                     LOGSTR1( "CATConfigurationAppGuiListBoxView::EndProcessL - task exists -> end" );
                     apTask.EndTask();
                     }
                 else
                     {
                     _LIT( KAppNotExist, "Could not end this process!" );
                     CAknErrorNote* note = new ( ELeave ) CAknErrorNote();
                     note->SetTextL( KAppNotExist() );
                     note->ExecuteLD();
                     }
                 }
             else if ( aCommand == EATConfigurationAppGuiListBoxViewKillProcessMenuItemCommand )
                 {
                 LOGSTR1( "CATConfigurationAppGuiListBoxView::EndProcessL - kill process" );
                 endProcess.Kill( KErrNone );
                 endProcess.Close();
                 }
             else if ( aCommand == EATConfigurationAppGuiListBoxViewTerminateProcessMenuItemCommand )
                 {
                 LOGSTR1( "CATConfigurationAppGuiListBoxView::EndProcessL - terminate process" );
                 endProcess.Terminate( KErrNone );
                 endProcess.Close();
                 }
             else if ( aCommand == EATConfigurationAppGuiListBoxViewPanicProcessMenuItemCommand )
                 {
                 LOGSTR1( "CATConfigurationAppGuiListBoxView::EndProcessL - panic process" );
                 _LIT( KPanicTxt, "Panic");
                 endProcess.Panic( KPanicTxt, KErrNone );
                 endProcess.Close();
                 }
             }
         else
             {
             CAknErrorNote* errorNote = new ( ELeave ) CAknErrorNote();
             _LIT( KErrTxt, "Could not open the process!");
             errorNote->SetTextL( KErrTxt );
             errorNote->ExecuteLD();
             }
         }   
	// Closes the array and frees all memory allocated to the array.
    processes.Close();
    }

// End of File