bluetooth/btexample/test/TestConsole/BTTestHelpers.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btexample/test/TestConsole/BTTestHelpers.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,498 @@
+// Copyright (c) 2005-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:
+//
+
+#ifndef BTTESTHELPERS_H_
+#define BTTESTHELPERS_H_
+
+#include <e32std.h>
+#include <e32cons.h>
+#include <e32base.h>
+#include <e32test.h>
+#include <f32file.h>
+
+#include <bt_sock.h>
+
+
+// L2CAP DEBUG P&S
+const TUint KUidBluetoothDebugPubSubKeyBase = 0x10272368; //	Range of 550 values registered
+
+
+// L2CAP debug P&S key values.
+const TUint KPropertyKeyBluetoothL2CapDebugBase = (KUidBluetoothDebugPubSubKeyBase + 0);
+
+const TUint KPropertyKeyBluetoothBasePDUAlloc	= (KUidBluetoothDebugPubSubKeyBase + 0x00);
+const TUint KPropertyKeyBluetoothBasePDUDel		= (KUidBluetoothDebugPubSubKeyBase + 0x01);
+const TUint KPropertyKeyBluetoothBasePDUPeak	= (KUidBluetoothDebugPubSubKeyBase + 0x02);
+
+const TUint KPropertyKeyBluetoothBFrameAlloc	= (KUidBluetoothDebugPubSubKeyBase + 0x10);
+const TUint KPropertyKeyBluetoothBFrameDel		= (KUidBluetoothDebugPubSubKeyBase + 0x11);
+const TUint KPropertyKeyBluetoothBFramePeak		= (KUidBluetoothDebugPubSubKeyBase + 0x12);
+const TUint KPropertyKeyBluetoothIFrameAlloc	= (KUidBluetoothDebugPubSubKeyBase + 0x20);
+const TUint KPropertyKeyBluetoothIFrameDel		= (KUidBluetoothDebugPubSubKeyBase + 0x21);
+const TUint KPropertyKeyBluetoothIFramePeak		= (KUidBluetoothDebugPubSubKeyBase + 0x22);
+const TUint KPropertyKeyBluetoothSFrameAlloc	= (KUidBluetoothDebugPubSubKeyBase + 0x30);
+const TUint KPropertyKeyBluetoothSFrameDel		= (KUidBluetoothDebugPubSubKeyBase + 0x31);
+const TUint KPropertyKeyBluetoothSFramePeak		= (KUidBluetoothDebugPubSubKeyBase + 0x32);
+const TUint KPropertyKeyBluetoothCFrameAlloc	= (KUidBluetoothDebugPubSubKeyBase + 0x40);
+const TUint KPropertyKeyBluetoothCFrameDel		= (KUidBluetoothDebugPubSubKeyBase + 0x41);
+const TUint KPropertyKeyBluetoothCFramePeak		= (KUidBluetoothDebugPubSubKeyBase + 0x42);
+const TUint KPropertyKeyBluetoothGFrameAlloc	= (KUidBluetoothDebugPubSubKeyBase + 0x50);
+const TUint KPropertyKeyBluetoothGFrameDel		= (KUidBluetoothDebugPubSubKeyBase + 0x51);
+const TUint KPropertyKeyBluetoothGFramePeak		= (KUidBluetoothDebugPubSubKeyBase + 0x52);
+const TUint KPropertyKeyBluetoothDataFrameAlloc	= (KUidBluetoothDebugPubSubKeyBase + 0x60);
+const TUint KPropertyKeyBluetoothDataFrameDel	= (KUidBluetoothDebugPubSubKeyBase + 0x61);
+const TUint KPropertyKeyBluetoothDataFramePeak	= (KUidBluetoothDebugPubSubKeyBase + 0x62);
+const TUint KPropertyKeyBluetoothFragFrameAlloc	= (KUidBluetoothDebugPubSubKeyBase + 0x70);
+const TUint KPropertyKeyBluetoothFragFrameDel	= (KUidBluetoothDebugPubSubKeyBase + 0x71);
+const TUint KPropertyKeyBluetoothFragFramePeak	= (KUidBluetoothDebugPubSubKeyBase + 0x72);
+
+const TUint KPropertyKeyBluetoothSDUAlloc		= (KUidBluetoothDebugPubSubKeyBase + 0x80);
+const TUint KPropertyKeyBluetoothSDUDel			= (KUidBluetoothDebugPubSubKeyBase + 0x81);
+const TUint KPropertyKeyBluetoothSDUPeak		= (KUidBluetoothDebugPubSubKeyBase + 0x82);
+
+const TUint KPropertyKeyBluetoothMuxerAlloc		= (KUidBluetoothDebugPubSubKeyBase + 0x90);
+const TUint KPropertyKeyBluetoothMuxerDel		= (KUidBluetoothDebugPubSubKeyBase + 0x91);
+const TUint KPropertyKeyBluetoothMuxerPeak		= (KUidBluetoothDebugPubSubKeyBase + 0x92);
+
+const TUint KPropertyKeyBluetoothLSAPAlloc		= (KUidBluetoothDebugPubSubKeyBase + 0xa0);
+const TUint KPropertyKeyBluetoothLSAPDel		= (KUidBluetoothDebugPubSubKeyBase + 0xa1);
+const TUint KPropertyKeyBluetoothLSAPPeak		= (KUidBluetoothDebugPubSubKeyBase + 0xa2);
+
+const TUint KPropertyKeyBluetoothASAPAlloc		= (KUidBluetoothDebugPubSubKeyBase + 0xb0);
+const TUint KPropertyKeyBluetoothASAPDel		= (KUidBluetoothDebugPubSubKeyBase + 0xb1);
+const TUint KPropertyKeyBluetoothASAPPeak		= (KUidBluetoothDebugPubSubKeyBase + 0xb2);
+
+const TUint KPropertyKeyBluetoothPSAPAlloc		= (KUidBluetoothDebugPubSubKeyBase + 0xc0);
+const TUint KPropertyKeyBluetoothPSAPDel		= (KUidBluetoothDebugPubSubKeyBase + 0xc1);
+const TUint KPropertyKeyBluetoothPSAPPeak		= (KUidBluetoothDebugPubSubKeyBase + 0xc2);
+
+const TUint KPropertyKeyBluetoothCommandAlloc	= (KUidBluetoothDebugPubSubKeyBase + 0xd0);
+const TUint KPropertyKeyBluetoothCommandDel		= (KUidBluetoothDebugPubSubKeyBase + 0xd1);
+const TUint KPropertyKeyBluetoothCommandPeak	= (KUidBluetoothDebugPubSubKeyBase + 0xd2);
+
+const TUint KPropertyKeyBluetoothL2DBGGetTimerGrpCID	= (KUidBluetoothDebugPubSubKeyBase + 0x100);
+const TUint KPropertyKeyBluetoothL2DBGSetTimerGrpCID	= (KUidBluetoothDebugPubSubKeyBase + 0x101);
+
+const TUint KPropertyKeyBluetoothL2DBGMinPDUGetTime		= (KUidBluetoothDebugPubSubKeyBase + 0x110);
+const TUint KPropertyKeyBluetoothL2DBGMaxPDUGetTime		= (KUidBluetoothDebugPubSubKeyBase + 0x111);
+
+const TUint KPropertyKeyBluetoothL2DBGMinPDUSentTime	= (KUidBluetoothDebugPubSubKeyBase + 0x112);
+const TUint KPropertyKeyBluetoothL2DBGMaxPDUSentTime	= (KUidBluetoothDebugPubSubKeyBase + 0x113);
+
+const TUint KPropertyKeyBluetoothL2DBGAvePDUGetTime		= (KUidBluetoothDebugPubSubKeyBase + 0x114);
+const TUint KPropertyKeyBluetoothL2DBGAvePDUSentTime	= (KUidBluetoothDebugPubSubKeyBase + 0x115);
+
+
+const TUint KPropertyKeyBluetoothQueuedSDUFlushedCounter		= (KUidBluetoothDebugPubSubKeyBase + 0x200);
+const TUint KPropertyKeyBluetoothPartialSentSDUFlushedCounter	= (KUidBluetoothDebugPubSubKeyBase + 0x201);
+const TUint KPropertyKeyBluetoothSentSDUFlushedCounter			= (KUidBluetoothDebugPubSubKeyBase + 0x202);
+const TUint KPropertyKeyBluetoothFlushedPDUMuxerResend			= (KUidBluetoothDebugPubSubKeyBase + 0x203);
+const TUint KPropertyKeyBluetoothFlushedPDUDataFlowResend		= (KUidBluetoothDebugPubSubKeyBase + 0x204);
+const TUint KPropertyKeyBluetoothFlushedPDUIFrame				= (KUidBluetoothDebugPubSubKeyBase + 0x205);
+const TUint KPropertyKeyBluetoothIncompleteErroredSDUReceived	= (KUidBluetoothDebugPubSubKeyBase +  0x206);
+
+
+
+class CBTTestConnection;
+class CBTTestConsole;
+
+
+class TBTQueuedBasebandEventNotification : public TBTBasebandEventNotification
+/**
+	Extends via aggregation public TBTBasebandEventNotification class to make it queue-able
+**/
+	{
+public:
+	TBTQueuedBasebandEventNotification(const TBTBasebandEventNotification& aEvent)
+		: TBTBasebandEventNotification(aEvent) {};
+
+public:
+	TSglQueLink iLink;
+	};
+
+class TConnProfile
+	{
+public:
+	enum TConnRole
+		{
+		ENone,
+		EMaster,
+		ESlave,
+		ENumRoles
+		};
+
+	enum TConnMode
+		{
+		EActive,
+		ESniff,
+		EPark,
+		EHold,
+		EExplicitActive,
+		ENumModes
+		};
+
+	enum TConnState
+		{
+		EConnIdle,
+		EConnListening,
+		EConnListeningAccept,
+		EConnAccepting,
+		EConnConnecting,
+		EConnConnected,
+		EConnDisconnected,
+		EConnServerDisconnected,
+		EConnFailed,
+		ENumStates
+		};
+
+
+	enum TDataState
+		{
+		EDataIdle,
+		EDataDialog1,
+		EDataDialog2,
+		EDataFailed,
+		EDataSend,
+		EDataRecv,
+		EDataRecvAny,
+		EDataSendReceive,
+		EDataSendOneShot,
+		EDataRecvOneShot,
+		ENumDataStates,
+		ERecvContinuationData
+		};
+
+	TConnProfile();
+
+
+	TInt		iPhyLinkIx;
+	TConnState	iState;
+	TConnRole	iRole;
+	TUint		iPackets;
+	TUint		iMaxSlots;
+	//TBTLinkMode	iMode;
+	TConnMode	iMode2;
+	TUint		iModeAllowed;
+	TBool		iSwitchAllowed;
+	TBool		iEncryption;
+	TDataState	iData;
+	TPoint		iDataCursor;
+
+	TInt		iAccepterIx;
+
+	TBool		iIsSocketBased;
+
+	TBTSockAddr	iRemoteBTAddr;
+	TInt 		iErrorCode;
+
+	TUint16		iSendingMTUSize;
+	TUint16		iRecvMTUSize;
+
+	TBool		iIsStreamProtocol;
+	TBool		iIsSCO;
+	TBool		iAutoSniffActive;
+
+	static const TDesC& StateName(TConnState aState);
+	static const TDesC& RoleName(TConnRole aState);
+	static const TDesC& ModeName(TBTLinkMode aState);
+	static const TDesC& ModeName(TConnProfile::TConnMode aState);
+	static const TDesC& DataStateName(TDataState aState);
+	};
+
+
+class CBTTestConnectionNotifier : public CActive
+	{
+public:
+	static CBTTestConnectionNotifier* NewL(CBTTestConnection & aParent);
+	static CBTTestConnectionNotifier* NewLC(CBTTestConnection & aParent);
+	CBTTestConnectionNotifier(CBTTestConnection & aParent);
+
+	void CancelRequests();
+	virtual ~CBTTestConnectionNotifier();
+
+	void RequestNotifications(TUint32 aNotifications, RBTPhysicalLinkAdapter & aPhyAdapter);
+
+private:
+	void DoCancel();
+	void RunL();
+
+	CBTTestConnection& iParent;
+	TBTBasebandEvent iEvent;
+	TBTBasebandEventNotification iNotification;
+	};
+
+
+class CBTTestConnection;
+
+// Thin handler class used to solver the issue of name clashes in BT API.
+class TBTTestConnectionSyncLinkHandler : public MBluetoothSynchronousLinkNotifier
+	{
+public:
+	TBTTestConnectionSyncLinkHandler(CBTTestConnection& aTestConnection) : iTestConnection(aTestConnection) {};
+
+	// MBluetoothSynchronousLinkNotifier definitions
+	inline void HandleSetupConnectionCompleteL(TInt aErr);
+	inline void HandleDisconnectionCompleteL(TInt aErr);
+	inline void HandleAcceptConnectionCompleteL(TInt aErr);
+	inline void HandleSendCompleteL(TInt aErr);
+	inline void HandleReceiveCompleteL(TInt aErr);
+
+private:
+	CBTTestConnection& iTestConnection;
+	};
+
+
+
+class CBTTestConnection : public CBase,
+                          public MBluetoothSocketNotifier,
+						  public MBluetoothPhysicalLinksNotifier,
+						  public MBluetoothPhysicalLinkMetricsObserver
+	{
+public:
+	enum TBTTestConnectionPanic
+		{
+		EBTConsoleNoSocketForSocketBasedConnection,
+		EBTConsoleShutdownCalledOnNonCBluetoothSocket,
+		EBTConsoleDisconnectCalledOnCBluetoothSocket,
+		EBTConsoleInvalidLowPowerMode,
+		EBTConsoleActivateActiveRequesterCalledOnCBluetoothSocket,
+		};
+
+	// METHODS
+	static CBTTestConnection* NewL(CBTTestConsole* aConsole, RSocketServ& aSocketServer);
+	static CBTTestConnection* NewLC(CBTTestConsole* aConsole, RSocketServ& aSocketServer);
+
+	CBTTestConnection(CBTTestConsole* aConsole, RSocketServ& aSocketServer);
+	virtual ~CBTTestConnection();
+
+	TInt CreateListeningSocket(TUint16 aPort, TDesC16 const& aProtocolName, TBTServiceSecurity & aSecurity, TBool aUseDefaultConfig);
+	TInt Accept(CBluetoothSocket& aListeningSocket);
+
+	TInt ConnectToPeer(TBTDevAddr &aAddr, TUint16 aPort, TDesC16 const& aProtocolName, TBTServiceSecurity & aSecurity, TBool aUseDefaultConfig);
+	TInt ConnectUsingBAP(TBTDevAddr &aAddr);
+
+	TInt SetupPhysAdapter();
+
+	void AcceptComplete(TInt result);
+	void UpdateProfileAcceptComplete();
+	void ConnectComplete(TInt result);
+	void ConnectBAPComplete(TInt result);
+
+	TInt ConfigureLink(TBool aUseIoctl);
+
+	TInt SendEchoRequest(TInt aPayloadSize);
+
+	void CancelAccept();
+	void CancelConnect();
+
+	void Close(RSocket& aSocket);
+	TInt ShutdownSocket(RSocket::TShutdown aShutdownType);
+	TInt DisconnectLink();
+	TInt IncreaseRTXTimer(TUint aTime);
+
+	void RequestNotification(TUint32 aNotification);
+	void OutputEventNotification(TBTBasebandEventNotification & aNotification);
+	void OutputOneShotEventNotification(TBTBasebandEventNotification & aNotification);
+	void CancelBasebandNotifyRequest();
+
+	TInt ChangeSupportedPacketTypes(TUint16 aPacketTypes);
+
+	TInt RoleChangeAllowed(TBool aAllowed);
+	TInt RequestRoleChange(TBTBasebandRole aRole);
+	TInt RequestAuthentication();
+
+	void StartACLData();
+	void StopACLData();
+
+	TBool SendComplete(TInt aIndex, TInt aStatus);
+	TBool RecvComplete(TInt aIndex, TInt aStatus, TInt aDataErr);
+
+	TInt RequestLPM(TConnProfile::TConnMode aLPM);
+	TInt SupportLPM(TBTLinkMode aLPM);
+	TInt PreventLPM(TBTLinkMode aLPM);
+	TInt RemoveLPMRequest();
+
+	TInt KillAllLinks(TInt aReason);
+	TInt KillLink(TInt aReason);
+
+	TInt ToggleAutoSniff();
+
+	TInt PassiveSCO();
+	TInt ActiveSCO(TBTDevAddr& aAddr);
+
+	TInt PassiveESCO();
+	TInt ActiveESCO(TBTDevAddr& aAddr);
+
+	TInt SendMTUIoctl(TBool aIsIncomingMTU, TUint16 aNewValue);
+	TInt SendPretendIncomingSduQFullIoctl(TBool aPretendIncomingSduQFull);
+	TInt GetChannelMode(TL2CapChannelMode& aMode);
+	TInt GetLocalPSM(TL2CAPPort& aPsm);
+
+	TInt RecvOneShotData();
+	//Send Data filled with 0123456789012... sequences
+	TInt SendOneShotData(TUint16 aDataSize);
+
+	//Receive part of data according buffer size aDataSize and check continuation in the mean time
+	TInt RecvContinuationData(TUint16 aDataSize);
+
+	TInt SetLocalModemStatus(TUint8 aModemStatus);
+	TInt RequestRFCommConfChgInd();
+
+	void StartPlmDisplayL();
+	void StopPlmDisplayL();
+
+	void StoreEvent(TBTBasebandEventNotification & aEvent);
+	TBool PrintEvents(TInt aCurrentEvent, TInt aNumEvents);
+	void ClearEventStore();
+	TInt PrintBTPhyConnections();
+	void StartLinkMonitorL();
+	void StopLinkMonitor();
+	void DoMonitor();
+
+	CBluetoothSocket& GetBTSocket() const { return *iBTSocket; };
+	TInt GetRemoteName(TNameEntry& aNameEntry);
+
+	// CBluetoothSocket MBluetoothSocketNotifier definitions
+	void HandleConnectCompleteL(TInt aErr);
+	void HandleAcceptCompleteL(TInt aErr);
+	void HandleShutdownCompleteL(TInt aErr);
+	void HandleSendCompleteL(TInt aErr);
+	void HandleReceiveCompleteL(TInt aErr);
+	void HandleIoctlCompleteL(TInt aErr);
+	void HandleActivateBasebandEventNotifierCompleteL(TInt aErr, TBTBasebandEventNotification& aEventNotification);
+
+	// MBluetoothPhysicalLinksNotifier definitions
+	void HandleCreateConnectionCompleteL(TInt aErr);
+	void HandleDisconnectCompleteL(TInt aErr);
+	void HandleDisconnectAllCompleteL(TInt aErr);
+
+	// MBluetoothSynchronousLinkNotifier definitions
+	void HandleSyncSetupConnectionCompleteL(TInt aErr);
+	void HandleSyncDisconnectionCompleteL(TInt aErr);
+	void HandleSyncAcceptConnectionCompleteL(TInt aErr);
+	void HandleSyncSendCompleteL(TInt aErr);
+	void HandleSyncReceiveCompleteL(TInt aErr);
+
+	// MBluetoothPhysicalLinkMetricsObserver definitions
+	void MbplmoRssiChanged(TInt8 aRssi);
+	void MbplmoLinkQualityChanged(TUint8 aLinkQuality);
+	void MbplmoFailedContactCounterChanged(TUint16 aFailedContactCounter);
+	void MbplmoTransmitPowerLevelChanged(TInt8 aTransmitPowerLevel);
+	void MbplmoError(TInt aError);
+
+	void ContinueDialog();
+	void DoSend(TUint8 aVal);
+	void DoRecv();
+	TInt CheckRecvData();
+
+	static TInt MonitorCB(TAny* aCBTTestConnection);
+
+	void Panic(TBTTestConnectionPanic aPanic);
+
+// ----------------------------------------------------------------------------
+//							DEBUG METHODS
+// ----------------------------------------------------------------------------
+#ifdef _DEBUG
+	TInt DataPlaneConfig();
+	TInt IssueManualFlush();
+#endif
+
+
+protected:
+private:
+
+// DATA
+public:
+	TConnProfile iProfile;
+	TUint iDataDialogCount;
+
+protected:
+	void ConstructL();
+private:
+	enum TCurrentIOCTL
+		{
+		EDontCare,
+		ERFCOMMConfigInd,
+		};
+
+	TTime iTime;
+
+	CBTTestConsole*				iParent;
+	RSocketServ&				iSocketServer;
+
+	CBTTestConnectionNotifier	iNotifier;
+
+	CBluetoothSocket*			iBTSocket;
+	CBluetoothPhysicalLinks*	iBTPhyLinks;
+	CBluetoothSynchronousLink*  iBTSyncLink;
+	TBTTestConnectionSyncLinkHandler iSyncLinkHandler;
+
+	RBTPhysicalLinkAdapter		iPhyLinkAdapter;
+
+	TBuf8<0xffff>				iRecvBuffer;
+	TBuf8<0xffff>				iSendBuffer;
+	TBuf8<0xffff>				iStreamRecvBuffer;
+
+	TBuf8<672>					iEchoDataBuffer;
+	TPckgBuf<TUint16>			i16bitIoctlBuffer;
+	TPckgBuf<TBool>				iBoolIoctlBuffer;
+	TSockXfrLength				iRecvBufferLength;
+	TL2CapConfigPkg 			iConfigPkg;
+
+	TSglQue<TBTQueuedBasebandEventNotification> iEventNotificationQueue;
+	TCurrentIOCTL				iCurrentIOCTL;
+
+	RBuf8 iCustomSendRecvBuffer;
+	//Record the last digit from the former sequence, initial value is -1
+	TInt iTailDigit;
+	//Count the total number of bytes received for each UDP transfer
+	TInt iTotalRecvByte;
+
+	TL2CAPSockAddr				iPeerSocketAddr;
+	TBool						iAutoSniff;
+	CPeriodic*					iPeriodic;
+	CBluetoothPhysicalLinkMetrics*		iMetrics;
+	CConsoleBase*				iMetricsConsole;
+	TUint						iLogTime;
+	};
+
+
+inline void TBTTestConnectionSyncLinkHandler::HandleSetupConnectionCompleteL(TInt aErr)
+	{
+	iTestConnection.HandleSyncSetupConnectionCompleteL(aErr);
+	}
+
+inline void TBTTestConnectionSyncLinkHandler::HandleDisconnectionCompleteL(TInt aErr)
+	{
+	iTestConnection.HandleSyncDisconnectionCompleteL(aErr);
+	}
+
+inline void TBTTestConnectionSyncLinkHandler::HandleAcceptConnectionCompleteL(TInt aErr)
+	{
+	iTestConnection.HandleSyncAcceptConnectionCompleteL(aErr);
+	}
+
+inline void TBTTestConnectionSyncLinkHandler::HandleSendCompleteL(TInt aErr)
+	{
+	iTestConnection.HandleSyncSendCompleteL(aErr);
+	}
+
+inline void TBTTestConnectionSyncLinkHandler::HandleReceiveCompleteL(TInt aErr)
+	{
+	iTestConnection.HandleSyncReceiveCompleteL(aErr);
+	}
+
+
+#endif