bluetooth/btstack/avdtp/avdtpDirectChannel.cpp
changeset 0 29b1cd4cb562
child 22 786b94c6f0a4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/avdtp/avdtpDirectChannel.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,170 @@
+// Copyright (c) 2003-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:
+// Implements the avdtp "direct" (!muxed) transport channel object
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+#include <bluetooth/logger.h>
+#include "avdtpDirectChannel.h"
+#include "avdtpTransportSession.h"
+#include "avdtp.h"
+#include "avdtputil.h"
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_AVDTP);
+#endif
+
+CDirectChannel* CDirectChannel::NewL(CAvdtpProtocol& aProtocol,
+						 	   		 const TBTDevAddr& aRemoteDevice)
+	{
+	LOG_STATIC_FUNC
+	CDirectChannel* s = new (ELeave) CDirectChannel(aProtocol, aRemoteDevice);
+	return s;
+	}
+
+
+CDirectChannel::CDirectChannel(CAvdtpProtocol& aProtocol,
+							   const TBTDevAddr& aRemoteDevice)
+: CTransportChannel(aProtocol, aRemoteDevice)
+	{
+	LOG_FUNC
+	}
+		
+TInt CDirectChannel::AttachTransportSession(CUserPlaneTransportSession& aSession, TAvdtpTransportSessionType /*aType*/)
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(!iTransportSession, Panic(EAVDTPBadSessionAttachToTransportChannel));
+	// don't care about session type for direct channels
+	iTransportSession = &aSession;
+	return KErrNone;
+	}
+	
+TBool CDirectChannel::CouldAttachSession(const TAvdtpSockAddr& /*aAddr*/)
+	{
+	LOG_FUNC
+	// for this channel we can take iff no session
+	return (iTransportSession == NULL);
+	}
+
+TTCID CDirectChannel::TCID() const
+	{
+	LOG_FUNC
+	return KDirectChannelTCID;
+	}
+
+CServProviderBase* CDirectChannel::ObtainSAP()
+	{
+	CServProviderBase* sap = iLogicalChannel;
+	iLogicalChannel = NULL;
+	return sap;
+	}
+
+void CDirectChannel::TransportSessionBlocked(TAvdtpTransportSessionType /*aSession*/, TBool aBlocked)
+	{
+	LOG_FUNC
+	LOG1(_L("TransportSession blocked(%d"), aBlocked);
+	iTransportSessionBlocked = aBlocked;
+	}
+	
+/**
+Just pass down directly to logical channel
+No marshalling of other sessions to do, and no framing so just go
+but this is by invite only! should check for this (only debug)
+*/
+TUint CDirectChannel::SendPacket(TTSID /*aTSID*/, RMBufChain& aPacket)
+	{
+	LOG_FUNC
+	LOG1(_L("Packet length = %d bytes"), aPacket.Length());
+	return iLogicalChannel ? iLogicalChannel->Write(aPacket,0) : 0;
+	}
+	
+	
+// from logical channel
+
+/**
+To reduce copying just forward indication on
+Also this leaves the AV Sap or Session to work out what is best strategy to get data
+*/
+void CDirectChannel::NewData(TUint aCount)
+	{
+	LOG_FUNC
+	if (iTransportSession)
+		{
+		RMBufChain chain;
+		TInt err = KErrNone;
+		while (aCount--)
+			{
+			err = iLogicalChannel->GetData(chain,0,0);  //returns negative error code or the number of datagrams ( = 1 )
+			if (err > 0)
+				{
+				iTransportSession->NewData(chain);
+				}
+			}
+		}
+	}
+
+void CDirectChannel::CanSend()
+/**
+upcall from logical channel (l2cap)
+*/
+	{
+	LOG_FUNC
+	iTransportSession->CanSend();
+	}
+
+#ifdef _DEBUG	
+void CDirectChannel::DetachTransportSession(CUserPlaneTransportSession& aSession, TAvdtpTransportSessionType /*aType */)
+#else
+void CDirectChannel::DetachTransportSession(CUserPlaneTransportSession& /*aSession*/, TAvdtpTransportSessionType /*aType */)
+#endif
+	{
+	LOG_FUNC
+	__ASSERT_DEBUG(&aSession == iTransportSession, Panic(EAVDTPBadSessionDetachFromTransportChannel));
+	iTransportSession = NULL;
+	// closing logical channel is async - we die on CanClose
+	// but we're invalid, so tell protocol
+	Protocol().TransportChannelClosing(*this);
+	CloseLogicalChannel();
+	}
+	
+void CDirectChannel::Disconnect()
+/**
+	upcall from logical channel (l2cap)
+*/
+	{
+	LOG_FUNC
+	iLogicalChannel = NULL;
+	if (iTransportSession)
+		{
+		iTransportSession->ChannelError(KErrDisconnected);
+		}
+	}
+	
+void CDirectChannel::Error(TInt aError, TUint /*aOperationMask*/)
+/**
+	upcall from logical channel (l2cap)
+*/
+	{
+	LOG_FUNC
+	if (iTransportSession)
+		{
+		iTransportSession->ChannelError(aError);
+		}
+	}
+	
+