bluetooth/btstack/rfcomm/rfcommflow.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/rfcomm/rfcommflow.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,181 @@
+// Copyright (c) 2001-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:
+//
+
+#ifndef RFCOMMFLOW_H
+#define RFCOMMFLOW_H
+
+#include <es_prot.h>
+#include <bttypes.h>
+class CRfcommSAP;
+class CRfcommMuxer;
+class CRfcommDataFrame;
+class TRfcommFlowStrategy;
+
+/**
+	CRfcommFlowStrategyFactory factory for flow strategies (ways to control flow 
+	of packets in and out of Rfcomm).
+**/
+NONSHARABLE_CLASS(CRfcommFlowStrategyFactory) : public CBase
+	{
+friend class CRfcommProtocol;
+public:
+enum TFlowStrategies
+	{
+	EFlowInitial,
+	EFlowCreditBased, //CBFC accepted
+	EFlowNonCreditBased, //CBFC rejected
+	//...
+	EMaxFlowStrategy
+	};
+	TRfcommFlowStrategy& GetFlowStrategy(const TFlowStrategies aFlowStrategy) const;
+
+	~CRfcommFlowStrategyFactory();
+private:
+	static CRfcommFlowStrategyFactory* NewL();
+	CRfcommFlowStrategyFactory();
+
+	// Horrible hacky workround for buggy VC6.
+	enum {MaxFlowStrategies=3}; // Must be equal to number of flow strategies in TFlowStrategies above
+	
+	TFixedArray<TRfcommFlowStrategy*, MaxFlowStrategies> iFlowStrategies;
+	};
+
+
+
+/**
+   Flow control strategy class
+**/
+NONSHARABLE_CLASS(TRfcommFlowStrategy) : public CBase
+	{
+public:
+	// Create/destroy
+	TRfcommFlowStrategy(CRfcommFlowStrategyFactory* aFactory=0); 
+	~TRfcommFlowStrategy();
+
+	virtual TInt DataBufferMultiple() = 0;
+	virtual TUint16 UsableMTU(const CRfcommSAP& aSAP, TUint8 aCredit) const = 0;
+	virtual TBool AllowWrite(CRfcommSAP& aSAP) = 0;
+	virtual TBool AllowFCOnOff(TBool aCommand) = 0;
+	virtual TInt PNConvergenceLayer(TBool aCommand) = 0;
+	virtual TUint8 PNFinalOctet() = 0;
+	virtual TUint8 WriteCredit(CRfcommSAP& aSAP) = 0;
+	virtual void OutgoingMSCReviseSignals(TBool aCommand, TUint8& aSignals) = 0;
+	virtual void ReviseDonatedCredits(CRfcommSAP& aSAP, TUint8 aCredit) = 0;
+	virtual void ReviseTransmittedCredits(CRfcommSAP& aSAP) = 0;
+	virtual CRfcommDataFrame* NewDataFrame(CRfcommMuxer& aMuxer, TUint8 aAddr, TInt aLen, 
+										   TUint8 aCredit, CRfcommSAP* aSAP) = 0;
+	virtual TBool CanProcessNewData(const TBool aAllowProcessNewData) const = 0;
+	virtual void DecodeLength(TBool aCBFC, TDesC8& aPacket, 
+							  TInt& aCreditBuffer, 
+							  TInt& aHeaderLengthBuffer) = 0;
+	virtual TBool ProcessDataFrameReviseCredits(CRfcommSAP& aSAP, TBool aPoll, 
+											   TUint8 aCredit) = 0;
+	virtual TBool MSC(CRfcommSAP& aSAP, TUint8 aSignals) = 0;
+	virtual void UpdateRxFlowControlState(CRfcommSAP& aSAP) = 0;
+	virtual TBool NewDataReviseCredits(CRfcommSAP& aSAP, const TDesC8& aData) = 0;
+	virtual void NewData(CRfcommSAP& aSAP) = 0;
+	virtual CRfcommFlowStrategyFactory::TFlowStrategies FlowType() = 0;
+
+protected:
+	CRfcommFlowStrategyFactory* iFactory;
+	};
+
+
+/**
+   Flow control strategy class before decision has been made (1st PN transaction)
+**/
+NONSHARABLE_CLASS(TRfcommFlowStrategyInitial) : public TRfcommFlowStrategy
+	{
+public:
+	// Create/destroy
+	TRfcommFlowStrategyInitial(CRfcommFlowStrategyFactory* aFactory); 
+	~TRfcommFlowStrategyInitial();
+
+	TInt DataBufferMultiple();
+	TUint16 UsableMTU(const CRfcommSAP& aSAP, TUint8 aCredit) const;
+	TBool AllowWrite(CRfcommSAP& aSAP);
+	TBool AllowFCOnOff(TBool aCommand);
+	TInt PNConvergenceLayer(TBool aCommand);
+	TUint8 PNFinalOctet();
+	TUint8 WriteCredit(CRfcommSAP& aSAP);
+	void OutgoingMSCReviseSignals(TBool aCommand, TUint8& aSignals);
+	void ReviseDonatedCredits(CRfcommSAP& aSAP, TUint8 aCredit);
+	void ReviseTransmittedCredits(CRfcommSAP& aSAP);
+	CRfcommDataFrame* NewDataFrame(CRfcommMuxer& aMuxer, TUint8 aAddr, TInt aLen, 
+								   TUint8 aCredit, CRfcommSAP* aSAP);
+	TBool CanProcessNewData(const TBool AllowProcessNewData) const;
+	void DecodeLength(TBool aCBFC, TDesC8& aPacket, 
+					  TInt& aCreditBuffer, TInt& aHeaderLengthBuffer);
+	TBool ProcessDataFrameReviseCredits(CRfcommSAP& aSAP, TBool aPoll, TUint8 aCredit);
+	TBool MSC(CRfcommSAP& aSAP, TUint8 aSignals);
+	void UpdateRxFlowControlState(CRfcommSAP& aSAP);
+	TBool NewDataReviseCredits(CRfcommSAP& aSAP, const TDesC8& aData);
+	void NewData(CRfcommSAP& aSAP);
+	CRfcommFlowStrategyFactory::TFlowStrategies FlowType();
+	};
+
+
+/**
+   Flow control strategy class for "Credit Based Flow Control"
+**/
+NONSHARABLE_CLASS(TRfcommFlowStrategyCreditBased) : public TRfcommFlowStrategyInitial
+	{
+public:
+	// Create/destroy
+
+	TRfcommFlowStrategyCreditBased(CRfcommFlowStrategyFactory* aFactory); 
+	~TRfcommFlowStrategyCreditBased();
+
+	TInt DataBufferMultiple();
+	TUint16 UsableMTU(const CRfcommSAP& aSAP, TUint8 aCredit) const;
+	TBool AllowWrite(CRfcommSAP& aSAP);
+	TBool AllowFCOnOff(TBool aCommand);
+	TUint8 WriteCredit(CRfcommSAP& aSAP);
+	void OutgoingMSCReviseSignals(TBool aCommand, TUint8& aSignals);
+	void ReviseDonatedCredits(CRfcommSAP& aSAP, TUint8 aCredit);
+	void ReviseTransmittedCredits(CRfcommSAP& aSAP);
+	CRfcommDataFrame* NewDataFrame(CRfcommMuxer& aMuxer, TUint8 aAddr, TInt aLen, 
+								   TUint8 aCredit, CRfcommSAP* aSAP);
+	TBool CanProcessNewData(const TBool aAllowProcessNewData) const;
+	void DecodeLength(TBool aCBFC, TDesC8& aPacket, 
+					  TInt& aCreditBuffer, TInt& aHeaderLengthBuffer);
+	TBool ProcessDataFrameReviseCredits(CRfcommSAP& aSAP, TBool aPoll, TUint8 aCredit);
+	TBool MSC(CRfcommSAP& aSAP, TUint8 aSignals);
+	void UpdateRxFlowControlState(CRfcommSAP& aSAP);
+	TBool NewDataReviseCredits(CRfcommSAP& aSAP, const TDesC8& aData);
+	void NewData(CRfcommSAP& aSAP);
+	CRfcommFlowStrategyFactory::TFlowStrategies FlowType();
+	};
+
+/**
+   Flow control strategy class for FOn/FOff ... which is per muxer
+**/
+NONSHARABLE_CLASS(TRfcommFlowStrategyNonCreditBased) : public TRfcommFlowStrategyInitial
+	{
+public:
+	// Create/destroy
+
+	TRfcommFlowStrategyNonCreditBased(CRfcommFlowStrategyFactory* aFactory); 
+	~TRfcommFlowStrategyNonCreditBased();
+
+
+	TInt PNConvergenceLayer(TBool aCommand);
+	TUint8 PNFinalOctet();
+	CRfcommFlowStrategyFactory::TFlowStrategies FlowType();
+	};
+
+
+
+#endif