--- /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 <e32base.h>
+#include <e32cons.h>
+#include <e32svr.h>
+#include <utf.h>
+#include <apgtask.h>
+#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<TDesC> 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<KMaxLineLength> line;
+
+ // Clear display
+ iConsole->ClearScreen();
+
+ // Print menu title
+ Print( Name() );
+
+ RArray<TDesC> 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<TDesC>& aArray )
+ {
+
+ TInt count = iItems.Count();
+ for( TInt i=0; i<count; i++ )
+ {
+ TBuf<50> 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<TDesC>& 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<TDesC>& /*aArray*/ )
+ {
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// CProcessInfoView::PrintViewL()
+// Prints process info view.
+// -----------------------------------------------------------------------------
+//
+void CProcessInfoView::PrintViewL( TUpdateType /*aType*/ )
+ {
+ if ( !iShowLibraries && !iSetLoggingMode )
+ {
+ // Get module names
+ RArray<TATProcessInfo> 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<TDesC> 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<KMaxLineLength> 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<KMaxFileName> fileName;
+ TInt fileErr = iMain->StorageServer().GetLoggingFileL( iProcessId, fileName );
+ if ( KErrNone == fileErr )
+ {
+ if ( fileName.Length() > KErrNone )
+ {
+ TBuf<KMaxFileName> 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<KMaxLineLength> line;
+ // Loaded libraries for this process
+ RArray< TBuf8<KMaxLibraryName> > libraries;
+ iMain->StorageServer().GetLoadedDllsL( iCurrentProcessInfo.iProcessId, libraries );
+ TInt lCount = libraries.Count();
+ for ( TInt count = 0 ; count < lCount ; count++ )
+ {
+ TBuf<KMaxLibraryName> 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<KMaxLineLength> 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<KMaxProcessName> 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