bluetoothappprofiles/avrcp/playerinformation/src/playerevents.cpp
changeset 70 f5508c13dfe0
parent 67 16e4b9007960
child 71 083fd884d7dd
--- a/bluetoothappprofiles/avrcp/playerinformation/src/playerevents.cpp	Wed Oct 13 13:15:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,477 +0,0 @@
-// 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:
-// This file contains the events part of the PlayerInformation API.
-// 
-//
-
-/**
- @file
- @publishedAll
- @released
-*/
-
-#include <bluetooth/logger.h>
-#include <remconinterfaceselector.h>
-#include <remconbeareravrcp.h>
-#include <playerinformationtarget.h>
-#include <playerinformationtargetobserver.h>
-
-#include "playerapplicationsetting.h"
-#include "eventsmask.h"
-#include "playereventsutils.h"
-#include "playerinformation.h"
-
-#ifdef __FLOG_ACTIVE
-_LIT8(KLogComponent, LOG_COMPONENT_AVRCP_PLAYER_INFO);
-#endif
-
-EXPORT_C void MPlayerEventsObserver::PlaybackStatusChanged(TPlaybackStatus aStatus)
-	{
-	DoPlaybackStatusChanged(aStatus);
-	}
-
-EXPORT_C void MPlayerEventsObserver::TrackChanged(TUint64 aTrackId, TUint32 aLengthInMilliseconds) 
-	{
-	DoTrackChanged(aTrackId, aLengthInMilliseconds); 
-	}
-
-EXPORT_C void MPlayerEventsObserver::TrackReachedEnd() 
-	{
-	DoTrackReachedEnd();
-	}
-
-EXPORT_C void MPlayerEventsObserver::TrackReachedStart()
-	{
-	DoTrackReachedStart();
-	}
-
-EXPORT_C void MPlayerEventsObserver::SetPlaybackPosition(TUint32 aMilliseconds) 
-	{
-	DoSetPlaybackPosition(aMilliseconds); 
-	}
-	
-EXPORT_C void MPlayerEventsObserver::SetBatteryStatus(TTargetBatteryStatus aBatteryStatus) 
-	{
-	DoSetBatteryStatus(aBatteryStatus); 
-	}
-
-void CPlayerInfoTarget::ProcessGetStatusAndBeginObserving( const TUint aOperationId, TRegisterNotificationEvent aEventId, const TDesC8& aData)
-	{
-	// check the event is in the supported list
-	if (!iSupportedNotificationEventList->Find(aEventId))
-		{
-		// Not supported so return error
-		SendError(KErrAvrcpMetadataInvalidParameter, aOperationId, ERemConNotifyResponseInterim);
-		return;
-		}
-		
-	// if the event is EPlaybackPosChanged then the timeinterval is included in the RegisterNofication
-	if (aEventId == ERegisterNotificationPlaybackPosChanged)
-		{
-		// decode the playback interval from aData
-		TInt error = 0;
-		RRemConPlayerInformation32BitResponse request;
-		TRAP(error, request.ReadL(aData));
-		
-		if (error != KErrNone)
-			{
-			// Not supported so return error
-			SendError(KErrAvrcpMetadataParameterNotFound, aOperationId, ERemConNotifyResponseInterim);
-			return;
-			}
-		
-		// save the playback interval
-		iPlayBackIntervalInMilliseconds = request.iValue * 1000;
-		
-		// and the current position
-		iLastNotifiedPlaybackPositionInMilliseconds = iPlaybackPositionInMilliseconds;
-		}
-		
-	// and request another notification (if there is not one already pending)
-	// on the next state change  
-	if (KErrNotFound ==iPendingNotificationEventList.Find(aEventId))
-		{
-		if (iPendingNotificationEventList.Append(aEventId) != KErrNone)
-			{
-			return SendError(KErrAvrcpMetadataInternalError, aOperationId);   // Try to send internal error if OOM
-			}
-		}
-		
-	// send the current status
-	SendNotificationResponse(aEventId, ERemConNotifyResponseInterim );
-	}
-
-void CPlayerInfoTarget::ProcessGetStatus( const TUint aOperationId, TRegisterNotificationEvent aEventId)
-	{
-	// send the current value
-	if (iSupportedNotificationEventList->Find(aEventId))
-		{
-		SendNotificationResponse(aEventId, ERemConNotifyResponseChanged );
-		}
-	else
-		{
-		// Not found so return error
-		SendError(KErrAvrcpMetadataInvalidParameter, aOperationId, ERemConNotifyResponseChanged);
-		}
-	}
-		
-/* ProcessGetPlayStatus This returns the current values of SongLength, 
-   SongPosition and PlayStatus.
-   Note if SongLength and SongPosition are not supported KPlaybackPositionUnknown is returned
- */
-void CPlayerInfoTarget::ProcessGetPlayStatus()
-	{
-	LOG_FUNC
-
-	TInt error =0;
-
-	// format the response in a RRemConPlayerInformationGetPlayStatusResponse
-	RRemConPlayerInformationGetPlayStatusResponse response;
-	response.iTrackLength = iLengthInMilliseconds;
-	response.iPlayPos = iPlaybackPositionInMilliseconds;
-	response.iStatus = iPlayBackStatus;
-	
-	TRAP(error, response.WriteL(iOutBuf));
-	if (error == KErrNone)
-		{
-		// send the response back to the CT
-		error = InterfaceSelector().SendUnreliable(TUid::Uid(KRemConPlayerInformationUid),
-												EGetPlayStatus, ERemConResponse, iOutBuf );
-		}
-	}
-
-/* ProcessGetPlayStatusUpdate returns the current play status if it has changed
- * relative to the provided play status, otherwise the request is queued until
- * the play status changes.
- */
-void CPlayerInfoTarget::ProcessGetPlayStatusUpdate(const TDesC8& aData)
-	{
-	LOG_FUNC
-
-	// Bearer should never send us more than one of these in parallel
-	__ASSERT_DEBUG(!iPlaybackStatusUpdatePending, PlayerEventsUtils::Panic(ETwoGetPlayStatusUpdatesQueued));
-	
-	TInt error =0;
-	RRemConPlayerInformationGetPlayStatusUpdateRequest request;
-	TRAP(error, request.ReadL(aData));
-	__ASSERT_DEBUG(error == KErrNone, PlayerEventsUtils::Panic(EBadlyFormattedInternalData));
-
-	if(request.iStatus != iPlayBackStatus)
-		{
-		// format the response in a RRemConPlayerInformationGetPlayStatusResponse
-		RRemConPlayerInformationGetPlayStatusUpdateResponse response;
-		response.iStatus = iPlayBackStatus;
-		
-		TRAP(error, response.WriteL(iOutBuf));
-		if (error == KErrNone)
-			{
-			// send the response back to the CT
-			error = InterfaceSelector().SendUnreliable(TUid::Uid(KRemConPlayerInformationUid),
-													EGetPlayStatusUpdate, ERemConResponse, iOutBuf );
-			if(error != KErrNone)
-				{
-				// We will try and send the response again next time we get an update
-				iPlaybackStatusUpdatePending = ETrue;
-				}
-			}
-		}
-	else
-		{
-		iPlaybackStatusUpdatePending = ETrue;
-		}
-	}
-
-// Send a Notification message for aEventID 
-void CPlayerInfoTarget::SendNotificationResponse( TRegisterNotificationEvent aEventId, TRemConMessageSubType aMsgSubType )
-	{
-	LOG_FUNC
-
-	TInt error = 0;
-	iOutBuf.Zero();
-
-	if (!iSupportedNotificationEventList->Find(aEventId))
-		{
-		return SendError(KErrAvrcpMetadataInvalidParameter, 
-						 RAvrcpIPC::SetIPCOperationIdFromEventId(aEventId), aMsgSubType);
-		}
-		
-	switch (aEventId)
-		{
-		case ERegisterNotificationTrackReachedEnd:
-		case ERegisterNotificationTrackReachedStart:
-			{
-			// no extra data for reached start or end 
-			RAvrcpIPCError response;
-			response.iError = KErrNone;
-			TRAP(error, response.WriteL(iOutBuf));
-			break;
-			}
-
-		case ERegisterNotificationPlaybackStatusChanged:
-			{
-			// 8bit response -- current playback status 
-			RRemConPlayerInformation8BitResponse response;
-			response.iValue = iPlayBackStatus;
-			TRAP(error, response.WriteL(iOutBuf));
-			break;
-			}
-
-		case ERegisterNotificationBatteryStatusChanged:
-			{
-			// 8bit response -- current battery status
-			RRemConPlayerInformation8BitResponse response;
-			response.iValue = iBatteryStatus;
-			TRAP(error, response.WriteL(iOutBuf));
-			break;
-			}
-
-		case ERegisterNotificationPlaybackPosChanged:
-			{
-			// 32bit response -- current playback position in millisecond 
-			RRemConPlayerInformation32BitResponse response;
-			response.iValue = iPlaybackPositionInMilliseconds;
-			TRAP(error, response.WriteL(iOutBuf));
-			break;
-			}
-
-		case ERegisterNotificationTrackChanged:
-			{
-			// 64bit response -- index of the current track 
-			RRemConPlayerInformation64BitResponse response;
-			response.iValue = iTrackId;
-			TRAP(error, response.WriteL(iOutBuf));
-			break;
-			}
-
-		case ERegisterNotificationPlayerApplicationSettingChanged:
-			{
-			// Send a list of the settings that have changed followed by their value 
-			// starting with the number of attributes to be sent 
-			RRemConPlayerAttributeIdsAndValues response;
-			response.iNumberAttributes = 0;
-		
-			// for every entry in the list
-			THashMapIter<TInt, CPlayerApplicationSettings*> iter(iPlayerApplicationSettings);
-			CPlayerApplicationSettings* const* setting = iter.NextValue();
-			while ( setting != NULL )
-				{
-				TUint8 value = (*setting)->GetCurrentValue();
-				TInt ret1 = response.iAttributeValue.Append(value);
-				TInt ret2 = response.iAttributeId.Append((*setting)->GetAttributeID());
-				if (ret1 != KErrNone || ret2 != KErrNone)
-					{
-					response.Close();
-					return SendError(KErrAvrcpMetadataInternalError, 
-									 RAvrcpIPC::SetIPCOperationIdFromEventId(aEventId),
-									 aMsgSubType);   // Try to send internal error if OOM
-					}
-				response.iNumberAttributes++;
-				setting = iter.NextValue();
-				}
-				
-			TRAP(error, response.WriteL(iOutBuf));
-			response.Close();
-			break;
-			}
-		default:
-			return;
-		}
-	
-	if (error == KErrNone)
-		{
-		// send the response back to the CT
-		TUint operationId = RAvrcpIPC::SetIPCOperationIdFromEventId(aEventId);
-		error = InterfaceSelector().SendUnreliable(TUid::Uid(KRemConPlayerInformationUid),
-												operationId, ERemConResponse, aMsgSubType, iOutBuf);
-		}
-	}
-	 
-// from MPlayerEventsObserver
- void CPlayerInfoTarget::DoPlaybackStatusChanged(TPlaybackStatus  aStatus)
-	{
-	LOG_FUNC
-
-	iPlayBackStatus = aStatus;
-	
-	// if the playback status is in the current event list
-	TInt pos = iPendingNotificationEventList.Find( ERegisterNotificationPlaybackStatusChanged );
-	if (pos != KErrNotFound)
-		{
-		iPendingNotificationEventList.Remove( pos );
-		SendNotificationResponse( ERegisterNotificationPlaybackStatusChanged, ERemConNotifyResponseChanged);
-		}
-	
-	pos = iPendingNotificationEventList.Find( ERegisterNotificationPlaybackPosChanged );
-	if (pos != KErrNotFound)
-		{
-		iPendingNotificationEventList.Remove( pos );
-		SendNotificationResponse(ERegisterNotificationPlaybackPosChanged, ERemConNotifyResponseChanged);
-		}
-	
-	if(iPlaybackStatusUpdatePending)
-		{
-		// format the response in a RRemConPlayerInformationGetPlayStatusResponse
-		RRemConPlayerInformationGetPlayStatusUpdateResponse response;
-		response.iStatus = iPlayBackStatus;
-		
-		TRAPD(error, response.WriteL(iOutBuf));
-		if (error == KErrNone)
-			{
-			// send the response back to the CT
-			error = InterfaceSelector().SendUnreliable(TUid::Uid(KRemConPlayerInformationUid),
-													EGetPlayStatusUpdate, ERemConResponse, iOutBuf );
-			if(error == KErrNone)
-				{
-				iPlaybackStatusUpdatePending = EFalse;
-				}
-			// if we did error we will try and respond again next time the client's play status
-			// changes
-			}
-		}
-	}
-	
-void CPlayerInfoTarget::DoTrackChanged(TUint64 aTrackId, TUint32 aLengthInMilliseconds)
-	{
-	LOG_FUNC
-
-	iTrackId = aTrackId;
-	iLengthInMilliseconds = aLengthInMilliseconds;
-
-	// if the playback status is in the current event list 
-	TInt pos = iPendingNotificationEventList.Find( ERegisterNotificationTrackChanged );
-	if (pos != KErrNotFound)
-		{
-		iPendingNotificationEventList.Remove( pos );
-		SendNotificationResponse(ERegisterNotificationTrackChanged, ERemConNotifyResponseChanged);
-		}
-
-	pos = iPendingNotificationEventList.Find( ERegisterNotificationPlaybackPosChanged );
-	if (pos != KErrNotFound)
-		{
-		iPendingNotificationEventList.Remove( pos );
-		iPlaybackPositionInMilliseconds = 0;	//set 0 to current position for new track
-		SendNotificationResponse(ERegisterNotificationPlaybackPosChanged, ERemConNotifyResponseChanged);
-		}
-	}
-
-void CPlayerInfoTarget::DoTrackReachedEnd()
-	{
-	LOG_FUNC
-	
-	iTrackPosition = EEnd;
-
-	// if the ETrackReachedEnd status is in the current event list 
-	TInt pos = iPendingNotificationEventList.Find( ERegisterNotificationTrackReachedEnd );
-	if (pos != KErrNotFound)
-		{
-		iPendingNotificationEventList.Remove( pos );
-		SendNotificationResponse(ERegisterNotificationTrackReachedEnd, ERemConNotifyResponseChanged);
-		}
-	
-	pos = iPendingNotificationEventList.Find( ERegisterNotificationPlaybackPosChanged );
-	if (pos != KErrNotFound)
-		{
-		iPendingNotificationEventList.Remove( pos );
-		iPlaybackPositionInMilliseconds = iLengthInMilliseconds;
-		SendNotificationResponse(ERegisterNotificationPlaybackPosChanged, ERemConNotifyResponseChanged);
-		}
-	}
-
-void CPlayerInfoTarget::DoTrackReachedStart()
-	{
-	LOG_FUNC
-
-	iTrackPosition = EStart;
-
-	// if the ETrackReachedStart status is in the current event list 
-	TInt pos = iPendingNotificationEventList.Find( ERegisterNotificationTrackReachedStart );
-	if (pos != KErrNotFound)
-		{
-		iPendingNotificationEventList.Remove( pos );
-		SendNotificationResponse(ERegisterNotificationTrackReachedStart, ERemConNotifyResponseChanged);
-		}
-	
-	pos = iPendingNotificationEventList.Find( ERegisterNotificationPlaybackPosChanged );
-	if (pos != KErrNotFound)
-		{
-		iPendingNotificationEventList.Remove( pos );
-		iPlaybackPositionInMilliseconds = 0;
-		SendNotificationResponse(ERegisterNotificationPlaybackPosChanged, ERemConNotifyResponseChanged);
-		}
-	}
-
-void CPlayerInfoTarget::DoSetPlaybackPosition(TUint32 aMilliseconds)		
-	{
-	LOG_FUNC
-	
-	iPlaybackPositionInMilliseconds = aMilliseconds;
-
-	// if the playback position is in the current Notification event list 
-	TInt pos = iPendingNotificationEventList.Find( ERegisterNotificationPlaybackPosChanged );
-	if (pos != KErrNotFound)
-		{
-		// a notification has been requested, now check if it is due
-
-		TUint32 difference = (iPlaybackPositionInMilliseconds > iLastNotifiedPlaybackPositionInMilliseconds) ?
-        	iPlaybackPositionInMilliseconds - iLastNotifiedPlaybackPositionInMilliseconds:
-        	iLastNotifiedPlaybackPositionInMilliseconds - iPlaybackPositionInMilliseconds;
-
-		if (difference >= iPlayBackIntervalInMilliseconds)
-			{
-			// Due now so send
-			iPendingNotificationEventList.Remove( pos );
-			SendNotificationResponse(ERegisterNotificationPlaybackPosChanged, ERemConNotifyResponseChanged);			
-			}	
-		}
-	}
-
-void CPlayerInfoTarget::DoSetBatteryStatus(TTargetBatteryStatus aBatteryStatus)
-	{
-	LOG_FUNC
-
-	TBool validStatus = ETrue;
-	if (aBatteryStatus < MPlayerEventsObserver::ENormal || 
-		aBatteryStatus > MPlayerEventsObserver::EFullCharge)
-		{
-		LOG1(_L("Invalid battery status: %d"),aBatteryStatus);
-		validStatus = EFalse;
-		}
-	else
-		{
-		iBatteryStatus = aBatteryStatus;
-		}
-
-	// if the battery status is in the current event list
-	TInt pos = iPendingNotificationEventList.Find( ERegisterNotificationBatteryStatusChanged );
-	if (pos != KErrNotFound)
-		{
-		iPendingNotificationEventList.Remove( pos );
-		if (validStatus)
-			{
-			SendNotificationResponse(ERegisterNotificationBatteryStatusChanged, ERemConNotifyResponseChanged);
-			}
-		}
-	}
-	
-void CPlayerInfoTarget::SendError(TInt aError, TInt aOperationId, TRemConMessageSubType aSubType)
-	{
-	TInt error = 0;
-	RAvrcpIPCError response;
-	response.iError = aError;
-	TRAP(error, response.WriteL(iOutBuf));   // Don't send error if OOM
-	if (error == KErrNone)
-		InterfaceSelector().SendUnreliable(TUid::Uid(KRemConPlayerInformationUid),
-										aOperationId, ERemConResponse, aSubType, iOutBuf);
-	}
-