bluetooth/btstack/avctp/avctppacket.h
changeset 0 29b1cd4cb562
--- /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 <es_mbuf.h>
+
+#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