--- /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