remotecontrol/avrcp/statusconverter/remconavrcpstatusconverter.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) 2004-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
 @file
20ac952a623c 201040_02
hgs
parents:
diff changeset
    18
 @internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
    19
 @released
20ac952a623c 201040_02
hgs
parents:
diff changeset
    20
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    21
20ac952a623c 201040_02
hgs
parents:
diff changeset
    22
#include <avcframe.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    23
#include <remconbeareravrcp.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    24
20ac952a623c 201040_02
hgs
parents:
diff changeset
    25
#include "remconstatusapi.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    26
#include "remconavrcpstatusconverter.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    27
20ac952a623c 201040_02
hgs
parents:
diff changeset
    28
/** Factory function.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    29
20ac952a623c 201040_02
hgs
parents:
diff changeset
    30
@return Ownership of a new CRemConAvrcpStatusConverter.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    31
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    32
CRemConAvrcpStatusConverter* CRemConAvrcpStatusConverter::NewL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    33
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    34
	CRemConAvrcpStatusConverter* self = new(ELeave) CRemConAvrcpStatusConverter;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    35
	return self;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    36
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    37
20ac952a623c 201040_02
hgs
parents:
diff changeset
    38
/** Destructor.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    39
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    40
CRemConAvrcpStatusConverter::~CRemConAvrcpStatusConverter()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    41
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    42
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    43
20ac952a623c 201040_02
hgs
parents:
diff changeset
    44
/** Constructor.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    45
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    46
CRemConAvrcpStatusConverter::CRemConAvrcpStatusConverter()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    47
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    48
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    49
20ac952a623c 201040_02
hgs
parents:
diff changeset
    50
/** Called to get a converter interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    51
20ac952a623c 201040_02
hgs
parents:
diff changeset
    52
@param aUid The uid of the desired interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    53
@return An instance of the desired interface, NULL if
20ac952a623c 201040_02
hgs
parents:
diff changeset
    54
		one could not be found.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    55
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    56
TAny* CRemConAvrcpStatusConverter::GetInterface(TUid aUid)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    57
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    58
	TAny* ret = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    59
	if ( aUid == TUid::Uid(KRemConConverterInterface1) )
20ac952a623c 201040_02
hgs
parents:
diff changeset
    60
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    61
		ret = reinterpret_cast<TAny*>(
20ac952a623c 201040_02
hgs
parents:
diff changeset
    62
			static_cast<MRemConConverterInterface*>(this)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    63
			);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    64
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    65
20ac952a623c 201040_02
hgs
parents:
diff changeset
    66
	return ret;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    67
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    68
20ac952a623c 201040_02
hgs
parents:
diff changeset
    69
/** Decides whether this converter supports this interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    70
20ac952a623c 201040_02
hgs
parents:
diff changeset
    71
This converter supports only the AVRCP bearer and Status API.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    72
This function checks whether the Uids provided match AVRCP and
20ac952a623c 201040_02
hgs
parents:
diff changeset
    73
Status.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    74
20ac952a623c 201040_02
hgs
parents:
diff changeset
    75
@param aInterfaceData The Uid of the originating RemCon interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    76
@param aBearerUid The Uid of the bearer this data is destined for.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    77
@return Whether this data can be converted.	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    78
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
    79
TBool CRemConAvrcpStatusConverter::SupportedUids(const TUid& aInterfaceUid, const TUid& aBearerUid) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
    80
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    81
	return (aInterfaceUid == TUid::Uid(KRemConStatusApiUid) &&
20ac952a623c 201040_02
hgs
parents:
diff changeset
    82
	   aBearerUid == TUid::Uid(KRemConBearerAvrcpImplementationUid));
20ac952a623c 201040_02
hgs
parents:
diff changeset
    83
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    84
20ac952a623c 201040_02
hgs
parents:
diff changeset
    85
/** Decides whether this converter supports this interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    86
20ac952a623c 201040_02
hgs
parents:
diff changeset
    87
This converter supports only the AVRCP bearer.  That bearer publishes
20ac952a623c 201040_02
hgs
parents:
diff changeset
    88
interface data in the format of an AV/C frame.  This function 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    89
checks that aBearerUid is that of AVRCP, and if so examines the AV/C
20ac952a623c 201040_02
hgs
parents:
diff changeset
    90
frame in aInterfaceData to see if it is a supported command.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    91
20ac952a623c 201040_02
hgs
parents:
diff changeset
    92
@param aInterfaceData Data in the format of the bearer identified by
20ac952a623c 201040_02
hgs
parents:
diff changeset
    93
					  aBearerUid.  
20ac952a623c 201040_02
hgs
parents:
diff changeset
    94
@param aBearerUid The Uid of the bearer this data originates from.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    95
@return Whether this data can be converted.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    96
*/	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    97
TBool CRemConAvrcpStatusConverter::SupportedInterface(const TDesC8& aInterfaceData, const TUid& aBearerUid) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
    98
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    99
	TInt supported = EFalse;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   100
	if(aBearerUid == TUid::Uid(KRemConBearerAvrcpImplementationUid))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   101
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   102
		AVC::TOpcode opcode = AVC::EPower; // arbitrary initialisation to avoid compiler warning
