bluetooth/btstack/avdtp/avdtp.h
changeset 0 29b1cd4cb562
--- /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 <es_prot.h>
+#include <bt_sock.h>
+#include <bluetoothav.h>
+#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 <es_prot_internal.h>
+
+// 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<CTransportChannel>	iTransportChannels;
+	TDblQue<CTransportChannel>	iClosingTransportChannels;
+
+	TDblQue<CSignallingChannel>	iSignallingChannels;
+	// no closing signalling channel tracking as they perform immediate shutdowns
+
+	TDblQue<CAVStream>			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<CAvdtpSAP>  		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