bluetoothappprofiles/avrcp/statusclient/statusapicontroller.cpp
changeset 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothappprofiles/avrcp/statusclient/statusapicontroller.cpp	Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,259 @@
+// 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
+ @publishedAll
+ @released
+*/
+
+#include <bluetooth/logger.h>
+#include <remconstatusapicontroller.h>
+#include <remconstatusapicontrollerobserver.h>
+#include <remconinterfaceselector.h>
+#include "remconstatusapi.h"
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_AVRCP_STATUS);
+#endif
+
+/** Creates new Status Api Controller.
+
+@param aInterfaceSelector An interface selector for use with this interface.
+@param aObserver An observer to be notified of responses to commands issued
+				to this interface.
+@return A fully constructed CRemConStatusApiController
+*/
+EXPORT_C CRemConStatusApiController* CRemConStatusApiController::NewL(CRemConInterfaceSelector& aInterfaceSelector, 
+											  MRemConStatusApiControllerObserver& aObserver)
+	{
+	LOG_STATIC_FUNC
+
+	CRemConStatusApiController* self = new(ELeave) CRemConStatusApiController(aInterfaceSelector, aObserver);
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/** Constructs this interface.
+
+@param aInterfaceSelector An interface selector for use with this interface.
+@param aObserver An observer to be notified of responses to commands issued
+				to this interface.
+@internalComponent
+@released
+*/
+CRemConStatusApiController::CRemConStatusApiController(CRemConInterfaceSelector& aInterfaceSelector, 
+							   MRemConStatusApiControllerObserver& aObserver)
+:	CRemConInterfaceBase(TUid::Uid(KRemConStatusApiUid), 
+						 KRemConStatusApiMaxOperationSpecificDataSize, 
+						 aInterfaceSelector,
+						 ERemConClientTypeController),
+	iObserver(aObserver)
+	{
+	iOutData.Assign(NULL);
+	}
+
+/** Destructor.
+*/
+EXPORT_C CRemConStatusApiController::~CRemConStatusApiController()
+	{
+	}
+
+/** Gets a pointer to a specific interface version.
+
+@return A pointer to the interface, NULL if not supported.
+@internalComponent
+@released
+*/
+TAny* CRemConStatusApiController::GetInterfaceIf(TUid aUid)
+	{
+	TAny* ret = NULL;
+	if ( aUid == TUid::Uid(KRemConInterfaceIf1) )
+		{
+		ret = reinterpret_cast<TAny*>(
+			static_cast<MRemConInterfaceIf*>(this)
+			);
+		}
+
+	return ret;
+	}
+
+/** New message from RemCon.
+
+@internalComponent
+@released
+*/
+void CRemConStatusApiController::MrcibNewMessage(TUint aOperationId, const TDesC8& aData)
+	{
+	LOG_FUNC
+
+	switch ( aOperationId )
+		{
+	case ERemConStatusApiUnitInfo:
+		{
+		TInt vendorId, unit, unitType, extendedUnitType;
+		SetUnitInfoResponseData(aData, vendorId, unit, unitType, extendedUnitType);
+		
+		iObserver.MrcsacoUnitInfoResponse(vendorId, unit, unitType, extendedUnitType);
+		break;
+		}
+	case ERemConStatusApiSubunitInfo:
+		{
+		TInt page, extension;
+		TPtrC8 pageData;
+		SetSubunitInfoResponseData(aData, page, extension, pageData);
+		
+		iObserver.MrcsacoSubunitInfoResponse(page, extension, pageData);
+		break;
+		}
+	default:
+		break;
+		}
+	}
+
+/** Parses command data from the buffer.
+
+@param aCommandData The buffer from which to read the data.
+@param aVendorId On return, the vendor id
+@param aUnit On return, the unit
+@param aUnitType On return, the unit type 
+@param aExtendedUnitType On return, the extended unit type
+
+@internalComponent
+@released
+*/
+void CRemConStatusApiController::SetUnitInfoResponseData(const TDesC8& aCommandData,
+	TInt& aVendorId, TInt& aUnit, TInt& aUnitType, TInt& aExtendedUnitType)
+	{
+	if(aCommandData.Length())
+		{
+		ReadCommandDataToInt(aCommandData, KRemConStatusApiVendorIdOffset, 
+			KRemConStatusApiVendorIdLength, aVendorId);
+		ReadCommandDataToInt(aCommandData, KRemConStatusApiUnitOffset, 
+			KRemConStatusApiUnitLength, aUnit);
+		ReadCommandDataToInt(aCommandData, KRemConStatusApiUnitTypeOffset, 
+			KRemConStatusApiUnitTypeLength, aUnitType);
+		ReadCommandDataToInt(aCommandData, KRemConStatusApiExtendedUnitTypeOffset, 
+			KRemConStatusApiExtendedUnitTypeLength, aExtendedUnitType);
+		}
+	else
+		{
+		// On error set all fields to 0
+		aVendorId = aUnit = aUnitType = aExtendedUnitType = 0;
+		}
+	}
+
+/** Parses command data from the buffer.
+
+@param aCommandData The buffer from which to read the data.
+@param aPage On return, the page
+@param aExtension On return, the extension
+@param aPageData On return, the page data
+
+@internalComponent
+@released
+*/
+void CRemConStatusApiController::SetSubunitInfoResponseData(const TDesC8& aCommandData,
+	TInt& aPage, TInt& aExtension, TPtrC8& aPageData)
+	{
+	if(aCommandData.Length())
+		{
+		ReadCommandDataToInt(aCommandData, KRemConStatusApiPageOffset, 
+			KRemConStatusApiPageLength, aPage);
+		ReadCommandDataToInt(aCommandData, KRemConStatusApiExtensionOffset, 
+			KRemConStatusApiExtensionLength, aExtension);
+
+		aPageData.Set(aCommandData.Mid(KRemConStatusApiPageDataOffset));
+		}
+	else
+		{
+		// On error set all fields to 0
+		aPage = aExtension = 0;
+		aPageData.Set(KNullDesC8());
+		}
+	}
+	
+/** Reads command data from the buffer to an int.
+
+@param aCommandData The buffer from which to read the data.
+@param aOffset The offset within aCommandData read from.
+@param aLength The length of data to read.  This must not be
+				more than 4.
+@param aValue On return, the value of the specified data section.
+
+@internalComponent
+@released
+*/	
+void CRemConStatusApiController::ReadCommandDataToInt(const TDesC8& aCommandData, 
+	TInt aOffset, TInt aLength, TInt& aValue)
+	{
+	__ASSERT_ALWAYS(aLength <= 4, CRemConStatusApiController::Panic(EStatusApiCommandDataSectionTooLong));
+	
+	aValue = 0;
+	
+	for(TInt i = 0 ; i < aLength; i++)
+		{
+		aValue |= aCommandData[i+aOffset]<<(8*i);
+		}
+	}
+
+/** Issue UnitInfo command.
+Only one command per controller session can be outstanding at any one time.
+@param aStatus Status to be completed with the result of issuing this command.
+@param aNumRemotes On completion, the number of remotes this command was issued to.
+*/
+EXPORT_C void CRemConStatusApiController::UnitInfo(TRequestStatus& aStatus, TUint& aNumRemotes)
+	{
+	LOG_FUNC
+
+	InterfaceSelector().Send(aStatus, 
+		TUid::Uid(KRemConStatusApiUid),
+		(TUint)ERemConStatusApiUnitInfo, 
+		aNumRemotes,
+		ERemConCommand,
+		iOutData);
+	}
+
+/** Issue SubUnitInfo command.
+Only one command per controller session can be outstanding at any one time.
+@param aStatus Status to be completed with the result of issuing this command.
+@param aNumRemotes On completion, the number of remotes this command was issued to.
+*/
+EXPORT_C void CRemConStatusApiController::SubunitInfo(TRequestStatus& aStatus, TUint& aNumRemotes)
+	{
+	LOG_FUNC
+
+	InterfaceSelector().Send(aStatus, 
+		TUid::Uid(KRemConStatusApiUid), 
+		(TUint)ERemConStatusApiSubunitInfo, 
+		aNumRemotes,
+		ERemConCommand);
+	}
+	
+/** Utility Status Converter panic function.
+
+@param aPanic The panic number.
+@internalComponent
+@released
+*/
+void CRemConStatusApiController::Panic(TStatusApiPanic aPanic)
+	{
+	User::Panic(KStatusApiPanicName, aPanic);
+	}
+
+//
+// End of file