bluetooth/btstack/linkmgr/physicallinksmanager.h
changeset 0 29b1cd4cb562
child 18 f8503e232b0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/linkmgr/physicallinksmanager.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,324 @@
+// Copyright (c) 2006-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 PHYSICALLINKSMANAGER_H_
+#define PHYSICALLINKSMANAGER_H_
+
+#include "MBtHostControllerEventInternalNotifier.h"
+#include "linkmuxer.h"
+#include "linkmgr.h"
+#include "bluetooth/physicallinksstate.h"
+#include "RegistryHelpers.h"
+#include "pairingscache.h"
+
+#include <bt_sock.h>
+
+static const TInt KBTBasebandConnectionArrayGranularity = 4;
+static const TInt KBTStateChangeSubscriberArrayGranularity = 2;
+
+class CBTBasebandModel;
+class CHCIFacade;
+class CBTSecMan;
+class RBTRegServ;
+class CPhysicalLink;
+class CBTProxySAP;
+class MPINCodeResponseHandler;
+class MLinkKeyResponseHandler;
+class MLogicalLink;
+
+struct TLogicalLinkListener;
+class CRoleSwitcher;
+class CRoleSwitcherStateFactory;
+
+NONSHARABLE_CLASS(TPageTimeoutController) : public MHCICommandQueueClient
+	{
+public:
+	TPageTimeoutController(MHCICommandQueue& aCommandQueue);
+	void Abort();
+
+	void WritePageTimeout(TBasebandTime aPageTimeout);
+
+private:	// events from MHCICommandQueueClient
+	virtual void MhcqcCommandEventReceived(const THCIEventBase& aEvent, const CHCICommandBase* aRelatedCommand);
+	virtual void MhcqcCommandErrored(TInt aErrorCode, const CHCICommandBase* aCommand);
+
+private:
+	void WritePageTimeoutL(TBasebandTime aPageTimeout);
+
+private:
+	MHCICommandQueue&	iCommandQueue;
+	TInt				iOutstandingCommands;
+	TInt				iLastCommandId;
+	};
+
+
+NONSHARABLE_CLASS(CBluetoothPrefetchManager)
+	: public CBase
+	, public MPINCodeResponseHandler
+	{
+public:
+	static CBluetoothPrefetchManager* NewL();
+	~CBluetoothPrefetchManager();
+
+	TInt HandleOverPinRequester(const TBTDevAddr& aAddr, CBTPinRequester* aPinRequester);
+	TInt RegisterForPrefetching(const TBTDevAddr& aAddr, MBluetoothPrefetchNotifier& aNotifier);
+
+	TBool IsPrefetchAvailable(const TBTDevAddr& aAddr, TBTPinCode& aPinCode);
+
+private:
+	NONSHARABLE_CLASS(RPinRequest)
+		{
+	friend class CBluetoothPrefetchManager;
+	public:
+		RPinRequest();
+		TInt Create(const TBTDevAddr& aAddr, CBTPinRequester* aPinRequester);
+		void AddNotifier(MBluetoothPrefetchNotifier& aNotifier);
+		TBool NotifiersWaiting() const;
+		void CompleteRequest(TInt aResult);
+
+	private:
+		TBTDevAddr							iAddr;
+		CBTPinRequester*					iPinRequester;
+		TDblQue<TPrefetchNotifierQLink>*	iNotifiers;
+		};
+
+	NONSHARABLE_STRUCT(TPrefetchedPin)
+		{
+		TBTDevAddr		iAddr;
+		TBTPinCode		iPin;
+		};
+
+private:
+	CBluetoothPrefetchManager();
+
+	static TBool CompareAddressInRequest(const TBTDevAddr* aDevAddr, const RPinRequest& aRequest);
+	static TBool CompareAddressInStore(const TBTDevAddr* aDevAddr, const TPrefetchedPin& aRequest);
+
+private: // from MPINCodeResponseHandler
+	TInt PINCodeRequestReply(const TBTDevAddr& aDevAddr, const TDesC8& aPin) const;
+	TInt PINCodeRequestNegativeReply(const TBTDevAddr& aDevAddr) const;
+
+private:
+	mutable RArray<RPinRequest>		iPinRequesters;
+	mutable RArray<TPrefetchedPin>	iPrefetchedPins;
+	};
+
+
+NONSHARABLE_CLASS(CPhysicalLinksManager) : public CBase,
+							  public MBtHostControllerEventInternalNotifier,
+							  public MBTPairingsCacheObserver
+/**
+	Manages CPhysicalLink objects.
+	One connections manager exists to take care of all CPhysicalLink objects.
+*/
+	{
+public:
+
+	static CPhysicalLinksManager* NewL(CLinkMgrProtocol& aLinkMgrProtocol,
+									   CHCIFacade& aHCIFacade,
+									   CRegistrySession& aRegSess,
+									   CBTSecMan& aSecMan,
+									   CBTCodServiceMan& aCodMan);
+	~CPhysicalLinksManager();
+	inline CBTSecMan& SecMan() const;
+	inline CBTCodServiceMan& CodMan() const;
+	inline CBTBasebandModel& Baseband() const;
+	CPhysicalLink& NewPhysicalLinkL(const TBTDevAddr& aDevice);			// factory function
+	CPhysicalLink& NewPhysicalLinkL(const TBTNamelessDevice& aDevice);	// factory function
+	void AuthenticateL(const TBTDevAddr& aBDAddr);
+	void EncryptL(const TBTDevAddr& aBDAddr);
+
+	void RemovePhysicalLink(const CPhysicalLink& aConnection);
+	TInt AddListener(MLogicalLink& aLogicalLink, TPhysicalLinkPort aPort);
+	void RemoveListener(MLogicalLink& aLogicalLink);
+	void ClearTerminatingProxy(CBTProxySAP* aProxySAP);
+	TInt TerminateAllPhysicalLinks(CBTProxySAP* aProxySAP);
+	TInt TerminatePhysicalLink(CPhysicalLink* aConnection, CBTProxySAP* aProxySAP);
+
+	void FatalError(TInt aErr);
+	void UpdateRemoteDevicesDetails();
+	TInt RefreshPairedBDAddrs();
+	
+	void SetAcceptPairedOnlyMode(TBool aOn);
+	void SetSimplePairingDebugMode(TBool aOn);
+	
+	void SimplePairingDebugModeChanged(TBool aOn);
+
+	inline TInt NumberOfPhysicalLinks() const;
+	void EnumeratePhysicalLinks(TDes8& aPackagedArray);
+	void DumpPhysicalLinks();
+	TBool IsAcceptPairedOnlyMode();
+	
+	void RequireSlotSpace();	// for HostResolver (or others) who need to reduce connection commitments
+	TBasebandTime TryToChangePageTimeout(TBasebandTime aPageTimeout);
+	
+	// role change methods to control locally initiated requests
+	void AddRoleSwitcher(CRoleSwitcher& aRoleSwitcher);
+	// This method must be called only from the D'tor of CRoleSwitcher	
+	void RemoveRoleSwitcher(CRoleSwitcher& aRoleSwitcher);
+	// to enable to generate BTBaseband event, RoleChange error in case of RoleChange
+	// command was 'not allowed' by HW
+	void RoleChangeRejectedByHW(THCIErrorCode aErr);
+	CRoleSwitcherStateFactory& RoleSwitcherStateFactory() const;
+	
+public:	
+			
+	
+// events from MBtHostControllerEventInternalNotifier
+	virtual void ConnectionComplete(THCIErrorCode aErr, const TBTConnect& aConn);
+	virtual void ConnectionRequest(const TBTConnect& aConn);
+	virtual void Disconnection(THCIErrorCode aErr, THCIConnHandle aConnH, THCIErrorCode aResult);
+	virtual void CompletedPackets(THCIConnHandle aConnH, TUint16 aNumPackets);
+	virtual void AuthenticationComplete(THCIErrorCode aErr, THCIConnHandle aConnH);
+	virtual void EncryptionChange(THCIErrorCode aErr, THCIConnHandle aConnH,TBool aEncrypted);
+	virtual void ACLDataReceived(THCIConnHandle aConnH, TUint8 aFlag, const TDesC8& aData);
+	virtual void SCODataReceived(THCIConnHandle aConnH, const TDesC8& aData);
+	virtual void SynchronousConnectionComplete(THCIErrorCode aErr, const TBTConnect& aConn, const TBTSyncConnectOpts& aSyncOpts);
+	virtual void PinRequest(const TBTDevAddr& aBDAddr, MPINCodeResponseHandler& aRequester);
+	virtual void NewLinkKey(const TBTDevAddr& aBDAddr, const TBTLinkKey& aLinkKey, THCILinkKeyType aLinkKeyType);
+	virtual void LinkKeyRequest(const TBTDevAddr& aBDAddr, MLinkKeyResponseHandler& aRequester);
+	virtual void ReadRemoteSupportedFeaturesComplete(THCIErrorCode aErr, THCIConnHandle aConnH, const TBTFeatures& aBitMask);
+	virtual void ReadRemoteExtendedFeaturesComplete(THCIErrorCode aErr, THCIConnHandle aConnH, TUint64 aBitMask, TUint8 aPageNumber, TUint8 aMaximimPageNumber);
+	virtual void ReadRemoteVersionInfoComplete(THCIErrorCode aErr, THCIConnHandle aConnH, const TBTDevRemoteHwVersion& aVer);
+	virtual void PacketTypeChange(THCIErrorCode aErr, THCIConnHandle aConnH, TUint16 aNewPacket);
+	virtual void LinkSupervisionTimeoutChange(THCIErrorCode aErr, THCIConnHandle aConnH, TUint16 aNewTimeout);
+	virtual void MaxSlotsChange(THCIConnHandle aConnH, TUint8 aSlots);
+	virtual void ModeChange(THCIErrorCode aErr, THCIConnHandle aConnH, TBTLinkMode aMode, TBasebandTime aInterval);
+	virtual void WriteLinkPolicySettingsCompleteEvent(THCIErrorCode aErr, THCIConnHandle aConnH);
+	virtual void RoleChange(THCIErrorCode aErr, const TBTDevAddr& aAddr, TBTBasebandRole aRole);
+	virtual void ClockOffset(THCIErrorCode aErr, THCIConnHandle aConnH, TBasebandTime aClockOffset);
+	virtual void RemoteName(THCIErrorCode aErr, const TBTDevAddr& aAddr, const TBTDeviceName8& aName);
+	virtual void SimplePairingComplete(const TBTDevAddr& aBDAddr, THCIErrorCode aErr);
+
+// events from MBTPairingsCacheObserver
+	virtual void MbpcoDeferredDecisionResolved(TInt aError);
+
+// Getters
+	inline CHCIFacade& HCIFacade() const;
+	inline CLinkMgrProtocol& LinkManagerProtocol() const;
+	inline CBTPairingsCache& PairingsCache() const;
+	inline CBluetoothPrefetchManager& PrefetchMan() const;
+
+	CPhysicalLink* FindPhysicalLink() const;	// mainly for finding random coonected PHY for proxy SAP
+	CPhysicalLink* FindPhysicalLink(THCIConnHandle aConnH) const; // mainly for LinkMgrProtocol
+	CPhysicalLink* FindPhysicalLink(const TBTDevAddr& aBDAddr) const;
+	TLogicalLinkListener* FindListener(TPhysicalLinkPort aPort);
+
+	TInt ChangeMode(TBTLinkMode aMode, THCIConnHandle aConnHandle);
+	TInt ExitMode(TBTLinkMode aMode, THCIConnHandle aConnHandle);
+	TInt ChangeRole(TBTBasebandRole aRole, CPhysicalLink& aPhysicalLink);
+	TInt Encrypt(TBool aEnable, CPhysicalLink& aPhysicalLink);
+	
+	TBool ActiveConnectRoleSwitchAllowed() const;
+	TBool PassiveConnectBecomeMaster() const;
+	TBool RoleSwitchAllowed() const;
+	
+	void ArbitrateAllPhysicalLinks();
+
+	TInt GetConnectionHandles(RHCIConnHandleArray& aConnectionHandles, TLinkType aLinkType) const;
+	TInt GetNumPendingHandles(TInt& aConnectionHandles, TLinkType aLinkType) const;
+	TInt GetConnectionHandles(RHCIConnHandleArray& aConnectionHandles, TLinkType aLinkType, const TBTDevAddr& aBDAddr) const;
+	TInt GetNumPendingHandles(TInt& aConnectionHandles, TLinkType aLinkType, const TBTDevAddr& aBDAddr) const;
+	TInt GetRemoteAddress(TBTDevAddr& aBDAddr, THCIConnHandle aConnectionHandle) const;
+	TInt GetRemoteDeviceClass(TBTDeviceClass& aDeviceClass, const TBTDevAddr& aBDAddr) const;
+	TInt GetRemoteSupportedFeatures(TBTFeatures& aRemoteSupportedFeatures, const TBTDevAddr& aBDAddr) const;
+	TInt GetLinkPolicySettings(TLinkPolicy& aLinkPolicySettings, const TBTDevAddr& aBDAddr) const;
+	TInt GetBasebandLinkState(TBTBasebandLinkState& aBasebandLinkState, const TBTDevAddr& aBDAddr) const;
+
+private:
+
+	CPhysicalLinksManager(CLinkMgrProtocol& aLinkMgrProtocol,
+						  CHCIFacade& aHCIFacade,
+						  CRegistrySession& aRegSess, CBTSecMan& aSecMan, CBTCodServiceMan& aCodMan);
+	void ConstructL();
+	void CancelPendingConnections(THCIErrorCode aErr, const TBTConnect& aConn);
+	void DoConnectionRequestL(const TBTConnect& aConn);
+	static TBool ListenerMatch(const TLogicalLinkListener& aA, const TLogicalLinkListener& aB);
+	void UpdateTerminatingProxy(CBTProxySAP* aProxySAP);
+
+	TBasebandTime CheckPageTimeoutAgainstLSTO(TBasebandTime aPageTimeout);
+
+private:
+	RPointerArray<CPhysicalLink>	iPhysicalLinks;
+
+	CHCIFacade&						iHCIRequestHandler;
+	CRegistrySession&				iRegSess;	// we don't "own" an "access".
+	CBTSecMan&						iSecMan;
+	CBTCodServiceMan&				iCodMan;
+	CLinkMgrProtocol&				iLinkManagerProtocol;
+
+	CBTProxySAP*					iTerminatingProxy; // unowned
+	CPhysicalLink*					iTerminatingConnection; // unowned
+	
+	CBTBasebandModel*				iBaseband;
+	RArray<TLogicalLinkListener>	iListeners;
+
+	// role change control variables
+	TSglQue<CRoleSwitcher> 			iRoleSwitchersQ;
+	CRoleSwitcherStateFactory*		iRoleSwitcherStateFactory;
+	
+	TBool							iAcceptPairedOnlyMode;
+	CBTPairingsCache*				iPairingsCache;
+
+	TPageTimeoutController			iPageTimeoutController;
+	CBluetoothPrefetchManager*		iPrefetchMan;
+	};
+
+inline CLinkMgrProtocol& CPhysicalLinksManager::LinkManagerProtocol() const
+	{
+	return iLinkManagerProtocol;
+	}
+
+inline CHCIFacade& CPhysicalLinksManager::HCIFacade() const
+	{
+	return iHCIRequestHandler;
+	}
+
+inline CBTSecMan& CPhysicalLinksManager::SecMan() const
+	{
+	return iSecMan;
+	}
+
+inline CBTBasebandModel& CPhysicalLinksManager::Baseband() const
+	{
+	return *iBaseband;
+	}
+
+inline TInt CPhysicalLinksManager::NumberOfPhysicalLinks() const
+	{
+	return iPhysicalLinks.Count();
+	}
+
+inline CBTCodServiceMan& CPhysicalLinksManager::CodMan() const
+	{
+	return iCodMan;
+	}
+
+inline CBTPairingsCache& CPhysicalLinksManager::PairingsCache() const
+	{
+	return *iPairingsCache;
+	}
+
+inline CRoleSwitcherStateFactory& CPhysicalLinksManager::RoleSwitcherStateFactory() const
+	{
+	return *iRoleSwitcherStateFactory;
+	}
+
+inline CBluetoothPrefetchManager& CPhysicalLinksManager::PrefetchMan() const
+	{
+	return *iPrefetchMan;
+	}
+
+#endif //PHYSICALLINKSMANAGER