remotecontrol/avrcp/nowplayingapi/src/remconnowplayingtargetbase.cpp
author jontanne
Thu, 14 Oct 2010 11:16:56 +0100
changeset 52 321a10f609ef
parent 51 20ac952a623c
permissions -rw-r--r--
Add USB HCTL to bt package
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
20ac952a623c 201040_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
20ac952a623c 201040_02
hgs
parents:
diff changeset
     2
// All rights reserved.
20ac952a623c 201040_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
20ac952a623c 201040_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
20ac952a623c 201040_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
20ac952a623c 201040_02
hgs
parents:
diff changeset
     7
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    10
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    11
// Contributors:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    12
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    13
// Description:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    14
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    15
20ac952a623c 201040_02
hgs
parents:
diff changeset
    16
20ac952a623c 201040_02
hgs
parents:
diff changeset
    17
20ac952a623c 201040_02
hgs
parents:
diff changeset
    18
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
    19
 @file
20ac952a623c 201040_02
hgs
parents:
diff changeset
    20
 @internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
    21
 @released
20ac952a623c 201040_02
hgs
parents:
diff changeset
    22
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    23
20ac952a623c 201040_02
hgs
parents:
diff changeset
    24
#include <remconmediabrowsetypes.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    25
#include <remcondatabaseawarenowplayingtargetobserver.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    26
#include <remcondatabaseunawarenowplayingtargetobserver.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    27
#include <remcon/remconnowplayingtargetbase.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    28
#include <remcon/avrcpspec.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    29
#include <remconinterfaceselector.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    30
#include <bluetooth/logger.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    31
20ac952a623c 201040_02
hgs
parents:
diff changeset
    32
#include "mediabrowse.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    33
#include "nowplaying.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    34
#include "remconnowplayingfault.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    35
#include "remconqueuemessage.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    36
20ac952a623c 201040_02
hgs
parents:
diff changeset
    37
#ifdef __FLOG_ACTIVE
20ac952a623c 201040_02
hgs
parents:
diff changeset
    38
_LIT8(KLogComponent, LOG_COMPONENT_REMCONNOWPLAYINGAPI);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    39
_LIT8(KLogFormat, "Operation Id = 0x%x, Data Lengh = %d");
20ac952a623c 201040_02
hgs
parents:
diff changeset
    40
#endif
20ac952a623c 201040_02
hgs
parents:
diff changeset
    41
20ac952a623c 201040_02
hgs
parents:
diff changeset
    42
CRemConNowPlayingTargetBase::CRemConNowPlayingTargetBase(
20ac952a623c 201040_02
hgs
parents:
diff changeset
    43
	CRemConInterfaceSelector& aInterfaceSelector,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    44
	MRemConDatabaseAwareNowPlayingTargetObserver& aObserver)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    45
	: CRemConInterfaceBase(
20ac952a623c 201040_02
hgs
parents:
diff changeset
    46
	TUid::Uid(KRemConNowPlayingApiUid),
20ac952a623c 201040_02
hgs
parents:
diff changeset
    47
	KMaxLengthNowPlayingMsg,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    48
	aInterfaceSelector,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    49
	ERemConClientTypeTarget), 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    50
	iDaObserver(&aObserver),
20ac952a623c 201040_02
hgs
parents:
diff changeset
    51
	iInterfaceSelector(aInterfaceSelector),
20ac952a623c 201040_02
hgs
parents:
diff changeset
    52
	iInProgress(EFalse)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    53
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    54
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    55
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
    56
CRemConNowPlayingTargetBase::CRemConNowPlayingTargetBase(
20ac952a623c 201040_02
hgs
parents:
diff changeset
    57
	CRemConInterfaceSelector& aInterfaceSelector,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    58
	MRemConDatabaseUnawareNowPlayingTargetObserver& aObserver)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    59
	: CRemConInterfaceBase(
20ac952a623c 201040_02
hgs
parents:
diff changeset
    60
	TUid::Uid(KRemConNowPlayingApiUid),
20ac952a623c 201040_02
hgs
parents:
diff changeset
    61
	KMaxLengthNowPlayingMsg,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    62
	aInterfaceSelector,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    63
	ERemConClientTypeTarget), 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    64
	iDuObserver(&aObserver),
