remotecontrol/avrcp/remconbeareravrcp/src/avrcpsdputils.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) 2008-2010 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
#include <bt_sock.h>
20ac952a623c 201040_02
hgs
parents:
diff changeset
    17
20ac952a623c 201040_02
hgs
parents:
diff changeset
    18
#include "avrcpsdputils.h"
20ac952a623c 201040_02
hgs
parents:
diff changeset
    19
20ac952a623c 201040_02
hgs
parents:
diff changeset
    20
static void AddCommonServiceRecordAttributesL(RSdpDatabase& aSdpDatabase, TSdpServRecordHandle aRecHandle)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    21
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    22
	// Provider Name
20ac952a623c 201040_02
hgs
parents:
diff changeset
    23
	aSdpDatabase.UpdateAttributeL(aRecHandle,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    24
		KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetProviderName,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    25
		AvrcpSdp::KAvrcpProviderName
20ac952a623c 201040_02
hgs
parents:
diff changeset
    26
		);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    27
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    28
	// Service Description
20ac952a623c 201040_02
hgs
parents:
diff changeset
    29
	aSdpDatabase.UpdateAttributeL(aRecHandle,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    30
		KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceDescription,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    31
		AvrcpSdp::KAvrcpServiceDescription
20ac952a623c 201040_02
hgs
parents:
diff changeset
    32
		);	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    33
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    34
	// Add to public browse group
