diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/linkmgr/physicallinksmanager.h --- /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 + +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* 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 iPinRequesters; + mutable RArray 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 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 iListeners; + + // role change control variables + TSglQue 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