diff -r 2fefb5a2b416 -r f1fd07aa74c9 usbmgmt/usbmgrtest/t_ncm/src/setncmiapcommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usbmgmt/usbmgrtest/t_ncm/src/setncmiapcommand.cpp Wed Jul 07 14:16:40 2010 +0800 @@ -0,0 +1,308 @@ +/* +* 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 "setncmiapcommand.h" +#include "ncmtestconsole.h" + +_LIT(KSetNcmIapCommandDescription, "Set Ncm Iap ID"); + +CSetNcmIapCommand* CSetNcmIapCommand::NewL(CUsbNcmConsole& aTestConsole, TUint aKey) + { + LOG_STATIC_FUNC_ENTRY + + CSetNcmIapCommand* self = new(ELeave) CSetNcmIapCommand(aTestConsole, aKey); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } +CSetNcmIapCommand::~CSetNcmIapCommand() + { + EndWork(); + } + +CSetNcmIapCommand::CSetNcmIapCommand(CUsbNcmConsole& aTestConsole, TUint aKey) + : CNcmCommandBase(EPriorityStandard, aTestConsole, aKey) + { + CActiveScheduler::Add(this); + } + +void CSetNcmIapCommand::ConstructL() + { + SetDescription(KSetNcmIapCommandDescription()); + } + +void CSetNcmIapCommand::DoCommandL() +/** +Main function of set ncm iap. +It will start a new console to display all Iaps in commsdb and current setting for ncm. +Then prompt user to input ncm iap id and the index of this iap will be placed in central +repository. Press 'ESC' for give up this function. After the setting is successful, the +console will be destroyed and return to main console +*/ + { + LOG_FUNC + + if(!IsActive()) + { + //If the console has existed, close the old console. The work on old console will be + //gived up. + if(iConsole) + { + __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Close old console")); + EndWork(); + } + InitWorkL(); + + iConsole->Printf(_L("Press \'ESC\' to exit without change\n")); + + //Display all iaps in commsdb + ListAllNcmIapL(); + + //wait user input iap id + iConsole->Printf(KSetIapMemo()); + iCommandState = EIapId; + iConsole->Read(iStatus); + SetActive(); + } + } + +void CSetNcmIapCommand::ListAllNcmIapL() +/** +Display all iaps in commsdb on console and get current config in cental repoistory +*/ + { + LOG_FUNC + + //Display commsdb's iaps + TInt iapcount = iTestConsole.DrawAvailableIapsL(); + + TInt iapId = 0; + + //Get iap config from central repository + TInt err = iRepository->FindL(KPartialKey, KMask, iRows); + if(err == KErrNone) + { + TUint count = iRows.Count(); + for (TInt row = 0; row < count; ++row) + { + // Read each IAP ID + User::LeaveIfError(iRepository->Get(iRows[row], iapId)); + __FLOG_STATIC2(KSubSys, KLogComponent , _L8("index[%d]: iap = %d"), row, iapId); + iConsole->Printf(_L("index[%d]: iap = %d\n"), row, iapId); + } + } + else + { + __FLOG_STATIC1(KSubSys, KLogComponent , _L8("FindL() err[%d]"), err); + } + } + +void CSetNcmIapCommand::GetDefaultIapL(TInt& aDefaultIap) +/** +Get the default iap id (The first one) stored in central repository. +@return the default iap id +*/ + { + LOG_FUNC + aDefaultIap = 13; + return ; + } + +void CSetNcmIapCommand::SetNcmIapL() +/** +Set iap id into central repository. The iap id is iIapId. The place of iap id in central +repository is iIndex. iIndex is started from 0. If the iIndex is not exist in central +repository, iIapId will be placed at last place. +*/ + { + LOG_FUNC + + TUint count = iRows.Count(); + __FLOG_STATIC1(KSubSys, KLogComponent , _L8("now iap count = %d"), count); + + TInt idx; + if(iIndex >= count) + { + //iIndex is not exist in central repository, create a new entry in central repository + idx = iRows[count-1]+1; + User::LeaveIfError(iRepository->Create(idx, iIapId)); + __FLOG_STATIC2(KSubSys, KLogComponent , _L8("add iap: idx = %d, iIapId"), idx, iIapId); + } + else + { + //iIndex exists, just set in the new value + idx = iRows[iIndex]; + User::LeaveIfError(iRepository->Set(idx, iIapId)); + __FLOG_STATIC2(KSubSys, KLogComponent , _L8("set iap: aIdx = %d, iIapId"), idx, iIapId); + } + + } + +void CSetNcmIapCommand::RunL() + { + LOG_FUNC + __FLOG_STATIC1(KSubSys, KLogComponent , _L8("CSetNcmIapCommand::RunL - iStatus = %d"), iStatus.Int()); + + User::LeaveIfError(iStatus.Int()); + + TKeyCode code = iConsole->KeyCode(); + switch(code) + { + case EKeyEnter: + { + iConsole->Printf(_L("\n")); + + //get value + TInt val; + TBool typeErr = EFalse; + if(iChars.Length() != 0) + { + TLex lex(iChars); + lex.SkipSpaceAndMark(); + + if(KErrNone != lex.Val(val)) + { + typeErr = ETrue; + } + } + else + { + typeErr = ETrue; + } + + if(typeErr) + { + //Prompt user input again + iConsole->Printf(KErrInput()); + iConsole->Printf(KSetIapMemo()); + iChars.SetLength(0); + __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Input error")); + break; + } + + //The input is correct + __FLOG_STATIC1(KSubSys, KLogComponent , _L8("Get val = %d"), val); + + if(iCommandState == EIapId) + { + //if the command state is wait iap id, now get the iap id, wait for iap index + iIapId = val; + iChars.SetLength(0); + iConsole->Printf(KSetIapIndexMemo()); + iCommandState = EIapPriority; + } + else //(iCommandState == EIapPriority) + { + //if the command state is wait iap index, now the index. set into central repoistory. + //Then destroy the current console and update the value displayed on main console if the + //setting value is ncm default value. + iIndex = val; + SetNcmIapL(); + EndWork(); + if(iIndex == 0) + { + iTestConsole.SetLocalIapId(iIapId); + } + __FLOG_STATIC2(KSubSys, KLogComponent , _L8("Set Ncm Iap, idx = %d, id = %d"), + iIndex, iIapId); + + return; + } + } + break; + case EKeyEscape: + //delete this; + EndWork(); + return; + case EKeyBackspace: + if(iChars.Length() > 0) + { + iConsole->SetCursorPosRel(TPoint(-1, 0)); + iConsole->ClearToEndOfLine(); + iChars.SetLength(iChars.Length()-1); + } + break; + default: + iChars.Append(code); + iConsole->Printf(_L("%c"), code); + break; + } + iConsole->Read(iStatus); + SetActive(); + + } + +void CSetNcmIapCommand::DoCancel() + { + iConsole->ReadCancel(); + } + +TInt CSetNcmIapCommand::RunError(TInt aError) + { + User::Panic(_L("CSetNcmIapCommand"), aError); + return aError; + } + +void CSetNcmIapCommand::InitWorkL() +/** +Initialize work. Including start a new console, create buf for getting user input, get repoistory handle. +*/ + { + LOG_FUNC + + if(!iConsole) + { + iConsole = Console::NewL(_L("Set Ncm IAP Console"), TSize(-1,-1)); + __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Create Console ok!")); + + User::LeaveIfError(iChars.Create(KMaxNumOfChars)); + __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Create iChars ok!")); + + iRepository = CRepository::NewL(KNcmIapIdRepositoryUID); + __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Get CRepository ok!")); + + iIapId = 1; + iIndex = 0; + } + } + +void CSetNcmIapCommand::EndWork() +/** +Finalize work. Including delete console, delete the buf used for getting user input, close repoistory handle. +*/ + { + LOG_FUNC + + if(iConsole) + { + __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Destroy console...")); + Cancel(); + iChars.Close(); + iRows.Close(); + delete iRepository; + delete iConsole; + iConsole = NULL; + __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Destroy console ok!")); + } + } +