diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/l2cap/l2capSAPSignalHandler.h --- /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 +#include + +#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