bluetooth/btstack/avctp/avctpsap.h
changeset 0 29b1cd4cb562
child 51 20ac952a623c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/avctp/avctpsap.h	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,262 @@
+// Copyright (c) 2005-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 AVCTP Service Access Point (SAP) class
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef AVCTPSAP_H
+#define AVCTPSAP_H
+
+#include <es_prot.h>
+#include <bt_sock.h>
+#include "avctpOutboundQ.h"
+#include "avctpconstants.h"
+#include "avctppacket.h"
+#include "BtSap.h"
+#include "secman.h"
+#include "avctpcommon.h"
+/**
+ This class is used to queue an indication (in some circustances) so to serialize more indications
+ to be served. It is also used in the particular case of an oustanding ioctl in order to be able
+ to complete it with the right indication.
+ The logic is that when an Ioctl with EPrimaryChannelAttachToTransport or ESecondaryChannelAttachToTransport name has been submitted it
+ means that a connection request to a remote device has been submitted. So we queue an "indication" with
+ the remote device address. If an Ioctl completed arrives we want to discriminate if it is the request's 
+ reply or an incoming connection from another device. If it isn't our request completion it will be queued
+ So, we will serve first the request's completion and then the incoming connections. 
+ **/
+NONSHARABLE_CLASS(HQueuedIndication)
+	{
+public:
+	static HQueuedIndication* New(const TControlIoctlMessage& aMessage);
+	inline TControlIoctlMessage& Indication() const;
+	~HQueuedIndication();
+public:
+	TSglQueLink	iLink;
+private:
+    void ConstructL(const TControlIoctlMessage& aMessage);
+private:
+	TControlIoctlMessage* iMessage;
+	};
+
+inline TControlIoctlMessage& HQueuedIndication::Indication() const
+    {
+    return *iMessage;
+    }
+
+// Forward declarations
+class CAvctpProtocol;
+class CAvctpTransport;
+
+/**
+The SAP for an AVCTP socket.
+
+Note that this class doesn't currently support any ioctls or options,
+not even to forward them on to a lower protocol
+
+  @internalAll
+  @see CBluetoothSAP
+*/
+NONSHARABLE_CLASS(CAvctpSap) : public CBluetoothSAP, public MSocketNotify
+	{
+friend class CAvctpProtocol; // needed for iQueLink access
+friend class CAvctpTransport;
+
+public:
+	// Creation
+	static CAvctpSap* NewL(CAvctpProtocol& aProtocol);
+	~CAvctpSap();
+	
+	// Interface between the muxers and the saps via protocol
+	TBool HasDataFor(const TBTDevAddr& aRemoteAddr);
+	TBool NewData(HAvctpIncomingSdu* aSdu, TInt aChannel);
+	
+	inline SymbianAvctp::TPid Pid() const;
+	inline TInt Channel() const;
+	inline TBool IsInList() const;
+private:
+	CAvctpSap(CAvctpProtocol& aProtocol);
+	void ConstructL();
+
+	// virtuals from CServProviderBase
+	// Made private so that only people accessing this class through the base base class 
+	// can get at them since these methods are public in there.
+	void Start();
+	void LocalName(TSockAddr& aAddr) const;
+	TInt SetLocalName(TSockAddr& aAddr);
+	void RemName(TSockAddr& aAddr) const;
+	TInt SetRemName(TSockAddr& aAddr);
+	TInt GetOption(TUint aLevel,TUint aName,TDes8& aOption) const;
+	void Ioctl(TUint aLevel,TUint aName,TDes8* aOption);
+	void CancelIoctl(TUint aLevel,TUint aName);
+	void ActiveOpen();
+	void ActiveOpen(const TDesC8& aConnectionData);
+	TInt PassiveOpen(TUint aQueueSize);
+	TInt PassiveOpen(TUint aQueueSize,const TDesC8& aConnectionData);
+	void Shutdown(CServProviderBase::TCloseType aOption);
+	void Shutdown(CServProviderBase::TCloseType aOption, const TDesC8& aDisconnectionData);
+	void AutoBind();
+	TInt Write(RMBufChain& aData, TUint aOptions, TSockAddr* anAddr=NULL);
+	TInt GetData(RMBufChain& aData, TUint aLength, TUint aOptions, TSockAddr* aAddr);
+	TInt SecurityCheck(MProvdSecurityChecker* aSecurityChecker);
+
+	// virtual from CBluetoothSAP
+	// Made private so that only people accessing this class through the base base class 
+	// can get at them since these methods are public in there.
+	TInt SAPSetOption(TUint aLevel,TUint aName,const TDesC8& aOption);
+
+	// Callbacks
+	void StartSendAsyncCallBack();
+	void CancelSendAsyncCallBack();
+	static TInt SendAsyncCallBack(TAny* aSap);
+
+    // Utility functions
+	TInt SetPid(SymbianAvctp::TPid aPid);
+	MSocketNotify& Socket() const;
+	void CheckForCanSend();
+	void CheckForCanClose();	
+	TInt CheckPidAllowed(SymbianAvctp::TPid aPid);
+	
+	void MuxerDown(const TBTDevAddr& aRemoteAddr);
+	
+private:
+	// Pure virtuals From MSocketNotify
+	// Made private so that only people accessing this class through the M- base class 
+	// can get at them since these methods are public in the M- class.
+	void NewData(TUint aCount);	// it's not used in favour of the public overloaded NewData()
+	void CanSend();
+	void ConnectComplete();
+	void ConnectComplete(const TDesC8& aConnectData);
+	void ConnectComplete(CServProviderBase& aSSP);
+	void ConnectComplete(CServProviderBase& aSSP,const TDesC8& aConnectData);
+	void CanClose(TDelete aDelete=EDelete);
+	void CanClose(const TDesC8& aDisconnectData,TDelete aDelete=EDelete);
+	void Error(TInt aError, TUint aOperationMask=EErrorAllOperations);
+	void Disconnect(void);
+	void Disconnect(TDesC8& aDisconnectData);
+	void IoctlComplete(TDesC8* aBuf);
+	void NoBearer(const TDesC8& /*aConnectionInfo*/);
+	void Bearer(const TDesC8& /*aConnectionInfo*/);
+
+private: // unowned
+
+	/** The protocol object */
+	CAvctpProtocol& iProtocol;
+
+private: // owned
+
+	/** The packets that the Sap has taken responsibility of sending */
+	TAvctpOutboundQ	iOutgoingSdus;
+	/** The packets that the Sap has taken responsibility of, and has notified to esock to pick up 
+		Packets should be added on the end as they come in and taken off the front as they go up to
+		esock.*/
+	TDblQue<HAvctpIncomingSdu>	iIncomingSdus;
+	
+	CAsyncCallBack* iSendAsyncCallBack;	/** Asynchronous callback for processing */
+	SymbianAvctp::TPid	iPid;	/** The PID for this socket*/
+	/** A class provided by esock that will allow us to perform the PID security check*/
+	MProvdSecurityChecker* iSecurityChecker;
+	
+	TBool iSendBlocked;
+	
+	/** We need to store the address of any pending data we've been asked to send in case we need to error it
+	    if the associated muxer goes down for some reason. Note this member variable will only contain a
+	    valid address when iSendBlocked is ETrue */
+	TBTDevAddr iPendingSendAddress;	
+	TBool iIsClosing;
+	TBool iClosed;
+	
+	TDblQueLink iQueLink;	/** A link so that the protocol can queue Saps */
+
+	TInt				iChannel;
+	TBool				iIsInList;
+	};
+
+
+// the SAPs are "sockets" so that the avctp transport can be very thin and "transient" so effectively forwards calls from L2CAP
+// perhaps with a bit of roundrobinning in the CanSend
+class CAvctpControlSAP : public CBluetoothSAP, public MSocketNotify
+	{
+public:
+	static CAvctpControlSAP* NewL(CAvctpProtocol& aProtocol);
+private:
+	CAvctpControlSAP(CAvctpProtocol& aProtocol);
+private:
+	void Start();
+	void LocalName(TSockAddr& aAddr) const;
+	TInt SetLocalName(TSockAddr& aAddr);
+	void RemName(TSockAddr& aAddr) const;
+	TInt SetRemName(TSockAddr& aAddr);	
+	TInt GetOption(TUint aLevel,TUint aName,TDes8& aOption) const;
+	TBool IsActiveRequest(TUint aName);
+	void Ioctl(TUint aLevel,TUint aName,TDes8* aOption);
+	void CancelIoctl(TUint aLevel,TUint aName);
+	void ActiveOpen();
+	void ActiveOpen(const TDesC8& aConnectionData);
+	TInt PassiveOpen(TUint aQueueSize);
+	TInt PassiveOpen(TUint aQueueSize,const TDesC8& aConnectionData);
+	void Shutdown(CServProviderBase::TCloseType aOption);
+	void Shutdown(CServProviderBase::TCloseType aOption, const TDesC8& aDisconnectionData);
+	void AutoBind();
+	TUint Write(const TDesC8& aDesc,TUint aOptions, TSockAddr* aAddr);
+	TInt GetData(RMBufChain& aData, TUint aLength, TUint aOptions, TSockAddr* aAddr);
+	TInt SecurityCheck(MProvdSecurityChecker* aSecurityChecker);
+
+	// virtual from CBluetoothSAP
+	// Made private so that only people accessing this class through the base base class 
+	// can get at them since these methods are public in there.
+	TInt SAPSetOption(TUint aLevel,TUint aName,const TDesC8& aOption);
+	void SetOutstandingIndication(const TControlIoctlMessage& aMessage);
+	void QueueIncomingIndication(const TControlIoctlMessage& aMessage);
+	void CompleteIoctlWithError(const TControlIoctlMessage& aMessage);
+	void QueueErrorIoctlComplete(const TControlIoctlMessage& aMessage);
+	void CompleteQueuedIoctlWithError(TInt aError);
+private:
+// Pure virtuals From MSocketNotify
+// Made private so that only people accessing this class through the M- base class 
+// can get at them since these methods are public in the M- class.
+	void NewData(TUint aCount);
+	void CanSend();
+	void ConnectComplete();
+	void ConnectComplete(const TDesC8& aConnectData);
+	void ConnectComplete(CServProviderBase& aSSP);
+	void ConnectComplete(CServProviderBase& aSSP,const TDesC8& aConnectData);
+	void CanClose(TDelete aDelete=EDelete);
+	void CanClose(const TDesC8& aDisconnectData,TDelete aDelete=EDelete);
+	void Error(TInt aError, TUint aOperationMask=EErrorAllOperations);
+	void Disconnect(void);
+	void Disconnect(TDesC8& aDisconnectData);
+	void IoctlComplete(TDesC8* aBuf);
+	void NoBearer(const TDesC8& /*aConnectionInfo*/);
+	void Bearer(const TDesC8& /*aConnectionInfo*/);
+
+	void ProcessIoctlQueue();
+	inline void ClearIoctl();
+	
+private:
+	CAvctpProtocol&				iProtocol;
+	TDblQueLink					iQueLink;
+	TSglQue<HQueuedIndication>	iIndicationQueue;
+	};
+
+	
+#include "avctpsap.inl"
+
+#endif // AVCTPSAP_H
+