bluetooth/btstack/avctp/avctpPacketMgr.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/avctp/avctpPacketMgr.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,183 @@
+// Copyright (c) 2005-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:
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+
+/*
+ the incoming assembler owns a chain to try to preserve the idea to not allocate
+ the outgoing fragmenter owns the HOutboundSDU
+ 
+ the inbound one could change, but it may be ok to only transfer the MBufChain into the HInboundSDU when we are happy that
+ we have something worth holding onto on a queue
+ */
+
+#ifndef AVCTPPACKETMGR_H
+#define AVCTPPACKETMGR_H
+
+#include "avctppacket.h"
+
+// Forward declarations
+class CAvctpProtocol;
+class CAvctpTransport;
+class CPartialIncomingSdu;
+class CPartialOutgoingSdu;
+class HAvctpOutgoingSdu;
+class RMBufChain;
+class CAvctpPacketMgr;
+
+NONSHARABLE_CLASS(MAvctpSDUSender)
+	{
+public:
+	virtual void Write(HAvctpOutgoingSdu*& aOutgoingSdu, TInt aChannel) =0; 
+	virtual TInt WriteIpid(HAvctpOutgoingSdu*& aOutgoingSdu) =0; 
+	virtual TBool IsClearToSend(TInt aChannel) const =0;
+	};
+
+	
+/**
+This class helps the Mgr collect together the incoming packet fragments from a muxer
+*/
+NONSHARABLE_CLASS(CIncomingSduAssembler) : public CBase
+	{
+public:
+	static CIncomingSduAssembler* NewL(CAvctpPacketMgr& aMgr, TInt aChannel);
+	~CIncomingSduAssembler();
+
+	void Reset();	
+	void AddDataL(TAvctpStartHeaderInfo& aHeaderInfo, RMBufChain& aIncomingPdu);
+	
+private:
+	CIncomingSduAssembler(CAvctpPacketMgr& aMgr, TInt aChannel);
+	void ConstructL();
+	
+	void ProcessNormalPduL(RMBufChain& aIncomingPdu);
+	void ProcessStartPdu(TAvctpStartHeaderInfo& aHeaderInfo, RMBufChain& aIncomingPdu);
+	void ProcessContinuePdu(const TAvctpStartHeaderInfo& aHeaderInfo, RMBufChain& aIncomingPdu);
+	void ProcessEndPduL(const TAvctpStartHeaderInfo& aHeaderInfo, RMBufChain& aIncomingPdu);
+	
+private:
+	static const TInt	KAvctpNormalHeaderMask = 0xf3;
+	
+	CAvctpPacketMgr&	iMgr;
+	RMBufChain			iAccretingSdu;
+	TUint				iFragmentsReceived;
+	TAvctpStartHeaderInfo	iStartHeaderInfo;
+	
+	/** The spec mandates that Start and Continue fragments have the same length &
+	that End fragments have a equal or smaller size. NB it doesn't say the size
+	has to equal the current MTU
+	*/
+	TUint				iContinueFragmentSize;
+	TInt				iChannel;
+	};
+	
+
+/**
+This class helps the Mgr fragment the outgoing Sdus from a sap
+*/
+NONSHARABLE_CLASS(COutgoingSduFragmenter) : public CBase
+	{
+public:
+	enum TWriteState
+		{
+		ENormal,
+		EFragmenting,
+		};
+
+public:
+	static COutgoingSduFragmenter* NewL(CAvctpPacketMgr& aMgr, TInt aChannel);
+	~COutgoingSduFragmenter();
+
+	TBool HasData();
+	void Write(HAvctpOutgoingSdu*& aOutgoingSdu);
+	void CanSend();
+	void Reset();	
+	
+private:
+	COutgoingSduFragmenter(CAvctpPacketMgr& aMgr, TInt aChannel);
+	void ConstructL();
+	
+	TInt CountFragments(const RMBufChain& aSdu, TInt iMtuUsedToFragment) const;
+	void DoSendCurrentSDU();
+	void BeginSendingSdu(TInt aMtu);
+	void ContinueSendingSdu(TInt aMtu);
+	
+	TInt AddHeader(RMBufChain& aPdu, TInt aNumFragments);
+	
+	// Callbacks
+	void StartSendAsyncCallBack();
+	void CancelSendAsyncCallBack();
+	static TInt SendAsyncCallBack(TAny* aFragmenter);
+	
+	void CheckForCanSend();
+
+private:
+	CAvctpPacketMgr&		iMgr;	
+	
+	RMBufChain				iSduData;
+	TAvctpNormalHeaderInfo	iHeaderInfo;  // FIXME rename
+	TBTDevAddr				iAddr;
+	
+	TInt					iChannel;
+	TWriteState				iCurrentWriteState;
+	CAsyncCallBack*			iSendAsyncCallBack;	
+	};
+	
+
+	
+NONSHARABLE_CLASS(CAvctpPacketMgr) : public CBase,
+									 public MAvctpSDUSender
+	{
+public:
+	~CAvctpPacketMgr();
+	static CAvctpPacketMgr* NewL(CAvctpTransport& aMuxer, CAvctpProtocol& aProtocol);
+	
+	// From above
+	virtual void Write(HAvctpOutgoingSdu*& aOutgoingSdu, TInt aChannel); 
+	virtual TInt WriteIpid(HAvctpOutgoingSdu*& aOutgoingSdu); 
+	
+	// From the transport
+	void CanSend(TInt aChannel);
+	void SignalMuxerError(TInt aError,TUint aOperationMask);
+	TInt NewData(RMBufChain& aIncomingPdu, TInt aChannel);
+	TBool WouldLikeToSend();
+	
+	inline CAvctpTransport& Transport() const;
+	inline CAvctpProtocol& Protocol() const;
+	inline TBool IsClearToSend(TInt aChannel) const;
+	inline const TBTDevAddr& DevAddr() const;
+	
+private:
+	CAvctpPacketMgr(CAvctpTransport& aMuxer, CAvctpProtocol& aProtocol);
+	void ConstructL();
+	
+private:
+	CAvctpTransport&		iTransport;
+	CAvctpProtocol&			iProtocol;
+
+	TFixedArray<CIncomingSduAssembler*,2>	iIncomingAssemblers;
+	TFixedArray<COutgoingSduFragmenter*,2>	iOutgoingFragmenters;	
+
+	TUint					iIpidSdusSent;
+	};
+
+#include "avctppacketmgr.inl"
+
+#endif // AVCTPPACKETMGR_H 
+