--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usbmgmt/usbmgrtest/t_ncm/src/ncmtestconsole.cpp Tue Aug 31 17:01:47 2010 +0300
@@ -0,0 +1,565 @@
+/*
+* 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 "ncmtestconsole.h"
+#include "ncmtestdefines.hrh"
+#include "commandengine.h"
+#include "devicewatcher.h"
+#include "servicewatcher.h"
+#include "ncmwatcher.h"
+#include "exitcommand.h"
+#include "setncmiapcommand.h"
+#include "simpancommand.h"
+#include "tcpcommand.h"
+
+#include <commdb.h>
+#include <commdbconnpref.h>
+#include <nifman.h>
+#include <es_enum.h>
+
+//#include <ncm/ncmuiinterfaces.h>
+using namespace UsbNcm;
+
+//The app parameter
+_LIT(KArgDemo, "DEMO");
+
+//Set the display item length
+//every display item has fixed length. It will be displayed screen permanently.
+//The details about how to use display item is in CUsbNcmConsole::DrawL()
+TInt gDisplayItemLength[] = {
+ DISPLAY_USB_SERVICE_STATE_LEN, //EUsbServiceStateItem
+ DISPLAY_USB_DEVICE_STATE_LEN, //EUsbDeviceStateItem
+ DISPLAY_NCM_CONN_STATE_LEN, //ENcmConnStatusItem
+ DISPLAY_NCM_CONN_IP_LEN, //ENcmConnIpItem
+ DISPLAY_UPLINK_CONN_STATE_LEN, //EUplinkConnStatusItem
+ DISPLAY_UPLINK_CONN_IP_LEN, //EUplinkConnIpItem
+ DISPLAY_NCM_BTPAN_LEN, //ENcmBtPanItem
+ DISPLAY_AGENT_STATE_LEN, //ENcmAgentStateItem
+ DISPLAY_AUTH_SETTING_LEN, //EAuthorisationSettingItem
+ DISPLAY_NCM_CONNECTION_STATE
+ };
+
+void Panic(TInt aPanic)
+ {
+ User::Panic(_L("NcmTestConsole"), aPanic);
+ }
+
+
+void RunConsoleL()
+ {
+ TInt cmdLineLength(User::CommandLineLength());
+ HBufC* cmdLine = HBufC::NewMaxLC(cmdLineLength);
+ TPtr cmdLinePtr = cmdLine->Des();
+ User::CommandLine(cmdLinePtr);
+
+ TLex args(*cmdLine);
+ // args are separated by spaces
+ args.SkipSpace();
+
+ TPtrC cmdToken = args.NextToken();
+ HBufC* tc = HBufC::NewLC(80);
+ *tc = cmdToken;
+
+ TBool isDemo = EFalse;
+
+ //Find if there is 'DEMO' or not.
+ while (tc->Length())
+ {
+ TInt pos = tc->FindF(KArgDemo);
+ if ( pos != KErrNotFound )
+ {
+ isDemo = ETrue;
+ break;
+ }
+
+ // next parameter
+ *tc = args.NextToken();
+ }
+ CleanupStack::PopAndDestroy(tc);
+ CleanupStack::PopAndDestroy(cmdLine);
+
+ CUsbNcmConsole* console = CUsbNcmConsole::NewLC(isDemo);
+ console->StartL();
+ CleanupStack::PopAndDestroy(console);
+ }
+
+TInt E32Main()
+ {
+ __UHEAP_MARK;
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+ CActiveScheduler* activeScheduler = new CActiveScheduler;
+ TInt err = KErrNoMemory;
+ if(cleanup && activeScheduler)
+ {
+ CActiveScheduler::Install(activeScheduler);
+ TRAP(err,RunConsoleL());
+ }
+ delete activeScheduler;
+ delete cleanup;
+ __UHEAP_MARKEND;
+ return err;
+ }
+
+CUsbNcmConsoleEvent* CUsbNcmConsoleEvent::NewL()
+ {
+ CUsbNcmConsoleEvent* self = new(ELeave) CUsbNcmConsoleEvent();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+
+ }
+
+CUsbNcmConsoleEvent::CUsbNcmConsoleEvent()
+ {
+ }
+
+CUsbNcmConsoleEvent::~CUsbNcmConsoleEvent()
+ {
+ iLink.Deque();
+ iEvent.Close();
+ }
+
+void CUsbNcmConsoleEvent::ConstructL()
+ {
+ User::LeaveIfError(iEvent.Create(NUM_CHARACTERS_ON_LINE-1));
+ }
+
+
+CUsbNcmConsole* CUsbNcmConsole::NewLC(TBool aDemo)
+/**
+Constructs a CUsbNcmConsole object.
+ @param aDemo Indicate start NCM control app and NCM automaticly or manually
+
+When iDemo is ETrue, means ncmtestconsole starts as a demo. It will ask user to set ncm iap and
+uplink iap.Then user can experience the NCM function by plug/unplug usb cable.
+*/
+ {
+ LOG_STATIC_FUNC_ENTRY
+
+ CUsbNcmConsole* self = new(ELeave) CUsbNcmConsole(aDemo);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CUsbNcmConsole::~CUsbNcmConsole()
+ {
+ LOG_FUNC
+
+ //If Ncm control app is not stopped, stop it.
+ //destroy all commands
+ delete iKeys;
+
+ //destroy event list
+ TDblQueIter<CUsbNcmConsoleEvent> iter(iEventList);
+ CUsbNcmConsoleEvent* event = NULL;
+ while((event = iter++) != NULL)
+ {
+ delete event;
+ }
+
+ //delete iStartWatcherCallback;
+
+ //destroy all watches
+ delete iSharedStateWatcher;
+ delete iDeviceWatcher;
+ delete iServiceWatcher;
+
+ iUsb.Close();
+
+ delete iConsole;
+
+ //Destroy all display items
+ for(TInt i=0; i<ELastItem; i++)
+ {
+ iDisplayArray[i].Close();
+ }
+ iDisplayArray.Close();
+
+ Cancel();
+
+ }
+
+CUsbNcmConsole::CUsbNcmConsole(TBool aDemo)
+ : CActive(EPriorityLow) // Low so all notifications that want to be serviced will be done first
+ , iHelp(EFalse)
+ , iDemo(aDemo)
+ , iEventList(_FOFF(CUsbNcmConsoleEvent, iLink))
+ {
+ CActiveScheduler::Add(this);
+ }
+
+void CUsbNcmConsole::ConstructL()
+ {
+ LOG_FUNC
+
+ //Init Display Item
+ iDisplayArray.ReserveL(ELastItem);
+ CreateDisplayItemL();
+
+ iConsole = Console::NewL(KUsbNcmConsoleTitle, TSize(-1,-1));
+ User::LeaveIfError(iUsb.Connect());
+ __FLOG_STATIC0(KSubSys, KLogComponent , _L8("iUsb.Connect() successful"));
+
+ //Init event list
+ for(TInt i=0; i< NUM_EVENT_ON_SCREEN; ++i)
+ {
+ CUsbNcmConsoleEvent* nullEvent = CUsbNcmConsoleEvent::NewL();
+ iEventList.AddFirst(*nullEvent);
+ }
+ __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Create event list successful"));
+
+
+ //Start watcher
+ //iDeviceWatcher = CDeviceWatcher::NewL(*this);
+ //iServiceWatcher = CServiceWatcher::NewL(*this);
+ // iUplinkConnectionWatcher = CUplinkWatcher::NewL(*this);
+
+ __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Create watchers successful"));
+
+ //create command engine
+ iKeys = CNcmCommandEngine::NewL(*this);
+
+ //add commands
+ CNcmCommandBase* command = NULL;
+
+ //the command to set ncm iap
+ command = CSetNcmIapCommand::NewL(*this, 'n');
+ iKeys->RegisterCommand(command);
+ //Get the default iap used by ncm
+ TInt defaultIap = 0;
+ ((CSetNcmIapCommand*)command)->GetDefaultIapL(defaultIap);
+ SetLocalIapId(defaultIap);
+
+ //the command to simulate PAN actvie/inactive
+ command = CSimPANCommand::NewL(*this, 'p');
+ iKeys->RegisterCommand(command);
+
+ //the command to create a connection from PC to H4 and make data transfer
+ command = CTcpCommand::NewL(*this, 'v', ETrue, ETrue);
+ iKeys->RegisterCommand(command);
+ //the command to create a connection from H4 to PC and make data transfer
+ command = CTcpCommand::NewL(*this, 'i', ETrue, EFalse);
+ iKeys->RegisterCommand(command);
+
+ command = CTcpCommand::NewL(*this , 'r', EFalse, ETrue);
+ iKeys->RegisterCommand(command);
+ command = CTcpCommand::NewL(*this , 's', EFalse, EFalse);
+ iKeys->RegisterCommand(command);
+
+ //here to add new command
+
+ //the command to quit
+ command = CExitCommand::NewL(*this, 'q');
+ iKeys->RegisterCommand(command);
+
+ //Monitor the status published by NCM agent
+ iSharedStateWatcher = CSharedStateWatcher::NewL(*this);
+ }
+
+void CUsbNcmConsole::StartL()
+ {
+ //Output the init state to screen
+ DrawL();
+ //Do StartWatcherCommand if 'demo' is the command parameter
+ if(iDemo)
+ {
+// iStartWatcherCallback->CallBack();
+ }
+ CActiveScheduler::Start();
+ }
+
+void CUsbNcmConsole::Stop() const
+ {
+ CActiveScheduler::Stop();
+ }
+
+void CUsbNcmConsole::DoCancel()
+ {
+ }
+
+void CUsbNcmConsole::RunL()
+ {
+ DrawL();
+ }
+
+TInt CUsbNcmConsole::RunError(TInt aError)
+ {
+ User::Panic(_L("CUsbNcmConsole"), aError);
+ return aError;
+ }
+
+void CUsbNcmConsole::ScheduleDraw(TUint aKey)
+/**
+Called by commands and monitors.To notify main console there's new infomation to show.
+ @param aKey Display type. '1'-'9' - display the command help
+ 'E' - display the events.
+ '0' - back from command help
+*/
+ {
+ iHelp = aKey;
+ if(!IsActive())
+ {
+ SetActive();
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete(status, KErrNone);
+ }
+ }
+
+RUsb& CUsbNcmConsole::Usb()
+ {
+ return iUsb;
+ }
+
+void CUsbNcmConsole::SetLocalIapId(TInt aId)
+/**
+Set the Ncm Iap which will be monitored and displayed on screen
+ @param aId The Ncm Iap Id
+*/
+ {
+ iLocalIapId = aId;
+ ScheduleDraw('E');
+ }
+
+void CUsbNcmConsole::NotifyEvent(CUsbNcmConsoleEvent* aEvent)
+/**
+Called by commands and monitors. To tell main console to display the new event.
+ @param aEvent Event reported by commands and monitors
+*/
+ {
+ //Console can't display a NULL event
+ __ASSERT_ALWAYS(aEvent, Panic(ENcmEventIsNull));
+ //Console can't display a string more than one line
+ __ASSERT_ALWAYS(aEvent->iEvent.Length() <= NUM_CHARACTERS_ON_LINE, Panic(ENcmEventLengthValid));
+
+ iEventList.AddFirst(*aEvent);
+ CUsbNcmConsoleEvent* theLastEvent = iEventList.Last();
+ delete theLastEvent;
+
+ ScheduleDraw('E');
+ }
+
+void CUsbNcmConsole::DrawL()
+/**
+Display all infomation on screen.
+There are two parts on the screen. One is permanent info. It will display all kinds of states such as USB device state,
+USB service state, NCM state, and so on. The other is event info show. It will display the events reported by monitors
+and commands. It also used to show command help when user need command help.
+*/
+ {
+ iConsole->ClearScreen();
+ // First line is the server version number
+ TVersionName versionName = iVersion.Name();
+ iConsole->Printf(_L(
+ // 1 2 3 4 5
+ // 12345678901234567890123456789012345678901234567890123
+ "Server Version: %S %S\n"
+ ),
+ &versionName, &iDisplayArray[EAuthorisationSettingItem]
+ );
+
+
+ iConsole->Printf(_L("Service: %S Device: %S\n"),
+ &iDisplayArray[EUsbServiceStateItem], &iDisplayArray[EUsbDeviceStateItem]);
+ iConsole->Printf(_L("NCM Iap:%2d state:%S IP:%S\n"),
+ iLocalIapId, &iDisplayArray[ENcmConnStatusItem], &iDisplayArray[ENcmConnIpItem]);
+ iConsole->Printf(_L("Active:%S NcmConnection:%S\n"),
+ &iDisplayArray[ENcmBtPanItem], &iDisplayArray[ENcmAgentStateItem]);
+ iConsole->Printf(_L("Ncm connection:%S\n"), &iDisplayArray[ENcmConnectionStateItem]);
+
+ if ((iHelp > 0) && (iHelp <=9))
+ {
+ iConsole->Printf(_L("Press 0 to quit help\n\n"));
+ //Display the command help
+ iKeys->PrintHelp(iHelp);
+ }
+ else
+ {
+ iConsole->Printf(_L("Press 1 to 9 to get menu help\n\n"));
+ //Display the event list
+ TDblQueIter<CUsbNcmConsoleEvent> iter(iEventList);
+ CUsbNcmConsoleEvent* event = NULL;
+ while((event = iter++) != NULL)
+ {
+ iConsole->Printf(event->iEvent.Left(NUM_CHARACTERS_ON_LINE-1));
+ iConsole->Printf(_L("\n"));
+ }
+ }
+ }
+
+
+void CUsbNcmConsole::CreateDisplayItemL()
+/**
+Init the display item.
+*/
+ {
+ for(TInt i = 0; i < ELastItem; i++)
+ {
+ RBuf buf;
+ iDisplayArray.AppendL(buf);
+ iDisplayArray[i].CreateL(gDisplayItemLength[i]);
+ }
+ }
+
+void CUsbNcmConsole::SetDisplayItem(TInt aIndex, TDes& aInfo)
+/**
+Called by commands and monitors to show the changed info in screen
+*/
+ {
+ //Prevent array is out of bound
+ __ASSERT_ALWAYS(((aIndex < ELastItem) && (aIndex >= 0)), Panic(ENcmDisplayItemVaild));
+
+ iDisplayArray[aIndex].SetLength(0);
+ iDisplayArray[aIndex].Copy(aInfo);
+
+ ScheduleDraw('E');
+ }
+
+TInt CUsbNcmConsole::LocalIapId() const
+ {
+ return iLocalIapId;
+ }
+
+const TDes& CUsbNcmConsole::GetDisplayItem(TInt aIndex)
+ {
+ //Prevent array is out of bound
+ __ASSERT_ALWAYS(((aIndex < ELastItem) && (aIndex >= 0)), Panic(ENcmDisplayItemVaild));
+
+ return iDisplayArray[aIndex];
+ }
+
+
+TInt CUsbNcmConsole::DoCommandCallback(TAny *aThisPtr)
+ {
+ CNcmCommandBase* command = static_cast<CNcmCommandBase*>(aThisPtr);
+ TRAPD(err,command->DoCommandL());
+ if(err != KErrNone)
+ {
+ User::Panic(_L("DoCommandCallback"), err);
+ }
+ return err;
+ }
+
+
+TInt CUsbNcmConsole::DrawAvailableIapsL()
+/**
+Display commsdb's iaps on console
+@return the count of iaps
+*/
+ {
+ LOG_FUNC
+ __FLOG_STATIC0(KSubSys, KLogComponent , _L8("CNcmTestUtil::DrawAvailableIapsL"));
+
+ iConsole->Printf(_L("CommDB IAPs:\n"));
+ iConsole->Printf(_L("ID: Name\n"));
+
+ //Get commsdb handle
+ CCommsDatabase* db = CCommsDatabase::NewL();
+ __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Get CommsDatabase ok"));
+ CleanupStack::PushL(db);
+
+ //Get Iap table infomation
+ CCommsDbTableView* iapTableView = db->OpenTableLC(TPtrC(IAP));
+ __FLOG_STATIC0(KSubSys, KLogComponent , _L8("OpenTableLC ok"));
+
+
+ TUint32 iapId;
+ TBuf<128> iapName;
+ TInt iapCount = 0;
+
+ for (TInt iapTableErr = iapTableView->GotoFirstRecord(); iapTableErr == KErrNone; iapTableErr = iapTableView->GotoNextRecord())
+ {
+ //Get every IAP
+ iapTableView->ReadTextL(TPtrC(COMMDB_NAME), iapName);
+ iapTableView->ReadUintL(TPtrC(COMMDB_ID), iapId);
+
+ __FLOG_STATIC2(KSubSys, KLogComponent , _L8("Read: %d: %S"), iapId, &iapName);
+
+ iConsole->Printf(_L("%d: %S\n"), iapId, &iapName);
+ iapCount++;
+ }
+
+ if (0 == iapCount)
+ {
+ iConsole->Printf(_L("No available IAP!\n"));
+ }
+
+ CleanupStack::PopAndDestroy(2); // iapTableView, db
+ return iapCount;
+
+ }
+
+TBool CUsbNcmConsole::AttachConnectionL(TInt aIap, RConnection& aConnection)
+/**
+Try to attach the connection specified by iIapId. If attach failed or no specified connection,return false
+*/
+ {
+ LOG_FUNC
+ __FLOG_STATIC1(KSubSys, KLogComponent , _L8("AttachConnectionL aIap=%d"), aIap);
+
+ TBool result = ETrue;
+ TUint count = 0;
+ //Get active connections
+ User::LeaveIfError(aConnection.EnumerateConnections(count));
+ __FLOG_STATIC2(KSubSys, KLogComponent , _L8("active connection count = %d, watch iap = %d"), count, aIap);
+
+ TBool hasConnection = EFalse;
+ for(TInt i = 1; i <= count; i++)
+ {
+ TPckgBuf<TConnectionInfo> info;
+ User::LeaveIfError(aConnection.GetConnectionInfo(i,info));
+ TUint32 id = info().iIapId;
+ __FLOG_STATIC2(KSubSys, KLogComponent , _L8("aIap=%d, id=%d"), aIap, id);
+
+ if(id == aIap)
+ {
+ hasConnection = ETrue;
+ //The connection is the connection specified by aIap
+ __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Got it!"));
+
+ //Attach the connection
+ TInt err = aConnection.Attach(info, RConnection::EAttachTypeMonitor);
+ if(err != KErrNone)
+ {
+ result = EFalse;
+ __FLOG_STATIC1(KSubSys, KLogComponent , _L8("Attach error[%d]"), err);
+ }
+ else
+ {
+ __FLOG_STATIC0(KSubSys, KLogComponent , _L8("Attach it!"));
+ }
+ break;
+ }
+ }
+
+ if(!hasConnection)
+ {
+ //connection not found;
+ __FLOG_STATIC0(KSubSys, KLogComponent , _L8("No connection found!"));
+ result = EFalse;
+ }
+
+ return result;
+
+ }