diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btstack/sdp/sdpclient.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btstack/sdp/sdpclient.h Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,158 @@ +// Copyright (c) 2000-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 SDPCLIENT_H +#define SDPCLIENT_H + +#include +#include + +class CSdpPdu; +class CSdpNetDbProvider; +class CSdpProtocol; +class CProtocolBase; +class TUUID; + +/** + Acts as the local SDP client Agent, for a given remote device. + + There is one of these per remote device. This class + acts as an internal socket binding to a lower level SAP. Thus we + derive from MSocketNotify so that the SAP can directly notify us of events. +**/ +NONSHARABLE_CLASS(CSdpClient) : public CBase, private MSocketNotify + { +friend class CSdpProtocol; +public: + // Create/destroy + static CSdpClient* NewL(CSdpProtocol& aProt, CProtocolBase& aL2CAP); + ~CSdpClient(); + // Interface for the Protocol to request services + void Open(TBTDevAddr& aAddr); + void AddNetDbProvider(CSdpNetDbProvider& aNetDbProvider); + void RemoveNetDbProvider(CSdpNetDbProvider& aNetDbProvider); + + // Interface for the NetDbProviders to request actions + void ServiceSearchRequest(CSdpNetDbProvider& aNetDbProvider, + TUint16 aMaxCount, const TUUID &aUUID, const TDesC8& aContState); + void ServiceAttributeRequest(CSdpNetDbProvider& aNetDbProvider, + TUint aRecordHandle, TUint16 aMaxLength, TBool aRange, + TUint aAttribute, const TDesC8& aContState); + void EncodedRequest(CSdpNetDbProvider& aNetDbProvider, + TUint8 aPduRequestId, + const TDesC8& aEncodedData); + + + // From MSocketNotify + 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& /*aConnectionInf*/) {}; + void Bearer(const TDesC8& /*aConnectionInf*/) {}; + +private: + // Create/destroy + CSdpClient(CSdpProtocol& aProtocol, CProtocolBase& aL2CAP); + void ConstructL(); + + // Out & In PDU handling could be generalised in a CSDP base, which + // the SDP client and server specialise as appropriate. + + // Processing incoming pdus + void ParseNextPacket(); + void HandlePDU(TUint8 aPduId, TUint16 aTransId, const TDesC8& aParams); + void HandleErrorResponse(CSdpNetDbProvider* aNetDbProv, const TDesC8& aParams); + void HandleServiceSearchResponse(CSdpNetDbProvider* aNetDbProv, const TDesC8& aParams); + void HandleServiceAttributeResponse(CSdpNetDbProvider* aNetDbProv, const TDesC8& aParams); + + // Outgoing pdus + CSdpPdu* NewPdu(CSdpNetDbProvider* aNetDb); + TUint16 NextTransId(); + + void EnqueOutboundPdu(CSdpPdu& aPdu); + void TryToSend(); + + // Hide these to make replacing with bitmask easier + TBool ChannelUp() const; + void ChannelUp(TBool aState); + + TBool RequestOutstanding() const; + void RequestOutstanding(TBool aBool); // True if OK to send + + TBool L2CAPBlocked() const; + void L2CAPBlocked(TBool aState); + + // Misc + void CheckForIdle(TInt aTimeoutInSeconds); + void CancelIdleTimer(); + static TInt IdleTimerExpired(TAny* aPtr); + +private: + // Data items + TDblQue iNetDbProviders; // NetDbProviders using this Client + TDblQue iOutboundQ; // PDUs to be sent + CSdpProtocol& iProtocol; + CProtocolBase& iL2CAP; + CServProviderBase* iBoundSAP; + TBTDevAddr iRemoteAddr; + + // Reassembly buffer + HBufC8* iNextPacket; // Next packet coming up from L2CAP + + // Client state + TBool iClientChannelUp; + TBool iRequestOutstanding; // A request has been sent + TBool iL2CAPSendBlocked; // Is L2CAP ok to send data? + TUint16 iTransId; // Last used transaction ID for this client + + // Clean up stuff + TDeltaTimerEntry iIdleTimerEntry; //< Idle timer, that kills us eventually + TBool iIdleQueued; //< Idle timer is on Q. + + // Go on a Q + TDblQueLink iLink; + }; + + +inline TBool CSdpClient::ChannelUp() const + {return iClientChannelUp;} + +inline void CSdpClient::ChannelUp(TBool aState) + {iClientChannelUp=aState;} + +inline TBool CSdpClient::RequestOutstanding() const + {return iRequestOutstanding;} + +inline void CSdpClient::RequestOutstanding(TBool aBool) + {iRequestOutstanding=aBool;} + +inline TBool CSdpClient::L2CAPBlocked() const + {return iL2CAPSendBlocked;} + +inline void CSdpClient::L2CAPBlocked(TBool aState) + {iL2CAPSendBlocked=aState;} + + + +#endif