bluetooth/btstack/sdp/sdpclient.h
changeset 0 29b1cd4cb562
child 48 22de2e391156
--- /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 <es_prot.h>
+#include <bttypes.h>
+
+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<CSdpNetDbProvider> iNetDbProviders;  // NetDbProviders using this Client
+	TDblQue<CSdpPdu> 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