bluetooth/gavdp/source/gavdpIf.cpp
changeset 0 29b1cd4cb562
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetooth/gavdp/source/gavdpIf.cpp	Fri Jan 15 08:13:17 2010 +0200
@@ -0,0 +1,340 @@
+// Copyright (c) 2004-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:
+//
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#include <gavdp.h>
+#include "gavdpInternal.h"
+
+/**
+Default Constructor
+*/
+EXPORT_C RGavdp::RGavdp() 
+: iGavdpImp(NULL)
+	{
+	}
+
+/**
+Open a GAVDP session.
+@note not to be confused with the "Open" primitive in the GAVDP spec. This is 
+merely opening the handle in the Symbian OS sense.
+@param aServiceUser a reference to a MGavdpUser mixin for GAVDP callback 
+events.
+@param aSocketServer reference to the client's Socket Server session. 
+@return system-wide error
+@see RegisterSEP
+*/
+EXPORT_C TInt RGavdp::Open(MGavdpUser& aServiceUser, RSocketServ& aSocketServer)
+	{
+	__ASSERT_ALWAYS(iGavdpImp==NULL,Panic(EGavdpAlreadyOpen));
+	
+	TRAPD(res, iGavdpImp = CGavdp::NewL(aServiceUser, aSocketServer, *this));
+	return res;
+	}
+	
+/**
+Closes the GAVDP session and frees all resources associated with it.
+This function should not be called from within a client's implementation of 
+any MGavdpUser (upcall) method.
+@note not to be confused with the "Close" primitive in the GAVDP spec. This is 
+merely closing the handle in the Symbian OS sense.
+@note However, if this is Closed when streams are active, the Bluetooth 
+subsystem shall Release all Streams managed by this RGavdp instance.
+@note that the closure of any bearer sockets created remains the 
+responsibility of the client.
+*/
+EXPORT_C void RGavdp::Close()
+	{
+	delete iGavdpImp;
+	iGavdpImp = NULL;
+	}
+	
+/**
+Cancel the outstanding client request.
+As per usual Symbian OS Cancel semantics, this method does not guarantee that 
+the outstanding request was "undone".
+Therefore to reset each sides' state the client should consider sending an 
+Abort too.
+@see RGavdp::AbortStream
+*/
+EXPORT_C void RGavdp::Cancel()
+	{
+	if(iGavdpImp!=NULL)
+		{
+		iGavdpImp->Cancel();	
+		}
+	}
+
+/**
+Connects a GAVDP session - i.e. creates an AVDTP signalling channel to a 
+remote device.
+The signalling channel may already exist, in which case this session is added 
+as a user of that channel.
+The necessary multiplexing is implemented in AVDTP, so the client need not be 
+concerned with this.
+@param aRemoteAddr the Bluetooth device address of the remote GAVDP entity.
+*/
+EXPORT_C void RGavdp::Connect(const TBTDevAddr& aRemoteAddr)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	iGavdpImp->Connect(aRemoteAddr);
+	}
+	
+/**
+Discover the Stream endpoints (SEPs) on the remote device.
+Callbacks on MGavdpUser will be called as a result of this call.
+@pre a Signalling channel must have been successfully created
+@see MGavdpUser::GAVDP_SEPDiscovered
+*/
+EXPORT_C void RGavdp::DiscoverRemoteSEPs()
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	iGavdpImp->DiscoverRemoteSEPs();
+	}
+	
+/**
+Get the capabilities of a remote Stream Endpoint (SEP).
+Callbacks on MGavdpUser will be called for the intersection of capabilities 
+that the remote supports and that the local GAVDP user is interested in using. 
+@param aSEID the ID of the remote SEP for which capabilities are to be 
+retrieved.
+@param aInterestingCategories the categories the local GAVDP client is 
+interested in.
+*/
+EXPORT_C void RGavdp::GetRemoteSEPCapabilities(TSEID aSEID, const TAvdtpServiceCategories& aInterestingCategories)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	iGavdpImp->GetRemoteSEPCapabilities(aSEID, aInterestingCategories);
+	}
+	
+/**
+Begin configuring (or reconfiguring) a remote SEP.
+Subsequent calls are used to add each configuration required.
+@see RGavdp::AddSEPCapability
+@param aRemoteSEID the ID of the remote SEP.
+@param aLocalSEID the ID of the local SEP.
+@return system-wide error.
+*/	
+EXPORT_C TInt RGavdp::BeginConfiguringRemoteSEP(TSEID aRemoteSEID, TSEID aLocalSEID)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	return iGavdpImp->BeginConfiguringRemoteSEP(aRemoteSEID, aLocalSEID);
+	}
+	
+/**
+Begin configuring (or reconfiguring) a local SEP.
+Subsequent calls are used to add each configuration required.
+@see RGavdp::AddSEPCapability
+@param aSEID the ID of the local SEP.
+@return system-wide error.
+*/	
+EXPORT_C TInt RGavdp::BeginConfiguringLocalSEP(TSEID aSEID)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	return iGavdpImp->BeginConfiguringLocalSEP(aSEID);
+	}
+	
+/**
+Add a particular capability into a SEP.
+When called on a local SEP this equates to adding capabilities into the SEP.
+When called on a remote SEP this equates to configuring the SEP.
+@param aCapability a capability
+@see TAvdtpServiceCapability
+@return system-wide error.
+*/	
+EXPORT_C TInt RGavdp::AddSEPCapability(const TAvdtpServiceCapability& aCapability)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	return iGavdpImp->AddSEPCapability(aCapability);
+	}
+	
+/**
+Finalises the (re)configuration of the SEP
+*/
+EXPORT_C void RGavdp::CommitSEPConfiguration()
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	iGavdpImp->CommitSEPConfiguration();
+	}
+	
+/**
+Start stream
+@param aSEID the SEID of the local or remote SEP that requires starting
+*/
+EXPORT_C void RGavdp::StartStream(TSEID aSEID)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	iGavdpImp->StartStream(aSEID);
+	}
+	
+/**
+Suspend stream
+@note that the remote may not support Suspend, and an 
+AVDTP NOT_SUPPORTED_COMMAND error may result.
+In this case the client should consider Closing the stream.
+@param aSEID the SEID of the local or remote SEP that requires suspending.
+*/
+EXPORT_C void RGavdp::SuspendStream(TSEID aSEID)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	iGavdpImp->SuspendStream(aSEID);
+	}
+	
+/**
+Abort stream
+@note that once complete the state of the SEP will be Idle. Thus to restream, 
+the SEP has to be reconfigured, opened and started.
+@param aSEID the SEID of the local or remote SEP that requires aborting.
+*/	
+EXPORT_C void RGavdp::AbortStream(TSEID aSEID)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	iGavdpImp->AbortStream(aSEID);
+	}
+	
+/**
+Send security control data to remote SEP.
+The meaning of this is dependent on the configured Content Protection method. 
+@see TAvdtpContentProtectionCapabilities
+@param aSEID the seid of the remote SEP
+@param aSecurityData the security data
+*/
+EXPORT_C void RGavdp::SendSecurityControl(TSEID aSEID, const TDesC8& aSecurityData)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	iGavdpImp->SendSecurityControl(aSEID, aSecurityData);	
+	}
+
+/**
+Register an extra local SEP.
+@param aInfo reference containing SEP information. Note the SEID assigned by 
+AVDTP will be written back into aInfo.
+@return system-wide error
+*/
+EXPORT_C TInt RGavdp::RegisterSEP(TAvdtpSEPInfo& aInfo)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	return iGavdpImp->RegisterSEP(aInfo);
+	}
+	
+/**
+Listen for inbound signalling channel connections.
+This is useful when the signalling channel is lost.
+Note: This function will not connect the session to any existing connected 
+signalling channels.
+The session will only be connected upon the next channel being connected. 
+Users should use Connect instead if they intend to connect to existing 
+signalling channels.
+@pre At least SEP shall have been registered
+@see RGavdp::RegisterSEP(TAvdtpSEPInfo& aInfo)
+@panic The client thread will be panicked if Listen is called prior to any 
+SEPs being registered.
+@return system-wide error code
+*/
+EXPORT_C TInt RGavdp::Listen()
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	return iGavdpImp->Listen();
+	}
+
+/**
+Creates bearers (in the form of sockets) for sessions on the stream.
+The sessions are media + optional reporting + optional recovery.
+The sockets will be created on the client's Socket Server session.
+The sockets may then be passed into RTP for its use.
+If the sockets are passed to RTP the client still has the responsibility of 
+closing them.
+ - i.e. neither RTP nor GAVDP will close the sockets.
+The reporting/recovery config is already known by the stream. All the required
+bearers will be created.
+
+@param aSEID The SEID of the remote SEP for which the sockets are required.
+@param aIgnored1 Source compatibility place holder
+@param aIgnored2 Source compatibility place holder
+@return system-wide error code
+
+@see RGavdp::CreateBearerSockets(TSEID aSEID)
+@deprecated
+*/
+EXPORT_C TInt RGavdp::CreateBearerSockets(TSEID aSEID, TBool /*aIgnored1*/, TBool /*aIgnored2*/)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	return iGavdpImp->CreateBearerSockets(aSEID);
+	}
+
+/**
+Creates bearers (in the form of sockets) for sessions on the stream.
+The sessions are media + optional reporting + optional recovery.
+The sockets will be created on the client's Socket Server session.
+The sockets may then be passed into RTP for its use.
+If the sockets are passed to RTP the client still has the responsibility of 
+closing them.
+ - i.e. neither RTP nor GAVDP will close the sockets.
+The reporting/recovery config is already known by the stream. All the required
+bearers will be created. 
+
+@param aSEID The SEID of the remote SEP for which the sockets are required.
+@return system-wide error code
+*/
+EXPORT_C TInt RGavdp::CreateBearerSockets(TSEID aSEID)
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	return iGavdpImp->CreateBearerSockets(aSEID);
+	}
+
+/**
+This function returns the deprecated value KMaxAvdtpSecurityControlInfo so as 
+to ensure that the return value is what partners will expect during the 
+transition period from the use of the old constant to this new API.
+When the constant is removed from BluetoothAV.h it should be moved to an 
+internal header.
+@return KMaxAvdtpSecurityControlInfo
+*/
+EXPORT_C TInt RGavdp::MaxSecurityControlLength()
+	{
+	return KMaxAvdtpSecurityControlInfo;
+	}
+
+/**
+Disconnects the RGavdp session from the signalling channel, but does not destroy the local SEPs owned
+by the signalling channel. Must only be called if the remote SEP has not yet been configured -
+if the remote SEP has been configured then AbortStream() should be called.
+
+@return system-wide error code
+@panic If remote SEP configured
+*/
+
+EXPORT_C TInt RGavdp::Shutdown()
+	{
+	__ASSERT_ALWAYS(iGavdpImp!=NULL,Panic(EGavdpNotOpen));
+	TInt ret = iGavdpImp->Shutdown();
+	if (ret==KErrNotReady) 
+		{
+		Panic(EGavdpShutdownNotPermittedAfterRemoteSEPConfigured);
+		}
+	return ret;
+	}
+	
+void RGavdp::UnbindBody()
+	{
+	iGavdpImp = NULL;
+	}
+
+	
+// EOF