diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/l2cap/l2capCommand.h --- /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 +#include + +#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(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(iCommand.Length() - KL2CapCommandHeaderLength), KLengthOffset, iCommand); + } + +inline TInt HL2CapCommand::CommandLength() const + { + return iCommand.Length(); + } + + +#endif +