20ac952a623c 201040_02
hgs
parents:
diff changeset
    35
	CSdpAttrValueDES *attrValDES = CSdpAttrValueDES::NewDESL(0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    36
	CleanupStack::PushL(attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    37
	attrValDES->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    38
		->BuildUUIDL(TUUID(TUint16(KPublicBrowseGroupUUID)))
20ac952a623c 201040_02
hgs
parents:
diff changeset
    39
	->EndListL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    40
	aSdpDatabase.UpdateAttributeL(aRecHandle, KSdpAttrIdBrowseGroupList, *attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    41
	CleanupStack::PopAndDestroy(attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    42
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    43
20ac952a623c 201040_02
hgs
parents:
diff changeset
    44
static CSdpAttrValueDES* GenerateControllerServiceClassListLC(TUint16 aProfileVersion)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    45
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    46
	// New service record with service class attribute containing
20ac952a623c 201040_02
hgs
parents:
diff changeset
    47
	// 0x110e (for A/V Remote Control) and potentially also 0x110f
20ac952a623c 201040_02
hgs
parents:
diff changeset
    48
	CSdpAttrValueDES* serviceClassUuids = CSdpAttrValueDES::NewDESL(NULL);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    49
	CleanupStack::PushL(serviceClassUuids);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    50
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    51
	// Unfortunately in earlier releases of the specification the controller service class UUID
20ac952a623c 201040_02
hgs
parents:
diff changeset
    52
	// was the same as the the profile UUID - meaning that searching for records with this UUID
20ac952a623c 201040_02
hgs
parents:
diff changeset
    53
	// would return both controller and target records (since they both belong to the same profile).
20ac952a623c 201040_02
hgs
parents:
diff changeset
    54
	// This was corrected by adding a specific service class UUID for the controller role - both
20ac952a623c 201040_02
hgs
parents:
diff changeset
    55
	// the specific UUID and the old "profile" UUID are provided in the list of service classes (for
20ac952a623c 201040_02
hgs
parents:
diff changeset
    56
	// backwards compatibility).
20ac952a623c 201040_02
hgs
parents:
diff changeset
    57
	//
20ac952a623c 201040_02
hgs
parents:
diff changeset
    58
	// This new SDP record structure was introduced in AVRCP 1.4 and so if we conform to AVRCP 1.4 we 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    59
	// can use the new SDP record structure - if we are presenting ourselves as an earlier version 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    60
	// we must restrain ourselves and use the previously specified structure.
20ac952a623c 201040_02
hgs
parents:
diff changeset
    61
	if(aProfileVersion == AvrcpSdp::KAvrcpProfileVersion13)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    62
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    63
		serviceClassUuids->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    64
				->BuildUUIDL(TUUID(TUint16(KAVRemoteControlUUID)))
20ac952a623c 201040_02
hgs
parents:
diff changeset
    65
		->EndListL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    66
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    67
	else
20ac952a623c 201040_02
hgs
parents:
diff changeset
    68
		{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    69
		serviceClassUuids->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
    70
				->BuildUUIDL(TUUID(TUint16(KAVRemoteControlUUID)))
20ac952a623c 201040_02
hgs
parents:
diff changeset
    71
				->BuildUUIDL(TUUID(TUint16(KAVRemoteControlControllerUUID)))
20ac952a623c 201040_02
hgs
parents:
diff changeset
    72
		->EndListL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
    73
		}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    74
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    75
	return serviceClassUuids;
20ac952a623c 201040_02
hgs
parents:
diff changeset
    76
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    77
20ac952a623c 201040_02
hgs
parents:
diff changeset
    78
void AvrcpSdpUtils::CreateTargetServiceRecordL(RSdpDatabase& aSdpDatabase, TSdpServRecordHandle& aRecHandle)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    79
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    80
	// New service record with service class attribute containing
20ac952a623c 201040_02
hgs
parents:
diff changeset
    81
	// 0x110c (for A/V Remote Control Target) 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    82
	aSdpDatabase.CreateServiceRecordL(KAVRemoteControlTargetUUID, aRecHandle);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    83
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    84
	aSdpDatabase.UpdateAttributeL(aRecHandle,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    85
		KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceName,
20ac952a623c 201040_02
hgs
parents:
diff changeset
    86
		AvrcpSdp::KAvrcpTargetServiceName
20ac952a623c 201040_02
hgs
parents:
diff changeset
    87
		);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    88
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    89
	AddCommonServiceRecordAttributesL(aSdpDatabase, aRecHandle);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    90
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
    91
20ac952a623c 201040_02
hgs
parents:
diff changeset
    92
void AvrcpSdpUtils::CreateControllerServiceRecordL(RSdpDatabase& aSdpDatabase, TSdpServRecordHandle& aRecHandle, TUint16 aProfileVersion)
20ac952a623c 201040_02
hgs
parents:
diff changeset
    93
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
    94
	// New service record with service class attribute containing
20ac952a623c 201040_02
hgs
parents:
diff changeset
    95
	// 0x110e (for A/V Remote Control) 
20ac952a623c 201040_02
hgs
parents:
diff changeset
    96
	CSdpAttrValueDES* serviceClassUuids = GenerateControllerServiceClassListLC(aProfileVersion);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    97
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
    98
	aSdpDatabase.CreateServiceRecordL(*serviceClassUuids, aRecHandle);
20ac952a623c 201040_02
hgs
parents:
diff changeset
    99
	CleanupStack::PopAndDestroy(serviceClassUuids);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   100
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   101
	aSdpDatabase.UpdateAttributeL(aRecHandle,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   102
		KSdpAttrIdBasePrimaryLanguage + KSdpAttrIdOffsetServiceName,
20ac952a623c 201040_02
hgs
parents:
diff changeset
   103
		AvrcpSdp::KAvrcpControllerServiceName
20ac952a623c 201040_02
hgs
parents:
diff changeset
   104
		);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   105
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   106
	AddCommonServiceRecordAttributesL(aSdpDatabase, aRecHandle);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   107
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   108
20ac952a623c 201040_02
hgs
parents:
diff changeset
   109
void AvrcpSdpUtils::UpdateControllerServiceClassListL(RSdpDatabase& aSdpDatabase, TSdpServRecordHandle& aRecHandle, TUint16 aProfileVersion)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   110
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   111
	CSdpAttrValueDES* serviceClassUuids = GenerateControllerServiceClassListLC(aProfileVersion);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   112
	
20ac952a623c 201040_02
hgs
parents:
diff changeset
   113
	aSdpDatabase.UpdateAttributeL(aRecHandle, KSdpAttrIdServiceClassIDList, *serviceClassUuids);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   114
	CleanupStack::PopAndDestroy(serviceClassUuids);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   115
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   116
20ac952a623c 201040_02
hgs
parents:
diff changeset
   117
void AvrcpSdpUtils::UpdateProtocolDescriptorListL(RSdpDatabase& aSdpDatabase, TSdpServRecordHandle& aRecHandle, TUint16 aProtocolVersion)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   118
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   119
	CSdpAttrValueDES *attrValDES = CSdpAttrValueDES::NewDESL(0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   120
	CleanupStack::PushL(attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   121
	attrValDES->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   122
		->BuildDESL()->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   123
			->BuildUUIDL(TUUID(TUint16(KL2CAP)))					// L2CAP
20ac952a623c 201040_02
hgs
parents:
diff changeset
   124
			->BuildUintL(TSdpIntBuf<TUint16>(KAVCTP))				// PSM = AVCTP
20ac952a623c 201040_02
hgs
parents:
diff changeset
   125
		->EndListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   126
		->BuildDESL()->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   127
			->BuildUUIDL(TUUID(TUint16(KAVCTP)))					// AVCTP
20ac952a623c 201040_02
hgs
parents:
diff changeset
   128
			->BuildUintL(TSdpIntBuf<TUint16>(aProtocolVersion))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   129
		->EndListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   130
	->EndListL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   131
	aSdpDatabase.UpdateAttributeL(aRecHandle, KSdpAttrIdProtocolDescriptorList, *attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   132
	CleanupStack::PopAndDestroy(attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   133
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   134
20ac952a623c 201040_02
hgs
parents:
diff changeset
   135
void AvrcpSdpUtils::UpdateAdditionalProtocolDescriptorListL(RSdpDatabase& aSdpDatabase, TSdpServRecordHandle& aRecHandle)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   136
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   137
	CSdpAttrValueDES *attrValDES = CSdpAttrValueDES::NewDESL(0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   138
	CleanupStack::PushL(attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   139
	attrValDES->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   140
		->BuildDESL()->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   141
			->BuildUUIDL(TUUID(TUint16(KL2CAP)))				// L2CAP
20ac952a623c 201040_02
hgs
parents:
diff changeset
   142
			->BuildUintL(TSdpIntBuf<TUint16>(0x1b))				// PSM = AVCTP_browse
20ac952a623c 201040_02
hgs
parents:
diff changeset
   143
		->EndListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   144
		->BuildDESL()->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   145
			->BuildUUIDL(TUUID(TUint16(KAVCTP)))					// AVCTP
20ac952a623c 201040_02
hgs
parents:
diff changeset
   146
			->BuildUintL(TSdpIntBuf<TUint16>(AvrcpSdp::KAvctpProtocolVersion13))// 0x0103
20ac952a623c 201040_02
hgs
parents:
diff changeset
   147
		->EndListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   148
	->EndListL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   149
	aSdpDatabase.UpdateAttributeL(aRecHandle, KSdpAttrIdAdditionalProtocolDescriptorList, *attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   150
	CleanupStack::PopAndDestroy(attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   151
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   152
20ac952a623c 201040_02
hgs
parents:
diff changeset
   153
void AvrcpSdpUtils::UpdateProfileDescriptorListL(RSdpDatabase& aSdpDatabase, TSdpServRecordHandle& aRecHandle, TUint16 aProfileVersion)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   154
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   155
	CSdpAttrValueDES *attrValDES = CSdpAttrValueDES::NewDESL(0);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   156
	CleanupStack::PushL(attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   157
	attrValDES->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   158
		->BuildDESL()->StartListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   159
			//In the profile descriptor list the Control UUID is used 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   160
			//for BOTH controller and target
20ac952a623c 201040_02
hgs
parents:
diff changeset
   161
			->BuildUUIDL(KAVRemoteControlUUID) 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   162
			->BuildUintL(TSdpIntBuf<TUint16>(aProfileVersion))
20ac952a623c 201040_02
hgs
parents:
diff changeset
   163
		->EndListL()
20ac952a623c 201040_02
hgs
parents:
diff changeset
   164
	->EndListL();
20ac952a623c 201040_02
hgs
parents:
diff changeset
   165
	aSdpDatabase.UpdateAttributeL(aRecHandle, KSdpAttrIdBluetoothProfileDescriptorList, *attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   166
	CleanupStack::PopAndDestroy(attrValDES);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   167
	}
20ac952a623c 201040_02
hgs
parents:
diff changeset
   168
20ac952a623c 201040_02
hgs
parents:
diff changeset
   169
void AvrcpSdpUtils::UpdateSupportedFeaturesL(RSdpDatabase& aSdpDatabase, TSdpServRecordHandle& aRecHandle, AvrcpSdp::TRecordType aType, TUint16 aFeatures)
20ac952a623c 201040_02
hgs
parents:
diff changeset
   170
	{
20ac952a623c 201040_02
hgs
parents:
diff changeset
   171
	// Supported Features
20ac952a623c 201040_02
hgs
parents:
diff changeset
   172
	// For both target and controller roles if we support that role then
20ac952a623c 201040_02
hgs
parents:
diff changeset
   173
	// indicate support for all categories that are available within that
20ac952a623c 201040_02
hgs
parents:
diff changeset
   174
	// role.
20ac952a623c 201040_02
hgs
parents:
diff changeset
   175
	CSdpAttrValue* attrVal = NULL;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   176
	TSdpIntBuf<TUint16> featureBuf = (aType==AvrcpSdp::ERemoteControl) ? AvrcpSdp::KAvrcpBaseCtFeatures | aFeatures : AvrcpSdp::KAvrcpBaseTgFeatures | aFeatures;
20ac952a623c 201040_02
hgs
parents:
diff changeset
   177
	attrVal = CSdpAttrValueUint::NewUintL(featureBuf); 
20ac952a623c 201040_02
hgs
parents:
diff changeset
   178
	CleanupStack::PushL(attrVal);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   179
	aSdpDatabase.UpdateAttributeL(aRecHandle, KSdpAttrIdSupportedFeatures, *attrVal);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   180
	CleanupStack::PopAndDestroy(attrVal);
20ac952a623c 201040_02
hgs
parents:
diff changeset
   181
	}