diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/avdtp/avdtp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btstack/avdtp/avdtp.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,199 @@ +// Copyright (c) 2003-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: +// Defines the avdtp protocol class +// +// + +/** + @file + @internalComponent +*/ + +#ifndef AVDTP_H +#define AVDTP_H + +#include +#include +#include +#include "secman.h" +#include "notification.h" +#include "bt.h" +#include "avdtpTransportSession.h" +#include "avdtpSEPCache.h" +#include "avdtpStream.h" +#include "avdtpLocalSEP.h" +#include "avdtpAllocators.h" +#include + +// Stream and Datagram I/f's are muturally exclusive. You can't have some sockets one +// time and some the other -- esock will always give presidence to stream. +// don't support graceful close +const TUint KAvdtpServiceInfo = KSIInOrder| + KSIDatagram| + KSICanReconnect; +#ifdef _OOM_TEST +const TInt KAvdtpIdleTimeout = 1000; +#undef __ASSERT_DEBUG +#define __ASSERT_DEBUG(c,p) +#else +const TInt KAvdtpIdleTimeout = 5000000; +#endif + +const TUid KAvdtpUID = {0x100095FE}; + +class CBTProtocolFamily; +class CLinkMgrProtocol; +class CBTInquiryMgr; +class CTransportChannel; +class CSignallingChannel; + +class CAvdtpSAP; +class CLogicalChannelFactory; +class CAVStream; +class CRemoteSEPCache; +class CAVStreamStateFactory; + +NONSHARABLE_CLASS(CAvdtpProtocol) : public CBluetoothProtocolBase + { +friend class CAvdtpSAP; + +public: + // export for protocol + + static CAvdtpProtocol* NewL(CBTSecMan& aSecMan, RBTControlPlane& aControlPlane, CBTCodServiceMan& aCodMan); + static CAvdtpProtocol* NewLC(CBTSecMan& aSecMan, RBTControlPlane& aControlPlane, CBTCodServiceMan& aCodMan); + // From CProtocolBase + // Factories + CServProviderBase* NewSAPL(TUint aSockType); + + void Close(); + void Open(); + void CloseNow(); + + // From ProtocolManager before all binding. + void InitL(TDesC &aTag); + // From Protocol Manager - after all binding + void StartL(); + // From higher protocol + void BindL(CProtocolBase* aProtocol, TUint aId); + void BindToL(CProtocolBase* aProtocol); // From Protocol Manager + + // Query functions + void Identify(TServerProtocolDesc* aDesc) const; + static void ProtocolIdentity(TServerProtocolDesc* aDesc); + + // bluetooth protocol overridden functions + TInt StartProtocolListening(); + + // Get a factory for the logical channels + + inline CLogicalChannelFactory& LogicalChannelFactory() const; + TInt SetPreauthorisation(const TBTDevAddr& aPreauthoriseAddress, TBool aSetPreauthorisation); + + void StreamCreated(CAVStream& aStream); + CAVStream* FindStream(const TAvdtpSockAddr& aAddr); + void RemoveStream(CAVStream& aStream); + inline const CAVStreamStateFactory& StreamStateFactory() const; + + CTransportChannel* GetTransportChannel(const TAvdtpSockAddr& aSockAddr, TBool aUseMux, + TTCID aRemotelyAssignedTTCID=KInvalidTCID); + CTransportChannel* FindMuxChannel(TTCID aTCID); + CSignallingChannel* GetSignallingChannel(const TBTDevAddr& aDevAddr); + CSignallingChannel* FindSignallingChannel(const TBTDevAddr& aDevAddr); + CSignallingChannel* FindListeningSignallingChannel(); + CSignallingChannel* CreateSignallingChannelForListening(); + void ConnectSignallingListeners(CSignallingChannel& aConnectedSignallingChannel); + CUserPlaneTransportSession* CreateUserPlaneSessionL(CAvdtpSAP& aSAP, + CAVStream& aStream, + TAvdtpTransportSessionType aType); + + virtual TInt BearerConnectComplete(const TBTDevAddr& aAddr, CServProviderBase* aSAP); + + void TransportChannelDown(CTransportChannel& aTransportChannel); + void TransportChannelClosing(CTransportChannel& aTransportChannel); + + void SignallingChannelDown(CSignallingChannel& aSignallingChannel); + + inline CRemoteSEPCache& RemoteSEPCache() const; + inline TSEIDManager& SEIDManager(); + + // secondary SAP management + + void AddSecondarySAP(CAvdtpSAP& aSecondarySAP); + CAvdtpSAP* GetSecondarySAP(); + + virtual TInt ControlPlaneMessage(TBTControlPlaneMessage aMessage, TAny* aParam); + +private: + CAvdtpProtocol(CBTSecMan& aSecMan, RBTControlPlane& aControlPlane, CBTCodServiceMan& aCodMan); + ~CAvdtpProtocol(); + void ConstructL(); + + CTransportChannel* CreateTransportChannelL(const TBTDevAddr& aAddr, TBool aMuxed); + + void QueIdleTimerEntry(); + void RemoveIdleTimerEntry(); + TBool ShouldClose(); + static TInt TryToClose(TAny* aProtocol); + void DestroySecondarySAPs(); + void DoStartAvdtpListeningL(); + +private: + // Singleton objects + CLogicalChannelFactory* iLogicalChannelFactory; + CAVStreamStateFactory* iStreamStateFactory; + + CRemoteSEPCache* iRemoteSEPCache; + TDeltaTimerEntry iIdleTimerEntry; + TBool iIdleEntryQueued; + + // List of TransportChannels (Direct and Mux) + TDblQue iTransportChannels; + TDblQue iClosingTransportChannels; + + TDblQue iSignallingChannels; + // no closing signalling channel tracking as they perform immediate shutdowns + + TDblQue iStreams; // to allow for U-plane sessions to find the stream they belong to + + TSEIDManager iSEIDManager; + // Q of SAPs waiting for a transport channel to attach to + TSglQue iSecondarySAPs; + + TBool iClosePending; + }; + + +inline CLogicalChannelFactory& CAvdtpProtocol::LogicalChannelFactory() const + { + return *iLogicalChannelFactory; + } + +inline CRemoteSEPCache& CAvdtpProtocol::RemoteSEPCache() const + { + return *iRemoteSEPCache; + } + +inline TSEIDManager& CAvdtpProtocol::SEIDManager() + { + return iSEIDManager; + } + +inline const CAVStreamStateFactory& CAvdtpProtocol::StreamStateFactory() const + { + return *iStreamStateFactory; + } + + +#endif