remotecontrol/avrcp/remconbeareravrcp/src/avrcpMetadataTransfer.cpp
author hgs
Wed, 13 Oct 2010 16:20:29 +0300
changeset 51 20ac952a623c
permissions -rw-r--r--
201040_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51
20ac952a623c 201040_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-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
 @prototype
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 <avcframe.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    25
#include <e32base.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    26
#include <remcon/remconbearerobserver.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    27
#include <remcon/remconconverterplugin.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    28
#include <remcon/messagetype.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    29
#include <remcon/avrcpspec.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    30
#include <remconbeareravrcp.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    31
20ac952a623c 201040_02
hgs
parents:
diff changeset
    32
#include <remconbatterytargetobserver.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    33
#include <absolutevolumeapi.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    34
#include <absolutevolumeutils.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    35
20ac952a623c 201040_02
hgs
parents:
diff changeset
    36
#include "avrcp.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    37
#include "controlcommand.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    38
#include "avrcpcommandframer.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    39
#include "avrcpinternalinterface.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    40
#include "avrcpipc.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    41
#include "avrcplog.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    42
#include "avrcputils.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    43
#include "avrcpincomingcommandhandler.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    44
#include "mediabrowse.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    45
#include "mediainformation.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    46
#include "nowplaying.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    47
#include "playerinformation.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    48
#include "remconbattery.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    49
#include "remcongroupnavigation.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    50
20ac952a623c 201040_02
hgs
parents:
diff changeset
    51
TInt CControlCommand::ParseMetadataTransferPassthroughCommand()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    52
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    53
	// company id and frame type should already be set before here
20ac952a623c 201040_02
hgs
parents:
diff changeset
    54
	__ASSERT_DEBUG(iFrame->Type() == AVC::EControl,  AvrcpUtils::Panic(EAvrcpCTypeNotSet));
20ac952a623c 201040_02
hgs
parents:
diff changeset
    55
	__ASSERT_DEBUG(iVendorId == KBluetoothSIGVendorId,  AvrcpUtils::Panic(EAvrcpCompanyIDNotSet));
20ac952a623c 201040_02
hgs
parents:
diff changeset
    56
