diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/l2cap/l2sap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btstack/l2cap/l2sap.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,208 @@ +// 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: +// Define the L2CAP Service Access Point (SAP) class +// +// + +#ifndef L2SAP_H +#define L2SAP_H + +#include +#include "BtSap.h" + +class CL2CAPProtocol; +class TL2CAPSAPState; + +class CL2CapSDUQueue; +class CL2CapSAPSignalHandler; +class CL2CapChannelConfig; +class CL2CAPMux; +//class CBTCodServiceMan; + +NONSHARABLE_CLASS(CL2CAPConnectionSAP) : public CBluetoothSAP + { +public: + friend class TL2CAPSAPStateClosed; + friend class TL2CAPSAPStateBound; + friend class TL2CAPSAPStateAwaitingInitialData; + friend class TL2CAPSAPStateOpen; + friend class TL2CAPSAPStateAccepting; + friend class TL2CAPSAPStateDisconnecting; + + enum TShutdownType + { + ESAPShutdownNone, + ESAPShutdownImmediate, + ESAPShutdownNormal, + }; + + static CL2CAPConnectionSAP* NewL(CL2CAPProtocol&); + ~CL2CAPConnectionSAP(); + + // 'Un-hide' the other overloads +#ifndef __WINS__ +#ifndef __GCC32__ + using CServProviderBase::Write; + using CServProviderBase::GetData; +#endif +#endif + + // Virtual Methods from CServProviderBase / CBluetoothSAP + void LocalName(TSockAddr& anAddr) const; + TInt SetLocalName(TSockAddr& anAddr); + void RemName(TSockAddr& anAddr) const; + TInt SetRemName(TSockAddr& anAddr); + const TBTDevAddr& RemoteDev() const; + void SetRemoteDev(const TBTDevAddr& aAddr); + + TInt SAPSetOption(TUint aLevel,TUint aName,const TDesC8 &aOption); + TInt GetOption(TUint aLevel,TUint aName,TDes8& aOption)const; + + void Ioctl(TUint aLevel,TUint aName,TDes8* aOption); + void CancelIoctl(TUint aLevel,TUint aName); + void IoctlComplete(TInt aErr, TUint aLevel,TUint aName,TDesC8* aBuf); // From CBluetoothSAP + + void Start(); + + void ActiveOpen(); + void ActiveOpen(const TDesC8& aConnectionData); + TInt PassiveOpen(TUint aQueSize); + TInt PassiveOpen(TUint aQueSize,const TDesC8& aConnectionData); + void Shutdown(TCloseType aOption); + void Shutdown(TCloseType option,const TDesC8& aDisconnectionData); + void AutoBind(); + + TInt Write(RMBufChain& aData, TUint aOptions, TSockAddr* anAddr = NULL); + TInt GetData(RMBufChain& aData, TUint aLength, TUint aOptions, TSockAddr* anAddr = NULL); + + // Des. versions. These should be removed when they become + // redundant. + TUint Write(const TDesC8& aDesc, TUint aOptions, TSockAddr* anAddr = NULL); + void GetData(TDes8& aDesc, TUint aOptions, TSockAddr* anAddr = NULL); + + + // Methods from SAP Signal Handler + void LinkUp(); + void ChannelOpened(); + void ChannelConfigured(CL2CapChannelConfig& aConfig, + CL2CAPMux& aMuxer, + TL2CAPPort aLocalPort, + TL2CAPPort aRemotePort); + + TInt UpdateChannelConfig(const TL2CapConfig& aAPIConfig); + void ReconfiguringChannel(); + + void ChannelClosed(); + + void AccessRequestComplete(TInt aResult); + + void SignalHandlerError(TInt aErrorCode, MSocketNotify::TOperationBitmasks aErrorAction); + void DataPlaneError(TInt aErrorCode, MSocketNotify::TOperationBitmasks aErrorAction); + + + // Methods from Data Controller + void NewData(); + void CanSend(); + void CloseOutgoingSDUQueue(); + void SDUQueueClosed(); + + // State Pattern Utility Methods. + void SetState(TL2CAPSAPState& aNewState); + + TInt CreateDataPlane(CL2CapChannelConfig& aConfig, + CL2CAPMux& aMuxer, + TL2CAPPort aLocalPort, + TL2CAPPort aRemotePort); + + void PauseDataPlane(); + void TryToCompleteConfigurationIoctl(TInt aError); + + static TInt NewDataAsyncCallBack(TAny* aSAP); + inline void StartNewDataAsyncCallBack(); + + // Cloning Related Methods. + TUint8 TotalOutstandingCloneCount() const; + TBool CanAcceptConnection() const; + CL2CAPConnectionSAP* CloneListeningSAP(const TBTDevAddr& aAddr); + TBool DequeClone(CL2CAPConnectionSAP* aSAP); + + void DeleteAllClones(); + + // This method is used by the SAP states if they need to delete the SAP. + void DeleteSAP(); + + void SocketConnectComplete(); + + void EchoResponseReceived(const TDesC8* aData); + void DetachFromListeningSAP(); + inline void SetListeningSAP(CL2CAPConnectionSAP& aSAP); + inline void ClearListeningSAP(); + inline CL2CAPConnectionSAP* ListeningSAP() const; + + inline CL2CapSAPSignalHandler& SignalHandler() const; + inline CL2CapSDUQueue& DataQueue() const; + inline MSocketNotify* Socket() const; + inline CL2CAPProtocol& Protocol() const; + + inline TBool IsSDUQueueClosed() const; + inline TShutdownType ShutdownReceived() const; + inline TUint8 ChannelPriority() const; + + inline TInt SocketErrorCode() const; + inline TUint SocketErrorAction() const; + inline void SetSocketErrorCode(TInt aError); + inline void SetSocketErrorAction(MSocketNotify::TOperationBitmasks aAction); + inline TBool IsAcceptPending() const; +private: + CL2CAPConnectionSAP(CL2CAPProtocol&); + void ConstructL(); + + TBool EnqueClone(CL2CAPConnectionSAP* aSAP); + + TUint GetOptimalMTUSize(TUint aMTU, TUint aPduSize, TBool aBasicMode) const; + +private: + TL2CAPSAPState* iState; + CL2CAPProtocol& iProtocol; + + CL2CapSDUQueue* iL2CapDataQueue; + CL2CapSAPSignalHandler* iL2CapSAPSignalHandler; + + // Async Callback to notify New Data. + CAsyncCallBack* iNewDataAsyncCallBack; + TUint16 iNewDataToNotify; + + TUint8 iMaxAcceptingQCount; + + RPointerArray iClones; + CL2CAPConnectionSAP* iListeningSAP; + + TShutdownType iShutdownReceived; + TUint iOutstandingIoctlName; + + TUint8 iChannelPriority; + + TInt iSocketErrorCode; + MSocketNotify::TOperationBitmasks iSocketErrorAction; + //flag for dealing with the situation that we disconnect after connection + //complete and before accept. + TBool iAcceptPending; + }; + + +#include "l2sap.inl" + + +#endif +