20ac952a623c 201040_02
hgs
parents:
diff changeset
    65
	iInterfaceSelector(aInterfaceSelector),
20ac952a623c 201040_02
hgs
parents:
diff changeset
    66
	iInProgress(EFalse)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    67
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    68
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    69
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    70
void CRemConNowPlayingTargetBase::BaseConstructL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    71
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    72
	iMsgQueue = new(ELeave)TRemConMessageQueue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    73
	TCallBack cb(&NextMessageCb, this);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    74
	iNextMessageCallBack = new (ELeave) CAsyncCallBack(cb,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    75
			CActive::EPriorityStandard);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    76
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
    77
	iOutBuf.CreateL(KMaxLengthNowPlayingMsg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    78
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    79
    // Mandate the following features supported.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    80
	RRemConInterfaceFeatures features;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    81
	User::LeaveIfError(features.Open());
20ac952a623c 201040_02
hgs
parents:
diff changeset
    82
	CleanupClosePushL(features);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    83
20ac952a623c 201040_02
hgs
parents:
diff changeset
    84
	features.AddOperationL(EPlayItem);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    85
	features.AddOperationL(EAddToNowPlaying);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    86
	features.AddOperationL(ERegisterNotification);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    87
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    88
    CRemConInterfaceBase::BaseConstructL(features);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    89
    CleanupStack::PopAndDestroy(&features);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    90
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    91
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    92
20ac952a623c 201040_02
hgs
parents:
diff changeset
    93
EXPORT_C CRemConNowPlayingTargetBase::~CRemConNowPlayingTargetBase()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    94
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    95
	iOutBuf.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    96
20ac952a623c 201040_02
hgs
parents:
diff changeset
    97
	iNextMessageCallBack->Cancel();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    98
	delete iNextMessageCallBack;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    99
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   100
	iMsgQueue->Reset();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   101
	delete iMsgQueue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   102
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   103
20ac952a623c 201040_02
hgs
parents:
diff changeset
   104
/** 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   105
@internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
   106
@released
20ac952a623c 201040_02
hgs
parents:
diff changeset
   107
20ac952a623c 201040_02
hgs
parents:
diff changeset
   108
Gets a pointer to a specific interface version.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   109
20ac952a623c 201040_02
hgs
parents:
diff changeset
   110
@return A pointer to the interface, NULL if not supported.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   111
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   112
TAny* CRemConNowPlayingTargetBase::GetInterfaceIf(TUid aUid)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   113
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   114
	TAny* ret = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   115
	if ( aUid == TUid::Uid(KRemConInterfaceIf2) )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   116
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   117
		ret = reinterpret_cast<TAny*>(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   118
			static_cast<MRemConInterfaceIf2*>(this)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   119
			);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   120
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   121
20ac952a623c 201040_02
hgs
parents:
diff changeset
   122
	return ret;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   123
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   124
20ac952a623c 201040_02
hgs
parents:
diff changeset
   125
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   126
Provide a response to the play item command. For database aware clients this 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   127
would have been called via MrcdanptoPlayItem(). For database unaware client
20ac952a623c 201040_02
hgs
parents:
diff changeset
   128
this would have been called via MrcdunptoPlayItem()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   129
20ac952a623c 201040_02
hgs
parents:
diff changeset
   130
The client must call NowPlayingContentChanged() if the content of the now 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   131
playing list has been changed after the client successfully plays the item
20ac952a623c 201040_02
hgs
parents:
diff changeset
   132
and provides the response with KErrNone through this function.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   133
20ac952a623c 201040_02
hgs
parents:
diff changeset
   134
@param aErr The result of play item operation.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   135
     - KErrNone if the operation was successful.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   136
     - KErrInvalidMediaLibraryStateCookie if the client is able to maintain 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   137
       unique UIDs accross the entire virtual filesystem, but the media 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   138
       library state cookie provided does not match the client's state cookie.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   139
     - KErrInvalidUid if the uid of the item provided does not refer to any 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   140
       valid item.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   141
     - KErrNowPlayingUidIsADirectory if the uid of the item provided refers to
20ac952a623c 201040_02
hgs
parents:
diff changeset
   142
       a directory which can not be handled by this media player.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   143
     - KErrNowPlayingMediaInUse if the item is in use and can not be played.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   144
     - System wide error code otherwise.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   145
20ac952a623c 201040_02
hgs
parents:
diff changeset
   146
@see NowPlayingContentChanged()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   147
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   148
EXPORT_C void CRemConNowPlayingTargetBase::PlayItemResponse(TInt aErr)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   149
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   150
	TUint8 status = RAvrcpIPC::SymbianErrToStatus(aErr);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   151
	SendResponse(status, EPlayItem);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   152
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   153
	iInProgress = EFalse;		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   154
	if (!iMsgQueue->IsEmpty())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   155
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   156
		iNextMessageCallBack->CallBack();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   157
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   158
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   159
20ac952a623c 201040_02
hgs
parents:
diff changeset
   160
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   161
Sends the response for the request MrcnptoAddToNowPlaying()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   162
20ac952a623c 201040_02
hgs
parents:
diff changeset
   163
The client must call NowPlayingContentChanged() if the content of the now 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   164
playing list has been changed after the client successfully adds the item
20ac952a623c 201040_02
hgs
parents:
diff changeset
   165
to the now playing list and provides the response with KErrNone through 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   166
this function.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   167
20ac952a623c 201040_02
hgs
parents:
diff changeset
   168
param aErr The result of add to now playing operation.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   169
    - KErrNone if the operation was successful.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   170
    - KErrInvalidMediaLibraryStateCookie if the client is able to maintain 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   171
      unique UIDs accross the entire virtual filesystem, but the media 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   172
      library state cookie provided does not match the client's state cookie.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   173
    - KErrInvalidUid if the uid of the item provided does not 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   174
      refer to any valid item.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   175
    - KErrNowPlayingUidIsADirectory if the uid of the item provided refers to
20ac952a623c 201040_02
hgs
parents:
diff changeset
   176
      a directory which can not be handled by this media player.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   177
    - KErrNowPlayingMediaInUse if the item is in use and can not be added to 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   178
      now playing list.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   179
    - KErrNowPlayingListFull if the now playing list if full and no more items
20ac952a623c 201040_02
hgs
parents:
diff changeset
   180
      can be added.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   181
    - System wide error code otherwise.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   182
20ac952a623c 201040_02
hgs
parents:
diff changeset
   183
@see NowPlayingContentChanged()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   184
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   185
EXPORT_C void CRemConNowPlayingTargetBase::AddToNowPlayingResponse(TInt aErr)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   186
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   187
	TUint8 status = RAvrcpIPC::SymbianErrToStatus(aErr);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   188
	SendResponse(status, EAddToNowPlaying);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   189
20ac952a623c 201040_02
hgs
parents:
diff changeset
   190
	iInProgress = EFalse;		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   191
	if (!iMsgQueue->IsEmpty())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   192
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   193
		iNextMessageCallBack->CallBack();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   194
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   195
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   196
20ac952a623c 201040_02
hgs
parents:
diff changeset
   197
/**
20ac952a623c 201040_02
hgs
parents:
diff changeset
   198
Called by the client in the case that the now playing content changed.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   199
20ac952a623c 201040_02
hgs
parents:
diff changeset
   200
@see PlayItemResponse()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   201
@see AddToNowPlayingResponse()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   202
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   203
EXPORT_C void CRemConNowPlayingTargetBase::NowPlayingContentChanged()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   204
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   205
	if(iNotificationPending)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   206
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   207
		iNotificationPending = EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   208
		SendNotificationResponse(ERemConNotifyResponseChanged);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   209
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   210
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   211
20ac952a623c 201040_02
hgs
parents:
diff changeset
   212
void CRemConNowPlayingTargetBase::SendResponse(TUint8 aStatus, TUint aOperationId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   213
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   214
	TInt error = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   215
20ac952a623c 201040_02
hgs
parents:
diff changeset
   216
	// Formats the response in a RRemConNowPlayingResponse
20ac952a623c 201040_02
hgs
parents:
diff changeset
   217
	RRemConNowPlayingResponse response;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   218
	response.iStatus = aStatus;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   219
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   220
	TRAP(error, response.WriteL(iOutBuf));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   221
	if (error == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   222
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   223
		// Send the response back to the CT
20ac952a623c 201040_02
hgs
parents:
diff changeset
   224
		error = InterfaceSelector().SendUnreliable(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   225
				TUid::Uid(KRemConNowPlayingApiUid),
20ac952a623c 201040_02
hgs
parents:
diff changeset
   226
				aOperationId, ERemConResponse, iOutBuf );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   227
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   228
20ac952a623c 201040_02
hgs
parents:
diff changeset
   229
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   230
20ac952a623c 201040_02
hgs
parents:
diff changeset
   231
void CRemConNowPlayingTargetBase::SendError(TInt aError, TUint aOperationId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   232
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   233
	TInt error = KErrNone;	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   234
	RAvrcpIPCError response;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   235
	response.iError = RAvrcpIPC::SymbianErrorCheck(aError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   236
	TRAP(error, response.WriteL(iOutBuf));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   237
	if (error == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   238
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   239
		InterfaceSelector().SendUnreliable(TUid::Uid(KRemConNowPlayingApiUid),
20ac952a623c 201040_02
hgs
parents:
diff changeset
   240
				aOperationId, ERemConResponse, iOutBuf);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   241
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   242
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   243
20ac952a623c 201040_02
hgs
parents:
diff changeset
   244
// From MRemConInterfaceIf2
20ac952a623c 201040_02
hgs
parents:
diff changeset
   245
void CRemConNowPlayingTargetBase::MrcibNewMessage(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   246
		TUint aOperationId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   247
		const TDesC8& aData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   248
		TRemConMessageSubType aMsgSubType)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   249
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   250
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   251
	LOG2(KLogFormat, aOperationId, aData.Length());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   252
20ac952a623c 201040_02
hgs
parents:
diff changeset
   253
	TMetadataTransferPDU currentOp =
20ac952a623c 201040_02
hgs
parents:
diff changeset
   254
	RAvrcpIPC::GetPDUIdFromIPCOperationId(aOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   255
	switch(currentOp)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   256
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   257
	case EPlayItem:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   258
		if ( !iInProgress && 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   259
			 !iMsgQueue->Find(TUid::Uid(KRemConNowPlayingApiUid), EPlayItem))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   260
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   261
			ProcessPlayItem(aData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   262
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   263
		else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   264
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   265
			AddToOperationQueue(EPlayItem, aData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   266
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   267
		break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   268
	case EAddToNowPlaying:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   269
		if ( !iInProgress && 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   270
			 !iMsgQueue->Find(TUid::Uid(KRemConNowPlayingApiUid), EAddToNowPlaying))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   271
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   272
			ProcessAddToNowPlaying(aData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   273
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   274
		else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   275
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   276
			AddToOperationQueue(EAddToNowPlaying, aData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   277
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   278
		break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   279
	case ERegisterNotification:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   280
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   281
		// obtain eventId from aOperationId
20ac952a623c 201040_02
hgs
parents:
diff changeset
   282
		TRegisterNotificationEvent eventId = 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   283
		RAvrcpIPC::GetEventIdFromIPCOperationId(aOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   284
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   285
		// If asserted here, must something wrong occured in the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   286
		// remconbearer handling
20ac952a623c 201040_02
hgs
parents:
diff changeset
   287
		__ASSERT_DEBUG(eventId == ERegisterNotificationNowPlayingContentChanged
20ac952a623c 201040_02
hgs
parents:
diff changeset
   288
				, NowPlayingFault::Fault(EInvalidEventId));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   289
        
20ac952a623c 201040_02
hgs
parents:
diff changeset
   290
		// register for Notifications
20ac952a623c 201040_02
hgs
parents:
diff changeset
   291
		if (aMsgSubType == ERemConNotifyCommandAwaitingInterim)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   292
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   293
			ProcessGetStatusAndBeginObserving();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   294
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   295
		else if (aMsgSubType == ERemConNotifyCommandAwaitingChanged)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   296
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   297
			ProcessGetStatus();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   298
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   299
	 	break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   300
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   301
	default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   302
		break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   303
		};
20ac952a623c 201040_02
hgs
parents:
diff changeset
   304
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   305
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   306
void CRemConNowPlayingTargetBase::ProcessPlayItem(const TDesC8& aData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   307
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   308
	TUint64 item;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   309
	TRemConFolderScope scope;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   310
	TUint16 uidCounter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   311
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   312
	if (!ProcessNowPlaying(aData, EPlayItem, item, scope, uidCounter))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   313
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   314
		return;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   315
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   316
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   317
	iInProgress = ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   318
	if (iDaObserver && (uidCounter > 0))	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   319
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   320
		iDaObserver->MrcdanptoPlayItem(item, scope, uidCounter);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   321
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   322
	else if (!iDaObserver && (0 == uidCounter))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   323
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   324
		iDuObserver->MrcdunptoPlayItem(item, scope);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   325
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   326
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   327
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   328
		PlayItemResponse(KErrAvrcpAirInvalidParameter);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   329
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   330
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   331
20ac952a623c 201040_02
hgs
parents:
diff changeset
   332
void CRemConNowPlayingTargetBase::ProcessAddToNowPlaying(const TDesC8& aData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   333
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   334
	TUint64 item;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   335
	TRemConFolderScope scope;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   336
	TUint16 uidCounter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   337
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   338
	if (!ProcessNowPlaying(aData, EAddToNowPlaying, item, scope, uidCounter))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   339
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   340
		return;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   341
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   342
20ac952a623c 201040_02
hgs
parents:
diff changeset
   343
	iInProgress = ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   344
	if (iDaObserver && (uidCounter > 0))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   345
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   346
		iDaObserver->MrcdanptoAddToNowPlaying(item, scope, uidCounter);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   347
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   348
	else if (!iDaObserver && (0 == uidCounter))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   349
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   350
		iDuObserver->MrcdunptoAddToNowPlaying(item, scope);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   351
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   352
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   353
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   354
		AddToNowPlayingResponse(KErrAvrcpAirInvalidParameter);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   355
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   356
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   357
20ac952a623c 201040_02
hgs
parents:
diff changeset
   358
TBool CRemConNowPlayingTargetBase::ProcessNowPlaying(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   359
		const TDesC8& aData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   360
		TUint aOperationId,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   361
		TUint64& aItem, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   362
		TRemConFolderScope& aScope, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   363
		TUint16& aMediaLibraryStateCookie)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   364
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   365
	RRemConNowPlayingRequest request;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   366
	TRAPD(error, request.ReadL(aData))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   367
	if (error != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   368
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   369
		// Nothing in packet
20ac952a623c 201040_02
hgs
parents:
diff changeset
   370
		SendError(KErrAvrcpMetadataParameterNotFound, aOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   371
		return EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   372
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   373
    
20ac952a623c 201040_02
hgs
parents:
diff changeset
   374
	aItem = request.iElement;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   375
	aScope = request.iScope;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   376
	aMediaLibraryStateCookie = request.iUidCounter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   377
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   378
	//Does not allow invalid scope
20ac952a623c 201040_02
hgs
parents:
diff changeset
   379
	if (   aScope != EBrowseFolder 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   380
		&& aScope != ESearchResultFolder
20ac952a623c 201040_02
hgs
parents:
diff changeset
   381
		&& aScope != ENowPlayingFolder )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   382
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   383
		SendError(KErrAvrcpAirInvalidScope, aOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   384
		return EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   385
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   386
	return ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   387
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   388
20ac952a623c 201040_02
hgs
parents:
diff changeset
   389
void CRemConNowPlayingTargetBase::ProcessGetStatusAndBeginObserving()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   390
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   391
	// and request another notification (if there is not one already pending)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   392
	// on the next state change  
20ac952a623c 201040_02
hgs
parents:
diff changeset
   393
	iNotificationPending = ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   394
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   395
	// send the current status
20ac952a623c 201040_02
hgs
parents:
diff changeset
   396
	SendNotificationResponse(ERemConNotifyResponseInterim);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   397
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   398
20ac952a623c 201040_02
hgs
parents:
diff changeset
   399
void CRemConNowPlayingTargetBase::ProcessGetStatus()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   400
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   401
	// send the current value
20ac952a623c 201040_02
hgs
parents:
diff changeset
   402
	SendNotificationResponse(ERemConNotifyResponseChanged);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   403
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   404
20ac952a623c 201040_02
hgs
parents:
diff changeset
   405
void CRemConNowPlayingTargetBase::SendNotificationResponse(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   406
		TRemConMessageSubType aMsgSubType)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   407
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   408
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   409
20ac952a623c 201040_02
hgs
parents:
diff changeset
   410
	TInt error = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   411
20ac952a623c 201040_02
hgs
parents:
diff changeset
   412
	// No extra data needed
20ac952a623c 201040_02
hgs
parents:
diff changeset
   413
	RAvrcpIPCError response;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   414
	response.iError = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   415
	TRAP(error, response.WriteL(iOutBuf));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   416
20ac952a623c 201040_02
hgs
parents:
diff changeset
   417
	if (error == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   418
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   419
		// send the response back to the CT
20ac952a623c 201040_02
hgs
parents:
diff changeset
   420
		TUint operationId = 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   421
		RAvrcpIPC::SetIPCOperationIdFromEventId(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   422
				ERegisterNotificationNowPlayingContentChanged);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   423
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   424
		error = InterfaceSelector().SendUnreliable(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   425
				TUid::Uid(KRemConNowPlayingApiUid),
20ac952a623c 201040_02
hgs
parents:
diff changeset
   426
				operationId, ERemConResponse, aMsgSubType, iOutBuf);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   427
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   428
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   429
20ac952a623c 201040_02
hgs
parents:
diff changeset
   430
TInt CRemConNowPlayingTargetBase::NextMessageCb(TAny* aThis)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   431
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   432
	static_cast<CRemConNowPlayingTargetBase*>(aThis)->DoNextMessage();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   433
	return KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   434
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   435
20ac952a623c 201040_02
hgs
parents:
diff changeset
   436
void CRemConNowPlayingTargetBase::DoNextMessage()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   437
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   438
	CRemConQueuedMessage* msg = iMsgQueue->First();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   439
	iMsgQueue->Remove(*msg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   440
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   441
	switch (msg->iOperationId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   442
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   443
		case EPlayItem:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   444
			ProcessPlayItem(msg->Data());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   445
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   446
		case EAddToNowPlaying:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   447
			ProcessAddToNowPlaying(msg->Data());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   448
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   449
		default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   450
			// Never come here.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   451
			ASSERT(NULL);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   452
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   453
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   454
	delete msg;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   455
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   456
20ac952a623c 201040_02
hgs
parents:
diff changeset
   457
void CRemConNowPlayingTargetBase::AddToOperationQueue(TInt aOperationId, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   458
		const TDesC8& aData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   459
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   460
	CRemConQueuedMessage* msg = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   461
	TRAPD(err, msg = CRemConQueuedMessage::NewL(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   462
			TUid::Uid(KRemConNowPlayingApiUid), aData, aOperationId));			
20ac952a623c 201040_02
hgs
parents:
diff changeset
   463
	if (err == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   464
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   465
		iMsgQueue->AddLast(*msg);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   466
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   467
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   468
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   469
		SendError(KErrAvrcpMetadataInternalError, aOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   470
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   471
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   472