bluetoothappprofiles/avrcp/groupnavigationapi/src/groupnavigationapi.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 27 May 2010 13:01:44 +0300
changeset 33 837dcc42fd6a
parent 0 f63038272f30
permissions -rw-r--r--
Revision: 201019 Kit: 2010121

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

/**
 @file
 @publishedAll
 @released
*/

#include <bluetooth/logger.h>
#include <remcongroupnavigationtarget.h>
#include <remcongroupnavigationtargetobserver.h>

#include <remconinterfaceselector.h>

#include <avcframe.h>

#include "remcongroupnavigation.h"

#ifdef __FLOG_ACTIVE
_LIT8(KLogComponent, LOG_COMPONENT_AVRCP_GROUP_NAVIGATION);
#endif

EXPORT_C CRemConGroupNavigationApiTarget* CRemConGroupNavigationApiTarget::NewL(CRemConInterfaceSelector& aInterfaceSelector, 
		MRemConGroupNavigationTargetObserver& aObserver)
	{
	LOG_STATIC_FUNC

	CRemConGroupNavigationApiTarget* self = new(ELeave) CRemConGroupNavigationApiTarget(aInterfaceSelector, aObserver);
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(self);
	return self;
	}

EXPORT_C CRemConGroupNavigationApiTarget* CRemConGroupNavigationApiTarget::NewL(CRemConInterfaceSelector& aInterfaceSelector, 
		MRemConGroupNavigationTargetObserver& aObserver,TBool aNextGroupSupported, TBool aPreviousGroupSupported)
	{
	LOG_STATIC_FUNC

	CRemConGroupNavigationApiTarget* self = new(ELeave) CRemConGroupNavigationApiTarget(aInterfaceSelector, aObserver);
	CleanupStack::PushL(self);
	self->ConstructL(aNextGroupSupported,aPreviousGroupSupported);
	CleanupStack::Pop(self);
	return self;
	}
CRemConGroupNavigationApiTarget::CRemConGroupNavigationApiTarget(CRemConInterfaceSelector& aInterfaceSelector, 
		MRemConGroupNavigationTargetObserver& aObserver)
:	CRemConInterfaceBase(TUid::Uid(KRemConGroupNavigationApiUid), 
						 KMaxSizeRemConGroupNavigationMsg, 
						 aInterfaceSelector,
						 ERemConClientTypeTarget), 
	iObserver(aObserver), iPtr(0,0,0)
	{
	}
	
void CRemConGroupNavigationApiTarget::ConstructL()
	{
	// Create a output buffer (arbitrary value of 32 for granularity of buffer expansion)
	iOutData = CBufFlat::NewL(32);
	iOutData->SetReserveL(sizeof(TPckg<TRemConGroupNavigationResponse>)); 
	BaseConstructL();
	}
void CRemConGroupNavigationApiTarget::ConstructL(TBool aNextGroupSupported, TBool aPreviousGroupSupported)
	{
	// Create a output buffer (arbitrary value of 32 for granularity of buffer expansion)
	iOutData = CBufFlat::NewL(32);
	iOutData->SetReserveL(sizeof(TPckg<TRemConGroupNavigationResponse>));
	
	RRemConInterfaceFeatures features;
	User::LeaveIfError(features.Open());
	CleanupClosePushL(features);
	
	if(aNextGroupSupported)
		{
		features.AddOperationL(ENextGroup);
		}
	
	if(aPreviousGroupSupported)
		{
		features.AddOperationL(EPreviousGroup);
		}
	
	BaseConstructL(features);
	CleanupStack::PopAndDestroy(&features);
	}
	

/** Destructor.

@publishedAll
@released
*/
EXPORT_C CRemConGroupNavigationApiTarget::~CRemConGroupNavigationApiTarget()
	{
	delete iOutData;
	iStream.Close();
	}

/** Gets a pointer to a specific interface version.

@return A pointer to the interface, NULL if not supported.
@internalComponent
@released
*/
TAny* CRemConGroupNavigationApiTarget::GetInterfaceIf(TUid aUid)
	{
	TAny* ret = NULL;
	if ( aUid == TUid::Uid(KRemConInterfaceIf1) )
		{
		ret = reinterpret_cast<TAny*>(
			static_cast<MRemConInterfaceIf*>(this)
			);
		}

	return ret;
	}

EXPORT_C void CRemConGroupNavigationApiTarget::NextGroupResponse(TRequestStatus*& aStatus, TInt aError)
	{
	SendGroupResponse(ENextGroup, aStatus, aError);
	}

EXPORT_C void CRemConGroupNavigationApiTarget::PreviousGroupResponse(TRequestStatus*& aStatus, TInt aError)
	{
	SendGroupResponse(EPreviousGroup, aStatus, aError);
	}

void CRemConGroupNavigationApiTarget::SendGroupResponse(TGroupNavigationPassthroughOperationIds aId, TRequestStatus*& aStatus, TInt aError)
	{
	// format data to be sent
  	TRAPD(error, iOutData->ResizeL(sizeof(TRemConGroupNavigationResponse)));
  	if (error != KErrNone)
  		{
  		// if this fails, then silently drop response
  		return;
  		}
  		
	TRemConGroupNavigationResponse response;
	response.iError = aError;
	iOutData->Write(0,TPckg<TRemConGroupNavigationResponse>(response));
	iPtr.Set(iOutData->Ptr(0));

	// if a TRequestStatus has been supplied
	if (aStatus)
		{
		InterfaceSelector().Send(*aStatus, TUid::Uid(KRemConGroupNavigationApiUid), aId, iNumRemotes, ERemConResponse, iPtr);
		}
	else
		{
		InterfaceSelector().SendUnreliable(TUid::Uid(KRemConGroupNavigationApiUid), aId, ERemConResponse, iPtr);
		}
	}

// from MRemConInterfaceIf
void CRemConGroupNavigationApiTarget::MrcibNewMessage(TUint aOperationId, const TDesC8& aData)
	{
	LOG1(_L("\taOperationId = 0x%02x"), aOperationId);
	LOG1(_L("\taData.Length = %d"), aData.Length());

	/* Decode the get GroupNavigation message */
	TGroupNavigationPassthroughOperationIds currentOp = static_cast<TGroupNavigationPassthroughOperationIds>(aOperationId);
  	TRemConCoreApiButtonAction button = static_cast<TRemConCoreApiButtonAction>(aData.Ptr()[0]);

	switch (currentOp)
		{
		case ENextGroup:
			{
			iObserver.MrcgntoNextGroup( button );
			break;
			}
		case EPreviousGroup:
			{
			iObserver.MrcgntoPreviousGroup( button );
			break;
			}		
		default:
			break;

		}
	}