bluetooth/btstack/l2cap/l2sap.h
changeset 0 29b1cd4cb562
child 51 20ac952a623c
--- /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 <bt_sock.h>
+#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<CL2CAPConnectionSAP> 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
+