20ac952a623c 201040_02
hgs
parents:
diff changeset
   103
		TRAPD(err, opcode = CAVCFrame::OpcodeL(aInterfaceData));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   104
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   105
		if (		err == KErrNone
20ac952a623c 201040_02
hgs
parents:
diff changeset
   106
			&&		( opcode == AVC::EUnitInfo || opcode == AVC::ESubunitInfo )
20ac952a623c 201040_02
hgs
parents:
diff changeset
   107
			)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   108
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   109
			supported = ETrue;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   110
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   111
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   112
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   113
	return supported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   114
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   115
20ac952a623c 201040_02
hgs
parents:
diff changeset
   116
/** Convert data from the API's form (as we're given it by RemCon) to 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   117
bearer-specific form.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   118
20ac952a623c 201040_02
hgs
parents:
diff changeset
   119
We only deal with the AVRCP bearer.  This requires us to produce a
20ac952a623c 201040_02
hgs
parents:
diff changeset
   120
CAVCFrame.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   121
20ac952a623c 201040_02
hgs
parents:
diff changeset
   122
The supported commands are Unit Info and Subunit Info.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   123
20ac952a623c 201040_02
hgs
parents:
diff changeset
   124
@param aInterfaceUid The Uid of the originating RemCon interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   125
@param aOperationId The id of the operation within the interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   126
@param aData Data in the format defined by the RemCon interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   127
@param aMsgType Whether this is a command or response.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   128
@param aBearerData On return, an AV/C frame representing the operation.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   129
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   130
TInt CRemConAvrcpStatusConverter::InterfaceToBearer(TUid aInterfaceUid, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   131
		TUint aOperationId,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   132
		const TDesC8& /*aData*/,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   133
		TRemConMessageType aMsgType, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   134
		TDes8& aBearerData) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   135
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   136
	__ASSERT_ALWAYS(aInterfaceUid.iUid == KRemConStatusApiUid, CRemConAvrcpStatusConverter::Panic(EStatusConverterWrongInterface));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   137
	TInt err = KErrCorrupt;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   138
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   139
	switch(aOperationId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   140
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   141
		case ERemConStatusApiUnitInfo:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   142
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   143
			if(aMsgType == ERemConCommand)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   144
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   145
				CAVCFrame* frame = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   146
				TRAP(err, frame = UnitInfoL());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   147
				if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   148
					{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   149
					aBearerData = frame->Data();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   150
					err = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   151
					delete frame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   152
					}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   153
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   154
			else if(aMsgType == ERemConResponse)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   155
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   156
				// These should be generated within the bearer
20ac952a623c 201040_02
hgs
parents:
diff changeset
   157
				// as it knows the manufacturer id
20ac952a623c 201040_02
hgs
parents:
diff changeset
   158
				err = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   159
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   160
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   161
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   162
		case ERemConStatusApiSubunitInfo:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   163
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   164
			if(aMsgType == ERemConCommand)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   165
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   166
				CAVCFrame* frame = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   167
				TRAP(err, frame = SubunitInfoL());
20ac952a623c 201040_02
hgs
parents:
diff changeset
   168
				if(!err)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   169
					{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   170
					aBearerData = frame->Data();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   171
					err = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   172
					delete frame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   173
					}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   174
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   175
			else if(aMsgType == ERemConResponse)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   176
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   177
				// These should be generated within the bearer
20ac952a623c 201040_02
hgs
parents:
diff changeset
   178
				// as it knows the manufacturer id
20ac952a623c 201040_02
hgs
parents:
diff changeset
   179
				err = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   180
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   181
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   182
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   183
		default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   184
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   185
			err = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   186
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   187
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   188
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   189
20ac952a623c 201040_02
hgs
parents:
diff changeset
   190
	return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   191
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   192
20ac952a623c 201040_02
hgs
parents:
diff changeset
   193
/** Produce a Unit Info AV/C frame.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   194
20ac952a623c 201040_02
hgs
parents:
diff changeset
   195
@return A new AV/C frame representing unit info.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   196
@leave System wide error.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   197
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   198
CAVCFrame* CRemConAvrcpStatusConverter::UnitInfoL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   199
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   200
	CAVCFrame* frame = CAVCFrame::NewL(AVC::ECommand, AVC::EStatus, AVC::EUnit, AVC::EIgnore);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   201
	frame->Append(TChar(AVC::EUnitInfo));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   202
	frame->Append(TChar(0xff));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   203
	frame->Append(TChar(0xff));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   204
	frame->Append(TChar(0xff));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   205
	frame->Append(TChar(0xff));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   206
	frame->Append(TChar(0xff));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   207
	return frame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   208
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   209
20ac952a623c 201040_02
hgs
parents:
diff changeset
   210
/** Produce a Subunit Info AV/C frame.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   211
20ac952a623c 201040_02
hgs
parents:
diff changeset
   212
@return A new AV/C frame representing subunit info.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   213
@leave System wide error.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   214
*/	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   215
CAVCFrame* CRemConAvrcpStatusConverter::SubunitInfoL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   216
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   217
	CAVCFrame* frame = CAVCFrame::NewL(AVC::ECommand, AVC::EStatus, AVC::EUnit, AVC::EIgnore);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   218
	frame->Append(TChar(AVC::ESubunitInfo));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   219
	frame->Append(TChar(0x7));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   220
	frame->Append(TChar(0xff));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   221
	frame->Append(TChar(0xff));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   222
	frame->Append(TChar(0xff));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   223
	frame->Append(TChar(0xff));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   224
	return frame;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   225
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   226
20ac952a623c 201040_02
hgs
parents:
diff changeset
   227
/** Convert data from the bearer format to RemCon interface format.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   228
20ac952a623c 201040_02
hgs
parents:
diff changeset
   229
We only deal with the Status Api. The supported commands are Unit 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   230
Info response and Subunit Info response.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   231
20ac952a623c 201040_02
hgs
parents:
diff changeset
   232
Support of these commands is mandatory in the targets.  In the case
20ac952a623c 201040_02
hgs
parents:
diff changeset
   233
where a remote sends us something rubbish, we'll just provide our
20ac952a623c 201040_02
hgs
parents:
diff changeset
   234
client with the default info.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   235
20ac952a623c 201040_02
hgs
parents:
diff changeset
   236
@param aBearerData An AV/C frame to convert.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   237
@param aInterfaceUid On return, the Uid of the RemCon interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   238
@param aOperationId On return, the id of the operation within the 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   239
					interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   240
@param aMsgType Whether this is a command or response.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   241
@param aData On return, Data in the format defined by the RemCon interface.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   242
@return Whether the command was successfully converted.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   243
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   244
TInt CRemConAvrcpStatusConverter::BearerToInterface(const TDesC8& aBearerData,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   245
		TUid& aInterfaceUid, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   246
		TUint& aOperationId,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   247
		TRemConMessageType& aMsgType, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   248
		TDes8& aData) const
20ac952a623c 201040_02
hgs
parents:
diff changeset
   249
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   250
	TInt err = KErrCorrupt;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   251
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   252
	switch(aOperationId)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   253
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   254
		case ERemConStatusApiUnitInfo:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   255
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   256
			if(aMsgType == ERemConCommand)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   257
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   258
				// These should be generated within the bearer
20ac952a623c 201040_02
hgs
parents:
diff changeset
   259
				// as it knows the manufacturer id
20ac952a623c 201040_02
hgs
parents:
diff changeset
   260
				err = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   261
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   262
			else if(aMsgType == ERemConResponse)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   263
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   264
				// We try to parse the data, but if what the remote's sent
20ac952a623c 201040_02
hgs
parents:
diff changeset
   265
				// us is invalid we'll fill in sensible values later
20ac952a623c 201040_02
hgs
parents:
diff changeset
   266
				TRAP(err, SetUnitInfoResponseDataL(aBearerData, aData));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   267
				aInterfaceUid = TUid::Uid(KRemConStatusApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   268
				aOperationId = ERemConStatusApiUnitInfo;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   269
20ac952a623c 201040_02
hgs
parents:
diff changeset
   270
				if(err == KErrCorrupt)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   271
					{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   272
					// The data is set to the correct length in SetUnitInfoResponseDataL
20ac952a623c 201040_02
hgs
parents:
diff changeset
   273
					// Stick some default data in there 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   274
					SetCommandDataFromInt(aData, KRemConStatusApiUnitOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   275
						KRemConStatusApiUnitLength, AVC::EID0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   276
20ac952a623c 201040_02
hgs
parents:
diff changeset
   277
					SetCommandDataFromInt(aData, KRemConStatusApiUnitTypeOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   278
						KRemConStatusApiUnitTypeLength, AVC::EPanel);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   279
				
20ac952a623c 201040_02
hgs
parents:
diff changeset
   280
					SetCommandDataFromInt(aData, KRemConStatusApiExtendedUnitTypeOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   281
						KRemConStatusApiExtendedUnitTypeLength, 0);		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   282
							
20ac952a623c 201040_02
hgs
parents:
diff changeset
   283
					SetCommandDataFromInt(aData, KRemConStatusApiVendorIdOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   284
						KRemConStatusApiVendorIdLength, KRemConStatusApiDefaultVendorId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   285
20ac952a623c 201040_02
hgs
parents:
diff changeset
   286
					err = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   287
					}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   288
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   289
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   290
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   291
		case ERemConStatusApiSubunitInfo:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   292
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   293
			if(aMsgType == ERemConCommand)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   294
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   295
				// These should be generated within the bearer
20ac952a623c 201040_02
hgs
parents:
diff changeset
   296
				// as it knows the manufacturer id
20ac952a623c 201040_02
hgs
parents:
diff changeset
   297
				err = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   298
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   299
			else if(aMsgType == ERemConResponse)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   300
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   301
				// We try to parse the data, but if what the remote's sent
20ac952a623c 201040_02
hgs
parents:
diff changeset
   302
				// us is invalid we'll fill in sensible values later
20ac952a623c 201040_02
hgs
parents:
diff changeset
   303
				TRAP(err, SetSubunitInfoResponseDataL(aBearerData, aData));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   304
				aInterfaceUid = TUid::Uid(KRemConStatusApiUid);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   305
				aOperationId = ERemConStatusApiSubunitInfo;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   306
20ac952a623c 201040_02
hgs
parents:
diff changeset
   307
				if(err == KErrCorrupt)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   308
					{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   309
					// Subunit response data varies in length, so the length
20ac952a623c 201040_02
hgs
parents:
diff changeset
   310
					// set in SetSubunitInfoResponseDataL may be wrong.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   311
					aData.FillZ(KRemConStatusApiPageLength + KRemConStatusApiExtensionLength + KRemConStatusApiDefaultPageDataLength);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   312
				
20ac952a623c 201040_02
hgs
parents:
diff changeset
   313
					// Stick some default data in there 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   314
					SetCommandDataFromInt(aData, KRemConStatusApiPageOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   315
						KRemConStatusApiPageLength, 0);	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   316
						
20ac952a623c 201040_02
hgs
parents:
diff changeset
   317
					SetCommandDataFromInt(aData, KRemConStatusApiExtensionOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   318
						KRemConStatusApiExtensionLength, AVC::EIgnore);	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   319
20ac952a623c 201040_02
hgs
parents:
diff changeset
   320
					SetCommandDataFromInt(aData, KRemConStatusApiPageDataOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   321
						KRemConStatusApiDefaultPageDataLength, KRemConStatusApiDefaultPageData);	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   322
20ac952a623c 201040_02
hgs
parents:
diff changeset
   323
					err = KErrNone;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   324
					}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   325
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   326
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   327
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   328
		default:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   329
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   330
			err = KErrNotSupported;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   331
			break;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   332
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   333
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   334
20ac952a623c 201040_02
hgs
parents:
diff changeset
   335
	return err;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   336
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   337
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   338
/** Parses command data from the buffer.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   339
20ac952a623c 201040_02
hgs
parents:
diff changeset
   340
@param aCommandData The buffer from which to read the data.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   341
@param aVendorId On return, the vendor id
20ac952a623c 201040_02
hgs
parents:
diff changeset
   342
@param aUnit On return, the unit
20ac952a623c 201040_02
hgs
parents:
diff changeset
   343
@param aUnitType On return, the unit type 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   344
@param aExtendedUnitType On return, the extended unit type
20ac952a623c 201040_02
hgs
parents:
diff changeset
   345
20ac952a623c 201040_02
hgs
parents:
diff changeset
   346
@internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
   347
@released
20ac952a623c 201040_02
hgs
parents:
diff changeset
   348
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   349
void CRemConAvrcpStatusConverter::SetUnitInfoResponseDataL(const TDesC8& aBearerData,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   350
	TDes8& aRemConData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   351
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   352
	// AVRCP should pass us a sensible sized buffer!
20ac952a623c 201040_02
hgs
parents:
diff changeset
   353
	__ASSERT_ALWAYS(aRemConData.MaxLength() >= KUnitInfoResponseLength, CRemConAvrcpStatusConverter::Panic(EAvrcpPassedTooSmallABuffer));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   354
20ac952a623c 201040_02
hgs
parents:
diff changeset
   355
	// Get rid of any junk
20ac952a623c 201040_02
hgs
parents:
diff changeset
   356
	aRemConData.FillZ(KRemConStatusApiUnitLength + KRemConStatusApiUnitTypeLength
20ac952a623c 201040_02
hgs
parents:
diff changeset
   357
					  + KRemConStatusApiExtendedUnitTypeLength
20ac952a623c 201040_02
hgs
parents:
diff changeset
   358
					  + KRemConStatusApiVendorIdLength);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   359
20ac952a623c 201040_02
hgs
parents:
diff changeset
   360
	// Get unit id if there's enough data for it
20ac952a623c 201040_02
hgs
parents:
diff changeset
   361
	if(aBearerData.Length() < KUnitIdOffset + KUnitIdLength)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   362
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   363
		User::Leave(KErrCorrupt);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   364
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   365
	TInt unit;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   366
	ReadCommandDataToInt(aBearerData, KUnitIdOffset, KUnitIdLength, unit);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   367
	unit &= KAVCSubunitIDMask;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   368
	SetCommandDataFromInt(aRemConData, KRemConStatusApiUnitOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   369
		KRemConStatusApiUnitLength, unit);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   370
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   371
	// Get unit type (maybe extended) if there's enough data
20ac952a623c 201040_02
hgs
parents:
diff changeset
   372
	if(aBearerData.Length() < KUnitTypeOffset + KUnitTypeLength)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   373
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   374
		User::Leave(KErrCorrupt);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   375
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   376
	TInt unitType;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   377
	ReadCommandDataToInt(aBearerData, KUnitTypeOffset, KUnitTypeLength, unitType);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   378
	unitType &= KAVCSubunitTypeMask;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   379
	unitType >>= KUnitTypeShift;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   380
	SetCommandDataFromInt(aRemConData, KRemConStatusApiUnitTypeOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   381
		KRemConStatusApiUnitTypeLength, unitType);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   382
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   383
	TInt unitTypeExtend = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   384
	TInt vendorIdOffset = KVendorIdBaseOffset;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   385
	if(unitType == KUnitTypeExtend)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   386
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   387
		// Extended unit type.  VendorId is offset by 1
20ac952a623c 201040_02
hgs
parents:
diff changeset
   388
		vendorIdOffset++;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   389
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   390
		// Read the next byte if it's there
20ac952a623c 201040_02
hgs
parents:
diff changeset
   391
		if(aBearerData.Length() < KUnitTypeExtendOffset + 1)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   392
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   393
			User::Leave(KErrCorrupt);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   394
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   395
		ReadCommandDataToInt(aBearerData, KUnitTypeExtendOffset, 1, unitTypeExtend);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   396
		unitTypeExtend <<= 8;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   397
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   398
		// 	Double extended unit type. 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   399
		if(unitTypeExtend == KUnitTypeExtendExtend)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   400
			{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   401
			// VendorId is offset by 1
20ac952a623c 201040_02
hgs
parents:
diff changeset
   402
			vendorIdOffset++;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   403
			
20ac952a623c 201040_02
hgs
parents:
diff changeset
   404
			// Read the next byte
20ac952a623c 201040_02
hgs
parents:
diff changeset
   405
			TInt unitTypeExtendExtend = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   406
			if(aBearerData.Length() < KUnitTypeExtendExtendOffset + 1)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   407
				{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   408
				User::Leave(KErrCorrupt);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   409
				}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   410
			ReadCommandDataToInt(aBearerData, KUnitTypeExtendExtendOffset, 1, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   411
								 unitTypeExtendExtend);	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   412
			unitTypeExtend |= unitTypeExtendExtend;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   413
			}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   414
20ac952a623c 201040_02
hgs
parents:
diff changeset
   415
		SetCommandDataFromInt(aRemConData, KRemConStatusApiExtendedUnitTypeOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   416
			KRemConStatusApiExtendedUnitTypeLength, unitTypeExtend);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   417
		}		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   418
20ac952a623c 201040_02
hgs
parents:
diff changeset
   419
	// Get vendor id
20ac952a623c 201040_02
hgs
parents:
diff changeset
   420
	if(aBearerData.Length() < vendorIdOffset + KVendorIdLength)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   421
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   422
		User::Leave(KErrCorrupt);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   423
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   424
	TInt vendorId;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   425
	ReadCommandDataToInt(aBearerData, vendorIdOffset, KVendorIdLength, vendorId);				
20ac952a623c 201040_02
hgs
parents:
diff changeset
   426
	SetCommandDataFromInt(aRemConData, KRemConStatusApiVendorIdOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   427
		KRemConStatusApiVendorIdLength, vendorId);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   428
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   429
20ac952a623c 201040_02
hgs
parents:
diff changeset
   430
/** Parses command data from the buffer.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   431
20ac952a623c 201040_02
hgs
parents:
diff changeset
   432
@param aCommandData The buffer from which to read the data.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   433
@param aPage On return, the page
20ac952a623c 201040_02
hgs
parents:
diff changeset
   434
@param aExtension On return, the extension
20ac952a623c 201040_02
hgs
parents:
diff changeset
   435
@param aPageData On return, the page data
20ac952a623c 201040_02
hgs
parents:
diff changeset
   436
20ac952a623c 201040_02
hgs
parents:
diff changeset
   437
@internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
   438
@released
20ac952a623c 201040_02
hgs
parents:
diff changeset
   439
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   440
void CRemConAvrcpStatusConverter::SetSubunitInfoResponseDataL(const TDesC8& aBearerData,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   441
	TDes8& aRemConData)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   442
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   443
	// AVRCP should pass us a sensible sized buffer!
20ac952a623c 201040_02
hgs
parents:
diff changeset
   444
	__ASSERT_ALWAYS(aRemConData.MaxLength() >= KUnitInfoResponseLength, CRemConAvrcpStatusConverter::Panic(EAvrcpPassedTooSmallABuffer));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   445
20ac952a623c 201040_02
hgs
parents:
diff changeset
   446
	CAVCFrame* frame = CAVCFrame::NewL(aBearerData, AVC::EResponse); //Qualified
20ac952a623c 201040_02
hgs
parents:
diff changeset
   447
	CleanupStack::PushL(frame);		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   448
	TPtrC8 ptr = frame->Data();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   449
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   450
	// Work out how long a buffer we need for the RemCon data.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   451
	// This is KRemConStatusApiPageLength + KRemConStatusApiExtensionLength
20ac952a623c 201040_02
hgs
parents:
diff changeset
   452
	// + the length of the page data.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   453
	// We can work out the length of the page data from the frame - 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   454
	// it's the remainder of the frame after KSubunitPageDataOffset.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   455
	// This gives us:
20ac952a623c 201040_02
hgs
parents:
diff changeset
   456
	TInt remConDataLen = KRemConStatusApiPageLength 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   457
						+ KRemConStatusApiPageLength 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   458
						+ (ptr.Length() - KSubunitPageDataOffset);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   459
20ac952a623c 201040_02
hgs
parents:
diff changeset
   460
	if(aRemConData.MaxLength() < remConDataLen)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   461
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   462
		User::Leave(KErrCorrupt);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   463
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   464
20ac952a623c 201040_02
hgs
parents:
diff changeset
   465
	// Get rid of any junk
20ac952a623c 201040_02
hgs
parents:
diff changeset
   466
	aRemConData.FillZ(remConDataLen);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   467
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   468
	// Get page
20ac952a623c 201040_02
hgs
parents:
diff changeset
   469
	if(aBearerData.Length() < KSubunitPageOffset + KSubunitPageLength)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   470
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   471
		User::Leave(KErrCorrupt);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   472
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   473
	TInt page;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   474
	ReadCommandDataToInt(aBearerData, KSubunitPageOffset, KSubunitPageLength, page);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   475
	page &= KSubunitPageMask;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   476
	SetCommandDataFromInt(aRemConData, KRemConStatusApiPageOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   477
		KRemConStatusApiPageLength, page);	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   478
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   479
	// Get extension code
20ac952a623c 201040_02
hgs
parents:
diff changeset
   480
	if(aBearerData.Length() < KSubunitExtensionOffset + KSubunitExtensionLength)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   481
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   482
		User::Leave(KErrCorrupt);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   483
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   484
	TInt extensionCode;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   485
	ReadCommandDataToInt(aBearerData, KSubunitExtensionOffset, KSubunitExtensionLength, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   486
		extensionCode);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   487
	extensionCode &= KSubunitExtensionMask;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   488
	SetCommandDataFromInt(aRemConData, KRemConStatusApiExtensionOffset, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   489
		KRemConStatusApiExtensionLength, extensionCode);		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   490
		
20ac952a623c 201040_02
hgs
parents:
diff changeset
   491
	// Get page data
20ac952a623c 201040_02
hgs
parents:
diff changeset
   492
	TPtrC8 pageDataPtr = aBearerData.Mid(KSubunitPageDataOffset);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   493
	aRemConData.Replace(KRemConStatusApiPageDataOffset, pageDataPtr.Length(), pageDataPtr);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   494
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   495
	CleanupStack::PopAndDestroy(frame);	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   496
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   497
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   498
/** Reads command data from the buffer to an int.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   499
20ac952a623c 201040_02
hgs
parents:
diff changeset
   500
@param aCommandData The buffer from which to read the data.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   501
@param aOffset The offset within aCommandData read from.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   502
@param aLength The length of data to read.  This must not be
20ac952a623c 201040_02
hgs
parents:
diff changeset
   503
				more than 4.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   504
@param aValue On return, the value of the specified data section.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   505
20ac952a623c 201040_02
hgs
parents:
diff changeset
   506
@internalComponent
20ac952a623c 201040_02
hgs
parents:
diff changeset
   507
@released
20ac952a623c 201040_02
hgs
parents:
diff changeset
   508
*/	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   509
void CRemConAvrcpStatusConverter::ReadCommandDataToInt(const TDesC8& aCommandData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   510
	TInt aOffset, TInt aLength, TInt& aValue)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   511
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   512
	__ASSERT_DEBUG(aLength <= 4, CRemConAvrcpStatusConverter::Panic(EStatusConverterDataTooShort));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   513
20ac952a623c 201040_02
hgs
parents:
diff changeset
   514
	aValue = 0;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   515
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   516
	for(TInt i = 0 ; i < aLength; i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   517
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   518
		aValue |= aCommandData[aOffset+i]<<(8*i);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   519
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   520
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   521
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   522
/** Set the command data.  This overwrites the current
20ac952a623c 201040_02
hgs
parents:
diff changeset
   523
contents of the data buffer.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   524
20ac952a623c 201040_02
hgs
parents:
diff changeset
   525
@param aCommandData The buffer in which to set the data.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   526
@param aOffset The offset within aCommandData to set the data.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   527
@param aLength The length of data to replace.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   528
@param aValue The new value for the replaced data.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   529
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   530
void CRemConAvrcpStatusConverter::SetCommandDataFromInt(TDes8& aCommandData, 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   531
	TInt aOffset, TInt aLength, TInt aValue)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   532
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   533
	__ASSERT_DEBUG(aLength <= 4, CRemConAvrcpStatusConverter::Panic(EStatusConverterDataTooShort));
20ac952a623c 201040_02
hgs
parents:
diff changeset
   534
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   535
	for(TInt i = 0; i < aLength; i++)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   536
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   537
		aCommandData[aOffset+i] = aValue >> (8*i);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   538
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   539
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   540
20ac952a623c 201040_02
hgs
parents:
diff changeset
   541
/** Utility Status Converter panic function.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   542
20ac952a623c 201040_02
hgs
parents:
diff changeset
   543
@param aPanic The panic number.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   544
*/
20ac952a623c 201040_02
hgs
parents:
diff changeset
   545
void CRemConAvrcpStatusConverter::Panic(TStatusConverterPanic aPanic)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   546
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   547
	User::Panic(KStatusConverterPanicName, aPanic);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   548
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   549
20ac952a623c 201040_02
hgs
parents:
diff changeset
   550
//
20ac952a623c 201040_02
hgs
parents:
diff changeset
   551
// End of file