bluetoothappprofiles/avrcp/remconbeareravrcp/inc/avrcpoutgoingcommandhandler.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 21 Jun 2010 15:51:46 +0300
branchRCL_3
changeset 18 5a89845f78e2
parent 14 2f88a7d66f50
permissions -rw-r--r--
Revision: 201023 Kit: 2010125

// 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:
//

#ifndef AVRCPOUTGOINGCOMMANDHANDLER_H
#define AVRCPOUTGOINGCOMMANDHANDLER_H

/**
@file
@internalComponent
@released
*/

#include <e32base.h>
#include <avctpservices.h>
#include "commandhandlerinterface.h"

using namespace SymbianAvctp;

class CControlCommand;
class CRcpRouter;
class MRemConControlCommandInterface;
class MRemConBearerObserver;
NONSHARABLE_CLASS(CRcpOutgoingCommandHandler) : public CBase, public MOutgoingCommandHandler
	{
public:
	// Construction/Destruction
	static CRcpOutgoingCommandHandler* NewL(MRemConControlCommandInterface& aCommandInterface, 
		MRemConBearerObserver& aObserver,
		CRcpRouter& aRouter,
		CDeltaTimer& aTimer);
	~CRcpOutgoingCommandHandler();
	
	// Called from bearer
	void Disconnect(TBool aClearQueue);
		
	// Delta timer callback functions
	static TInt ResponseExpiry(TAny* aExpiryInfo);
	static TInt ReleaseExpiry(TAny* aExpiryInfo);
	
private:
	// From MOutgoingCommandHandler 
	void MaxPacketSize(TInt aMtu);
	void ReceiveResponse(const TDesC8& aMessageInformation, TTransactionLabel aTransLabel, TBool aIpidBitSet);	
	void MessageSent(CAvrcpCommand& aCommand, TInt aSendResult);
	
	void SendCommandL(TUid aInterfaceUid, 
		TUint aCommand, 
		TUint aId,  
		RBuf8& aCommandData, 
		const TBTDevAddr& aAddr);
	
	void SendNotifyCommandL(TUid aInterfaceUid, 
			TUint aCommand, 
			TUint aId,  
			RBuf8& aCommandData, 
			const TBTDevAddr& aAddr);

private:
	CRcpOutgoingCommandHandler(MRemConControlCommandInterface& aCommandInterface, 
		MRemConBearerObserver& aObserver,
		CRcpRouter& aRouter,
		CDeltaTimer& aTimer);
	
	// Internal send utility funcs
	void CleanupUnreleased();
	CControlCommand& SendCommandL(TUid aInterfaceUid,
		TUint aCommand, 
		TUint aId, 
		RBuf8& aCommandData, 
		TBool isClick, 
		const TBTDevAddr& aAddr,
		TBool aKnownToBearer,
		TBool aNotify);	

	void HandleCoreApiCommandL(TUint aCommand, 
		TUint aId,  
		RBuf8& aCommandData, 
		const TBTDevAddr& aAddr);

	void GenerateFailureResult(CControlCommand& aCommand, TInt aResult);
	void GenerateCommandL(CControlCommand& aCommand, TRemConCoreApiButtonAction aButtonAct);
		
	// Timer functions
	void ResponseExpiry(CControlCommand& aCommand);
	void ReleaseExpiry(CControlCommand& aCommand);
	void StartResponseTimer(CControlCommand& aCommand);
	void StartReleaseTimer(CControlCommand& aCommand);
	void ClearQueue(TDblQue<CControlCommand>& aQue);
	void ProcessDisconnect(TDblQue<CControlCommand>& aQue, TBool aClearQueue);
	CControlCommand* FindInQueue(TDblQue<CControlCommand>& aQue, SymbianAvctp::TTransactionLabel aTransLabel);
	void ProcessReceiveResponse(CAVCFrame* aFrame, 
								TBool aIpidBitSet,
								CControlCommand* aCommand, 
								TBool aNotify);
private:
	TTransactionLabel			iCurrentTrans;
	TDblQue<CControlCommand>	iCommandQueue;
	TDblQue<CControlCommand>	iNotifyCommandQueue;
	
	MRemConControlCommandInterface& iCommandInterface;
	MRemConBearerObserver&			iObserver;
	CRcpRouter&						iRouter;
	CDeltaTimer&					iTimer;
	
	CControlCommand*			iUnreleasedCommand;
	TBool					iUnreleasedHasResponse;
	TInt					iReleaseTimerExpiryCount;
	};

#endif // AVRCPOUTGOINGCOMMANDHANDLER_H