bluetoothappprofiles/avrcp/nowplayingapi/src/remconnowplayingtargetbase.cpp
changeset 70 f5508c13dfe0
parent 67 16e4b9007960
child 71 083fd884d7dd
--- a/bluetoothappprofiles/avrcp/nowplayingapi/src/remconnowplayingtargetbase.cpp	Wed Oct 13 13:15:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,472 +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:
-//
-
-
-
-/**
- @file
- @internalComponent
- @released
-*/
-
-#include <remconmediabrowsetypes.h>
-#include <remcondatabaseawarenowplayingtargetobserver.h>
-#include <remcondatabaseunawarenowplayingtargetobserver.h>
-#include <remcon/remconnowplayingtargetbase.h>
-#include <remcon/avrcpspec.h>
-#include <remconinterfaceselector.h>
-#include <bluetooth/logger.h>
-
-#include "mediabrowse.h"
-#include "nowplaying.h"
-#include "remconnowplayingfault.h"
-#include "remconqueuemessage.h"
-
-#ifdef __FLOG_ACTIVE
-_LIT8(KLogComponent, LOG_COMPONENT_REMCONNOWPLAYINGAPI);
-_LIT8(KLogFormat, "Operation Id = 0x%x, Data Lengh = %d");
-#endif
-
-CRemConNowPlayingTargetBase::CRemConNowPlayingTargetBase(
-	CRemConInterfaceSelector& aInterfaceSelector,
-	MRemConDatabaseAwareNowPlayingTargetObserver& aObserver)
-	: CRemConInterfaceBase(
-	TUid::Uid(KRemConNowPlayingApiUid),
-	KMaxLengthNowPlayingMsg,
-	aInterfaceSelector,
-	ERemConClientTypeTarget), 
-	iDaObserver(&aObserver),
-	iInterfaceSelector(aInterfaceSelector),
-	iInProgress(EFalse)
-	{
-	}
-		
-CRemConNowPlayingTargetBase::CRemConNowPlayingTargetBase(
-	CRemConInterfaceSelector& aInterfaceSelector,
-	MRemConDatabaseUnawareNowPlayingTargetObserver& aObserver)
-	: CRemConInterfaceBase(
-	TUid::Uid(KRemConNowPlayingApiUid),
-	KMaxLengthNowPlayingMsg,
-	aInterfaceSelector,
-	ERemConClientTypeTarget), 
-	iDuObserver(&aObserver),
-	iInterfaceSelector(aInterfaceSelector),
-	iInProgress(EFalse)
-	{
-	}
-	
-void CRemConNowPlayingTargetBase::BaseConstructL()
-	{
-	iMsgQueue = new(ELeave)TRemConMessageQueue;
-	TCallBack cb(&NextMessageCb, this);
-	iNextMessageCallBack = new (ELeave) CAsyncCallBack(cb,
-			CActive::EPriorityStandard);
-		
-	iOutBuf.CreateL(KMaxLengthNowPlayingMsg);
-	
-    // Mandate the following features supported.
-	RRemConInterfaceFeatures features;
-	User::LeaveIfError(features.Open());
-	CleanupClosePushL(features);
-
-	features.AddOperationL(EPlayItem);
-	features.AddOperationL(EAddToNowPlaying);
-	features.AddOperationL(ERegisterNotification);
-	
-    CRemConInterfaceBase::BaseConstructL(features);
-    CleanupStack::PopAndDestroy(&features);
-	}
-	
-
-EXPORT_C CRemConNowPlayingTargetBase::~CRemConNowPlayingTargetBase()
-	{
-	iOutBuf.Close();
-
-	iNextMessageCallBack->Cancel();
-	delete iNextMessageCallBack;
-	
-	iMsgQueue->Reset();
-	delete iMsgQueue;
-	}
-
-/** 
-@internalComponent
-@released
-
-Gets a pointer to a specific interface version.
-
-@return A pointer to the interface, NULL if not supported.
-*/
-TAny* CRemConNowPlayingTargetBase::GetInterfaceIf(TUid aUid)
-	{
-	TAny* ret = NULL;
-	if ( aUid == TUid::Uid(KRemConInterfaceIf2) )
-		{
-		ret = reinterpret_cast<TAny*>(
-			static_cast<MRemConInterfaceIf2*>(this)
-			);
-		}
-
-	return ret;
-	}
-
-/**
-Provide a response to the play item command. For database aware clients this 
-would have been called via MrcdanptoPlayItem(). For database unaware client
-this would have been called via MrcdunptoPlayItem()
-
-The client must call NowPlayingContentChanged() if the content of the now 
-playing list has been changed after the client successfully plays the item
-and provides the response with KErrNone through this function.
-
-@param aErr The result of play item operation.
-     - KErrNone if the operation was successful.
-     - KErrInvalidMediaLibraryStateCookie if the client is able to maintain 
-       unique UIDs accross the entire virtual filesystem, but the media 
-       library state cookie provided does not match the client's state cookie.
-     - KErrInvalidUid if the uid of the item provided does not refer to any 
-       valid item.
-     - KErrNowPlayingUidIsADirectory if the uid of the item provided refers to
-       a directory which can not be handled by this media player.
-     - KErrNowPlayingMediaInUse if the item is in use and can not be played.
-     - System wide error code otherwise.
-
-@see NowPlayingContentChanged()
-*/
-EXPORT_C void CRemConNowPlayingTargetBase::PlayItemResponse(TInt aErr)
-	{
-	TUint8 status = RAvrcpIPC::SymbianErrToStatus(aErr);
-	SendResponse(status, EPlayItem);
-	
-	iInProgress = EFalse;		
-	if (!iMsgQueue->IsEmpty())
-		{
-		iNextMessageCallBack->CallBack();
-		}
-	}
-
-/**
-Sends the response for the request MrcnptoAddToNowPlaying()
-
-The client must call NowPlayingContentChanged() if the content of the now 
-playing list has been changed after the client successfully adds the item
-to the now playing list and provides the response with KErrNone through 
-this function.
-
-param aErr The result of add to now playing operation.
-    - KErrNone if the operation was successful.
-    - KErrInvalidMediaLibraryStateCookie if the client is able to maintain 
-      unique UIDs accross the entire virtual filesystem, but the media 
-      library state cookie provided does not match the client's state cookie.
-    - KErrInvalidUid if the uid of the item provided does not 
-      refer to any valid item.
-    - KErrNowPlayingUidIsADirectory if the uid of the item provided refers to
-      a directory which can not be handled by this media player.
-    - KErrNowPlayingMediaInUse if the item is in use and can not be added to 
-      now playing list.
-    - KErrNowPlayingListFull if the now playing list if full and no more items
-      can be added.
-    - System wide error code otherwise.
-
-@see NowPlayingContentChanged()
-*/
-EXPORT_C void CRemConNowPlayingTargetBase::AddToNowPlayingResponse(TInt aErr)
-	{
-	TUint8 status = RAvrcpIPC::SymbianErrToStatus(aErr);
-	SendResponse(status, EAddToNowPlaying);
-
-	iInProgress = EFalse;		
-	if (!iMsgQueue->IsEmpty())
-		{
-		iNextMessageCallBack->CallBack();
-		}
-	}
-
-/**
-Called by the client in the case that the now playing content changed.
-
-@see PlayItemResponse()
-@see AddToNowPlayingResponse()
-*/
-EXPORT_C void CRemConNowPlayingTargetBase::NowPlayingContentChanged()
-	{
-	if(iNotificationPending)
-		{
-		iNotificationPending = EFalse;
-		SendNotificationResponse(ERemConNotifyResponseChanged);
-		}
-	}
-
-void CRemConNowPlayingTargetBase::SendResponse(TUint8 aStatus, TUint aOperationId)
-	{
-	TInt error = KErrNone;
-
-	// Formats the response in a RRemConNowPlayingResponse
-	RRemConNowPlayingResponse response;
-	response.iStatus = aStatus;
-	
-	TRAP(error, response.WriteL(iOutBuf));
-	if (error == KErrNone)
-		{
-		// Send the response back to the CT
-		error = InterfaceSelector().SendUnreliable(
-				TUid::Uid(KRemConNowPlayingApiUid),
-				aOperationId, ERemConResponse, iOutBuf );
-		}
-
-	}
-
-void CRemConNowPlayingTargetBase::SendError(TInt aError, TUint aOperationId)
-	{
-	TInt error = KErrNone;	
-	RAvrcpIPCError response;
-	response.iError = RAvrcpIPC::SymbianErrorCheck(aError);
-	TRAP(error, response.WriteL(iOutBuf));
-	if (error == KErrNone)
-		{
-		InterfaceSelector().SendUnreliable(TUid::Uid(KRemConNowPlayingApiUid),
-				aOperationId, ERemConResponse, iOutBuf);
-		}
-	}
-
-// From MRemConInterfaceIf2
-void CRemConNowPlayingTargetBase::MrcibNewMessage(
-		TUint aOperationId, 
-		const TDesC8& aData, 
-		TRemConMessageSubType aMsgSubType)
-	{
-	LOG_FUNC
-	LOG2(KLogFormat, aOperationId, aData.Length());
-
-	TMetadataTransferPDU currentOp =
-	RAvrcpIPC::GetPDUIdFromIPCOperationId(aOperationId);
-	switch(currentOp)
-		{
-	case EPlayItem:
-		if ( !iInProgress && 
-			 !iMsgQueue->Find(TUid::Uid(KRemConNowPlayingApiUid), EPlayItem))
-			{
-			ProcessPlayItem(aData);
-			}
-		else
-			{
-			AddToOperationQueue(EPlayItem, aData);
-			}
-		break;
-	case EAddToNowPlaying:
-		if ( !iInProgress && 
-			 !iMsgQueue->Find(TUid::Uid(KRemConNowPlayingApiUid), EAddToNowPlaying))
-			{
-			ProcessAddToNowPlaying(aData);
-			}
-		else
-			{
-			AddToOperationQueue(EAddToNowPlaying, aData);
-			}
-		break;
-	case ERegisterNotification:
-		{
-		// obtain eventId from aOperationId
-		TRegisterNotificationEvent eventId = 
-		RAvrcpIPC::GetEventIdFromIPCOperationId(aOperationId);
-		
-		// If asserted here, must something wrong occured in the 
-		// remconbearer handling
-		__ASSERT_DEBUG(eventId == ERegisterNotificationNowPlayingContentChanged
-				, NowPlayingFault::Fault(EInvalidEventId));
-        
-		// register for Notifications
-		if (aMsgSubType == ERemConNotifyCommandAwaitingInterim)
-			{
-			ProcessGetStatusAndBeginObserving();
-			}
-		else if (aMsgSubType == ERemConNotifyCommandAwaitingChanged)
-			{
-			ProcessGetStatus();
-			}
-	 	break;
-		}
-	default:
-		break;
-		};
-	}
-	
-void CRemConNowPlayingTargetBase::ProcessPlayItem(const TDesC8& aData)
-	{
-	TUint64 item;
-	TRemConFolderScope scope;
-	TUint16 uidCounter;
-	
-	if (!ProcessNowPlaying(aData, EPlayItem, item, scope, uidCounter))
-		{
-		return;
-		}
-	
-	iInProgress = ETrue;
-	if (iDaObserver && (uidCounter > 0))	
-		{
-		iDaObserver->MrcdanptoPlayItem(item, scope, uidCounter);
-		}
-	else if (!iDaObserver && (0 == uidCounter))
-		{
-		iDuObserver->MrcdunptoPlayItem(item, scope);
-		}
-	else
-		{
-		PlayItemResponse(KErrAvrcpAirInvalidParameter);
-		}
-	}
-
-void CRemConNowPlayingTargetBase::ProcessAddToNowPlaying(const TDesC8& aData)
-	{
-	TUint64 item;
-	TRemConFolderScope scope;
-	TUint16 uidCounter;
-	
-	if (!ProcessNowPlaying(aData, EAddToNowPlaying, item, scope, uidCounter))
-		{
-		return;
-		}
-
-	iInProgress = ETrue;
-	if (iDaObserver && (uidCounter > 0))
-		{
-		iDaObserver->MrcdanptoAddToNowPlaying(item, scope, uidCounter);
-		}
-	else if (!iDaObserver && (0 == uidCounter))
-		{
-		iDuObserver->MrcdunptoAddToNowPlaying(item, scope);
-		}
-	else
-		{
-		AddToNowPlayingResponse(KErrAvrcpAirInvalidParameter);
-		}
-	}
-
-TBool CRemConNowPlayingTargetBase::ProcessNowPlaying(
-		const TDesC8& aData, 
-		TUint aOperationId,
-		TUint64& aItem, 
-		TRemConFolderScope& aScope, 
-		TUint16& aMediaLibraryStateCookie)
-	{
-	RRemConNowPlayingRequest request;
-	TRAPD(error, request.ReadL(aData))
-	if (error != KErrNone)
-		{
-		// Nothing in packet
-		SendError(KErrAvrcpMetadataParameterNotFound, aOperationId);
-		return EFalse;
-		}
-    
-	aItem = request.iElement;
-	aScope = request.iScope;
-	aMediaLibraryStateCookie = request.iUidCounter;
-	
-	//Does not allow invalid scope
-	if (   aScope != EBrowseFolder 
-		&& aScope != ESearchResultFolder
-		&& aScope != ENowPlayingFolder )
-		{
-		SendError(KErrAvrcpAirInvalidScope, aOperationId);
-		return EFalse;
-		}
-	return ETrue;
-	}
-
-void CRemConNowPlayingTargetBase::ProcessGetStatusAndBeginObserving()
-	{
-	// and request another notification (if there is not one already pending)
-	// on the next state change  
-	iNotificationPending = ETrue;
-		
-	// send the current status
-	SendNotificationResponse(ERemConNotifyResponseInterim);
-	}
-
-void CRemConNowPlayingTargetBase::ProcessGetStatus()
-	{
-	// send the current value
-	SendNotificationResponse(ERemConNotifyResponseChanged);
-	}
-
-void CRemConNowPlayingTargetBase::SendNotificationResponse(
-		TRemConMessageSubType aMsgSubType)
-	{
-	LOG_FUNC
-
-	TInt error = KErrNone;
-
-	// No extra data needed
-	RAvrcpIPCError response;
-	response.iError = KErrNone;
-	TRAP(error, response.WriteL(iOutBuf));
-
-	if (error == KErrNone)
-		{
-		// send the response back to the CT
-		TUint operationId = 
-		RAvrcpIPC::SetIPCOperationIdFromEventId(
-				ERegisterNotificationNowPlayingContentChanged);
-		
-		error = InterfaceSelector().SendUnreliable(
-				TUid::Uid(KRemConNowPlayingApiUid),
-				operationId, ERemConResponse, aMsgSubType, iOutBuf);
-		}
-	}
-
-TInt CRemConNowPlayingTargetBase::NextMessageCb(TAny* aThis)
-	{
-	static_cast<CRemConNowPlayingTargetBase*>(aThis)->DoNextMessage();
-	return KErrNone;
-	}
-
-void CRemConNowPlayingTargetBase::DoNextMessage()
-	{
-	CRemConQueuedMessage* msg = iMsgQueue->First();
-	iMsgQueue->Remove(*msg);
-	
-	switch (msg->iOperationId)
-		{
-		case EPlayItem:
-			ProcessPlayItem(msg->Data());
-			break;
-		case EAddToNowPlaying:
-			ProcessAddToNowPlaying(msg->Data());
-			break;
-		default:
-			// Never come here.
-			ASSERT(NULL);
-			break;
-		}
-	delete msg;
-	}
-
-void CRemConNowPlayingTargetBase::AddToOperationQueue(TInt aOperationId, 
-		const TDesC8& aData)
-	{
-	CRemConQueuedMessage* msg = NULL;
-	TRAPD(err, msg = CRemConQueuedMessage::NewL(
-			TUid::Uid(KRemConNowPlayingApiUid), aData, aOperationId));			
-	if (err == KErrNone)
-		{
-		iMsgQueue->AddLast(*msg);
-		}
-	else
-		{
-		SendError(KErrAvrcpMetadataInternalError, aOperationId);
-		}
-	}
-