20ac952a623c 201040_02
hgs
parents:
diff changeset
    57
	TInt ret = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    58
	TUint16 operation = MetadataTransferParser::GetPassThroughOperationId(iVendorPayloadData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    59
	if (operation == ENextGroup)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    60
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    61
		iOperationId = ENextGroup;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    62
		iInterfaceUid = TUid::Uid(KRemConGroupNavigationApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    63
		ret = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    64
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    65
	else if (operation == EPreviousGroup)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    66
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    67
		iOperationId = EPreviousGroup;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    68
		iInterfaceUid = TUid::Uid(KRemConGroupNavigationApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    69
		ret = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    70
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    71
	return ret;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    72
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    73
20ac952a623c 201040_02
hgs
parents:
diff changeset
    74
/* Before calling this method, the following MUST be set:
20ac952a623c 201040_02
hgs
parents:
diff changeset
    75
 *  - Vendor Payload data
20ac952a623c 201040_02
hgs
parents:
diff changeset
    76
 *  - Opcode       == Vendor Dependent
20ac952a623c 201040_02
hgs
parents:
diff changeset
    77
 *  - Subunit Type == Panel
20ac952a623c 201040_02
hgs
parents:
diff changeset
    78
 *  - Subunit Id   == 0
20ac952a623c 201040_02
hgs
parents:
diff changeset
    79
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
    80
 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    81
TInt CControlCommand::ParseMetadataTransferVendorCommand(CAVRCPFragmenter& aFragmenter)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    82
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    83
	__ASSERT_DEBUG(iFrame->Opcode() == AVC::EVendorDependent, AvrcpUtils::Panic(EAvrcpNotFullyConstructed));
20ac952a623c 201040_02
hgs
parents:
diff changeset
    84
	__ASSERT_DEBUG(iFrame->SubunitType() == AVC::EPanel,      AvrcpUtils::Panic(EAvrcpNotFullyConstructed));
20ac952a623c 201040_02
hgs
parents:
diff changeset
    85
	__ASSERT_DEBUG(iFrame->SubunitID() == 0,                  AvrcpUtils::Panic(EAvrcpNotFullyConstructed));
20ac952a623c 201040_02
hgs
parents:
diff changeset
    86
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    87
	TInt ret = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    88
	iInterfaceUid = TUid::Uid(0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    89
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    90
	TMetadataTransferPDUID metadataPDUID = MetadataTransferParser::GetPDUID(iVendorPayloadData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    91
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    92
	TPtrC8 mtPayload(iVendorPayloadData.Mid(KRemConMetadataHeaderLength));
20ac952a623c 201040_02
hgs
parents:
diff changeset
    93
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    94
	TUint paramLength = MetadataTransferParser::GetParamLength(iVendorPayloadData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    95
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    96
	if (mtPayload.Length() != paramLength)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    97
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    98
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    99
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   100
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   101
	// If we're in a fragmented state, and we receive an un-expected
20ac952a623c 201040_02
hgs
parents:
diff changeset
   102
	// PDU (i.e. not CONTINUE or ABORT) then throw away the fragment
20ac952a623c 201040_02
hgs
parents:
diff changeset
   103
	// and just process the request. The specification (section 5.5.1)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   104
	// isn't entirely clear as to what should happen, but Sian reckons
20ac952a623c 201040_02
hgs
parents:
diff changeset
   105
	// this is probably the most polite thing to do (be liberal, etc)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   106
	if (aFragmenter.InFragmentedState())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   107
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   108
		if (   metadataPDUID != ERequestContinuingResponse
20ac952a623c 201040_02
hgs
parents:
diff changeset
   109
			&& metadataPDUID != EAbortContinuingResponse)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   110
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   111
			aFragmenter.Reset();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   112
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   113
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   114
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   115
	switch (iFrame->Type())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   116
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   117
		case AVC::EControl:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   118
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   119
			switch (metadataPDUID)	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   120
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   121
				case ERequestContinuingResponse:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   122
					ret = ParseContinuingResponse(mtPayload, aFragmenter);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   123
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   124
				case EAbortContinuingResponse:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   125
					ret = ParseAbortContinuingResponse(mtPayload, aFragmenter);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   126
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   127
				case ESetPlayerApplicationSettingValue:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   128
					ret = ParseSetPlayerApplicationSettingValue(mtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   129
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   130
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   131
				case EInformBatteryStatusOfCT:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   132
					ret = ParseInformBatteryStatusOfCT(mtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   133
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   134
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   135
				case EInformDisplayableCharacterSet:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   136
					ret = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   137
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   138
				case ESetAddressedPlayer:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   139
					ret = ParseSetAddressedPlayer(mtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   140
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   141
				case EPlayItem:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   142
					ret = ParsePlayItem(mtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   143
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   144
				case EAddToNowPlaying:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   145
					ret = ParseAddToNowPlaying(mtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   146
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   147
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   148
				case ESetAbsoluteVolume:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   149
				    ret =ParseSetAbsoluteVolume(mtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   150
				    break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   151
				default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   152
					// not allowed PDUID for Control
20ac952a623c 201040_02
hgs
parents:
diff changeset
   153
					ret = KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   154
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   155
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   156
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   157
		case AVC::EStatus:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   158
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   159
			switch (metadataPDUID)	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   160
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   161
				case EGetCapabilities:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   162
					ret = ParseGetCapabilities( mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   163
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   164
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   165
				case EGetPlayStatus:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   166
					ret = ParseGetPlayStatus( mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   167
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   168
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   169
				case EListPlayerApplicationSettingAttributes:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   170
					ret = ParseListPlayerApplicationSettingAttributes( mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   171
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   172
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   173
				case EListPlayerApplicationSettingValues:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   174
					ret = ParseListPlayerApplicationSettingValues( mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   175
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   176
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   177
				case EGetCurrentPlayerApplicationSettingValue:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   178
					ret = ParseGetCurrentPlayerApplicationSettingValue( mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   179
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   180
20ac952a623c 201040_02
hgs
parents:
diff changeset
   181
				case EGetPlayerApplicationSettingAttributeText:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   182
					ret = ParseGetPlayerApplicationSettingAttributeText( mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   183
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   184
20ac952a623c 201040_02
hgs
parents:
diff changeset
   185
				case EGetPlayerApplicationSettingValueText:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   186
					ret = ParseGetPlayerApplicationSettingValueText( mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   187
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   188
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   189
				case EGetElementAttributes:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   190
					ret = ParseGetElementAttributes(mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   191
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   192
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   193
				case ESetAddressedPlayer:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   194
					ret = ParseSetAddressedPlayer(mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   195
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   196
				
20ac952a623c 201040_02
hgs
parents:
diff changeset
   197
				case EPlayItem:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   198
					ret = ParsePlayItem(mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   199
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   200
					
20ac952a623c 201040_02
hgs
parents:
diff changeset
   201
				case EAddToNowPlaying:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   202
					ret = ParseAddToNowPlaying(mtPayload );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   203
					break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   204
				default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   205
					// not allowed PDUID for Status
20ac952a623c 201040_02
hgs
parents:
diff changeset
   206
					ret = KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   207
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   208
				
20ac952a623c 201040_02
hgs
parents:
diff changeset
   209
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   210
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   211
		case AVC::ENotify:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   212
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   213
			if (metadataPDUID==ERegisterNotification)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   214
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   215
				if (mtPayload.Length() != KLengthRegisterNotification)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   216
					{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   217
					ret = KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   218
					}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   219
				else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   220
					{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   221
					ret = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   222
					TRegisterNotificationEvent eventId = static_cast<TRegisterNotificationEvent>(mtPayload[KVendorDependentEventId]);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   223
					switch (eventId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   224
						{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   225
						case ERegisterNotificationPlaybackStatusChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   226
						case ERegisterNotificationTrackChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   227
						case ERegisterNotificationTrackReachedEnd:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   228
						case ERegisterNotificationTrackReachedStart:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   229
						case ERegisterNotificationBatteryStatusChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   230
						case ERegisterNotificationPlayerApplicationSettingChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   231
							{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   232
							iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   233
							iOperationId = RAvrcpIPC::SetIPCOperationIdFromEventId(eventId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   234
							break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   235
							}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   236
						// Note: ERegisterNotificationPlaybackPosChanged takes a 4 byte parameter
20ac952a623c 201040_02
hgs
parents:
diff changeset
   237
						case ERegisterNotificationPlaybackPosChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   238
							{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   239
							iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   240
							iOperationId = RAvrcpIPC::SetIPCOperationIdFromEventId(eventId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   241
							iCommandData.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   242
							ret = iCommandData.Create(KLengthPlaybackPosChangedParam);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   243
							if (ret == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   244
								{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   245
								iCommandData.Append(mtPayload.Right(KLengthPlaybackPosChangedParam));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   246
								}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   247
							else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   248
								{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   249
								ret = KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   250
								}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   251
							break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   252
							}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   253
							
20ac952a623c 201040_02
hgs
parents:
diff changeset
   254
						// Note ERegisterNotificationSystemStatusChanged is not supported
20ac952a623c 201040_02
hgs
parents:
diff changeset
   255
						case ERegisterNotificationSystemStatusChanged_NotSupported:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   256
							{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   257
							ret = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   258
							break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   259
							}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   260
							
20ac952a623c 201040_02
hgs
parents:
diff changeset
   261
						case ERegisterNotificationNowPlayingContentChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   262
							{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   263
							iInterfaceUid = TUid::Uid(KRemConNowPlayingApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   264
							iOperationId = RAvrcpIPC::SetIPCOperationIdFromEventId(eventId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   265
							break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   266
							}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   267
						case ERegisterNotificationAvailablePlayersChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   268
						case ERegisterNotificationAddressedPlayerChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   269
						case ERegisterNotificationUidsChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   270
							{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   271
							iInterfaceUid = TUid::Uid(KUidAvrcpInternalInterface);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   272
							iOperationId = RAvrcpIPC::SetIPCOperationIdFromEventId(eventId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   273
							ret = KErrAvrcpInternalCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   274
							break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   275
							}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   276
						case ERegisterNotificationVolumeChanged	:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   277
							{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   278
							ret = ParseVolumeChangedNotification(mtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   279
							break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   280
							}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   281
						default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   282
							{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   283
							ret = KErrAvrcpMetadataInvalidParameter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   284
							}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   285
						}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   286
					}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   287
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   288
			else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   289
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   290
				ret = KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   291
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   292
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   293
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   294
		case AVC::EReserved1:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   295
		case AVC::EReserved2:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   296
		case AVC::EReserved3:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   297
		case AVC::EReserved4:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   298
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   299
			ret = KErrAvrcpInvalidCType;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   300
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   301
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   302
		default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   303
			ret = KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   304
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   305
20ac952a623c 201040_02
hgs
parents:
diff changeset
   306
	return ret;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   307
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   308
20ac952a623c 201040_02
hgs
parents:
diff changeset
   309
/** Allocate correct space and append the payload to iCommandData
20ac952a623c 201040_02
hgs
parents:
diff changeset
   310
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   311
TInt CControlCommand::AppendIncomingPayload(const TPtrC8& aPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   312
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   313
	iCommandData.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   314
	if (iCommandData.Create(aPayload.Length()) != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   315
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   316
		return KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   317
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   318
	iCommandData.Append(aPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   319
	return KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   320
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   321
20ac952a623c 201040_02
hgs
parents:
diff changeset
   322
/** Decode a InformBatteryStatusOfCT PDU ID: 0x18 and call the BatteryStatus API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   323
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   324
TInt CControlCommand::ParseInformBatteryStatusOfCT(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   325
												 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   326
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   327
	if (aMtPayload.Length() != KLengthInformBatteryStatusOfCTPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   328
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   329
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   330
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   331
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   332
	TUint8 batteryStatus = aMtPayload[0];
20ac952a623c 201040_02
hgs
parents:
diff changeset
   333
	if (batteryStatus > EFullCharge)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   334
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   335
		return KErrAvrcpMetadataInvalidParameter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   336
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   337
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   338
	if (AppendIncomingPayload(aMtPayload) != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   339
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   340
		return KErrAvrcpMetadataInvalidParameter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   341
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   342
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   343
	iOperationId = EInformBatteryStatusOfCT;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   344
	iInterfaceUid = TUid::Uid(KRemConBatteryApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   345
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   346
	TInt ret = RespondToInforms(EInformBatteryStatusOfCT);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   347
	if (ret != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   348
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   349
		return ret;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   350
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   351
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   352
	return KErrAvrcpHandledInternallyInformRemCon;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   353
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   354
20ac952a623c 201040_02
hgs
parents:
diff changeset
   355
20ac952a623c 201040_02
hgs
parents:
diff changeset
   356
/** Decode PDU ID 0x40 - fragmentation support
20ac952a623c 201040_02
hgs
parents:
diff changeset
   357
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   358
TInt CControlCommand::ParseContinuingResponse(TPtrC8& aMtPayload,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   359
										  CAVRCPFragmenter& aFragmenter)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   360
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   361
	// Check if in fragmentation state, return error if not
20ac952a623c 201040_02
hgs
parents:
diff changeset
   362
	if (! aFragmenter.InFragmentedState())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   363
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   364
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   365
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   366
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   367
	// Check if the parameter matches the fragmented response
20ac952a623c 201040_02
hgs
parents:
diff changeset
   368
	TMetadataTransferPDUID pduId = MetadataTransferParser::GetPDUID(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   369
	if (pduId != aFragmenter.GetPDU())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   370
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   371
		return KErrAvrcpMetadataInvalidParameter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   372
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   373
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   374
	RBuf8 respPayload;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   375
	CAVCFrame* frame = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   376
	TRAPD(err, frame = CAVCVendorDependentResponse::NewL(KBluetoothSIGVendorId));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   377
	err = respPayload.Create(KAVCMaxVendorDependentPayload); //longest resp
20ac952a623c 201040_02
hgs
parents:
diff changeset
   378
	if (err == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   379
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   380
		respPayload.Append(aFragmenter.GetNextFragmentHeader());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   381
		respPayload.Append(aFragmenter.GetNextFragment());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   382
		frame->SetType(AVC::EStable);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   383
		frame->Append(respPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   384
		delete iFrame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   385
		iFrame = frame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   386
		respPayload.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   387
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   388
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   389
		return KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   390
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   391
	return KErrAvrcpHandledInternallyRespondNow;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   392
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   393
20ac952a623c 201040_02
hgs
parents:
diff changeset
   394
20ac952a623c 201040_02
hgs
parents:
diff changeset
   395
/** Decode PDU ID 0x41 - fragmentation support
20ac952a623c 201040_02
hgs
parents:
diff changeset
   396
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   397
TInt CControlCommand::ParseAbortContinuingResponse(TPtrC8& aMtPayload,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   398
												CAVRCPFragmenter& aFragmenter)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   399
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   400
	// Check if in fragmentation state, return error if not
20ac952a623c 201040_02
hgs
parents:
diff changeset
   401
	if (! aFragmenter.InFragmentedState())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   402
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   403
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   404
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   405
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   406
	// Check if the parameter matches the fragmented response
20ac952a623c 201040_02
hgs
parents:
diff changeset
   407
	TMetadataTransferPDUID pduId = MetadataTransferParser::GetPDUID(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   408
	if (pduId != aFragmenter.GetPDU())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   409
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   410
		return KErrAvrcpMetadataInvalidParameter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   411
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   412
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   413
	aFragmenter.Reset();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   414
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   415
	CAVCFrame* frame = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   416
	TRAPD(err, frame = CAVCVendorDependentResponse::NewL(KBluetoothSIGVendorId));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   417
	if (err == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   418
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   419
		frame->Append(EAbortContinuingResponse);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   420
		frame->Append(EUnfragmented);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   421
		// the package length is 0
20ac952a623c 201040_02
hgs
parents:
diff changeset
   422
		frame->Append( 0 );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   423
		frame->Append( 0 );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   424
		frame->SetType(AVC::EStable);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   425
		delete iFrame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   426
		iFrame = frame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   427
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   428
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   429
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   430
		return KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   431
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   432
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   433
	return KErrAvrcpHandledInternallyRespondNow;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   434
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   435
20ac952a623c 201040_02
hgs
parents:
diff changeset
   436
20ac952a623c 201040_02
hgs
parents:
diff changeset
   437
/** Decode a SetPlayerApplicationSettingValue PDU ID: 0x14 and call the PlayerInformation API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   438
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   439
TInt CControlCommand::ParseSetPlayerApplicationSettingValue(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   440
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   441
	if (aMtPayload.Length() < KMinLengthSetPASValuePdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   442
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   443
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   444
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   445
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   446
	// get the number of attributes contained 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   447
	TUint8 numAttributes = aMtPayload[KVendorDependentNumberAttributes];
20ac952a623c 201040_02
hgs
parents:
diff changeset
   448
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   449
	// Each attribute is 16 bits long
20ac952a623c 201040_02
hgs
parents:
diff changeset
   450
	if (sizeof(numAttributes) + numAttributes*sizeof(TUint16) != aMtPayload.Length())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   451
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   452
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   453
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   454
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   455
	iOperationId = ESetPlayerApplicationSettingValue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   456
	iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   457
	return AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   458
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   459
20ac952a623c 201040_02
hgs
parents:
diff changeset
   460
/** Decode a GetCapabilities PDU ID: 0x10 and call the PlayerInformation API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   461
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   462
TInt CControlCommand::ParseGetCapabilities(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   463
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   464
	// check enough data available
20ac952a623c 201040_02
hgs
parents:
diff changeset
   465
	if (aMtPayload.Length() != KLengthGetCapabilitiesPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   466
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   467
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   468
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   469
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   470
	// pass one byte of data to Player Information API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   471
	iOperationId = EGetCapabilities;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   472
	iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   473
	return AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   474
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   475
20ac952a623c 201040_02
hgs
parents:
diff changeset
   476
/** Decode a GetPlayStatus PDU ID: 0x30 and call the PlayerInformation API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   477
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   478
TInt CControlCommand::ParseGetPlayStatus(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   479
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   480
	// no payload in this command
20ac952a623c 201040_02
hgs
parents:
diff changeset
   481
	if (aMtPayload.Length()!=KLengthGetPlayStatusPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   482
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   483
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   484
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   485
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   486
	iOperationId = EGetPlayStatus;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   487
	iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   488
	return KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   489
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   490
20ac952a623c 201040_02
hgs
parents:
diff changeset
   491
/** Decode a ListPlayerApplicationSettingAttributes PDU ID: 0x11 and call the PlayerInformation API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   492
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   493
TInt CControlCommand::ParseListPlayerApplicationSettingAttributes(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   494
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   495
	// check length, there should be no parameters
20ac952a623c 201040_02
hgs
parents:
diff changeset
   496
	if (aMtPayload.Length()!=KLengthListPASAttributesPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   497
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   498
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   499
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   500
20ac952a623c 201040_02
hgs
parents:
diff changeset
   501
	iOperationId = EListPlayerApplicationSettingAttributes;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   502
	iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   503
	return KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   504
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   505
20ac952a623c 201040_02
hgs
parents:
diff changeset
   506
/** Decode a ListPlayerApplicationSettingValues PDU ID: 0x12 and call the PlayerInformation API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   507
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   508
TInt CControlCommand::ParseListPlayerApplicationSettingValues(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   509
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   510
	// check length, there should be 1 byte of data
20ac952a623c 201040_02
hgs
parents:
diff changeset
   511
	if (aMtPayload.Length() != KLengthListPASValuesPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   512
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   513
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   514
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   515
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   516
	iOperationId = EListPlayerApplicationSettingValues;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   517
	iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   518
	return AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   519
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   520
20ac952a623c 201040_02
hgs
parents:
diff changeset
   521
/** Decode a GetCurrentPlayerApplicationSettingValue PDU ID: 0x13 and call the PlayerInformation API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   522
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   523
TInt CControlCommand::ParseGetCurrentPlayerApplicationSettingValue(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   524
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   525
	// check the length
20ac952a623c 201040_02
hgs
parents:
diff changeset
   526
	if (aMtPayload.Length() < KMinLengthGetCurrentPASValuePdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   527
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   528
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   529
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   530
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   531
	TUint8 numAttributes = aMtPayload[KVendorDependentNumberAttributes];
20ac952a623c 201040_02
hgs
parents:
diff changeset
   532
	if (sizeof(numAttributes) + numAttributes != aMtPayload.Length())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   533
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   534
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   535
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   536
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   537
	iOperationId = EGetCurrentPlayerApplicationSettingValue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   538
	iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   539
	return AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   540
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   541
20ac952a623c 201040_02
hgs
parents:
diff changeset
   542
/** Decode a GetPlayerApplicationSettingAttributeText PDU ID: 0x15 and call the PlayerInformation API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   543
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   544
TInt CControlCommand::ParseGetPlayerApplicationSettingAttributeText(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   545
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   546
	if (aMtPayload.Length() < KMinLengthGetPASAttributeTextPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   547
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   548
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   549
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   550
	// get the number of attributes contained 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   551
	TUint8 numAttributes = aMtPayload[KVendorDependentNumberAttributes];
20ac952a623c 201040_02
hgs
parents:
diff changeset
   552
	if (sizeof(numAttributes) + numAttributes != aMtPayload.Length())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   553
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   554
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   555
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   556
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   557
	iOperationId = EGetPlayerApplicationSettingAttributeText;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   558
	iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   559
	return AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   560
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   561
20ac952a623c 201040_02
hgs
parents:
diff changeset
   562
/** Decode a GetPlayerApplicationSettingValueText PDU ID: 0x16 and call the PlayerInformation API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   563
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   564
TInt CControlCommand::ParseGetPlayerApplicationSettingValueText(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   565
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   566
	if (aMtPayload.Length() < KMinLengthGetPASValueTextPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   567
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   568
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   569
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   570
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   571
	// get number of values; preceded by attributeId (1byte) and numValues (1byte)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   572
	TUint8 numValues = aMtPayload[KVendorDependentNumberAttribsPdu16];
20ac952a623c 201040_02
hgs
parents:
diff changeset
   573
	if (sizeof(TUint8) + sizeof(numValues) + numValues != aMtPayload.Length())
20ac952a623c 201040_02
hgs
parents:
diff changeset
   574
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   575
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   576
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   577
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   578
	iOperationId = EGetPlayerApplicationSettingValueText;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   579
	iInterfaceUid = TUid::Uid(KRemConPlayerInformationUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   580
	return AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   581
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   582
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   583
/** Decode a GetElementAttributes PDU ID: 0x20 and call the PlayerInformation API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   584
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
   585
TInt CControlCommand::ParseGetElementAttributes(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   586
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   587
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   588
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   589
	if (aMtPayload.Length() < KMinLengthGetElementAttributesPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   590
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   591
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   592
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   593
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   594
	iOperationId = EGetElementAttributes;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   595
	iInterfaceUid = TUid::Uid(KRemConMediaInformationApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   596
	return AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   597
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   598
20ac952a623c 201040_02
hgs
parents:
diff changeset
   599
TInt CControlCommand::ParseSetAddressedPlayer(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   600
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   601
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   602
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   603
	if (aMtPayload.Length() < KLengthSetAddressedPlayerPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   604
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   605
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   606
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   607
20ac952a623c 201040_02
hgs
parents:
diff changeset
   608
	iOperationId = EAvrcpInternalSetAddressedPlayer;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   609
	iInterfaceUid = TUid::Uid(KUidAvrcpInternalInterface);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   610
	TInt err = AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   611
20ac952a623c 201040_02
hgs
parents:
diff changeset
   612
	return err == KErrNone ? KErrAvrcpInternalCommand : err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   613
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   614
20ac952a623c 201040_02
hgs
parents:
diff changeset
   615
TInt CControlCommand::ParsePlayItem(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   616
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   617
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   618
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   619
	if (aMtPayload.Length() < KMinLengthAddToNowPlayingPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   620
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   621
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   622
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   623
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   624
	iOperationId = EPlayItem;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   625
	iInterfaceUid = TUid::Uid(KRemConNowPlayingApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   626
	return AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   627
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   628
20ac952a623c 201040_02
hgs
parents:
diff changeset
   629
TInt CControlCommand::ParseAddToNowPlaying(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   630
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   631
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   632
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   633
	if (aMtPayload.Length() < KMinLengthAddToNowPlayingPdu)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   634
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   635
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   636
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   637
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   638
	iOperationId = EAddToNowPlaying;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   639
	iInterfaceUid = TUid::Uid(KRemConNowPlayingApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   640
	return AppendIncomingPayload(aMtPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   641
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   642
20ac952a623c 201040_02
hgs
parents:
diff changeset
   643
TInt CControlCommand::ParseUidsChangedNotification(TPtrC8& /*aMtPayload*/)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   644
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   645
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   646
	iInterfaceUid = TUid::Uid(KRemConMediaBrowseApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   647
	iOperationId = RAvrcpIPC::SetIPCOperationIdFromEventId(ERegisterNotificationUidsChanged);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   648
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   649
	return KErrAvrcpHandledInternallyRespondNow;	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   650
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   651
20ac952a623c 201040_02
hgs
parents:
diff changeset
   652
TInt CControlCommand::ParseVolumeChangedNotification(TPtrC8& /*aMtPayload*/)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   653
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   654
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   655
	iInterfaceUid = TUid::Uid(KRemConAbsoluteVolumeTargetApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   656
	iOperationId = KRemConAbsoluteVolumeNotification;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   657
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   658
	return KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   659
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   660
20ac952a623c 201040_02
hgs
parents:
diff changeset
   661
TInt CControlCommand::GenerateMetadataResponsePayload(MRemConBearerObserver& aObserver, RBuf8& aFramePayload, const RBuf8& aResponseData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   662
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   663
	TInt err = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   664
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   665
	// If it's a very large response; this requires re-allocating the buffer
20ac952a623c 201040_02
hgs
parents:
diff changeset
   666
	if (aResponseData.Length() > KAVCFrameMaxLength)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   667
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   668
		aFramePayload.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   669
		if (aFramePayload.Create(aResponseData.Length()) != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   670
			return KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   671
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   672
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   673
	// Obtain the PDU from the combined PDU + (possible) notification eventId
20ac952a623c 201040_02
hgs
parents:
diff changeset
   674
	TMetadataTransferPDU pduId = RAvrcpIPC::GetPDUIdFromIPCOperationId(iOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   675
	aFramePayload.Zero();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   676
	aFramePayload.Append(pduId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   677
	aFramePayload.Append(EUnfragmented);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   678
20ac952a623c 201040_02
hgs
parents:
diff changeset
   679
	//Check whether it is absolute volume response.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   680
	TBool absoluteVolumeResponse = EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   681
	if (pduId == ESetAbsoluteVolume)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   682
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   683
		absoluteVolumeResponse = ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   684
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   685
	else if (pduId == ERegisterNotification)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   686
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   687
		TRegisterNotificationEvent eventId = RAvrcpIPC::GetEventIdFromIPCOperationId(iOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   688
		if (eventId == ERegisterNotificationVolumeChanged)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   689
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   690
			absoluteVolumeResponse = ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   691
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   692
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   693
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   694
	TPtr8 responseData(NULL, 0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   695
	if (absoluteVolumeResponse)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   696
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   697
		responseData.Set(aResponseData.RightTPtr(aResponseData.Length()));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   698
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   699
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   700
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   701
		// Read 4 byte Big-Endian error code before the payload
20ac952a623c 201040_02
hgs
parents:
diff changeset
   702
		RAvrcpIPCError response;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   703
		TRAP(err, response.ReadL(aResponseData));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   704
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   705
		// If we couldn't parse the response via IPC, send an internal error
20ac952a623c 201040_02
hgs
parents:
diff changeset
   706
		if (err != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   707
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   708
			return KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   709
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   710
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   711
		// If an error occurred, return it (now that we've filled in the PDU id)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   712
		if (response.iError != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   713
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   714
			return response.iError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   715
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   716
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   717
		// Pass the rest of the response (minus error code) to be parsed
20ac952a623c 201040_02
hgs
parents:
diff changeset
   718
		responseData.Set(aResponseData.RightTPtr(aResponseData.Length() - KLengthErrorResponse));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   719
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   720
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   721
	switch (pduId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   722
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   723
		case ESetPlayerApplicationSettingValue:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   724
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   725
			// the package length is 0
20ac952a623c 201040_02
hgs
parents:
diff changeset
   726
			aFramePayload.Append( 0 );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   727
			aFramePayload.Append( 0 );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   728
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   729
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   730
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   731
		case EGetCapabilities:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   732
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   733
			TRAP(err,GenerateMetadataGetCapabilitiesResponsePayloadL(aObserver, aFramePayload, aResponseData));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   734
			if(err != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   735
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   736
				return KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   737
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   738
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   739
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   740
		case EListPlayerApplicationSettingAttributes:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   741
		case EListPlayerApplicationSettingValues:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   742
		case EGetCurrentPlayerApplicationSettingValue:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   743
		case EGetPlayerApplicationSettingAttributeText:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   744
		case EGetPlayerApplicationSettingValueText:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   745
		case EGetElementAttributes:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   746
		case EGetPlayStatus:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   747
		case EPlayItem:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   748
		case EAddToNowPlaying:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   749
		case ESetAddressedPlayer:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   750
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   751
			// the package length is the response length
20ac952a623c 201040_02
hgs
parents:
diff changeset
   752
			TInt packageLength = responseData.Length();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   753
			aFramePayload.Append(packageLength>>8);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   754
			aFramePayload.Append(packageLength);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   755
			aFramePayload.Append(responseData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   756
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   757
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   758
		case ESetAbsoluteVolume:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   759
			{			
20ac952a623c 201040_02
hgs
parents:
diff changeset
   760
			TRAPD(err, GenerateSetAbsoluteVolumeResponsePayloadL(aFramePayload,responseData));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   761
			if (err != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   762
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   763
				return KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   764
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   765
		    break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   766
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   767
		case ERegisterNotification:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   768
			{		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   769
			GenerateNotificationResponsePayload(aFramePayload, responseData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   770
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   771
			}		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   772
		default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   773
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   774
			return KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   775
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   776
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   777
20ac952a623c 201040_02
hgs
parents:
diff changeset
   778
	// Success. Error conditions have been handled previously
20ac952a623c 201040_02
hgs
parents:
diff changeset
   779
	return KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   780
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   781
20ac952a623c 201040_02
hgs
parents:
diff changeset
   782
void CControlCommand::GenerateSetAbsoluteVolumeResponsePayloadL(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   783
		RBuf8& aFramePayload, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   784
		const TDesC8& responseData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   785
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   786
	RRemConAbsoluteVolumeResponse response;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   787
	CleanupClosePushL(response);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   788
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   789
	response.ReadL(responseData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   790
	if (response.iError != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   791
	    {
20ac952a623c 201040_02
hgs
parents:
diff changeset
   792
	    User::Leave(response.iError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   793
	    }
20ac952a623c 201040_02
hgs
parents:
diff changeset
   794
	TUint8 absVol = KAvrcpMaxAbsoluteVolume * response.iVolume / response.iMaxVolume;	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   795
	TUint16 len = KLengthSetAbsoluteVolumeResponseParamter<<8 & 0xffff;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   796
	TPckgBuf<TUint16> parameterLength(len);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   797
	aFramePayload.Append(parameterLength);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   798
	aFramePayload.Append( absVol );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   799
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   800
	CleanupStack::PopAndDestroy(&response);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   801
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   802
20ac952a623c 201040_02
hgs
parents:
diff changeset
   803
void CControlCommand::DoGenerateNotifyVolumeChangeResponsePayloadL(
20ac952a623c 201040_02
hgs
parents:
diff changeset
   804
		RBuf8& aFramePayload, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   805
		const TDesC8& responseData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   806
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   807
	RRemConAbsoluteVolumeResponse response;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   808
	CleanupClosePushL(response);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   809
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   810
	response.ReadL(responseData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   811
	if (response.iError != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   812
	    {
20ac952a623c 201040_02
hgs
parents:
diff changeset
   813
	    User::Leave(response.iError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   814
	    }
20ac952a623c 201040_02
hgs
parents:
diff changeset
   815
	TUint8 absVol = KAvrcpMaxAbsoluteVolume * response.iVolume / response.iMaxVolume;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   816
	TRegisterNotificationEvent eventId = RAvrcpIPC::GetEventIdFromIPCOperationId(iOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   817
	TUint16 len = KLengthNotifyVolumeChangeResponseParameter<<8 & 0xffff;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   818
	TPckgBuf<TUint16> parameterLength(len);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   819
	aFramePayload.Append( parameterLength );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   820
	aFramePayload.Append( eventId );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   821
	aFramePayload.Append( absVol );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   822
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   823
	CleanupStack::PopAndDestroy(&response);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   824
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   825
20ac952a623c 201040_02
hgs
parents:
diff changeset
   826
TInt CControlCommand::GenerateNotificationResponsePayload(RBuf8& aFramePayload, const TDesC8& responseData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   827
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   828
	TInt err = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   829
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   830
	TRegisterNotificationEvent eventId = RAvrcpIPC::GetEventIdFromIPCOperationId(iOperationId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   831
	switch(eventId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   832
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   833
	case ERegisterNotificationVolumeChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   834
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   835
		TRAPD(err, DoGenerateNotifyVolumeChangeResponsePayloadL(aFramePayload, responseData));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   836
		if (err != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   837
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   838
			return KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   839
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   840
		break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   841
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   842
	case ERegisterNotificationPlaybackStatusChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   843
	case ERegisterNotificationTrackChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   844
	case ERegisterNotificationTrackReachedEnd:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   845
	case ERegisterNotificationTrackReachedStart:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   846
	case ERegisterNotificationPlaybackPosChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   847
	case ERegisterNotificationBatteryStatusChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   848
	case ERegisterNotificationPlayerApplicationSettingChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   849
	case ERegisterNotificationNowPlayingContentChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   850
	case ERegisterNotificationAvailablePlayersChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   851
	case ERegisterNotificationAddressedPlayerChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   852
	case ERegisterNotificationUidsChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   853
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   854
		TUint paramLength = responseData.Length() + 1;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   855
		aFramePayload.Append( paramLength >>8 );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   856
		aFramePayload.Append( paramLength );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   857
		aFramePayload.Append( eventId );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   858
		aFramePayload.Append( responseData );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   859
		break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   860
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   861
	default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   862
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   863
		err = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   864
		break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   865
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   866
		};
20ac952a623c 201040_02
hgs
parents:
diff changeset
   867
20ac952a623c 201040_02
hgs
parents:
diff changeset
   868
	return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   869
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   870
20ac952a623c 201040_02
hgs
parents:
diff changeset
   871
TInt CControlCommand::GenerateMetadataGetCapabilitiesResponsePayloadL(MRemConBearerObserver& /* aObserver */, RBuf8& aFramePayload, const RBuf8& aResponseData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   872
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   873
	LOG_FUNC
20ac952a623c 201040_02
hgs
parents:
diff changeset
   874
	__ASSERT_DEBUG(iPlayerInfoManager, AVRCP_PANIC(EAvrcpNotFullyConstructed));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   875
	TPtr8 responseData = aResponseData.RightTPtr(aResponseData.Length() - KLengthErrorResponse);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   876
20ac952a623c 201040_02
hgs
parents:
diff changeset
   877
	if(responseData[KCapabilityIdOffset] == ECapabilityIdEventsSupported)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   878
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   879
		// Add supported events not handled in the player info API.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   880
		RBuf8 eventsBuf;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   881
		eventsBuf.CreateL(KNumberEventsNotInPlayerInfoApi);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   882
		CleanupClosePushL(eventsBuf);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   883
		TInt count = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   884
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   885
		// If a specific player (i.e. a specific client ID)  has been indicated then
20ac952a623c 201040_02
hgs
parents:
diff changeset
   886
		// we add support for the event if supported by the specific player.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   887
		// If no specific player has been indicated (i.e. an invalid client ID), then
20ac952a623c 201040_02
hgs
parents:
diff changeset
   888
		// general support for the event is added if supported by any player.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   889
		// The player info manager APIs handles these different "support" semantics.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   890
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   891
		if(iPlayerInfoManager->AbsoluteVolumeSupportedL(ClientId()))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   892
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   893
			count++;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   894
			eventsBuf.Append(ERegisterNotificationVolumeChanged );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   895
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   896
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   897
		if(iPlayerInfoManager->BrowsingSupportedL(ClientId()))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   898
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   899
			count += 2;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   900
			eventsBuf.Append(ERegisterNotificationNowPlayingContentChanged );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   901
			eventsBuf.Append(ERegisterNotificationUidsChanged );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   902
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   903
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   904
		// If there are any browsing clients then mark support for the player addressing
20ac952a623c 201040_02
hgs
parents:
diff changeset
   905
		// events.  Without browsing support the remote will not be able to see the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   906
		// information about the players so it is better not to let them see events
20ac952a623c 201040_02
hgs
parents:
diff changeset
   907
		// relating to the them
20ac952a623c 201040_02
hgs
parents:
diff changeset
   908
		if(iPlayerInfoManager->BrowsingSupportedL(KNullClientId))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   909
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   910
			count+= 2;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   911
			eventsBuf.Append(ERegisterNotificationAvailablePlayersChanged );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   912
			eventsBuf.Append(ERegisterNotificationAddressedPlayerChanged );
20ac952a623c 201040_02
hgs
parents:
diff changeset
   913
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   914
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   915
		responseData[1] += count;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   916
20ac952a623c 201040_02
hgs
parents:
diff changeset
   917
		TInt packageLength = responseData.Length()+ count;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   918
		aFramePayload.Append(packageLength>>8);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   919
		aFramePayload.Append(packageLength);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   920
		aFramePayload.Append(responseData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   921
		aFramePayload.Append(eventsBuf);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   922
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   923
		CleanupStack::PopAndDestroy(&eventsBuf);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   924
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   925
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   926
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   927
		TInt packageLength = responseData.Length();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   928
		aFramePayload.Append(packageLength>>8);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   929
		aFramePayload.Append(packageLength);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   930
		aFramePayload.Append(responseData);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   931
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   932
	return KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   933
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   934
TMetadataTransferPDUID MetadataTransferParser::GetNotifyEventID(const TPtrC8& aData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   935
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   936
	return static_cast<TMetadataTransferNotifyEventID>(aData[KVendorDependentNotifyEventIdOffset]);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   937
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   938
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   939
TMetadataTransferPDUID MetadataTransferParser::GetPDUID(const TPtrC8& aData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   940
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   941
	return static_cast<TMetadataTransferPDUID>(aData[KVendorDependentRequestPDUId]);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   942
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   943
20ac952a623c 201040_02
hgs
parents:
diff changeset
   944
TUint16 MetadataTransferParser::GetParamLength(const TPtrC8& aData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   945
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   946
	TUint16 paramLength;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   947
	paramLength  = aData[KVendorDependentRequestParamLenMSB] << 8;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   948
	paramLength += aData[KVendorDependentRequestParamLenLSB];
20ac952a623c 201040_02
hgs
parents:
diff changeset
   949
	return paramLength;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   950
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   951
20ac952a623c 201040_02
hgs
parents:
diff changeset
   952
TUint16 MetadataTransferParser::GetPassThroughOperationId(const TPtrC8& aData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   953
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   954
	TUint16 operation;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   955
	operation  = aData[KPassThroughRequestOperationIdMSB] << 8;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   956
	operation += aData[KPassThroughRequestOperationIdLSB];
20ac952a623c 201040_02
hgs
parents:
diff changeset
   957
	return operation;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   958
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   959
20ac952a623c 201040_02
hgs
parents:
diff changeset
   960
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   961
TInt CControlCommand::RespondToInforms(TMetadataTransferPDUID aMetadataPDUID)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   962
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   963
	CAVCFrame* frame = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   964
	TRAPD(err, frame = CAVCVendorDependentResponse::NewL(KBluetoothSIGVendorId));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   965
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   966
	RBuf8 respPayload;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   967
	err = respPayload.Create(KAVRCPMinVendorDependentResponseLen);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   968
	if (err == KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   969
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   970
		respPayload.Append(aMetadataPDUID);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   971
		respPayload.Append(EUnfragmented);   // No fragmentation needed
20ac952a623c 201040_02
hgs
parents:
diff changeset
   972
		respPayload.Append(0);	// no params
20ac952a623c 201040_02
hgs
parents:
diff changeset
   973
		respPayload.Append(0);	// no params
20ac952a623c 201040_02
hgs
parents:
diff changeset
   974
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   975
		frame->SetType(AVC::EAccepted);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   976
		frame->Append(respPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   977
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   978
		delete iFrame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   979
		iFrame = frame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   980
		respPayload.Close();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   981
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   982
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
   983
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   984
		err = KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   985
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   986
	return err;	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   987
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   988
20ac952a623c 201040_02
hgs
parents:
diff changeset
   989
void CControlCommand::GenerateMetadataRejectPayloadL(TInt aError)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   990
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   991
	CAVCFrame* frame = CAVCVendorDependentResponse::NewL(KBluetoothSIGVendorId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   992
	frame->SetType(AVC::ERejected);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   993
20ac952a623c 201040_02
hgs
parents:
diff changeset
   994
	frame->Append(iFrame->Data()[6]); // PDU ID
20ac952a623c 201040_02
hgs
parents:
diff changeset
   995
	frame->Append(EUnfragmented);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   996
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   997
	// Param length - 2 bytes
20ac952a623c 201040_02
hgs
parents:
diff changeset
   998
	frame->Append(0x0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   999
	frame->Append(0x1);
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1000
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1001
	TUint8 avcError = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1002
	switch (aError)
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1003
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1004
		case KErrAvrcpMetadataInvalidCommand:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1005
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1006
			avcError = EInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1007
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1008
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1009
		case KErrAvrcpMetadataInvalidParameter:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1010
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1011
			avcError = EInvalidParameter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1012
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1013
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1014
		case KErrAvrcpMetadataParameterNotFound:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1015
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1016
			avcError = EParameterNotFound;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1017
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1018
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1019
		case KErrAvrcpMetadataInternalError:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1020
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1021
			avcError = EInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1022
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1023
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1024
		case KErrAvrcpAirInvalidCommand:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1025
		case KErrAvrcpAirInvalidParameter:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1026
		case KErrAvrcpAirParameterNotFound:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1027
		case KErrAvrcpAirInternalError:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1028
		case KErrAvrcpAirSuccess:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1029
		case KErrAvrcpAirUidChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1030
		case KErrAvrcpAirReserved:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1031
		case KErrAvrcpAirInvalidDirection:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1032
		case KErrAvrcpAirNotADirectory:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1033
		case KErrAvrcpAirDoesNotExist:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1034
		case KErrAvrcpAirInvalidScope:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1035
		case KErrAvrcpAirRangeOutOfBounds:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1036
		case KErrAvrcpAirUidIsADirectory:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1037
		case KErrAvrcpAirMediaInUse:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1038
		case KErrAvrcpAirNowPlayingListFull:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1039
		case KErrAvrcpAirSearchNotSupported:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1040
		case KErrAvrcpAirSearchInProgress:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1041
		case KErrAvrcpAirInvalidPlayerId:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1042
		case KErrAvrcpAirPlayerNotBrowesable:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1043
		case KErrAvrcpAirPlayerNotAddressed:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1044
		case KErrAvrcpAirNoValidSearchResults:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1045
		case KErrAvrcpAirNoAvailablePlayers:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1046
		case KErrAvrcpAirAddressedPlayerChanged:
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1047
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1048
			avcError = KErrAvrcpAirBase - aError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1049
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1050
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1051
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1052
	frame->Append(avcError);
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1053
	delete iFrame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1054
	iFrame = frame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1055
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1056
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1057
/** Decode a SetAbsoluteVolume PDU ID: 0x50 and SetAbsoluteTarget call the  API 
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1058
 */
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1059
TInt CControlCommand::ParseSetAbsoluteVolume(TPtrC8& aMtPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1060
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1061
	if (aMtPayload.Length() != KLengthSetAbsoluteVolumeRequestParameter)
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1062
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1063
		return KErrAvrcpMetadataInvalidCommand;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1064
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1065
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1066
	iOperationId = KRemConSetAbsoluteVolume;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1067
	iInterfaceUid = TUid::Uid(KRemConAbsoluteVolumeTargetApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1068
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1069
	TBuf8<KAbsoluteVolumeRequestDataSize> payload;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1070
	TRAPD(err, DoParseSetAbsoluteVolumeL(aMtPayload, payload));
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1071
	if (err != KErrNone)
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1072
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1073
		return KErrAvrcpMetadataInternalError;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1074
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1075
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1076
	return AppendIncomingPayload(payload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1077
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1078
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1079
void CControlCommand::DoParseSetAbsoluteVolumeL(const TPtrC8& aMtPayload, TDes8& aPayload)
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1080
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1081
	RRemConAbsoluteVolumeRequest request;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1082
	CleanupClosePushL(request);
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1083
	request.iVolume = KAbsoluteVolumeMask & aMtPayload[KLengthSetAbsoluteVolumeRequestParameter - 1];
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1084
	request.iMaxVolume = KAvrcpMaxAbsoluteVolume;
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1085
	request.WriteL(aPayload);
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1086
	CleanupStack::PopAndDestroy(&request);
20ac952a623c 201040_02
hgs
parents:
diff changeset
  1087
	}