From 6f9c0ba82f052d1928503d93abf690bd994ab531 Mon Sep 17 00:00:00 2001
From: Pawel Wasowski
Date: Wed, 12 Aug 2020 12:47:26 +0200
Subject: [PATCH] [Bluetooth] Add validators for BluetoothGATTServer*InitData
objects
This commit adds ValidateBluetoothGATT*Init() functions, that validate
BluetoothGATT{Service, Characteristic, Descriptor}Init objects and fill
optional fields with default values.
Verification: webapi-plugins build succeeds. Instantiating
tizen.bluetooth in Chrome Dev Tools succeeds.
The code will be further verified together with the code that relies on
it. Verification results will be reported in the next commits.
Change-Id: I1fc2017a8c970bd24a3cc3ef0a0c85ca7faf7569
Signed-off-by: Pawel Wasowski
---
src/bluetooth/bluetooth_api.js | 215 ++++++++++++++++++++++++++++++++-
1 file changed, 210 insertions(+), 5 deletions(-)
diff --git a/src/bluetooth/bluetooth_api.js b/src/bluetooth/bluetooth_api.js
index fa28ef2a..eed468ac 100755
--- a/src/bluetooth/bluetooth_api.js
+++ b/src/bluetooth/bluetooth_api.js
@@ -1619,6 +1619,7 @@ var BluetoothGATTService = function(data, address) {
var serviceUuid_ = data.serviceUuid;
//address_ is needed to control if device is still connected
var address_ = address || data.address;
+
function servicesGetter() {
var services = [];
var result = native.callSync('BluetoothGATTClientServiceGetServices', {
@@ -1685,9 +1686,54 @@ function NextGattServerEntityID() {
return ++CurrentGATTServerEntityId;
}
+function IsUuidValid(uuid) {
+ return (
+ BluetoothManager_UUIDIsValid16Bit(uuid) ||
+ BluetoothManager_UUIDIsValid32Bit(uuid) ||
+ BluetoothManager_UUIDIsValid128Bit(uuid)
+ );
+}
+
+var ValidateBluetoothGATTServerServiceInit = function(initData) {
+ initData = AV.validateArgs(
+ [
+ initData['serviceUuid'],
+ initData['isPrimary'] || true,
+ initData['includedServices'] || [],
+ initData['characteristics'] || []
+ ],
+ [
+ {
+ name: 'serviceUuid',
+ type: AV.Types.STRING,
+ validator: IsUuidValid
+ },
+ {
+ name: 'isPrimary',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'includedServices',
+ type: AV.Types.ARRAY
+ },
+ {
+ name: 'characteristics',
+ type: AV.Types.ARRAY
+ }
+ ]
+ );
+
+ // "uuid" field is used to construct BluetoothGATTService, but it's not a part
+ // of BluetoothGATTServerServiceInit dictionary.
+ // In case of BluetoothGATTServerServices, its value is always the same as
+ // serviceUuid's.
+ initData.uuid = initData.serviceUuid;
+ return initData;
+};
+
//class BluetoothGATTServerService ///////////////////////////
var BluetoothGATTServerService = function(data) {
- // TODO: validate data and set default values
+ data = ValidateBluetoothGATTServerServiceInit(data);
BluetoothGATTService.call(this, data, null);
@@ -1964,9 +2010,111 @@ var BluetoothGATTCharacteristic = function(data, address) {
};
};
+var ValidateBluetoothGATTServerCharacteristicInit = function(initData) {
+ return AV.validateArgs(
+ [
+ initData['uuid'],
+ initData['descriptors'] || [],
+ initData['isBroadcast'] || false,
+ initData['hasExtendedProperties'] || false,
+ initData['isNotify'] || false,
+ initData['isIndication'] || false,
+ initData['isReadable'] || false,
+ initData['isSignedWrite'] || false,
+ initData['isWritable'] || false,
+ initData['isWriteNoResponse'] || false,
+ initData['readPermission'] || false,
+ initData['writePermission'] || false,
+ initData['encryptedReadPermission'] || false,
+ initData['encryptedWritePermission'] || false,
+ initData['encryptedSignedReadPermission'] || false,
+ initData['encryptedSignedWritePermission'] || false,
+ initData['readValueRequestCallback'] || null,
+ initData['writeValueRequestCallback'] || null
+ ],
+ [
+ {
+ name: 'uuid',
+ type: AV.Types.STRING,
+ validator: IsUuidValid
+ },
+ {
+ name: 'descriptors',
+ type: AV.Types.ARRAY
+ },
+ {
+ name: 'isBroadcast',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'hasExtendedProperties',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'isNotify',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'isIndication',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'isReadable',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'isSignedWrite',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'isWritable',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'isWriteNoResponse',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'readPermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'writePermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'encryptedReadPermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'encryptedWritePermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'encryptedSignedReadPermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'encryptedSignedWritePermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'readValueRequestCallback',
+ type: AV.Types.FUNCTION,
+ nullable: true
+ },
+ {
+ name: 'writeValueRequestCallback',
+ type: AV.Types.FUNCTION,
+ nullable: true
+ }
+ ]
+ );
+};
+
//class BluetoothGATTServerCharacteristic ///////////////////////////
var BluetoothGATTServerCharacteristic = function(data) {
- // TODO: validate data and set default values
+ data = ValidateBluetoothGATTServerCharacteristicInit(data);
BluetoothGATTCharacteristic.call(this, data, null);
@@ -2262,15 +2410,72 @@ var BluetoothGATTDescriptor = function(data, address) {
uuid: {
enumerable: true,
get: function() {
- return uuid_;
+ return uuid_;
},
- set: function() {},
+ set: function() {}
}
});
};
+var ValidateBluetoothGATTServerDescriptorInit = function(initData) {
+ return AV.validateArgs(
+ [
+ initData['uuid'],
+ initData['readPermission'] || false,
+ initData['writePermission'] || false,
+ initData['encryptedReadPermission'] || false,
+ initData['encryptedWritePermission'] || false,
+ initData['encryptedSignedReadPermission'] || false,
+ initData['encryptedSignedWritePermission'] || false,
+ initData['readValueRequestCallback'] || null,
+ initData['writeValueRequestCallback'] || null
+ ],
+ [
+ {
+ name: 'uuid',
+ type: AV.Types.STRING,
+ validator: IsUuidValid
+ },
+ {
+ name: 'readPermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'writePermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'encryptedReadPermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'encryptedWritePermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'encryptedSignedReadPermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'encryptedSignedWritePermission',
+ type: AV.Types.BOOLEAN
+ },
+ {
+ name: 'readValueRequestCallback',
+ type: AV.Types.FUNCTION,
+ nullable: true
+ },
+ {
+ name: 'writeValueRequestCallback',
+ type: AV.Types.FUNCTION,
+ nullable: true
+ }
+ ]
+ );
+};
+
var BluetoothGATTServerDescriptor = function(data, address) {
- // TODO: validate data and set default values
+ data = ValidateBluetoothGATTServerDescriptorInit(data);
BluetoothGATTDescriptor.call(this, data, null);
--
2.34.1