diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/avctp/avctppacket.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btstack/avctp/avctppacket.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,185 @@ +// 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: +// Provides the AVCTP Packet classes +// +// + +/** + @file + @internalComponent +*/ + +#ifndef AVCTPPACKET_H +#define AVCTPPACKET_H + +#include + +#include "avctpconstants.h" +#include "avctppacketstatics.h" + +// Forward definitions +class TAvctpHeaderInfo; +class TAvctpNormalHeaderInfo; +class TAvctpStartHeaderInfo; + +class RMBufChain; + +NONSHARABLE_CLASS(CAvctpPacket) : public CBase +/** +Static methods to help parse an AVCTP packet. + + @internalComponent +*/ + { +public: + static TInt ParseHeader(const RMBufChain& aData, TAvctpStartHeaderInfo& aHeaderInfo); + static TPtrC8 GetHeader(const RMBufChain& aChain); + + static TInt ParseNormalHeader(const TDesC8& aData, TAvctpNormalHeaderInfo& aHeaderInfo); + static TInt ParseStartHeader(const TDesC8& aData, TAvctpStartHeaderInfo& aHeaderInfo); + + static TInt CheckNormalHeaderInfo(const TAvctpNormalHeaderInfo& aHeaderInfo); + static TInt CheckStartHeaderInfo(const TAvctpStartHeaderInfo& aHeaderInfo); + + }; + + +/** +Contains the common information given in all AVCTP packet headers +@internalComponent. + +This class by itself represents the headers of Continue and End +packets. +*/ +NONSHARABLE_CLASS(TAvctpHeaderInfo) + { +public: + inline TAvctpHeaderInfo(); + inline TAvctpHeaderInfo(SymbianAvctp::TTransactionLabel aTransactionLabel, + SymbianAvctp::TPacketType aPktType, + SymbianAvctp::TMessageType aMsgType); + inline SymbianAvctp::TPduHeaderLength HeaderLength() const; + +public: + SymbianAvctp::TTransactionLabel iTransactionLabel; + SymbianAvctp::TPacketType iPktType; + SymbianAvctp::TMessageType iMsgType; + }; + +/** +Contains the information given in a AVCTP normal packet header +@internalComponent +*/ +NONSHARABLE_CLASS(TAvctpNormalHeaderInfo) : public TAvctpHeaderInfo + { +public: + inline TAvctpNormalHeaderInfo(); + inline TAvctpNormalHeaderInfo(SymbianAvctp::TTransactionLabel aTransactionLabel, + SymbianAvctp::TPacketType aPktType, + SymbianAvctp::TMessageType aMsgType, + TBool aHasValidPid, + SymbianAvctp::TPid aPid); +public: + TBool iHasValidPid; + SymbianAvctp::TPid iPid; + }; + +/** +Contains the information given in a AVCTP start packet header +@internalComponent +*/ +NONSHARABLE_CLASS(TAvctpStartHeaderInfo) : public TAvctpNormalHeaderInfo + { +public: + inline TAvctpStartHeaderInfo(); + inline TAvctpStartHeaderInfo(SymbianAvctp::TTransactionLabel aTransactionLabel, + SymbianAvctp::TPacketType aPktType, + SymbianAvctp::TMessageType aMsgType, + TBool aHasValidPid, + SymbianAvctp::TPid aPid, + TUint aFragmentsInSdu); +public: + TUint iFragmentsInSdu; + }; + +// Forward Declaration +class HAvctpIncomingSdu; +class TAvctpOutboundQ; + +/** +The sap uses this class to take owner ship of data coming down from esock +& que it. +*/ +NONSHARABLE_CLASS(HAvctpOutgoingSdu) + { +friend class TAvctpOutboundQ; // So it has access to iQueLink to do it's Q ordering & Dequeing +friend class CAvctpProtocol; // So it can Q the Sdus + +public: + static HAvctpOutgoingSdu* NewL(const TAvctpNormalHeaderInfo& aHeaderInfo, + const TBTDevAddr& aAddr, + RMBufChain& aData); + + static HAvctpOutgoingSdu* NewIpidResponseL(const HAvctpIncomingSdu& aIncomingSdu, TInt aChannel); + + ~HAvctpOutgoingSdu(); + + inline const TBTDevAddr& BTAddr() const; + inline TAvctpNormalHeaderInfo& HeaderInfo(); //non-const so fragmenter can update header + inline RMBufChain& Data(); + inline void AddToQueue(TAvctpOutboundQ* aOutboundQ); + inline TInt Channel() const; + +private: + inline HAvctpOutgoingSdu(const TAvctpNormalHeaderInfo& aHeaderInfo, + const TBTDevAddr& aAddr); + void ConstructL(RMBufChain& aData); + +private: + TDblQueLink iQueLink; + TAvctpNormalHeaderInfo iHeaderInfo; + TBTDevAddr iAddr; + RMBufChain iSduData; + + TAvctpOutboundQ* iOutboundQ; // unowned + // iChannel is only used to carry the channel for the IPID responses. + // in all the other cases (i.e. for normal writing) the right fragmenter is picked up based on the current channel. + // But IPID responses are generated by the protocol, asynchronously, so we save the channel value here. + TUint iChannel; + }; + +/** +The sap uses this class to take owner ship of data coming up from below +& que it. +*/ +NONSHARABLE_CLASS(HAvctpIncomingSdu) + { +friend class CAvctpSap; // So it can Q the Sdus + +public: + inline HAvctpIncomingSdu(const TBTDevAddr& aAddr, + RMBufChain& aSduData); + + inline ~HAvctpIncomingSdu(); + inline const TBTDevAddr& BTAddr() const; + inline const RMBufChain& Data() const; +private: + TBTDevAddr iAddr; + RMBufChain iSduData; // takes ownership of inbound chain + TDblQueLink iQueLink; + }; + +#include "avctppacket.inl" + +#endif // AVCTPPACKET_H