From: Piotr Kosko/Native/Web API (PLT) /SRPOL/Engineer/Samsung Electronics Date: Thu, 17 Sep 2020 09:01:43 +0000 (+0200) Subject: [Bluetooth] Added servicesData to BluetoothLEAdvertiseData X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5eb9f7ec4eebaae49a42a376cc1f3eb0660c083f;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Bluetooth] Added servicesData to BluetoothLEAdvertiseData servicesData has a higher priority of usage over serviceData. To avoid problems with duplicated datas in both sets, deprecated member serviceData is used only if servicesData is null or undefined. [ACR] https://code.sec.samsung.net/jira/browse/TWDAPI-267 [Verification] Auto Bluetooth TCTs pass. Change-Id: I4bb9e9a5e953a660f60d8e2b863291f848eae38f --- diff --git a/src/bluetooth/bluetooth_api.js b/src/bluetooth/bluetooth_api.js index 5608e2ed..78df4ca9 100755 --- a/src/bluetooth/bluetooth_api.js +++ b/src/bluetooth/bluetooth_api.js @@ -204,6 +204,7 @@ tizen.BluetoothLEAdvertiseData = function(dict) { var appearance_ = null; var includeTxPowerLevel_ = false; var serviceData_ = null; + var servicesData_ = null; var manufacturerData_ = null; Object.defineProperties(this, { @@ -281,6 +282,25 @@ tizen.BluetoothLEAdvertiseData = function(dict) { } } }, + servicesData: { + enumerable: true, + get: function() { + return servicesData_; + }, + set: function(v) { + if (T.isNull(v)) { + servicesData_ = v; + } else if (T.isArray(v)) { + var tmpArray = [] + for (var i = 0; i < v.length; ++i) { + if (v[i] instanceof tizen.BluetoothLEServiceData) { + tmpArray.push(v[i]); + } + } + servicesData_ = tmpArray; + } + } + }, manufacturerData: { enumerable: true, get: function() { @@ -356,6 +376,12 @@ tizen.BluetoothLEAdvertiseData = function(dict) { return; } + // servicesData + if (T.isNull(dict.servicesData) || T.isArray(dict.servicesData)) { + // additional validation is done in setter of BluetoothLEAdvertiseData.servicesData + o.servicesData = dict.servicesData; + } + // manufacturerData if ( T.isNull(dict.manufacturerData) || diff --git a/src/bluetooth/bluetooth_le_adapter.cc b/src/bluetooth/bluetooth_le_adapter.cc index 27fd38f8..cbd08ae3 100644 --- a/src/bluetooth/bluetooth_le_adapter.cc +++ b/src/bluetooth/bluetooth_le_adapter.cc @@ -35,6 +35,7 @@ const std::string kUuid = "uuid"; const std::string kUuids = "uuids"; const std::string kSolicitationUuids = "solicitationuuids"; const std::string kServiceData = "serviceData"; +const std::string kServicesData = "servicesData"; class ParsedDataHolder { public: @@ -114,6 +115,7 @@ class BluetoothLEServiceData : public ParsedDataHolder { return {}; } + LoggerD("BluetoohtLEServiceData: %s : %s", uuid_str.get().c_str(), data.get().c_str()); return BluetoothLEServiceData{std::move(*uuid), data.get()}; } @@ -323,26 +325,34 @@ class BluetoothLEAdvertiseData : public ParsedDataHolder { ScopeLogger(); const auto& service_data_obj = obj.get(kServiceData); - if (service_data_obj.is()) { + const auto& services_data_obj = obj.get(kServicesData); + + if (service_data_obj.is() && services_data_obj.is()) { + LoggerD("Service data is null"); return true; - } else if (!service_data_obj.is()) { - return false; } - /* - * Currently, only advertising of a single service data object is supported - * by the Web API. In the future, support for advertising arrays of those - * may be added. - * - * TODO: if supported, parse here the whole array of service data instances. - */ - auto service_data = BluetoothLEServiceData::Construct(service_data_obj); - if (!service_data) { - return false; + // check servicesData first and append services to a vector (higher priority) + if (!services_data_obj.is() && services_data_obj.is()) { + LoggerD("Parsing service data array"); + for (auto single_service : services_data_obj.get()) { + auto service_data = BluetoothLEServiceData::Construct(single_service); + if (!service_data) { + return false; + } + out->service_data_.emplace_back(std::move(*service_data)); + } + return true; + } else if (!service_data_obj.is() && service_data_obj.is()) { + LoggerD("Parsing single service data"); + auto service_data = BluetoothLEServiceData::Construct(service_data_obj); + if (!service_data) { + return false; + } + out->service_data_.emplace_back(std::move(*service_data)); + return true; } - - out->service_data_.emplace_back(std::move(*service_data)); - return true; + return false; } static bool ParseManufacturerData(const picojson::value& obj, BluetoothLEAdvertiseData* out) { @@ -648,6 +658,11 @@ void BluetoothLEAdapter::StartAdvertise(const picojson::value& data, picojson::o error_message = "Failed to start advertising: only 16 bit values of BluetoothLEServiceData::uuid are " "supported"; + } else if (BT_ERROR_ALREADY_DONE == ret) { // in case of duplicated advertiser data report it with correct message + LogAndReportError(util::GetBluetoothError(BT_ERROR_INVALID_PARAMETER, "Duplicated advertiser data"), &out, + ("bt_adapter_le_set_advertising_device_name() failed with: %d (%s)", ret, + get_error_message(ret))); + return; } LogAndReportError(util::GetBluetoothError(ret, error_message), &out,