bluetoothappprofiles/avrcp/batterystatusapi/src/batterystatusapi.cpp
changeset 0 f63038272f30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bluetoothappprofiles/avrcp/batterystatusapi/src/batterystatusapi.cpp	Mon Jan 18 20:28:57 2010 +0200
@@ -0,0 +1,129 @@
+// 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 <remconbatterytarget.h>
+#include <remconbatterytargetobserver.h>
+#include <remcon/avrcpspec.h>
+#include <remconinterfaceselector.h>
+
+#include "remconbattery.h"
+
+#ifdef __FLOG_ACTIVE
+_LIT8(KLogComponent, LOG_COMPONENT_AVRCP_BATTERY_STATUS);
+#endif
+
+EXPORT_C CRemConBatteryApiTarget* CRemConBatteryApiTarget::NewL(CRemConInterfaceSelector& aInterfaceSelector, 
+		MRemConBatteryTargetObserver& aObserver)
+	{
+	LOG_STATIC_FUNC
+
+	CRemConBatteryApiTarget* self = new(ELeave) CRemConBatteryApiTarget(aInterfaceSelector, aObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CRemConBatteryApiTarget::CRemConBatteryApiTarget(CRemConInterfaceSelector& aInterfaceSelector, 
+		MRemConBatteryTargetObserver& aObserver)
+:	CRemConInterfaceBase(TUid::Uid(KRemConBatteryApiUid), 
+						 KLengthBatteryStatusMsg, 
+						 aInterfaceSelector,
+						 ERemConClientTypeTarget), 
+	iObserver(aObserver)
+	{
+	}
+	
+void CRemConBatteryApiTarget::ConstructL()
+	{
+	// Create a output buffer (arbitrary value of 32 for granularity of buffer expansion)
+	iOutData = CBufFlat::NewL(32);
+
+	// allocate a output buffer big enough for a TRemConBatteryApiResponse  
+	iOutData->SetReserveL(sizeof(TPckg<TRemConBatteryApiResponse>)); //do this now for easier writing to buffer
+	BaseConstructL();
+	}
+	
+EXPORT_C CRemConBatteryApiTarget::~CRemConBatteryApiTarget()
+	{
+	delete iOutData;
+	}
+
+/** Gets a pointer to a specific interface version.
+@return A pointer to the interface, NULL if not supported.
+@internalComponent
+@released
+*/
+TAny* CRemConBatteryApiTarget::GetInterfaceIf(TUid aUid)
+	{
+	TAny* ret = NULL;
+	if ( aUid == TUid::Uid(KRemConInterfaceIf1) )
+		{
+		ret = reinterpret_cast<TAny*>(
+			static_cast<MRemConInterfaceIf*>(this)
+			);
+		}
+
+	return ret;
+	}
+
+// from MRemConInterfaceIf
+void CRemConBatteryApiTarget::MrcibNewMessage(TUint /* aOperationId */, const TDesC8& aData)
+	{
+	// don't bother to log the operation ID as this was causing a build warning
+	LOG1(_L("\taInformBatteryStatusOfCT Data.Length = %d"), aData.Length());
+
+	TRemConBatteryApiResponse batteryApiResponse;
+	batteryApiResponse.iError = KErrNone;
+	iOutData->Reset();
+	
+	// check for malformed messages, there should be 1 byte of data
+	if ( aData.Length() == 1 )
+		{	
+		// check the battery status is validvalue to the client observer
+		if ( aData[0] <= EFullCharge )
+			{
+			TControllerBatteryStatus value = (TControllerBatteryStatus)aData[0];
+			iObserver.MrcbstoBatteryStatus(value);
+			}
+		else	
+			{
+			LOG(_L("\tMalformed message, data out range"));
+			batteryApiResponse.iError = KErrAvrcpMetadataInvalidParameter;
+			}
+		}
+	else
+		{
+		LOG(_L("\tMalformed message, data missing"));
+		batteryApiResponse.iError = KErrAvrcpMetadataParameterNotFound;
+		}
+
+	// send a response to remcon (if OOM silently drop message)
+	TRAPD(error, iOutData->ResizeL(sizeof(TRemConBatteryApiResponse)));
+	if (error == KErrNone)
+		{
+		iOutData->Write(0,TPckg<TRemConBatteryApiResponse>(batteryApiResponse));
+		InterfaceSelector().SendUnreliable(TUid::Uid(KRemConBatteryApiUid),
+												EInformBatteryStatusOfCT, ERemConResponse, iOutData->Ptr(0));
+		}
+	}
+