diff -r 2fefb5a2b416 -r f1fd07aa74c9 usbmgmt/usbmgrtest/t_ncm/src/commandengine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usbmgmt/usbmgrtest/t_ncm/src/commandengine.cpp Wed Jul 07 14:16:40 2010 +0800 @@ -0,0 +1,249 @@ +/* +* Copyright (c) 2002-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: +* +*/ + +/** @file + @internalComponent + @test + */ + +#include "commandengine.h" +#include "ncmtestconsole.h" + +CNcmCommandEngine* CNcmCommandEngine::NewL(CUsbNcmConsole& aTestConsole) +/** +Constructs a CNcmCommandEngine object. + @param aTestConsole The main console +*/ + { + LOG_STATIC_FUNC_ENTRY + CNcmCommandEngine* self = new(ELeave) CNcmCommandEngine(aTestConsole); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CNcmCommandEngine::~CNcmCommandEngine() + { + Cancel(); + RemoveAllCommand(); + } + +CNcmCommandEngine::CNcmCommandEngine(CUsbNcmConsole& aTestConsole) + : CActive(EPriorityStandard) + , iTestConsole(aTestConsole) + , iLastPage(0), iLastItem(-1), iRemainLine(COMMAND_MAX_COUNT_PER_PAGE) + { + CActiveScheduler::Add(this); + } + +void CNcmCommandEngine::ConstructL() + { + //wait user select command + iTestConsole.iConsole->Read(iStatus); + SetActive(); + } + +void CNcmCommandEngine::DoCancel() + { + iTestConsole.iConsole->ReadCancel(); + } + +void CNcmCommandEngine::RunL() + { + LOG_FUNC + + User::LeaveIfError(iStatus.Int()); + + TUint key = iTestConsole.iConsole->KeyCode(); + + __FLOG_STATIC1(KSubSys, KLogComponent , _L8("key = %c"), key); + + if((key >= '0') && (key <= '9')) + { + iTestConsole.ScheduleDraw(key-0x30); + } + else + { + CNcmCommandBase* command = NULL; + if(iCommandMap.Find(key)) + { + command = *(iCommandMap.Find(key)); + if(command) + { + command->DoCommandL(); + } + else + { + __FLOG_STATIC0(KSubSys, KLogComponent , _L8("The command in hashmap is NULL")); + } + } + else + { + CUsbNcmConsoleEvent* event = CUsbNcmConsoleEvent::NewL(); + event->iEvent.AppendFormat(_L("G:Unknown:Key[%c]"), key); + iTestConsole.NotifyEvent(event); + } + + } + iTestConsole.iConsole->Read(iStatus); + + SetActive(); + } + +void CNcmCommandEngine::RegisterCommand(CNcmCommandBase* aCommand) +/** +Add command object into command map + @param aCommand a command which will be used by user +*/ + { + //Assert if aCommand is NULL + __ASSERT_ALWAYS(aCommand, Panic(ENcmCommandIsNull)); + //Assert if the key exists in command map + __ASSERT_ALWAYS(!iCommandMap.Find(aCommand->Key()), Panic(ENcmCommandKeyExists)); + + //add command + TInt err = iCommandMap.Insert(aCommand->Key(), aCommand); + if(err != KErrNone) + { + User::Panic(_L("RegisterCommand"), err); + } + + //make the command to be displayed in which page, which line + TInt line = (aCommand->Description().Length() + NUM_CHARACTERS_ON_LINE + 4) / (NUM_CHARACTERS_ON_LINE); + iRemainLine -= line; + if(iRemainLine < 0) + { + iLastPage ++; + iRemainLine = COMMAND_MAX_COUNT_PER_PAGE - line; + iLastItem = 0; + } + else + { + iLastItem ++; + } + iCommandKeys[iLastPage][iLastItem] = aCommand->Key(); + + } + +void CNcmCommandEngine::RemoveAllCommand() +/** +Destroy all commands in command map +*/ + { + CNcmCommandBase* currentitem; + + RHashMap::TIter hashMapIter(iCommandMap); + TInt count = iCommandMap.Count(); + for(TInt i=0; i< count; i++) + { + currentitem = *(hashMapIter.NextValue()); + if(currentitem) + { + hashMapIter.RemoveCurrent(); + delete currentitem; + } + } + iCommandMap.Close(); + + } + + +void CNcmCommandEngine::PrintHelp(TInt aPage) +/** +Get command help info (command key - command description) +@param aPage the command help info of specified page +*/ + { + LOG_FUNC + + __ASSERT_ALWAYS(((aPage <= COMMAND_MAX_PAGE) && (aPage > 0)), Panic(ENcmArrayBound)); + + TUint key = iCommandKeys[aPage-1][0]; + if(key == 0) + { + //No commands in this page + iTestConsole.iConsole->Printf(_L("No commands\n")); + } + else + { + //Display command + TInt i = 0; + while((key != 0) && (i < COMMAND_MAX_COUNT_PER_PAGE)) + { + CNcmCommandBase* command = NULL; + command = *(iCommandMap.Find(key)); + iTestConsole.iConsole->Printf(_L("%c - %S\n"), command->Key(), &command->Description()); + i++; + key = iCommandKeys[aPage-1][i]; + } + } + + } + +CNcmCommandBase::CNcmCommandBase(TInt aPriority, CUsbNcmConsole& aConsole, TUint aKey) + : CActive(aPriority), iTestConsole(aConsole), iKey(aKey) +/** +Constructor +@param aPriority Active object's priority +@param aConsole The main console +@param aKey command key +*/ + { + } + +CNcmCommandBase::~CNcmCommandBase() + { + } + +TUint CNcmCommandBase::Key() const + { + return iKey; + } + +void CNcmCommandBase::SetKey(TUint aKey) + { + iKey = aKey; + } + + +const TDesC& CNcmCommandBase::Description() + { + return iDescription; + } + +void CNcmCommandBase::SetDescription(const TDesC& aDescription) +/** +Set command description +@param aDescription the new description for the command +*/ + { + iDescription.SetLength(0); + iDescription.Copy(aDescription.Left(NUM_CHARACTERS_ON_LINE)); + } +void CNcmCommandBase::RunL() + { + } + +void CNcmCommandBase::DoCancel() + { + } +TInt CNcmCommandEngine::RunError(TInt aError) + { + User::Panic(_L("CNcmCommandEngine"), aError); + return aError; + }