diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/common/bt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btstack/common/bt.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,214 @@ +// Copyright (c) 1999-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: +// Define the interface to the Bluetooth protocol module +// +// + +#ifndef BT_H +#define BT_H + +#include +#include "secman.h" +#include "debug.h" +#include "blogger.h" +#include "btsockettimer.h" +#include "codman.h" + +// This is the factory that ESOCK uses +class CBluetoothProtocolBase; +class CL2CAPProtocol; +class CRfcommProtocol; +class CBlogger; +class CIncomingConnectionListener; + +typedef TLinkType TPhysicalLinkPort; + +enum TBTControlPlaneMessage + { + EOverridePark, + EUndoOverridePark, + EArbitrateForNew, + EArbitrateForClosed, + EPresent, + EPreauthoriseDevice, // used for multiple SAPs operating in one usecase (eg AVRCP and GAVDP); + ESubscribePhysicalLink, + EUnsubscribePhysicalLink, + EOverrideLPMWithTimeout, + EOverrideLPM, + EUndoOverrideLPM, + ETryToAndThenPreventHostEncryptionKeyRefresh, + }; + +/** +Struct used for protocol control-plane message EPreauthoriseDevice, ECancelPreauthoriseDevice +Example: a headset may (in any order) connect AVCTP and AVDTP connections +We do not want to have the user see a double-authorise. +Care should be taken by protocol implementers when using this functionality +*/ +struct TOverrideAuthorise + { + TBTDevAddr iPreauthorisedRemoteAddress; + TInt iAuthorisingProtocol; // for checking + TInt iAuthorisingPort; // for checking + TBool iPreauthorise; + }; + +enum TPhysicalLinkPresent + { + EYes, // there is a non-parked, physical link to a device + EYesParked, // there is a physical link, but it is parked + ENo, // no physical link in place + ENoWay, // no physical link and no way to create one + }; + +enum TBluetoothFamilyPanic + { + EBTPrtProtocolCannotListen, + }; + +class MBluetoothControlPlaneToken + { +public: + static void Release(MBluetoothControlPlaneToken*& aToken); +private: + virtual void Release() = 0; + }; + +NONSHARABLE_CLASS(RBTControlPlane) + { +public: +// control-plane management + void AttachProtocolL(TInt aProtocolNum, CBluetoothProtocolBase& aProtocol); + void DetachProtocol(CBluetoothProtocolBase& aProtocol); + void Close(); + +// control-plane services + TInt ModifyPhysicalLink(TBTControlPlaneMessage aMessage, const TBTDevAddr& aAddr) const; + void TryToAndThenPreventHostEncryptionKeyRefresh(const TBTDevAddr& aAddr, MBluetoothControlPlaneToken*& aOutToken); + + TPhysicalLinkPresent PhysicalLinkPresent(const TBTDevAddr& aAddr) const; + TInt Preauthorise(TInt aTargetProtocolNum, + const TOverrideAuthorise& aSetPreauthorisation); + TInt SubscribePhysicalLink (MPhysicalLinkObserver& aObserver, TBTDevAddr aAddr) const; + TInt UnsubscribePhysicalLink(MPhysicalLinkObserver& aObserver, TBTDevAddr aAddr) const; +private: + CBluetoothProtocolBase* Protocol(TInt aProtocolNum) const; +private: + struct TBTProtocol + { + CBluetoothProtocolBase* iProtocol; // non-owned + TInt iProtocolNum; + }; + RArray iProtocols; + }; + +NONSHARABLE_CLASS(CBTProtocolFamily): public CProtocolFamilyBase + { +private: + CBTProtocolFamily(); +public: + static CBTProtocolFamily* NewL(); + virtual TInt Install(); + virtual TInt Remove(); + virtual CProtocolBase* NewProtocolL(TUint aSockType,TUint aProtocol); + virtual TUint ProtocolList(TServerProtocolDesc*& aProtocolList); + virtual void Open(); // must always override Open and Close together + virtual void Close(); + static TInt Destruct(TAny* aProtocolFamily); // callback + ~CBTProtocolFamily(); +private: + void ConstructL(); +private: + CBTSecMan* iSecurityMgr; // owned by family for all protocols + SBtTls iBTTls; + CAsyncCallBack* iCallback; + RBTControlPlane iControlPlane; + TInt iBTRefCount; + CBTCodServiceMan* iCodServiceMan; + }; + +NONSHARABLE_CLASS(CBluetoothProtocolBase) : public CProtocolBase +/** + Abstract class forming the base classes for all Bluetooth protocol objects + + Provides the basics such as listening and security +**/ + { +public: + virtual TInt BearerConnectComplete(const TBTDevAddr& aAddr, CServProviderBase* aSSP) =0; + virtual TInt ControlPlaneMessage(TBTControlPlaneMessage aMessage, TAny* aParam); + + virtual TInt StartProtocolListening(); + virtual void StopProtocolListening(); + + inline CBTSecMan& SecMan() const; + inline RBTControlPlane& ControlPlane() const; + inline TBool IsListening() const; + inline CIncomingConnectionListener& Listener() const; + inline CProtocolBase* LowerProtocol() const; + inline CBTCodServiceMan& CodMan() const; + + TInt IncrementListeners(); // called by any object that is prepared to listen at layer n + void DecrementListeners(); // called by any object that is prepared to listen at layer n + virtual void Error(TInt aError,CProtocolBase* aSourceProtocol=NULL); + +protected: + CBluetoothProtocolBase* iLowerProtocol; + CIncomingConnectionListener* iListener; + +protected: + TInt StartListening(TUint aPort, TUint aSockType, TUint aQueSize, TUid aUid); + CBluetoothProtocolBase(CBTSecMan& aSecMan, RBTControlPlane& aControlPlane, CBTCodServiceMan& aCodMan); + ~CBluetoothProtocolBase(); + +private: + void DoStartListeningL(TUint aPort, TUint aSockType, TUint aQueSize, TUid aUid); +private: + CBTSecMan& iSecMan; + RBTControlPlane& iControlPlane; + TInt iListeningEntities; + CBTCodServiceMan& iCodMan; + }; + +inline CBTSecMan& CBluetoothProtocolBase::SecMan() const + { + return iSecMan; + } + +inline RBTControlPlane& CBluetoothProtocolBase::ControlPlane() const + { + return iControlPlane; + } + +inline TBool CBluetoothProtocolBase::IsListening() const + { + return(iListeningEntities > 0); + } + +inline CProtocolBase* CBluetoothProtocolBase::LowerProtocol() const + { + return iLowerProtocol; + } + +inline CIncomingConnectionListener& CBluetoothProtocolBase::Listener() const + { + return *iListener; + } + +inline CBTCodServiceMan& CBluetoothProtocolBase::CodMan() const + { + return iCodMan; + } + +#endif