bluetoothappprofiles/avrcp/remconbeareravrcp/inc/controlbearer.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:04 +0100
branchRCL_3
changeset 56 9386f31cc85b
parent 55 613943a21004
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

// Copyright (c) 2008-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 CONTROLBEARER_H
#define CONTROLBEARER_H

/**
@file
@internalComponent
@released
*/

#include <avctpservices.h>
#include <btsdp.h>
#include <e32std.h>
#include <remcon/clientid.h>
#include <remcon/remconbearerinterface.h>
#include <remcon/remconbearerplugin.h>
#include <remcon/avrcpspec.h>
#include <remcon/messagetype.h>
#include <remcon/playertype.h>
#include "avrcpbearerinterface.h"
#include "remconcommandinterface.h"

class CControlCommand;
class CRcpRemoteDevice;
class CControlRouter;
class TBTDevAddr;
class CBrowseCommand;
class CAvrcpPlayerInfoManager;
class CAvrcpBulkBearer;

NONSHARABLE_CLASS(CRemConBearerAvrcp) : public CRemConBearerPlugin, public MRemConBearerInterfaceV3,
	public MAvrcpBearer, public MRemConControlCommandInterface
	{
public:
	static CRemConBearerAvrcp* NewL(TBearerParams& aParams);	
	virtual ~CRemConBearerAvrcp();	
		
public:	// Interface to command handlers, from MRemConCommandInterface
	void MrcciNewCommand(CAvrcpCommand& aCommand);
	void MrcciNewCommand(CAvrcpCommand& aCommand, const TRemConClientId& aClientId);
	void MrccciNewNotifyCommand(CAvrcpCommand& aCommand);
	void MrccciNewNotifyCommand(CAvrcpCommand& aCommand, const TRemConClientId& aClientId);

	void MrccciNewResponse(CAvrcpCommand& aCommand);
	void MrccciNewNotifyResponse(CControlCommand& aCommand);
	
	TUint MrcciNewTransactionId();
    void MrcciCommandExpired(TUint aTransactionId);
    
	void MrccciSetAddressedClient(const TRemConClientId& aClient);
	void MrccciRegisterForLocalAddressedClientUpdates();
	void MrccciUnregisterForLocalAddressedClientUpdates();

private: // MRemConBearerInterfaceV3 functions called from RemCon
	virtual TInt GetResponse(TUid& aInterfaceUid, 
		TUint& aId, 
		TUint& aOperationId, 
		RBuf8& aCommandData, 
		TRemConAddress& aAddr);
			
	virtual TInt SendCommand(TUid aInterfaceUid, 
		TUint aOperationId, 
		TUint aId,  
		RBuf8& aData, 
		const TRemConAddress& aAddr);
		
	virtual TInt GetCommand(TUid& aInterfaceUid, 
		TUint& aId, 
		TUint& aOperationId, 
		RBuf8& aCommandData, 
		TRemConAddress& aAddr);	
	
	virtual TInt GetNotifyCommand(TUid& aInterfaceUid, 
		TUint& aId, 
		TUint& aOperationId, 
		RBuf8& aCommandData, 
		TRemConAddress& aAddr);	
			
	virtual CAvrcpCommand* GetFirstCommand(TDblQue<CAvrcpCommand>& aQue,
		TUid& aInterfaceUid, 
		TUint& aId, 
		TUint& aOperationId, 
		RBuf8& aCommandData, 
		TRemConAddress& aAddr);
		
	virtual TInt SendResponse(TUid aInterfaceUid, 
		TUint aOperationId, 
		TUint aId, 
		RBuf8& aData, 
		const TRemConAddress& aAddr);
	
	virtual void SendReject(TUid aInterfaceUid, 
			TUint aOperationId, 
			TUint aTransactionId, 
			const TRemConAddress& aAddr); 
	virtual void ConnectRequest(const TRemConAddress& aAddr);
	virtual void DisconnectRequest(const TRemConAddress& aAddr);	
	
	virtual TSecurityPolicy SecurityPolicy() const;
	void ClientStatus(TBool aControllerPresent, TBool aTargetPresent);	
	virtual void ClientAvailable(TRemConClientId& aId, TPlayerType aClientType, TPlayerSubType aClientSubType, const TDesC8& aName);
	virtual void ClientNotAvailable(TRemConClientId& aId);
	virtual void ControllerFeaturesUpdated(RArray<TUid>& aSupportedInterfaces);
	
	virtual TInt SetLocalAddressedClient(TRemConClientId& aId);
	
private: // from CRemConBearerPlugin
	TAny* GetInterface(TUid aUid);
	
private:	
	// from MAvrcpBearer called from router
	void ConnectIndicate(const TBTDevAddr& aBTDevice);
	void ConnectConfirm(const TBTDevAddr& aBTDevice, TInt aError);
	void DisconnectIndicate(const TBTDevAddr& aBTDevice);
	void DisconnectConfirm(const TBTDevAddr& aBTDevice, TInt aError);
	
	MIncomingCommandHandler* IncomingHandler(const TBTDevAddr& aAddr);
	MOutgoingCommandHandler* OutgoingHandler(const TBTDevAddr& aAddr);
	
private:
	// MRemConBearerInterfaceV3 plugin functions called from RemCon
	virtual TInt SendNotifyCommand(TUid aInterfaceUid, 
			TUint aOperationId, 
			TUint aId,  
			RBuf8& aData, 
			const TRemConAddress& aAddr);
	
	virtual TInt GetNotifyResponse(TUid& aInterfaceUid, 
			TUint& aId, 
			TUint& aOperationId, 
			RBuf8& aCommandData, 
			TRemConAddress& aAddr,
			TRemConMessageSubType& aSubMessageType);

private:
	enum TAvrcpRecordType
		{
		EAvrcpRemoteControlRecord,
		EAvrcpRemoteControlTargetRecord,
		};

private:
	CRemConBearerAvrcp(TBearerParams& aParams);
	void ConstructL();
	
	// utility functions
	CRcpRemoteDevice* RemoteDevice(const TBTDevAddr& aAddr);
	
	void UpdateServiceRecordL(RSdpDatabase& aSdpDatabase,
		TBool aController,
		TBool aTarget);
	void RegisterServiceRecordL(RSdpDatabase& aSdpDatabase,
		TAvrcpRecordType aType);
	
	void HandleUndeliveredCommand(CAvrcpCommand& aCommand, const TRemConAddress& aAddr);
	
private:
	TDblQue<CRcpRemoteDevice>	iRemotes;
	TDblQue<CAvrcpCommand>		iReadyCommands;
	TDblQue<CAvrcpCommand>		iReadyResponses;
	TDblQue<CControlCommand>	iReadyNotifyResponses;
	TDblQue<CAvrcpCommand>		iReadyNotifyCommands;
	CControlRouter*				iRouter;
	CDeltaTimer*				iTimer;
	RSdp						iSdp;
	TSdpServRecordHandle		iControllerSdpRecordHandle;
	TSdpServRecordHandle		iTargetSdpRecordHandle;
	TBool						iConstructionComplete;
	CAvrcpPlayerInfoManager*	iPlayerInfoManager;
	MIncomingCommandHandler*	iInternalHandler;
	
	CAvrcpBulkBearer*			iBulkBearer;
	
	RAvctp						iAvctp;
	
	TInt						iRemotesInterestedInLocalAddressedClient;
	};

#endif //CONTROLBEARER_H