usbmgmt/usbmgr/host/fdf/test/t_fdf/activeconsole.cpp
changeset 0 c9bc50fca66e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgr/host/fdf/test/t_fdf/activeconsole.cpp	Tue Feb 02 02:02:59 2010 +0200
@@ -0,0 +1,317 @@
+/*
+* Copyright (c) 2007-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 <e32twin.h>
+#include <e32svr.h>
+#include "activeconsole.h"
+#include "testbase.h"
+#include "tests.h"
+
+CActiveConsole::CActiveConsole(CConsoleBase& aConsole)
+ :	CActive(CActive::EPriorityStandard),
+	iConsole(aConsole)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CActiveConsole* CActiveConsole::NewLC(CConsoleBase& aConsole)
+	{
+	CActiveConsole* self = new(ELeave) CActiveConsole(aConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	self->DisplayMainMenu();
+	return self;
+	}
+
+void CActiveConsole::ConstructL()
+	{
+	// Launch of FDTest test.
+	iTest = gTestDefinitions[0].iFactoryL(*this);
+	}
+
+CActiveConsole::~CActiveConsole()
+	{
+	Cancel();
+
+	StopCurrentTest();
+	}
+
+void CActiveConsole::DoCancel()
+	{
+	iConsole.ReadCancel();
+	}
+
+void CActiveConsole::StopCurrentTest()
+	{
+	delete iTest;
+	iTest = NULL;
+	}
+
+void CActiveConsole::RunL()
+// Only process when we get a return, otherwise cache- i.e. support multi-character selections
+	{
+	DoActionKeyL(iConsole.KeyCode());
+
+	// Repost asynchronous request.
+	RequestCharacter();
+	}
+
+void CActiveConsole::DoActionKeyL(TKeyCode aKeyCode)
+	{
+	WriteNoReturn(_L8("%c"), aKeyCode);
+
+	// Examine the key that just came in.
+	switch ( TUint(aKeyCode) )
+		{
+	case EKeyEscape:
+		{
+		Write(_L8("Exiting"));
+		CActiveScheduler::Stop();
+		return;
+		}
+
+	case EKeyEnter:
+		// Tell the test about what's in the buffer so far, if anything.
+		Write(_L8("You entered \'%S\'"), &iInputBuffer);
+		switch ( iInputBuffer.Length() )
+			{
+		case 0:
+			// Don't pass anything on- nothing to pass on.
+			break;
+
+		case 1:
+			if ( 	iInputBuffer == _L8("S") 
+				||	iInputBuffer == _L8("s") 
+				)
+				{
+				StopCurrentTest();
+				}
+			else
+				{
+				// Tell the test via the old 'single character' interface.
+				// If there is a test, then let it process the key. If there isn't a 
+				// test, we process it to (possibly) create and run a new test object.
+				if ( iTest )
+					{
+					TRAPD(err, iTest->ProcessKeyL((TKeyCode)iInputBuffer[0]));
+					if ( err )
+						{
+						Write(_L8("CTestBase::ProcessKeyL left with %d"), err);
+						StopCurrentTest();
+						}
+					}
+				else
+					{
+					SelectTestL();
+					}
+				}
+			iInputBuffer = KNullDesC8();
+			break;
+		
+		default:
+			// Tell the test via the new 'multi character' interface.
+			// If there is a test, then let it process the key. If there isn't a 
+			// test, we process it to (possibly) create and run a new test object.
+			if ( iTest )
+				{
+				TRAPD(err, iTest->ProcessKeyL(iInputBuffer));
+				if ( err )
+					{
+					Write(_L8("CTestBase::ProcessKeyL left with %d"), err);
+					StopCurrentTest();
+					}
+				}
+			else
+				{
+				SelectTestL();
+				}
+			iInputBuffer = KNullDesC8();
+			break;
+			}
+		DisplayMainMenu();
+		break;
+
+	default:
+		iInputBuffer.Append(aKeyCode);
+		break;
+		}
+	}
+
+void CActiveConsole::RequestCharacter()
+	{
+	iConsole.Read(iStatus);
+	SetActive();
+	}
+
+void CActiveConsole::DisplayMainMenu()
+	{
+	Write(KNullDesC8);
+
+	// If there's a current test, display its step menu. Otherwise, display 
+	// all the available tests.
+	if ( iTest )
+		{
+		iTest->DisplayTestSpecificMenu();
+		Write(_L8("s - stop and close current test"));
+		}
+	else
+		{
+		const TUint numberOfTests = sizeof(gTestDefinitions) / sizeof(TTestDefinition);
+		for ( TUint ii = 0 ; ii < numberOfTests ; ii ++ )
+			{
+			Write(_L8("%d - %S"), ii, &gTestDefinitions[ii].iDescription);
+			}
+		}
+
+	Write(_L8("Escape - exit program"));
+	Write(KNullDesC8);
+ 	}
+
+void CActiveConsole::Write(TRefByValue<const TDesC8> aFmt, ...)
+	{
+	VA_LIST list;
+	VA_START(list, aFmt);
+
+	TBuf8<0x100> buf;
+	buf.AppendFormatList(aFmt, list);
+	TBuf<0x100> wideBuf;
+	wideBuf.Copy(buf);
+	iConsole.Write(wideBuf);
+	iConsole.Write(_L("\n"));
+
+	(void)RDebug::Print(wideBuf);
+	}
+
+void CActiveConsole::WriteNoReturn(TRefByValue<const TDesC8> aFmt, ...)
+	{
+	VA_LIST list;
+	VA_START(list, aFmt);
+
+	TBuf8<0x100> buf;
+	buf.AppendFormatList(aFmt, list);
+	TBuf<0x100> wideBuf;
+	wideBuf.Copy(buf);
+	iConsole.Write(wideBuf);
+
+	(void)RDebug::Print(wideBuf);
+	}
+
+TKeyCode CActiveConsole::Getch()
+	{
+	return iConsole.Getch();
+	}
+
+void CActiveConsole::SelectTestL()
+	{
+	StopCurrentTest();
+
+	// Pick a test out of the global array of tests.
+	const TUint numberOfTests = sizeof(gTestDefinitions) / sizeof (TTestDefinition);
+	TLex8 lex(iInputBuffer);
+	TUint index;
+	TInt err = lex.Val(index);
+
+	if (	err == KErrNone
+		&&	index < numberOfTests
+		)
+		{
+		iTest = gTestDefinitions[index].iFactoryL(*this);
+		}
+	else
+		{
+		Write(_L8("Unknown selection"));
+		}
+	}
+
+void CActiveConsole::TestFinished()
+/**
+ * Called by the test when it has finished. Results in the destruction of the 
+ * test.
+ */
+	{
+	StopCurrentTest();
+	}
+
+TInt CActiveConsole::RunError(TInt aError)
+/**
+ * Called by the Active Scheduler when a RunL in this active object leaves.
+ */
+	{
+	// This actually happens when a test object fails to construct properly.
+	Write(_L8("Error creating test object: %d"), aError);
+
+	iInputBuffer = KNullDesC8();
+	DisplayMainMenu();
+
+	// It's OK to carry on with the program itself, so repost asynchronous 
+	// request.
+	RequestCharacter();
+
+	return KErrNone;
+	}
+
+void CActiveConsole::GetNumberL(TUint& aNumber)
+	{
+	TBuf<12> addrAsText;
+	addrAsText.Zero();
+	if ( aNumber != 0 )
+		{
+		addrAsText.Format(_L("%d"), aNumber);
+		}
+	WriteNoReturn(_L8("Enter a number: "));
+	if ( addrAsText.Length() > 0 )
+		{
+		TBuf8<100> narrowBuf;
+		narrowBuf.Copy(addrAsText);
+		WriteNoReturn(narrowBuf);
+		}
+	TKeyCode code;
+	TBuf<1> character;
+	FOREVER
+		{
+		code = Getch();
+		character.SetLength(0);
+		character.Append(code);
+	
+		// If <CR> finish editing string
+		if (code == 0x0d)
+			break;
+		
+		// if <BS> remove last character
+		if ((code == 0x08)&&(addrAsText.Length() != 0))
+			{
+			WriteNoReturn(_L8("%S"),&character);
+			addrAsText.SetLength((addrAsText.Length()-1));
+			}
+		else
+			{
+			if (addrAsText.Length() < addrAsText.MaxLength())
+				{
+				WriteNoReturn(_L8("%S"),&character);
+				addrAsText.Append(code);
+				}
+			}
+		}
+	//now extract the new address from the string...
+	if( !addrAsText.Length() )
+		{
+		addrAsText.Append('0'); //null string causes TLex::Val to return an error
+		}
+	TLex lex(addrAsText);
+	TInt err = lex.Val(aNumber, EDecimal);
+	(void)User::LeaveIfError(err);
+	}