bluetooth/btstack/l2cap/l2capSAPSignalHandler.h
changeset 0 29b1cd4cb562
child 23 32ba20339036
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/l2cap/l2capSAPSignalHandler.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,284 @@
+// 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:
+//
+
+#ifndef L2CAPSAPSIGNALHANDLER_H
+#define L2CAPSAPSIGNALHANDLER_H
+
+#include <e32std.h>
+#include <e32base.h>
+
+#include "L2CapChannelConfig.h"
+#include "l2capSigStates.h"
+#include "bttypes.h"
+#include "l2capSignalHandler.h"
+#include "l2capSigPacketEcho.h"
+#include "l2sap.h"
+
+class HConnectionResponse;
+class HConnectionRequest;
+class HConfigureRequest;
+class HConfigureResponse;
+class HDisconnectRequest;
+class HDisconnectResponse;
+class HCommandReject;
+
+class TL2CAPEntityConfig;
+
+class CL2CAPConnectionSAP;
+class CL2CAPSignalStateFactory;
+
+NONSHARABLE_CLASS(CL2CapSAPSignalHandler) : public CL2CapSignalHandler,
+                               public MEchoResponseHandler
+	{
+public:
+	static CL2CapSAPSignalHandler* NewL(CL2CAPConnectionSAP& aSAP);
+
+	virtual ~CL2CapSAPSignalHandler();
+
+	// Prepare outgoing commands
+	TInt UpdateChannelConfig(const TL2CapConfig& aAPIConfig);
+	void CloneChannelConfig(CL2CapChannelConfig& aL2CAPChannelConfig);
+
+	TInt ConstructConnectionResponse(TUint8 aId, TConnectResponseResult aResult, TConnectResponseStatus aStatus = EConnectPendNoFurtherInfo);
+	TInt ConstructConnectionRequest();
+	TInt ConstructConfigRequest();
+	TInt ConstructConfigResponse(TUint8 aId, TConfigFlags aFlags, TConfigResponseResult aResult, RMBufChain& aUnknownParameters);
+	TInt ConstructConfigResponse(TUint8 aId, TConfigFlags aFlags, TConfigResponseResult aResult);
+    TInt ConstructDisconnectRequest();
+	TInt ConstructDisconnectResponse(TUint8 aId);
+
+	void L2CapEntityConfigUpdated();
+	inline TBool IsPeerInfoDefined();
+	void ConfigRequestDelayTimerExpiry();	
+	TBool DelayConfigRequest();
+
+	TBool HandleConnectionResponse(HConnectionResponse* aConnectionResponse);
+	TBool HandleConfigureRequest(HConfigureRequest* aConfigRequest);
+	TBool HandleConfigureResponse(HConfigureResponse* aConfigResponse);	
+	TBool HandleDisconnectRequest(HDisconnectRequest* aDisconnectRequest);	
+	TBool HandleDisconnectResponse(HDisconnectResponse* aDisconnectResponse);	
+	TBool HandleCommandReject(HCommandReject* aCommandReject);
+
+	void CommandResponseFailure(HL2CapCommand* aCommand);
+
+	TInt PassiveConnectionRequest(const TBTDevAddr& aAddr, HConnectionRequest* aConnectionRequest);
+	void ActiveConnectionRequest();
+
+	void ConnectRequestReceived();
+	void OpenChannelRequest();
+	void ConfigureChannelRequest();
+	void CloseChannelRequest();
+
+	void SAPSignalHandlerRegistered(CL2CAPMux& aMuxer, TL2CAPEntityConfig& aEntityConfig);
+	void ReconfiguringChannel();
+
+	void SignalHandlerDisconnectedCanClose();
+	void SignalHandlerErrorD(TInt aErrorCode, MSocketNotify::TOperationBitmasks aErrorAction);
+
+	void Error(TInt aErrorCode, MSocketNotify::TOperationBitmasks aErrorAction);
+	
+	void LinkUp();
+
+	inline TBool IsChannelClosed() const;
+	inline TBool IsChannelOpen() const;
+	inline TInt GetNegotiatedChannelMode(TL2CapChannelMode& aMode) const;
+	
+	void SetLocalParameters(TL2CAPSockAddr& aAddr);
+	void GetLocalParameters(TL2CAPSockAddr& aAddr) const;
+	void SetRemName(TL2CAPSockAddr& aAddr);
+	void GetRemName(TL2CAPSockAddr& aAddr) const;
+
+	inline TUint8 RTXTimerDuration() const;
+	inline TUint16 ERTXTimerDuration() const;
+	TInt SetRTXTimerDuration(TUint8 aDuration);
+	TInt SetERTXTimerDuration(TUint16 aDuration);
+
+	void SetState(TL2CAPSigState& aState);
+	
+	TInt SetOption(TUint aLevel,TUint aName,const TDesC8 &aOption);
+	TInt GetOption(TUint aLevel,TUint aName,TDes8& aOption)const;		
+
+	inline CL2CAPConnectionSAP* SAP();
+	inline const TBTDevAddr& RemoteBTAddress() const;
+
+	void SetLocalPort(TL2CAPPort aPort);
+	inline TL2CAPPort LocalPort() const;
+	void SetRemotePort(TL2CAPPort aPort);
+	inline TL2CAPPort RemotePort() const;
+
+	inline CL2CapChannelConfig& ChannelConfig();
+	inline const CL2CapChannelConfig& ChannelConfig() const;
+		
+	TUint8 GetOutstandingRequestID();
+	void SetOutstandingRequestID(TUint8 aOutstandingRequestID);
+	
+	// SAP signal handler timer methods.	
+	static TInt TimerExpired(TAny* aSAPSignalHandler);
+
+	void StartConfigurationTimer();
+	void CancelTimer();
+
+	void DetachFromMux();
+	void SAPClosed();
+
+	TInt SendEchoRequest(const TDes8* aData);
+	void EchoResponseReceived(const TDesC8* aData);
+
+	void OverrideParkMode();
+	void UndoOverrideParkMode();
+	void OverrideLPMWithTimeout();
+	inline TInt SignalHandlerErrorCode() const;
+	inline MSocketNotify::TOperationBitmasks SignalHandlerErrorAction() const;
+	inline void SetSignalHandlerErrorCode(TInt aError);
+	inline void SetSignalHandlerErrorAction(MSocketNotify::TOperationBitmasks aAction);
+
+private:
+	CL2CapSAPSignalHandler(CL2CAPConnectionSAP& aSAP);
+	void ConstructL();
+	
+	void PendingCommandsDrained();
+	void HandleTimerExpired();
+
+public:
+	TDblQueLink iLink;	
+private:
+	enum TSAPSignalHandlerTimerState
+		{
+		ETimerIdle,
+		EConfigRequestDelayTimer,
+		EConfigurationTimer,
+		};
+		
+	CL2CAPConnectionSAP* iSAP;
+
+	TBTDevAddr iLocalBTAddress;
+	TL2CAPPort iLocalPort;
+
+	TL2CAPPort iRemotePort;
+
+	TUint8 iDefaultRTXTimerDuration;
+	TUint16 iERTXTimerDuration;
+	
+	CL2CapChannelConfig* iChannelConfig;
+	TL2CAPSigState* iSigState;  				// Our signalling base state object
+
+	TUint8 iOutstandingRequestID;
+
+	TSAPSignalHandlerTimerState iSAPSignalHandlerTimerState;
+	TDeltaTimerEntry iSAPSignalHandlerTimerEntry;
+	
+	TInt iSignalHandlerErrorCode;
+	MSocketNotify::TOperationBitmasks iSignalHandlerErrorAction;
+
+	// We need the peer supported features to be able to handle a Config Request coming
+	// through (to be able to negotiate channel mode properly), which may be any time after 
+	// OpenChannelRequest, so OpenChannelRequest is delayed until Information Response comes
+	// through.
+	TBool iOpenChannelRequestAwaitingPeerEntityConfig;
+	// The SAP is ready to send a config request
+	// Flag to indicate that we are delaying sending this config request
+	TBool iAwaitingConfigRequestDelayTimer;
+	};
+
+inline TUint8 CL2CapSAPSignalHandler::GetOutstandingRequestID()
+	{
+	return iOutstandingRequestID;
+	}	
+
+inline void CL2CapSAPSignalHandler::SetOutstandingRequestID(TUint8 aOutstandingRequestID)
+	{
+	iOutstandingRequestID = aOutstandingRequestID;
+	}	
+
+inline CL2CapChannelConfig& CL2CapSAPSignalHandler::ChannelConfig()
+	{
+	return *iChannelConfig;
+	}
+
+inline const CL2CapChannelConfig& CL2CapSAPSignalHandler::ChannelConfig() const
+	{
+	return *iChannelConfig;
+	}
+
+inline TInt CL2CapSAPSignalHandler::GetNegotiatedChannelMode(TL2CapChannelMode& aMode) const
+	{
+	return iSigState->GetNegotiatedChannelMode(*this, aMode);
+	}
+
+inline CL2CAPConnectionSAP* CL2CapSAPSignalHandler::SAP()
+	{
+	return iSAP;
+	}
+	
+inline TL2CAPPort CL2CapSAPSignalHandler::LocalPort() const
+	{
+	return iLocalPort;
+	}
+inline TL2CAPPort CL2CapSAPSignalHandler::RemotePort() const
+	{
+	return iRemotePort;
+	}
+	
+inline const TBTDevAddr& CL2CapSAPSignalHandler::RemoteBTAddress() const
+	{
+	return iSAP->RemoteDev();
+	}
+
+inline TBool CL2CapSAPSignalHandler::IsChannelClosed() const
+	{
+	return iSigState->IsChannelClosed();
+	}
+
+inline TBool CL2CapSAPSignalHandler::IsChannelOpen() const
+	{
+	return iSigState->IsChannelOpen();
+	}
+
+inline TUint8 CL2CapSAPSignalHandler::RTXTimerDuration() const
+	{
+	return iDefaultRTXTimerDuration;
+	}
+	
+inline TUint16 CL2CapSAPSignalHandler::ERTXTimerDuration() const
+	{
+	return iERTXTimerDuration;
+	}
+
+inline TInt CL2CapSAPSignalHandler::SignalHandlerErrorCode() const
+	{
+	return iSignalHandlerErrorCode;
+	}
+	
+inline MSocketNotify::TOperationBitmasks CL2CapSAPSignalHandler::SignalHandlerErrorAction() const	
+	{
+	return iSignalHandlerErrorAction;
+	}
+
+inline void CL2CapSAPSignalHandler::SetSignalHandlerErrorCode(TInt aError)
+	{
+	iSignalHandlerErrorCode = aError;
+	}
+
+inline TBool CL2CapSAPSignalHandler::IsPeerInfoDefined()
+	{
+	return iChannelConfig->IsPeerInfoDefined();
+	}
+
+inline void CL2CapSAPSignalHandler::SetSignalHandlerErrorAction(MSocketNotify::TOperationBitmasks aAction)
+	{
+	iSignalHandlerErrorAction = aAction;
+	}
+	
+#endif