bluetooth/btstack/common/bt.h
changeset 0 29b1cd4cb562
child 45 99439b07e980
--- /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