bluetooth/btstack/avdtp/avdtpLocalSEP.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/btstack/avdtp/avdtpLocalSEP.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,247 @@
+// 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 local SEP
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <bluetooth/logger.h>
+#include "avdtpLocalSEP.h"
+#include "avdtpStream.h"
+#include "avdtp.h"
+#include "avdtputil.h"
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_AVDTP);
+#endif
+
+/*
+@param aSEPInfo is an in and out parameter
+inbound there is no SEID set, but this class on construction writes back the assigned SEID
+*/
+CLocalSEP* CLocalSEP::NewL(TAvdtpSEPInfo& aSEPInfo, TSEIDManager& aSEIDManager)
+	{
+	LOG_STATIC_FUNC
+	CLocalSEP* sep = new (ELeave) CLocalSEP;
+	CleanupStack::PushL(sep);
+	sep->ConstructL(aSEPInfo, aSEIDManager);
+	CleanupStack::Pop(sep);
+	return sep;
+	}
+	
+CLocalSEP::CLocalSEP() : iPreConfigured(ETrue)
+	{
+	LOG_FUNC
+	}
+	
+void CLocalSEP::ConstructL(TAvdtpSEPInfo& aSEPInfo, TSEIDManager& aSEIDManager)
+	{
+	LOG_FUNC
+	
+	// store client's settings of sink-ness, codec type etc
+	iInfo = aSEPInfo;
+	// assign RSEID to us, and return for client knowledge
+	User::LeaveIfError(aSEIDManager.GetSEID(iLocalSEID));
+	
+	// store for remote-acquisition
+	iInfo.SetSEID(iLocalSEID.SEID());
+	
+	// update client with seid details
+	aSEPInfo = iInfo;
+	
+	LOG1(_L("Assigned SEID %d"), aSEPInfo.SEID().SEID());
+	__ASSERT_DEBUG(iInfo.SEID().IsLocal(), Panic(EAvdtpSEIDHasWrongDomain));
+	}
+		
+/*
+add or change a capability
+*/
+void CLocalSEP::AddCapability(const TAvdtpServiceCapability* aCapability)
+	{
+	LOG_FUNC
+	// take heap copy to persist this blob of data
+	__ASSERT_DEBUG(aCapability, Panic(EAvdtpBadLocalSEPUpdate));
+	
+	TAvdtpServiceCategory c = aCapability->Category();
+	if (iCapabilities[c])
+		{
+		delete iCapabilities[c];
+		}
+	iCapabilities[c] = const_cast<TAvdtpServiceCapability*>(aCapability);
+	iCapabilityCategories.SetCapability(c);
+	}
+		
+CLocalSEP::~CLocalSEP()
+	{
+	LOG_FUNC
+	iLocalSEID.Close();
+	iCapabilities.DeleteAll();
+	iConfiguration.DeleteAll();
+	if (iStream)
+		{
+		iStream->LocalSEPDestroyed(*this);
+		}
+	iPendingConfigurationProtocolDomain.Close();
+	delete iSecurityControl;
+	}
+
+/*
+Is the Local SEP in a state where it will accept pending configuration to be set.
+Returns KErrNone if a subsequent call to SetPendingConfiguration() will succeed
+otherwise an AVDTP error code.
+*/
+TInt CLocalSEP::CheckConfigurationState(TBool aIsReconfig) const
+	{
+	LOG_FUNC
+	TInt ret = KErrNone;
+	if (InUse() && !aIsReconfig)
+		{
+		ret = SymbianBluetoothAV::ConvertToSymbianError::AvdtpError(EAvdtpSEPInUse);
+		}
+	else if (!InUse() && aIsReconfig)
+		{
+		ret = SymbianBluetoothAV::ConvertToSymbianError::AvdtpError(EAvdtpSepNotInUse);
+		}
+	else
+		{
+		if (iPendingConfigurationProtocolDomain.Length())
+			{
+			// remote sent us while already setting configuration
+			ret = SymbianBluetoothAV::ConvertToSymbianError::AvdtpError(EAvdtpBadState);
+			}
+		}
+	return ret;	
+	}
+	
+/*
+The pending configuration is set for a period of time before the configuration
+is committed.
+
+For an incoming (re)configure, the pending configuration is set when AVDTP 
+receives the (re)configure request and committed when GAVDP processes the 
+resulting indication and sends the (re)configure response.
+
+For an outgoing (re)configure, the pending configuration is set when we send 
+the (re)configure request and committed when we receive the (re)configure 
+response.
+*/	
+TInt CLocalSEP::SetPendingConfiguration(const RBuf8& aConfigProtocolDomain, TBool aIsReconfig)
+	{
+	LOG_FUNC
+	TInt ret = CheckConfigurationState(aIsReconfig);
+
+	if (ret == KErrNone)
+		{
+		// take ownership of config
+		iPendingConfigurationProtocolDomain.Assign(aConfigProtocolDomain);
+		}
+		
+	return ret;
+	}
+
+
+void CLocalSEP::SetRemoteSEID(TSEID aINTSEID)
+	{
+	LOG_FUNC
+	iRemoteSEID = aINTSEID;	
+	__ASSERT_DEBUG(!iRemoteSEID.IsLocal(), Panic(EAvdtpSEIDHasWrongDomain));
+	}
+
+
+void CLocalSEP::CommitPendingConfigurationL(TBool aSuccess, TBool aReconfig)
+	{
+	LOG_FUNC
+	if (aSuccess)
+		{
+		TAvdtpServiceCategories cats;
+		cats.SetCapability(EAllServiceCategories);
+		CCapabilityParseVisitor* parser = new(ELeave) CCapabilityParseVisitor(cats);
+		iConfiguration.DeleteAll();
+		parser->Process(iPendingConfigurationProtocolDomain);
+		iConfiguration = parser->GetCapabilities();
+		delete parser;
+
+		iPreConfigured = EFalse;
+		}
+		
+	// if we're configuring we need to set in use if success
+	// if we're reconfiguring we don't want to clear in use if fail
+	if (aReconfig)
+		{
+		if (!InUse())
+			{
+			// don't want to clear in use for failed reconfigurations
+			SetInUse(aSuccess);
+			}
+		}
+	else
+		{
+		SetInUse(aSuccess);
+		}		
+	// we were given ownership, close in either case
+	iPendingConfigurationProtocolDomain.Close();		
+	}
+	
+void CLocalSEP::SetSecurityControl(const HBufC8* aSecurityControl)
+	{
+	LOG_FUNC
+	delete iSecurityControl;
+	iSecurityControl = aSecurityControl;
+	}
+	
+CAVStream& CLocalSEP::CreateStreamL(const TAvdtpSockAddr& aAddr,
+									MAvdtpStreamNotify& aStreamNotify,
+									CAvdtpProtocol& aProtocol)
+	{
+	LOG_FUNC
+	if (!iStream)
+		{
+		iStream = CAVStream::NewL(aAddr, aStreamNotify, aProtocol, *this);
+		aProtocol.StreamCreated(*iStream);
+		}
+	else
+		{
+		// client is trying to use same local sep for >1 stream. Wrong!
+		User::Leave(KErrInUse);
+		}
+	return *Stream();
+	}
+	
+void CLocalSEP::ExpectStreamL(const TBTDevAddr& aBTAddr,
+								MAvdtpStreamNotify& aStreamNotify,
+								CAvdtpProtocol& aProtocol)
+	{
+	LOG_FUNC
+	TAvdtpSockAddr addr;
+	addr.SetBTAddr(aBTAddr);
+	addr.SetSEID(iRemoteSEID);
+	CreateStreamL(addr, aStreamNotify, aProtocol).Configured();
+	}
+
+void CLocalSEP::SetInUse(TBool aInUse)
+	{
+	LOG_FUNC
+	// clients must check that any bound stream will require erroring
+	iInfo.SetInUse(aInUse);
+	}
+
+TBool CLocalSEP::MultiplexingConfigured() const
+	{
+	return static_cast<TAvdtpMultiplexingCapability*>(Configuration()[EServiceCategoryMultiplexing]) ?
+			ETrue : EFalse;
+	}