bluetooth/btstack/avdtp/avdtpTransportChannel.cpp
changeset 0 29b1cd4cb562
child 22 786b94c6f0a4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/avdtp/avdtpTransportChannel.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,166 @@
+// 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 transport channel base class
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <bluetooth/logger.h>
+#include "avdtpTransportChannel.h"
+#include "avdtpDirectChannel.h"
+#include "avdtpMuxChannel.h"
+#include "avdtp.h"
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_AVDTP);
+#endif
+
+CTransportChannel::CTransportChannel(CAvdtpProtocol& aProtocol,
+							  		 const TBTDevAddr& aRemoteDevice)
+	: iProtocol(aProtocol),
+	  iRemoteDevice(const_cast<TBTDevAddr&>(aRemoteDevice))
+	{
+	LOG_FUNC
+	}
+	
+CTransportChannel::~CTransportChannel()
+	{
+	LOG_FUNC
+	iProtocol.TransportChannelDown(*this);
+
+	if (iLogicalChannel)
+		{
+		iLogicalChannel->Shutdown(CServProviderBase::EImmediate);
+		delete iLogicalChannel;
+		}
+	}
+
+/*static*/ CTransportChannel* CTransportChannel::NewDirectChannelL(CAvdtpProtocol& aProtocol,
+							  const TBTDevAddr& aRemoteDevice)
+	{
+	LOG_STATIC_FUNC
+	return CDirectChannel::NewL(aProtocol, aRemoteDevice);
+	}
+
+
+/*static*/ CTransportChannel* CTransportChannel::NewMuxChannelL(CAvdtpProtocol& aProtocol,
+							  const TBTDevAddr& aRemoteDevice,
+							  TTCID aRemotelyAssignedTCID/*=KInvalidTCID*/)
+	{
+	LOG_STATIC_FUNC
+	return CMuxChannel::NewL(aProtocol, aRemoteDevice, aRemotelyAssignedTCID);
+	}
+
+TInt CTransportChannel::SetOption(TUint aLevel, TUint aName, const TDesC8 &aOption)
+	{
+	LOG_FUNC
+	return iLogicalChannel->SetOption(aLevel, aName, aOption);
+	}
+
+void CTransportChannel::CanClose(TDelete aDelete)
+	{
+	LOG_FUNC
+	switch (aDelete)
+		{
+		case EDelete:
+			delete iLogicalChannel;
+		// fallthrough
+		default:
+			iLogicalChannel = NULL;
+		}
+	delete this;
+	}
+	
+void CTransportChannel::LogicalChannelComplete(TLogicalChannelRecord aLogicalChannelRecord, TInt aErr)
+	{
+	LOG_FUNC
+	if (aErr)
+		{
+		// try to tell any sessions present...
+		static_cast<MSocketNotify*>(this)->Disconnect();		
+		}
+	else
+		{
+		// take ownership
+		iLogicalChannel = aLogicalChannelRecord.iLogicalChannelSAP;
+		iLogicalChannel->SetNotify(this);
+		// drain any data
+		if (aLogicalChannelRecord.iDataCount)
+			{
+			NewData(aLogicalChannelRecord.iDataCount);
+			
+			if (aLogicalChannelRecord.iEndOfData)
+				{
+				NewData(KNewDataEndofData);
+				}
+			}
+		}
+	}
+	
+void CTransportChannel::AllowServices(TAvdtpAdaptationServices aServices)
+	{
+	LOG_FUNC
+	// retained by base class - the derivee can choose whether to use it
+	iAllowedServices = aServices;
+	}
+
+
+void CTransportChannel::CloseLogicalChannel()
+	{
+	LOG_FUNC
+	if (iLogicalChannel)
+		{
+		iLogicalChannel->Shutdown(CServProviderBase::ENormal);
+		}
+	else CanClose();
+	}
+
+
+TInt CTransportChannel::MaxPacketSize(TInt& aMTU)
+	{
+	LOG_FUNC
+	// default is just whatever l2cap is
+	TInt ret = KErrNotReady;
+	if (iLogicalChannel)
+		{
+		TPckg<TInt> mtuPckg(aMTU);
+		ret = iLogicalChannel->GetOption(KSolBtL2CAP, KL2CAPOutboundMTUForBestPerformance, mtuPckg);
+		}
+	else
+		{
+		aMTU = 0;
+		}
+	return ret;
+	}
+	
+TInt CTransportChannel::MaxReceivePacketSize(TInt& aMRU)
+	{
+	LOG_FUNC
+	// default is just whatever l2cap is
+	TInt ret = KErrNotReady;
+	if (iLogicalChannel)
+		{
+		TPckg<TInt> mruPckg(aMRU);
+		ret = iLogicalChannel->GetOption(KSolBtL2CAP, KL2CAPInboundMTU, mruPckg);
+		}
+	else
+		{
+		aMRU = 0;
+		}
+	return ret;
+	}