bluetooth/btstack/avdtp/avdtpTransportSession.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/avdtp/avdtpTransportSession.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,223 @@
+// 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 transport session base class
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#ifndef TRANSPORTSESSION_H
+#define TRANSPORTSESSION_H
+
+#include <es_mbuf.h>
+#include <bt_sock.h>
+#include <bluetoothav.h>
+#include "avdtpAllocators.h"
+
+class CUserPlaneTransportSession;
+class CTransportSession;
+class CTransportChannel;
+class CAvdtpProtocol;
+class CAvdtpSAP;
+class CAVStream;
+
+NONSHARABLE_STRUCT(TTransportBinding)
+	{
+	CUserPlaneTransportSession* iSession;
+	CTransportChannel* iChannel;
+	};
+
+
+// starting off life as RMBufChain - move to RAvdtpMessage later..
+// but actually it's only muxchannel that needs to do stuff!
+// so might be best for the pool to reatin just mbufchains and
+// for muxchannel to prepend mux data later
+static const TUint KDefaultPacketPool = 8;
+
+NONSHARABLE_CLASS(RPacketPool)
+	{
+public:
+	RPacketPool();
+	TInt Create(TUint aSize, TBool aBalk);
+	TInt Add(RMBufChain& aChain, TInt& aWrappedChainSize);
+	TInt Remove(RMBufChain& aReturnedMBufChain);
+	TInt SetCeiling(TInt aCeiling);
+	void Close();
+	TInt Resize(TUint aSize);
+	inline TBool CanBalk() const;
+	inline TInt Count() const;
+	inline void SetBalking(TBool aNewBalkSetting);
+private:
+	inline TInt OldestIndex() const;
+	TInt AllocatePool(TUint aSize);
+	void AllocatePoolL(TUint aSize);
+	void CreateEntryL();
+	void DestroyEntry(TUint aIndex);
+	
+private:
+	RArray<RMBufChain>		iPool;
+	TUint					iNewestIndex; // the position at which last inbound chain assigned
+	TUint					iOldestIndex;
+	TBool					iBalk;	// if false, wrapping occurs
+	};
+
+inline TBool RPacketPool:: CanBalk() const
+	{
+	return iBalk;
+	}
+	
+inline TInt RPacketPool::Count() const
+	{
+	return iPool.Count();
+	}
+	
+inline void RPacketPool::SetBalking(TBool aNewBalkSetting)
+	{
+	iBalk = aNewBalkSetting;
+	}
+
+NONSHARABLE_CLASS(CTransportSession) : public CBase
+/**
+	Intended for derivation by all stream bearers
+	Where there is clear generality the base class provides implementations
+	However this class can't begin to think what to do on some downcalls so
+	it mandates that derivers implement these
+	
+*/
+	{
+public:
+	virtual TInt ActiveOpen()=0;
+	virtual TInt SetOption(TUint aLevel, TUint aName, const TDesC8 &aOption);
+	virtual TInt GetOption(TUint aLevel, TUint aName, TDes8& aOption) const;
+	virtual void Ioctl(TUint aLevel, TUint aName, const TDesC8* aOption);
+	virtual void CancelIoctl(TUint aLevel, TUint aName);
+	virtual void Start();
+	virtual void Shutdown();
+	virtual void FastShutdown();
+	virtual TInt Send(RMBufChain& aData, TUint aOptions, TSockAddr* aAddr)=0;
+	virtual TInt GetData(RMBufChain& aData)=0;
+	void Ready(const TBTDevAddr& aRemoteAddr); //addr passed cos possibly passive
+	inline TBTDevAddr RemoteAddress() const;
+	inline TAvdtpTransportSessionType SessionType() const;
+	inline void SetRemoteAddress(const TBTDevAddr& aSockAddr);
+	
+	void LocalName(TAvdtpSockAddr& aAddr) const;
+	void RemName(TAvdtpSockAddr& aAddr) const;
+	TInt SetLocalName(TAvdtpSockAddr& aAddr);
+	TInt SetRemoteName(TAvdtpSockAddr& aAddr);
+	~CTransportSession();
+	
+protected:
+	CTransportSession(CAvdtpProtocol& aProtocol,
+					  CAvdtpSAP& aSAP,
+					  TAvdtpTransportSessionType aType);
+	void ConstructL();
+	inline TSEID SEID() const;
+	inline void SetSEID(TSEID aSEID);
+protected:
+	CAvdtpSAP&			iSAP; // our (parent) SAP
+	CAvdtpProtocol&		iProtocol;
+protected:
+	enum TAvdtpSAPShutdownReceived
+		{
+		ENone,
+		ENormal,
+		EImmediate,
+		};
+	virtual void DoShutdown()=0;
+	TAvdtpSAPShutdownReceived	iSAPShutdown;
+private:
+	// private to stop derivers playing around with session type later
+	TAvdtpSockAddr		iAddress;
+	};
+	
+
+NONSHARABLE_CLASS(CUserPlaneTransportSession) : public CTransportSession 
+	{
+public:
+	inline TTSID TSID() const;
+	inline TSEID SEID() const;
+	void ChannelError(TInt aError);	// informs stream, which may call back into error
+	virtual void StreamError(TInt aError);	// default just passes to sap
+	virtual void StreamReleased();
+	virtual TInt Send(RMBufChain& aData, TUint aOptions, TSockAddr* aAddr)=0;
+	virtual TInt GetData(RMBufChain& aData);
+	virtual void CanSend()=0;
+	virtual void ReceivePacketLost();
+	
+//	void NewData(TUint aCount);
+	void NewData(RMBufChain& aChain);
+	virtual TInt ActiveOpen();
+protected:	
+	CUserPlaneTransportSession(CAvdtpProtocol& aProtocol,
+					  CAvdtpSAP& aSAP,
+					  TAvdtpTransportSessionType aType,
+					  CAVStream& aStream);
+	void ConstructL();
+	~CUserPlaneTransportSession();
+	void LeaveTransportChannel();
+	
+	virtual TInt DoActiveOpen()=0;	// could bring this into this class
+	virtual void DoShutdown();
+protected:
+	RTSID				iTSID;
+	RPacketPool			iReceivePool;
+	RPacketPool			iSendPool;
+	CAVStream*			iStream; // the stream we're part of, may become NULL
+	CTransportChannel*	iTransportChannel; //non-owned
+	TBool				iTransportChannelBlocked;
+	TInt				iRemainingDataInChannel;
+	};
+
+
+inline TAvdtpTransportSessionType CTransportSession::SessionType() const
+	{
+	return iAddress.Session();
+	}
+	
+
+inline TSEID CTransportSession::SEID() const
+	{
+	return iAddress.SEID();
+	}
+
+inline void CTransportSession::SetSEID(TSEID aSEID)
+	{
+	iAddress.SetSEID(aSEID);
+	}
+
+inline TSEID CUserPlaneTransportSession::SEID() const
+	{
+	return CTransportSession::SEID();
+	}
+
+inline TTSID CUserPlaneTransportSession::TSID() const
+	{
+	return iTSID.TSID();
+	}
+
+inline TBTDevAddr CTransportSession::RemoteAddress() const
+	{
+	return iAddress.BTAddr();
+	}
+	
+inline void CTransportSession::SetRemoteAddress(const TBTDevAddr& aDevAddr)
+	{
+	iAddress.SetBTAddr(aDevAddr);
+	}
+	
+#endif //TRANSPORTSESSION_H