--- /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 <es_prot.h>
+#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<TBTProtocol> 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