diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/avctp/common/Avctp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btstack/avctp/common/Avctp.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,216 @@ +// 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: +// + +/** + @file + @internalTechnology +*/ + +#ifndef AVCTP_H +#define AVCTP_H + +#include +#include +#include +#include "btsockettimer.h" +#include "avctpcommon.h" +#include + +namespace SymbianAvctp +{ + +const static TUint KServiceInfo = + KSIConnectionLess | KSIReliable | KSIInOrder | + KSIDatagram | KSIGracefulClose; + +const static TInt KServiceTypeInfo = + ESocketSupport | ECantProcessMBufChains | EUseCanSend; + +const static TInt KMaxNumSocketsInProtocol = 10; +} // end of namespace SymbianAvctp + + +// ok to not have in namespace +const static TL2CAPPort KAvctpSecondChannelPSM = 0x1b; +const TInt KAvctpSecondaryChannelOutboundMTU = 0xffff; +const TInt KAvctpSecondaryChannelInboundMTU = 0xffff; + +// forward declarations +class CAvctpSap; +class CAvctpTransport; +class CAvctpMuxerStateFactory; +class CAvctpConnection; +class CAvctpPacketMgr; +class HAvctpIncomingSdu; +class HAvctpOutgoingSdu; +class CAvctpSubConDeviceErrorEvent; +class CAvctpSubConEventConnectCfm; +class CAvctpSubConEventConnectInd; +class CAvctpSubConEventDiscCfm; +class CAvctpSubConEventDiscInd; +class MAvctpSDUSender; + +NONSHARABLE_CLASS(TClientItem) + { +public: + TClientItem(TUint16 aClientId); + void AttachPrimaryChannel(MSocketNotify& aNotify); + void AttachSecondaryChannel(MSocketNotify& aNotify); + void DetachSecondaryChannel(); + TUint16 ClientId() const; + MSocketNotify* PrimaryChannel() const; + MSocketNotify* SecondaryChannel() const; + TBool IsSecondaryChannelAttached() const; +private: + TUint16 iClientId; + MSocketNotify* iPrimaryChannel; + MSocketNotify* iSecondaryChannel; + TBool iIsSecondaryChannelAttached; + TInt iRefCount; + }; + +/** +The AVCTP Protocol object. Used by BT_v2.prt to create a CProtocolBase object +for ESOCK, so ESOCK can create AVCTP sockets. + +This is the object created by ESock to give access to AVCTP services + + @internalAll + @see CProtocolBase +*/ + +NONSHARABLE_CLASS(CAvctpProtocol) : public CBluetoothProtocolBase + { +public: + // Factory functions + static CAvctpProtocol* NewL(CBTSecMan& aSecMan, RBTControlPlane& aControlPlane, CBTCodServiceMan& aCodMan); + static CAvctpProtocol* NewLC(CBTSecMan& aSecMan, RBTControlPlane& aControlPlane, CBTCodServiceMan& aCodMan); + + // Functions from CProtocolBase + virtual void InitL(TDesC& aTag); // need to get a state factory + virtual void StartL(); // check we're bound + virtual void BindToL(CProtocolBase* aProtocol); // bind to lower protocol (L2CAP) + virtual void CloseNow(); + virtual void Open(); + virtual void Close(); + virtual void Identify(TServerProtocolDesc* aProtocolDesc) const; + virtual CServProviderBase* NewSAPL(TUint aSockType); + + // Functions from CBluetoothProtocolBase + virtual TInt BearerConnectComplete(const TBTDevAddr& aAddr, CServProviderBase* aSSP); + virtual TInt ControlPlaneMessage(TBTControlPlaneMessage aMessage, TAny* aParam); + + // Other general protocol functions + TInt StartProtocolListening(); + void DoStartAvctpListeningL(); + static void ProtocolIdentity(TServerProtocolDesc* aDesc); // Static query function used by Identify + TInt SetPreauthorisation(const TBTDevAddr& aPreauthoriseAddress, TBool aSetPreauthorisation); + + // AVCTP specific functions + CAvctpMuxerStateFactory& MuxerStateFactory() const; + + // Interface to the muxer + TInt ProvideTransport(const TBTDevAddr& aRemoteAddr, TUint16 aClientId, MSocketNotify& aControlSocket); + TInt ActiveExtendTransport(const TBTDevAddr& aRemoteAddr, TUint16 aClientId, MSocketNotify& aSecondChannelControlSocket); + void AwaitForExtendedTransport(TUint16 aClientId, MSocketNotify& aSecondChannelControlSocket); + void PrimaryChannelRefuseAttach(const TBTDevAddr& aRemoteAddr, TUint16 aClientId); + void SecondaryChannelRefuseAttach(const TBTDevAddr& aRemoteAddr, TUint16 aClientId); + TInt AttachInboundConnectionToTransport(const TBTDevAddr& aRemoteAddr, CServProviderBase* aL2CAPConSAP); + TInt GetChannelMtu(TInt aChannel, const TBTDevAddr& aAddr, TInt& aMtu); + TInt ReleaseTransport(const TBTDevAddr& aRemoteAddr, TUint16 aClientId); + TInt ReleaseExtendedTransport(const TBTDevAddr& aRemoteAddr, TUint16 aClientId); + void PrimaryChannelIncomingRemoteDisconnection(const TBTDevAddr& aRemoteAddr); + MAvctpSDUSender* GetSDUSender(const TBTDevAddr& aRemoteAddr, TInt aChannel); + CAvctpTransport* FindTransport(const TBTDevAddr& aDevAddr); + void AwaitTransport(TUint16 aClientId, MSocketNotify& aControlSocket); + TInt PrimaryChannelAgreeAttachment(TUint16 aClientId, const TBTDevAddr& aRemoteAddr); + TInt SecondaryChannelAgreeAttachment(TUint16 aClientId, const TBTDevAddr& aRemoteAddr); + // Interface to all Saps provided for the muxers + TBool SapsHaveDataFor(const TBTDevAddr& aRemoteAddr); + void SignalCanSendToSaps(CAvctpPacketMgr& aPacketMgr); + void SignalNewDataToSaps(HAvctpIncomingSdu* aSdu, TInt aChannel); + void SignalMuxerDownToSaps(const TBTDevAddr& aRemoteAddr); + + // Que Management + TInt AddSap(CAvctpSap& aSap); + void RemoveSap(CAvctpSap& aSap); + CAvctpSap* FindSap(TUint16 aClientId); + TInt AddTransport(CAvctpTransport& aMuxer); + void RemoveTransport(CAvctpTransport& aMuxer); + CAvctpTransport* FindOrCreateTransport(const TBTDevAddr& aDevAddr, TInt aChannel, CServProviderBase* aL2CAPConSAP = NULL); + void SetSecondChannelCtrlNotify(TUint16 aClientId, MSocketNotify& aSecondChannelControlSocket); + void NotifyLinkUp(const TBTDevAddr& aAddr, TBool aIsSecondChannel); +private: + CAvctpProtocol(CBTSecMan& aSecMan, RBTControlPlane& aControlPlane, CBTCodServiceMan& aCodMan); + void ConstructL(); + ~CAvctpProtocol(); + + // Close Functions + void CheckForIdle(); + TBool IsIdle(); + void QueIdleTimer(); + void DequeIdleTimer(); + const TClientItem* AddClientItem(TUint16 aClientId, MSocketNotify& aNotify); + const TClientItem* ClientItem(TUint16 aClientId) const; + static TInt TryToClose(TAny* aProtocol); + + // Ipid Response Callback functions + static TInt IpidAsyncCallBack(TAny* aProtocol); + inline void StartSendIpidAsyncCallBack(); + inline void CancelIpidAsyncCallBack(); + +#ifdef __FLOG_ACTIVE + void LogSaps(); + void LogMuxers(); +#endif + +private: + /** The state factory for the lightweight AVCTP SAP states */ + CAvctpMuxerStateFactory* iMuxerStateFactory; + + // Queues + /** All AVCTP Service Access Providers are owned by esock. + This queue is for Saps that have been assigned a PID + to allow us to enforce the 1 SAP / PID rule */ + TDblQue iSaps; + /** All AVCTP transports are owned by the protocol. + This queue is for Muxers that have been assigned a remote address + to allow us to enforce the 1 Muxer / remote address rule */ + TDblQue iTransports; + /** This is a Que of IPID responses to remote devices + These are owned by the protocol */ + TDblQue iIpidResponses; + + // Stuff for close callbacks, etc. + /** Whether we are about to die */ + TBool iClosePending; + + /** An entry in the BT protocol family delta timer queue + The idle timer is something that runs to prevent the protocol going down and + then being brought up again immediately because this is costly. Instead we + stay alive for a small amount of time to try and smooth out the Opening and + closing */ + TDeltaTimerEntry iIdleTimerEntry; + TBool iIdleTimerQueued; + + CAsyncCallBack* iIpidResponseAsyncCallBack; + CIncomingConnectionListener* iSecondChannelListener; + RHashMap iClientItems; + }; + +#include "avctp.inl" + +#endif // AVCTP_H +