bluetooth/btstack/l2cap/l2capCommand.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/l2cap/l2capCommand.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,174 @@
+// Copyright (c) 2004-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:
+// The base class for L2Cap Commands
+// 
+//
+
+#ifndef L2CAPCOMMAND_H
+#define L2CAPCOMMAND_H
+
+#include <es_mbuf.h>
+#include <bt_sock.h>
+
+#include "l2util.h"
+#include "l2constants.h"
+#include "L2types.h"
+
+
+class CL2CapSignalHandler;
+class CL2CAPMux;
+
+NONSHARABLE_CLASS(HL2CapCommand)
+	{
+public:
+	// Message format lengths and offsets.
+	const static TUint8 KCodeOffset					= 0;
+	const static TUint8 KIdOffset					= 1;
+	const static TUint8 KLengthOffset 				= 2;
+	const static TUint8 KL2CapCommandHeaderLength 	= 4;		
+
+	// RTX / ERTX Timer values.
+	const static TUint8 KDefaultRTXTimerDuration	= 5;	// Second(s)
+	const static TUint8 KDefaultERTXTimerDuration	= 120;	// Second(s)
+	const static TUint8 KMinRTXTimerDuration		= 1;
+	const static TUint8 KMinERTXTimerDuration		= 60;
+	const static TUint8 KMaxRTXTimerDuration		= 60;
+	const static TUint16 KMaxERTXTimerDuration		= 300;
+	const static TUint8 KNumberOfRetransmissions	= 1;
+
+	// Used to specify that the ID has not been set yet.
+	const static TUint8 KUninitialisedID			= 0;
+
+	enum TRTXTimerType
+		{
+		ERTXTimer,
+		EERTXTimer,
+		};
+			
+	static TInt DecodeCommand(RMBufChain& aCommandString, HL2CapCommand*& aCommand);
+
+	virtual ~HL2CapCommand();
+	HL2CapCommand(RMBufChain& aCommand, 
+	              TUint8 aRTXTimerDuration = KDefaultRTXTimerDuration,
+	              TUint16 aERTXTimerDuration = KDefaultERTXTimerDuration);
+
+	// Pure virtual that is used to ensure that derived class have a mechanism to process themselves in
+	// signal handler
+	virtual	TBool ProcessCommand(CL2CapSignalHandler& aSignalHandler) = 0;
+
+	// This is called to pull an outgoing L2CAP command.  This method will initialise
+	// the CID if one has not yet been allocated. 
+	TInt GetCommand(CL2CAPMux& aMuxer, RMBufChain& aBuffer);
+	
+	inline TBool IsRequest() const;
+
+	inline TSignallingCommand Code() const;
+	inline void SetCode(TSignallingCommand aCode);
+	
+	inline TUint8 ID() const;
+	inline void SetID(TUint8 aID);
+
+	inline TInt DataLength() const;
+	inline void WriteDataLength();
+
+	inline TInt CommandLength() const;
+
+	void StartRTXTimer(TRTXTimerType aType, CL2CapSignalHandler& aSignalHandler);
+	static TInt ResponseTimerExpired(TAny* aL2CapCommand);
+	
+	static void PutLittleEndian32(TUint32 aValue, TInt aOffset, RMBufChain& aCommand);
+	static void PutLittleEndian16(TUint16 aValue,TInt aOffset, RMBufChain& aCommand);
+	static void PutByte(TUint8 aByte, TInt aOffset, RMBufChain& aCommand);
+
+	static TUint32 GetLittleEndian32(TInt aOffset, const RMBufChain& aCommand);
+	static TUint16 GetLittleEndian16(TInt aOffset, const RMBufChain& aCommand);
+	static TUint8 GetByte(TInt aOffset, const RMBufChain& aCommand);
+
+	TBool StatefulResponse();
+protected:
+	// RTx / ERTx Timer methods.
+	void CancelResponseTimer();
+	void HandleResponseTimerExpiry();
+	
+//members	
+public:
+	//Link member so that CCFramePDU can hold a linked list of these commands
+	TDblQueLink iLink;
+
+protected:
+	RMBufChain iCommand;
+	TBool iResponseTimerRunning;
+	TDeltaTimerEntry iResponseTimerEntry;
+	CL2CapSignalHandler* iResponseSignalHandler;
+	TUint8 iRetransmissionCounter;
+	
+	TUint8 iRTXTimerDuration;
+	TUint16 iERTXTimerDuration;
+	};
+
+
+NONSHARABLE_CLASS(HInvalidCommand) : public HL2CapCommand
+	{
+public:
+	HInvalidCommand(RMBufChain& aCommand);
+	~HInvalidCommand();
+
+	TBool ProcessCommand(CL2CapSignalHandler& aSignalHandler);
+	};
+
+
+inline TBool HL2CapCommand::IsRequest() const
+	{
+	// Every request command code has the LSB clear.
+	return (!(Code() & 0x01));
+	}
+
+inline TSignallingCommand HL2CapCommand::Code() const
+	{
+	return TSignallingCommand(GetByte(KCodeOffset, iCommand));
+	}
+	
+inline void HL2CapCommand::SetCode(TSignallingCommand aCode)
+	{
+	PutByte(static_cast<TUint8>(aCode), KCodeOffset, iCommand);
+	}
+
+inline TUint8 HL2CapCommand::ID() const
+	{
+	return GetByte(KIdOffset, iCommand);
+	}
+	
+inline void HL2CapCommand::SetID(TUint8 aID)
+	{
+	PutByte(aID, KIdOffset, iCommand);
+	}
+	
+inline TInt HL2CapCommand::DataLength() const
+	{
+	return GetLittleEndian16(KLengthOffset, iCommand);
+	}
+
+inline void HL2CapCommand::WriteDataLength()
+	{
+	PutLittleEndian16(static_cast<TUint16>(iCommand.Length() - KL2CapCommandHeaderLength), KLengthOffset, iCommand);
+	}
+
+inline TInt HL2CapCommand::CommandLength() const
+	{
+	return iCommand.Length();
+	}
+	
+
+#endif
+