diff -r 000000000000 -r f0f2b8682603 memana/analyzetoolclient/consoleui/src/atconsoleviews.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/memana/analyzetoolclient/consoleui/src/atconsoleviews.cpp Thu Feb 11 15:51:35 2010 +0200 @@ -0,0 +1,1247 @@ +/* +* 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 FILES +#include +#include +#include +#include +#include +#include "atconsoleui.h" +#include "atconsoleviews.h" + +// LOCAL FUNCTION PROTOTYPES +LOCAL_C void LimitedAppend( TDes& aOriginal, const TDesC& aAppend); + +// FORWARD DECLARATIONS + +// ==================== LOCAL FUNCTIONS ======================================= +// ----------------------------------------------------------------------------- +// LimitedAppend() +// Appends texts. +// ----------------------------------------------------------------------------- +// +LOCAL_C void LimitedAppend( TDes& aOriginal, const TDesC& aAppend ) + { + + TInt spaceLeft = aOriginal.MaxLength() - aOriginal.Length(); + + if ( spaceLeft > aAppend.Length() ) + { + aOriginal.Append ( aAppend ); + } + else + { + aOriginal.Append ( aAppend.Left ( spaceLeft ) ); + } + } + +// ----------------------------------------------------------------------------- +// CView::NewL() +// First phase constructor. +// ----------------------------------------------------------------------------- +// +CView* CView::NewL( CConsoleMain* aConsole, + CView* aParent, + const TDesC& aName, + TInt64 aProcessId + ) + { + + CView* self = new ( ELeave ) CView(); + CleanupStack::PushL( self ); + self->ConstructL( aConsole, aParent, aName, aProcessId ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CView::ConstructL() +// Second phase constructor. +// ----------------------------------------------------------------------------- +// +void CView::ConstructL( CConsoleMain* aConsole, + CView* aParent, + const TDesC& aName, TInt64 aProcessId + ) + { + // Store the parameters + iMain = aConsole; + iConsole = aConsole->GetConsole(); + iParent = aParent; + iViewName = aName; + iProcessId = aProcessId; + + // Get display size + const TInt KOverHead = 5; + iSize = iConsole->ScreenSize(); + iScreenSize = iSize.iHeight - KOverHead; // Size available for menus + } + +// ----------------------------------------------------------------------------- +// CView::CView() +// C++ default constructor. +// ----------------------------------------------------------------------------- +// +CView::CView() + { + iDirection = 1; + iPrevPos = -1; // Invalid starting value + } + +// ----------------------------------------------------------------------------- +// CView::~CView() +// Destructor. +// ----------------------------------------------------------------------------- +// +CView::~CView() + { + iItems.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CView::TimerUpdate() +// Handles screen updates. +// ----------------------------------------------------------------------------- +// +void CView::TimerUpdate() + { + RArray texts; + if( ItemTexts( texts ) != KErrNone ) + { + texts.Close(); + return; + } + TInt count = texts.Count(); + // If list is empty, do not scroll. + if ( count < 1 ) + { + texts.Close(); + return; + } + else if( iFirstItem + iPositionOnScreen > count ) + { + iFirstItem = iPositionOnScreen = 0; + } + + // If menu selection is updated, then restart scrolling + if (iPrevPos != iFirstItem + iPositionOnScreen) + { + iPrevPos = iFirstItem + iPositionOnScreen; + iStart = 0; + iDirection = 1; + } + + // If menu item have not been changed after last timer, then + // start scrolling + const TDesC& name = texts[ iFirstItem + iPositionOnScreen ]; + if ( name.Length() > iSize.iWidth) + { + TInt y = iConsole->WhereY(); + TInt x = iConsole->WhereX(); + TBuf<80> iTmp; + + iStart = iStart + iDirection; + + // "Right end" + if ( iStart + iSize.iWidth > name.Length() + KViewOverhead ) + { + iStart--; + iDirection = -1; + } + + // "Left end" + if ( iStart == -1 ) + { + iStart++; + iDirection = 1; + } + + if( iStart > name.Length() ) + { + iStart = 0; + } + + iTmp=_L(" *"); + LimitedAppend( iTmp, name.Mid ( iStart ) ); + + iConsole->SetPos( 0, iPositionOnScreen + 1 ); + iConsole->Printf ( iTmp.Left( iSize.iWidth -2 ) ); + + iConsole->SetPos(x,y); + } + texts.Close(); + } + +// ----------------------------------------------------------------------------- +// CView::AppendBefore() +// Appends cursor to the line. +// ----------------------------------------------------------------------------- +// +void CView::AppendBefore( TInt aLineNum, TDes& aLine ) + { + if( ( aLine.MaxLength() - aLine.Length() ) < 2 ) + { + return; + } + + // If printing active line, print the marker + if ( aLineNum == iPositionOnScreen + iFirstItem ) + { + aLine.Append( _L(" *") ); + } + else + { + aLine.Append( _L(" ") ); + } + } + +// ----------------------------------------------------------------------------- +// CView::PrintViewL() +// Prints view. +// ----------------------------------------------------------------------------- +// +void CView::PrintViewL( TUpdateType aType ) + { + iUpdateType = aType; + TBuf line; + + // Clear display + iConsole->ClearScreen(); + + // Print menu title + Print( Name() ); + + RArray texts; + if( ItemTexts( texts ) != KErrNone ) + { + texts.Close(); + return; + } + + TInt oldItemCount = iItemCount; + + iItemCount = texts.Count(); + + // If first time in menu, update start and end positions + if( ( iFirstItem == iLastItem ) || // First time here.. + ( iLastItem >= iItemCount ) || + ( oldItemCount != iItemCount ) ) // Menu size changed + { + iLastItem = iItemCount - 1; + iPositionOnScreen = 0; + + // If "overflow", then adjust the end + if (iLastItem > iScreenSize ) + { + iLastItem = iScreenSize; + } + } + + // Print items + for ( TInt i = iFirstItem; i <= iLastItem; i++ ) + { + line.Zero(); + + // Append text before line + AppendBefore( i, line ); + TBuf<2*KMaxName> temp; + if ( i < iItems.Count() ) + { + temp.Copy( iItems[ i ]->Name() ); + TATLogOption loggingMode; + iMain->StorageServer().GetLoggingModeL( iMain->Processes()[ i ].iProcessId, loggingMode ); + if ( EATLoggingOff != loggingMode ) + { + if ( iMain->IsSubTestRunning( iMain->Processes()[ i ].iProcessId ) > KErrNotFound ) + { + temp.Append( _L(": ") ); + temp.Append( _L("subtest running") ); + } + } + else + { + temp.Append( _L(": ") ); + temp.Append( _L("logging cancelled") ); + } + // TEST START + /*if ( i == iFirstItem ) + { + temp.Append( _L(": ") ); + temp.Append( _L("subtest running") ); + } + else if ( i == iFirstItem + 1 ) + { + temp.Append( _L(": ") ); + temp.Append( _L("logging cancelled") ); + } + else if ( i == iFirstItem + 2 ) + { + temp.Append( _L(": ") ); + temp.Append( _L("subtest running") ); + }*/ + // TEST END + LimitedAppend ( line, temp /*texts[i]*/ ); + } + else + LimitedAppend ( line, KExitTxt ); + + // Print the line + Print(line); + } + texts.Close(); + } + +// ----------------------------------------------------------------------------- +// CView::SelectL() +// Handles line selections. +// ----------------------------------------------------------------------------- +// +CView* CView::SelectL( TKeyCode aSelection, TBool& aContinue ) + { + MapKeyCode( aSelection ); + + switch ( ( TInt )aSelection ) + { + // Exit + case EKeyEscape: + aContinue = EFalse; + return this; + // SelectL item + case EKeyEnter: + case EKeyRightArrow: + { + // Print items + for ( TInt i = iFirstItem; i <= iLastItem; i++ ) + { + if ( i < iItems.Count() ) + { + TATLogOption loggingMode; + TInt processCount ( iMain->Processes().Count() ); + if ( i < processCount ) + { + iMain->StorageServer().GetLoggingModeL( iMain->Processes()[ i ].iProcessId, loggingMode ); + if ( EATLoggingOff != loggingMode ) + { + return iItems[ iPositionOnScreen ]; + } + else + { + return this; + } + } + } + } + //return iItems[ iPositionOnScreen ]; + } + // Going back + case EKeyLeftArrow: + { + TBool tmp = iShowLibraries | iSetLoggingMode; + iShowLibraries = EFalse; + iSetLoggingMode = EFalse; + if ( tmp ) + return this; + else + return iParent; + } + // Go down + case EKeyDownArrow: + { + if ( iFirstItem + iPositionOnScreen == iItemCount - 1 ) + { + // If end of the list, go to beginning + iLastItem = iLastItem - iFirstItem; + iFirstItem = 0; + iPositionOnScreen = 0; + } + else + { + if ( iPositionOnScreen == iScreenSize ) + { + // If in end of screen, update items + if ( iLastItem != ( iItemCount - 1 ) ) + { + // If not end of the list, then update first and last + // but do not update position in screen. + iLastItem++; + iFirstItem++; + } + } + else + { + // Going down "in-screen", no need to update items + iPositionOnScreen++; + } + } + break; + } + // Go Up + case EKeyUpArrow: + { + if ( iFirstItem + iPositionOnScreen == 0 ) + { + // If in the beginning of the list + + if ( iItemCount <= iScreenSize ) + { + // Wrap around when the list is not full + iPositionOnScreen = iItemCount-1; + } + else + { + // Wrap around when there are more items than + // can be shown at once. + iPositionOnScreen = iScreenSize; + iLastItem = iItemCount-1; + iFirstItem = iItemCount - iPositionOnScreen - 1; + } + } + else if ( iPositionOnScreen == 0 ) + { + // If not at the beginning of the list, then update first and + // last but do not update position in screen. + if ( iFirstItem != 0 ) + { + iLastItem--; + iFirstItem--; + } + } + else + { + // Going up "in-screen", no need to update items + iPositionOnScreen--; + } + + break; + } + + // Additional keys + case EKeyHome: + case '3': + iPositionOnScreen = 0; + iFirstItem = 0; + iLastItem = iScreenSize; + + if ( iLastItem > iItemCount-1 ) + { + iLastItem = iItemCount-1; + } + break; + case EKeyEnd: + case '9': + iPositionOnScreen = iScreenSize; + iLastItem = iItemCount-1; + iFirstItem = iLastItem - iScreenSize; + + if ( iFirstItem < 0 ) + { + iFirstItem = 0; + iPositionOnScreen = iLastItem-1; + } + break; + case EKeyPageUp: + case '1': + + iFirstItem = iFirstItem - iScreenSize - 1; + iLastItem = iLastItem - iScreenSize - 1; + + if ( iFirstItem < 0 ) + { + iFirstItem = 0; + iPositionOnScreen = 0; + iLastItem = iScreenSize; + if ( iLastItem > iItemCount-1 ) + { + iLastItem = iItemCount-1; + } + } + break; + case EKeyPageDown: + case '7': + iFirstItem = iFirstItem + iScreenSize + 1; + iLastItem = iLastItem + iScreenSize + 1; + + // Going too far + if ( iLastItem > iItemCount - 1 ) + { + iLastItem = iItemCount-1; + iFirstItem = iLastItem - iScreenSize; + iPositionOnScreen = iScreenSize; + } + + // Ok, list is smaller than screen + if ( iFirstItem < 0 ) + { + iFirstItem = 0; + iLastItem = iItemCount-1; + iPositionOnScreen = iLastItem; + } + break; + default: // Bypass the keypress + break; + } + + // Continue normally and keep in the same menu + aContinue = ETrue; + return this; + + } + +// ----------------------------------------------------------------------------- +// CView::ItemTexts() +// Formats menu texts +// ----------------------------------------------------------------------------- +// +TInt CView::ItemTexts( RArray& aArray ) + { + + TInt count = iItems.Count(); + for( TInt i=0; i temp; + temp.Copy( iItems[i]->Name() ); + if( aArray.Append( iItems[i]->Name() ) != KErrNone ) + { + return KErrNoMemory; + } + } + + return KErrNone; + + } + +// ----------------------------------------------------------------------------- +// CView::SetParent() +// Sets menu parent menu +// ----------------------------------------------------------------------------- +// +void CView::SetParent ( CView* aMenu ) + { + + iParent = aMenu; + + } + +// ----------------------------------------------------------------------------- +// CView::Print() +// Prints line to the screen. +// ----------------------------------------------------------------------------- +// +void CView::Print( const TDesC& aPrint ) + { + iConsole->Printf ( aPrint.Left( iSize.iWidth - KViewOverhead ) ); + iConsole->Printf(_L("\n")); + } + +// ----------------------------------------------------------------------------- +// CView::AddItemL() +// Adds item to the list. +// ----------------------------------------------------------------------------- +// +void CView::AddItemL( CView* aMenu ) + { + + User::LeaveIfError ( iItems.Append( aMenu ) ); + + } + +// ----------------------------------------------------------------------------- +// CView::ResetItems() +// Resets the item list. +// ----------------------------------------------------------------------------- +// +void CView::ResetItems() + { + iItems.ResetAndDestroy(); + } +// ----------------------------------------------------------------------------- +// CView::Name() +// Returns the name of view. +// ----------------------------------------------------------------------------- +// +const TDesC& CView::Name( ) const + { + + return iViewName; + + } + +// ----------------------------------------------------------------------------- +// CView::MapKeyCode() +// Maps numeric keycodes to proper TKeyCode values. +// ----------------------------------------------------------------------------- +// +void CView::MapKeyCode(TKeyCode &aSelection) + { + + TInt asciiCode = (TInt) aSelection; + + // Handling numeric keys 2,4,6 and 8 + + if(asciiCode == KMyKeyUpAsciiCode) + { + aSelection = EKeyUpArrow; + } + + if(asciiCode == KMyKeyLeftAsciiCode) + { + aSelection = EKeyLeftArrow; + } + + if(asciiCode == KMyKeyRightAsciiCode) + { + aSelection = EKeyEnter; + } + + if(asciiCode == KMyKeyDownAsciiCode) + { + aSelection = EKeyDownArrow; + } + } + +// ----------------------------------------------------------------------------- +// CMainView::NewL() +// First phase constructor. +// ----------------------------------------------------------------------------- +// +CMainView* CMainView::NewL( CConsoleMain* aConsole, + CView* aParent, + const TDesC& aName ) + { + + CMainView* self = new ( ELeave ) CMainView(); + CleanupStack::PushL( self ); + self->ConstructL( aConsole, aParent, aName ); + CleanupStack::Pop( self ); + return self; + + } + +// ----------------------------------------------------------------------------- +// CMainView::ItemTexts() +// Format menu texts. +// ----------------------------------------------------------------------------- +// +TInt CMainView::ItemTexts( RArray& aArray ) + { + + CView::ItemTexts( aArray ); + // Add Exit to last one in menu + if( aArray.Append( KExitTxt ) != KErrNone ) + { + return KErrNoMemory; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMainView::ConstructL() +// Second phase constructor. +// ----------------------------------------------------------------------------- +// +void CMainView::ConstructL( CConsoleMain* aConsole, + CView* aParent, + const TDesC& aName + ) + { + + CView::ConstructL( aConsole, aParent, aName, NULL ); + + } + +// ----------------------------------------------------------------------------- +// CMainView::SelectL() +// Process keypresses in menu. +// ----------------------------------------------------------------------------- +// +CView* CMainView::SelectL( TKeyCode aSelection, TBool& aContinue ) + { + + MapKeyCode( aSelection ); + + // If SelectLion == "exit" and right or enter + if ( aSelection == EKeyEnter || aSelection == EKeyRightArrow ) + { + if ( iPositionOnScreen == iItemCount - 1 ) + { + // Exit + aContinue = EFalse; + return this; + } + } + + // Normal menu handling + CView* tmp = CView::SelectL( aSelection, aContinue ); + return tmp; + + } + +// ----------------------------------------------------------------------------- +// CProcessInfoView::NewL() +// First phase constructor. +// ----------------------------------------------------------------------------- +// +CProcessInfoView* CProcessInfoView::NewL( CConsoleMain* aConsole, + CView* aParent, + const TDesC& aName, TInt64 aProcessId ) + { + + CProcessInfoView* self = new ( ELeave ) CProcessInfoView(); + CleanupStack::PushL( self ); + self->ConstructL( aConsole, aParent, aName, aProcessId ); + CleanupStack::Pop( self ); + return self; + + } + +// ----------------------------------------------------------------------------- +// CProcessInfoView::~CProcessInfoView() +// Destructor. +// ----------------------------------------------------------------------------- +// +CProcessInfoView::~CProcessInfoView() + { + } + +// ----------------------------------------------------------------------------- +// CProcessInfoView::ConstructL() +// First phase constructor. +// ----------------------------------------------------------------------------- +// +void CProcessInfoView::ConstructL( CConsoleMain* aConsole, + CView* aParent, + const TDesC& aName, TInt64 aProcessId + ) + { + CView::ConstructL( aConsole, aParent, aName, aProcessId ); + } + +// ----------------------------------------------------------------------------- +// CProcessInfoView::ItemTexts() +// Formats menu item texts. +// ----------------------------------------------------------------------------- +// +TInt CProcessInfoView::ItemTexts( RArray& /*aArray*/ ) + { + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CProcessInfoView::PrintViewL() +// Prints process info view. +// ----------------------------------------------------------------------------- +// +void CProcessInfoView::PrintViewL( TUpdateType /*aType*/ ) + { + if ( !iShowLibraries && !iSetLoggingMode ) + { + // Get module names + RArray processes; + // Clear display + iConsole->ClearScreen(); + // Print menu title + TBuf<2*KMaxName> title; + title.Copy( Name() ); + TInt subTest = iMain->IsSubTestRunning( iProcessId ); + if ( subTest > KErrNotFound ) + { + // Append subtest running text + title.Append( _L(": ") ); + title.Append( _L( "subtest running" ) ); + } + + Print( title /*Name()*/ ); + // Update positions + RArray texts; + if( ItemTexts( texts ) != KErrNone ) + { + return; + } + + TInt oldItemCount = iItemCount; + iItemCount = texts.Count(); + + // If first time in menu, update start and end positions + if( ( iFirstItem == iLastItem ) || // First time here.. + ( iLastItem >= iItemCount ) || + ( oldItemCount != iItemCount ) ) // Menu size changed + { + iLastItem = iItemCount - 1; + iPositionOnScreen = 0; + + // If "overflow", then adjust the end + if ( iLastItem > iScreenSize ) + { + iLastItem = iScreenSize; + } + } + // Update pos screen + if ( iPositionOnScreen > ( TInt )ECancelLoggingTxtItem - 1 ) + iPositionOnScreen = 0; + else if ( iPositionOnScreen < ( TInt )EStartSubtestTxtItem ) + iPositionOnScreen = ( TInt )ECancelLoggingTxtItem - 1; + + // Get processes + processes = iMain->Processes(); + // Get current opened process + for ( TInt num = 0 ; num < processes.Count() ; num++ ) + { + TATProcessInfo tmpProcessInfo; + tmpProcessInfo = processes[ num ]; + if ( tmpProcessInfo.iProcessId == iProcessId ) + { + iCurrentProcessInfo = tmpProcessInfo; + break; + } + } + + TBuf line; + // Get curr. and max. allocations + TUint32 number( KErrNone ); + TUint32 size( KErrNone ); + TUint32 maxNumber( KErrNone ); + TUint32 maxSize( KErrNone ); + TInt currErr = iMain->StorageServer().GetCurrentAllocsL( iProcessId, number, size ); + TInt maxErr = iMain->StorageServer().GetMaxAllocsL( iProcessId, maxNumber, maxSize ); + // Get logging mode + TATLogOption loggingMode; + TInt loggingErr = iMain->StorageServer().GetLoggingModeL( iProcessId, loggingMode ); + + // Print curr. allocations + line = _L(" "); + LimitedAppend ( line, _L( "Curr. allocations: " ) ); + // Append curr. allocs + if ( currErr == KErrNone ) + line.AppendNum( number ); + + Print( line ); + line = _L(" "); + if ( currErr == KErrNone ) + { + if ( size >= KATThousand && size < KATMillion ) // kiloByte range + { + TReal value( size ); + value = value / KATThousand; + line.Format( _L(" %.1f"), value ); + line.Append( _L(" ") ); + line.Append( KATKB ); + } + else if ( size >= KATMillion ) // megaByte range + { + TReal value( size ); + value = value / KATMillion; + line.Format( _L(" %.1f"), value ); + line.Append( _L(" ") ); + line.Append( KATMB ); + } + else + { + line.Copy( _L(" ") ); + line.AppendNum( size ); + line.Append( _L(" ") ); + line.Append( KATB ); + } + } + else + { + LimitedAppend ( line, _L( "unavailable" ) ); + } + Print( line ); + + // Print max. allocations + line = _L(" "); + LimitedAppend ( line, _L( "Max. allocations: " ) ); + // Append curr. allocs + if ( maxErr == KErrNone ) + line.AppendNum( maxNumber ); + + Print( line ); + line = _L(" "); + if ( maxErr == KErrNone ) + { + if ( size >= KATThousand && size < KATMillion ) // kiloByte range + { + TReal value( maxSize ); + value = value / KATThousand; + line.Format( _L(" %.1f"), value ); + line.Append( _L(" ") ); + line.Append( KATKB ); + } + else if ( size >= KATMillion ) // megaByte range + { + TReal value( maxSize ); + value = value / KATMillion; + line.Format( _L(" %.1f"), value ); + line.Append( _L(" ") ); + line.Append( KATMB ); + } + else + { + line.Copy( _L(" ") ); + line.AppendNum( maxSize ); + line.Append( _L(" ") ); + line.Append( KATB ); + } + } + else + { + LimitedAppend ( line, _L( "unavailable") ); + } + Print( line ); + + // Print starting time + line = _L(" "); + LimitedAppend ( line, _L( "Process started:") ); + Print( line ); + line = _L(" "); + TTime time( iCurrentProcessInfo.iStartTime ); + TBuf<50> dateString; + _LIT( KDateString3,"%D%M%Y%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%:3%+B" ); + time.FormatL( dateString, KDateString3 ); + LimitedAppend ( line, dateString ); + Print( line ); + + // Print logging mode + line = _L(" "); + LimitedAppend ( line, _L( "Logging mode:") ); + Print( line ); + line = _L(" "); + if ( KErrNone == loggingErr ) + { + if ( EATUseDefault == loggingMode ) + { + LimitedAppend ( line, _L( "External" ) ); + } + else if ( EATLogToFile == loggingMode ) + { + LimitedAppend ( line, _L( "Internal" ) ); + } + else if ( EATLogToXti == loggingMode ) + { + LimitedAppend ( line, _L( "External" ) ); + } + else if( EATLoggingOff == loggingMode ) + { + LimitedAppend ( line, _L( "None" ) ); + } + } + else + { + LimitedAppend ( line, _L( "unavailable" ) ); + } + Print(line); + + // Print mode information (UDEB/UREL) + line = _L(" "); + LimitedAppend ( line, _L( "Mode:") ); + Print( line ); + line = _L(" "); + TUint32 isUdeb; + TInt udebErr = iMain->StorageServer().GetUdebL( iProcessId, isUdeb ); + if ( KErrNone == udebErr ) + { + if ( isUdeb > KErrNone ) + { + LimitedAppend ( line, _L( "UDEB" ) ); + } + else + { + LimitedAppend ( line, _L( "UREL" ) ); + } + } + else + { + LimitedAppend ( line, _L( "unavailable" ) ); + } + Print( line ); + + // Print logging file information + line = _L(" "); + LimitedAppend ( line, _L( "Logging file:") ); + Print( line ); + line = _L(" "); + TBuf8 fileName; + TInt fileErr = iMain->StorageServer().GetLoggingFileL( iProcessId, fileName ); + if ( KErrNone == fileErr ) + { + if ( fileName.Length() > KErrNone ) + { + TBuf unicodeFile; + CnvUtfConverter::ConvertToUnicodeFromUtf8( unicodeFile, fileName ); + LimitedAppend ( line, unicodeFile ); + } + else + { + LimitedAppend ( line, _L( "None" ) ); + } + } + else + { + LimitedAppend ( line, _L( "unavailable" ) ); + } + Print( line ); + + line = _L("\n"); + Print( line ); + + // Print process info menu + TInt cursor( KErrNone ); + while ( cursor <= ( TInt )ECancelLoggingTxtItem - 1 ) // -1, dyninitmenupane + { + line.Zero(); + if ( cursor == 0 && iMain->IsSubTestRunning( iProcessId ) == KErrNotFound ) + { + AppendBefore( cursor, line ); + LimitedAppend ( line, _L( "Start subtest") ); + // Print the line + Print( line ); + } + else if ( cursor == 0 && iMain->IsSubTestRunning( iProcessId ) > KErrNotFound ) + { + AppendBefore( cursor, line ); + LimitedAppend ( line, _L( "Stop subtest") ); + // Print the line + Print( line ); + } + else if ( cursor == 1 ) + { + AppendBefore( cursor, line ); + LimitedAppend ( line, _L( "View libraries") ); + // Print the line + Print( line ); + } + else if ( cursor == 2 ) + { + AppendBefore( cursor, line ); + LimitedAppend ( line, _L( "End process") ); + // Print the line + Print( line ); + } + else if ( cursor == 3 ) + { + AppendBefore( cursor, line ); + LimitedAppend ( line, _L( "Kill process") ); + // Print the line + Print( line ); + } + else if ( cursor == 4 ) + { + AppendBefore( cursor, line ); + LimitedAppend ( line, _L( "Cancel logging") ); + // Print the line + Print( line ); + } + cursor++; + } + texts.Close(); + } + else if ( iShowLibraries && !iSetLoggingMode ) + { + ViewLibrariesL(); + } + else if ( !iShowLibraries && iSetLoggingMode ) + { + SetLoggingModeL(); + } + + } + +// ----------------------------------------------------------------------------- +// CProcessInfoView::SelectL() +// Process keypresses in menu. +// ----------------------------------------------------------------------------- +// +CView* CProcessInfoView::SelectL( TKeyCode aSelection, TBool& aContinue ) + { + MapKeyCode( aSelection ); + + if( ( aSelection == EKeyRightArrow || + aSelection == EKeyEnter ) ) + { + if ( !iSetLoggingMode ) + { + if( iPositionOnScreen == EStartSubtestTxtItem ) + { + if ( iMain->IsSubTestRunning( iProcessId ) == KErrNotFound ) + iMain->SetProcessSubTestStart( iProcessId ); + else + iMain->SetProcessSubTestStop( iProcessId ); + return NULL; + } + else if( iPositionOnScreen == EViewLibrariesTxtItem - 1 ) + { + iShowLibraries = ETrue; + return NULL; + } + else if( iPositionOnScreen == EEndProcessTxtItem - 1 ) + { + EndProcessL( ETryToEnd ); + // Trying to end process -> go processes view + return iParent; + } + else if( iPositionOnScreen == EKillProcessTxtItem - 1 ) + { + EndProcessL( ETryToKill ); + // Trying to kill process -> go processes view + return iParent; + } + else if( iPositionOnScreen == ECancelLoggingTxtItem - 1 ) + { + iMain->StorageServer().CancelLogging( iProcessId ); + return iParent; + } + else + { + return this; + } + } + else if ( iSetLoggingMode ) + { + return NULL; + } + } + + return CView::SelectL( aSelection, aContinue ); + } + +// ----------------------------------------------------------------------------- +// CProcessInfoView::ViewLibrariesL() +// Prints libraries loaded by current process. +// ----------------------------------------------------------------------------- +// +void CProcessInfoView::ViewLibrariesL() + { + // Clear display + iConsole->ClearScreen(); + // Print menu title + Print( _L( "Loaded libraries:") ); + + TBuf line; + // Loaded libraries for this process + RArray< TBuf8 > libraries; + iMain->StorageServer().GetLoadedDllsL( iCurrentProcessInfo.iProcessId, libraries ); + TInt lCount = libraries.Count(); + for ( TInt count = 0 ; count < lCount ; count++ ) + { + TBuf library; + library.Copy( libraries[ count ] ); + line = _L(" "); + LimitedAppend ( line, library ); + Print(line); + } + libraries.Close(); + } + + +// ----------------------------------------------------------------------------- +// CProcessInfoView::SetLoggingModeL() +// Prints logging modes which user wants to select to current process. +// ----------------------------------------------------------------------------- +// +void CProcessInfoView::SetLoggingModeL() + { + // Clear display + iConsole->ClearScreen(); + // Print menu title + Print( _L( "Logging mode:") ); + + // Update pos screen + if ( iPositionOnScreen > 2 ) + iPositionOnScreen = 0; + else if ( iPositionOnScreen < 0 ) + iPositionOnScreen = 2; + + TBuf line; + + // Print logging modes + TInt cursor( KErrNone ); + while ( cursor <= 2 ) // Three items + { + line.Zero(); + if ( cursor == 0 ) + { + AppendBefore( cursor, line ); + LimitedAppend ( line, _L( "External") ); + // Print the line + Print( line ); + } + else if ( cursor == 1 ) + { + AppendBefore( cursor, line ); + LimitedAppend ( line, _L( "Internal") ); + // Print the line + Print( line ); + } + else if ( cursor == 2 ) + { + AppendBefore( cursor, line ); + LimitedAppend ( line, _L( "None") ); + // Print the line + Print( line ); + } + cursor++; + } + } + +// ----------------------------------------------------------------------------- +// CProcessInfoView::EndProcessL() +// Ends process with a specific method. +// ----------------------------------------------------------------------------- +// +void CProcessInfoView::EndProcessL( TInt aCommand ) + { + RProcess endProcess; + TUint processId = iProcessId; + TBuf processName; + processName.Copy( Name() ); + 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 == ETryToEnd ) + { + endProcess.Close(); + RWsSession wsSession; + TInt wsErr = wsSession.Connect(); + if ( KErrNone == wsErr ) + { + TApaTaskList apList = TApaTaskList( wsSession ); + TApaTask apTask = apList.FindApp( processName ); + if ( apTask.Exists() ) + { + apTask.EndTask(); + } + wsSession.Close(); + } + + } + else if ( aCommand == ETryToKill ) + { + endProcess.Kill( KErrNone ); + endProcess.Close(); + } + } + } + +// End of file