bluetooth/btstack/l2cap/L2CapChannelConfig.h
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/l2cap/L2CapChannelConfig.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,180 @@
+// Copyright (c) 1999-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:
+// Defines the L2CAP Channel Config class
+// 
+//
+
+#ifndef L2CAPCHANNELCONFIG_H
+#define L2CAPCHANNELCONFIG_H
+
+#include <bt_sock.h>
+#include <bttypes.h>
+
+#include "L2types.h"
+#include "L2CapFecNegotiator.h"
+#include "l2capEntityConfig.h"
+#include "l2capSigPacketConfigure.h"
+
+// Forward declarations
+class TL2CAPEntityConfig;
+class HConfigureRequest;
+class HConfigureResponse;
+class RMBufChain;
+
+#ifndef __UNITTest__
+	class CL2CapSAPSignalHandler;
+#else
+	class CL2CapConfigProxy;
+#endif
+
+NONSHARABLE_CLASS(CL2CapChannelConfig) : public CBase
+	{
+public:
+	enum TChannelConfigStatus
+		{
+		EChannelConfigOutstanding,
+		EChannelConfigComplete,
+		EChannelConfigFailed,
+		};
+
+	// Configuration constants
+	const static TUint16 KMinOutgoingFlushTimeout = TL2CapConfig::EMinDataObsolescenceTimeout; //min physically possible
+	~CL2CapChannelConfig();
+	
+	static CL2CapChannelConfig* NewL(CL2CapSAPSignalHandler& aSAPSignalHandler);
+
+	TInt HandleConfigRequest(HConfigureRequest& aConfigRequest, RMBufChain& aUnknownOptions);
+	TInt HandleConfigResponse(HConfigureResponse& aConfigResponse, RMBufChain& aUnknownOptions);
+	// This does the actual handling and sends a response to a whole Config Request "transaction",
+	// so that segmented config requests are correctly handled.
+	TInt ConfigRequestComplete(TBool aConfigRequestSent, TConfigResponseResult& aResult);
+
+	void CloneChannelConfig(const CL2CapChannelConfig& aCL2CapChannelConfig);
+	TInt UpdateLocalConfigWithEntityCapabilities();
+
+	TInt UpdateConfigAPIChange(const TL2CapConfig& aAPIConfig, TBool& aOnTheAirReconfigRequired);
+
+	void RegisterL2CapEntityConfig(TL2CAPEntityConfig& aL2CapEntityConfig);
+	void DetachChannelConfig();
+	inline TBool IsPeerInfoDefined();
+
+	TChannelConfigStatus LocalConfigurationStatus() const;
+
+	TInt GetChannelMode(TL2CapChannelMode& aMode) const;
+	
+	// Accessors for configuration options.
+	inline TL2CapConfigurationOptionGroup<TMTUOption>& IncomingMTU() const;
+	inline TL2CapConfigurationOptionGroup<TMTUOption>& OutgoingMTU() const;
+	inline TL2CapConfigurationOptionGroup<TFlushTimeoutDurationOption>& IncomingFlushTimeout() const;
+	inline TL2CapConfigurationOptionGroup<TFlushTimeoutDurationOption>& OutgoingFlushTimeout() const;
+	inline TL2CapConfigurationOptionGroup<TQualityOfServiceOption>& IncomingQOS() const;
+	inline TL2CapConfigurationOptionGroup<TQualityOfServiceOption>& OutgoingQOS() const;
+	inline TL2CapFecNegotiator& FecNegotiator();
+	inline const TL2CapFecNegotiator& FecNegotiator() const;
+
+private:
+#ifndef __UNITTest__
+	CL2CapChannelConfig(CL2CapSAPSignalHandler& aSAPSignalHandler);
+#else
+	CL2CapChannelConfig(CL2CapConfigProxy& aSAPSignalHandler);
+#endif	
+	void ConstructL();
+
+	TBool GenerateFecOptions(const TL2CapEntityInfo& aPeerEntityConfig);
+	TInt UpdateReliability(const TL2CapConfig& aApiConfig);
+	TInt UpdateMtuMru(const TL2CapConfig& aApiConfig, TBool& aOnTheAirReconfigRequired);
+
+private:
+	// Configuration members.
+	// MTU / MRU
+	TL2CapConfigurationOptionGroup<TMTUOption>* iIncomingMTU;
+	TL2CapConfigurationOptionGroup<TMTUOption>* iOutgoingMTU;
+
+	// Incoming and outgoing Flush timers.
+	TL2CapConfigurationOptionGroup<TFlushTimeoutDurationOption>* iIncomingFlushTimeoutDuration;
+	TL2CapConfigurationOptionGroup<TFlushTimeoutDurationOption>* iOutgoingFlushTimeoutDuration;
+
+	// Incoming and outgoing QoS
+	TL2CapConfigurationOptionGroup<TQualityOfServiceOption>* iIncomingQOS;
+	TL2CapConfigurationOptionGroup<TQualityOfServiceOption>* iOutgoingQOS;
+
+	// Incoming and outgoing FEC
+	TL2CapFecNegotiator iFecNegotiator;
+
+#ifndef	 __UNITTest__
+	CL2CapSAPSignalHandler& 	iSAPSignalHandler;
+#else
+	CL2CapConfigProxy& 			iSAPSignalHandler;
+#endif
+	TL2CAPEntityConfig*	 		iL2CapEntityConfig;  // Non-owned.
+
+	TL2CapConfig::TChannelReliability		iRequestedChannelReliability;
+	TBool									iLegacyModesDisallowed;
+	TUint16									iRequestedFlushTimeout;
+	TUint16									iRequestedRetransmissionTimeout;
+
+	// Thanks to the possibility of segmented ConfigRequests, we need
+	// this to collect all the options as Config Request segments flow in.
+	// Then once the whole ConfigRequest transaction is received, we process this.
+	TL2CapConfigParamOptions				iReceivedConfigRequestOptions;
+	};
+
+
+// Accessors for configuration options.
+inline TL2CapConfigurationOptionGroup<TMTUOption>& CL2CapChannelConfig::IncomingMTU() const
+	{
+	return *iIncomingMTU;
+	}
+	
+inline TL2CapConfigurationOptionGroup<TMTUOption>& CL2CapChannelConfig::OutgoingMTU() const
+	{
+	return *iOutgoingMTU;
+	}
+
+inline TL2CapConfigurationOptionGroup<TFlushTimeoutDurationOption>& CL2CapChannelConfig::IncomingFlushTimeout() const
+	{
+	return *iIncomingFlushTimeoutDuration;
+	}
+
+inline TL2CapConfigurationOptionGroup<TFlushTimeoutDurationOption>& CL2CapChannelConfig::OutgoingFlushTimeout() const
+	{
+	return *iOutgoingFlushTimeoutDuration;
+	}
+
+inline TL2CapConfigurationOptionGroup<TQualityOfServiceOption>& CL2CapChannelConfig::IncomingQOS() const
+	{
+	return *iIncomingQOS;
+	}
+
+inline TL2CapConfigurationOptionGroup<TQualityOfServiceOption>& CL2CapChannelConfig::OutgoingQOS() const
+	{
+	return *iOutgoingQOS;
+	}
+
+inline TL2CapFecNegotiator& CL2CapChannelConfig::FecNegotiator()
+	{
+	return iFecNegotiator;
+	}
+
+inline const TL2CapFecNegotiator& CL2CapChannelConfig::FecNegotiator() const
+    {
+    return iFecNegotiator;
+    }
+
+inline TBool CL2CapChannelConfig::IsPeerInfoDefined()
+	{
+	return iL2CapEntityConfig && iL2CapEntityConfig->PeerInfoDefined();
+	}
+
+#endif