diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/avctp/avctpPacketMgr.h --- /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 iIncomingAssemblers; + TFixedArray iOutgoingFragmenters; + + TUint iIpidSdusSent; + }; + +#include "avctppacketmgr.inl" + +#endif // AVCTPPACKETMGR_H +