From: Pawel Andruszkiewicz Date: Thu, 30 Jul 2015 14:23:40 +0000 (+0200) Subject: [BluetoothLE] Add default values for missing LEDevice attributes. X-Git-Tag: submit/tizen/20151026.073646^2^2~229^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cce4807f7b24a43862b5365f4f9d333e8af1a360;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [BluetoothLE] Add default values for missing LEDevice attributes. [Verification] Code compiles. Change-Id: Ifb9acf4e7a054df7bb27e5c7c690c4afbd3e5d44 Signed-off-by: Pawel Andruszkiewicz --- diff --git a/src/bluetooth/bluetooth_api.js b/src/bluetooth/bluetooth_api.js index 55b53d68..fac24d6b 100755 --- a/src/bluetooth/bluetooth_api.js +++ b/src/bluetooth/bluetooth_api.js @@ -571,42 +571,45 @@ BluetoothSocket.prototype.close = function() { //class BluetoothLEDevice //////////////////////////////////////////////////// var BluetoothLEDevice = function(data) { - - var address = "", name = "", txpowerLevel = null, appearance = null, uuids = [], - solicitationuuids = [], serviceData = [], manufacturerData = null; + var address = "", name = null, txpowerlevel = null, appearance = null, uuids = null, + solicitationuuids = null, serviceData = null, manufacturerData = null; if (data) { - address = data.address; - name = data.name; - txpowerLevel = data.txpowerLevel; - appearance = data.appearance; - uuids = data.uuids; - solicitationuuids = data.solicitationuuids; + address = data.address; + name = data.name || null; + txpowerlevel = data.txpowerlevel || null; + appearance = data.appearance || null; + uuids = data.uuids || null; + solicitationuuids = data.solicitationuuids || null; + if (data.serviceData) { data.serviceData.forEach(function(d) { serviceData.push(new tizen.BluetoothLEServiceData(d)); }); + } + if (data.manufacturerData) { manufacturerData = new tizen.BluetoothLEManufacturerData(data.manufacturerData); + } } Object.defineProperties(this, { address : {value: address, writable: false, enumerable: true}, name : {value: name, writable: false, enumerable: true}, - txpowerLevel : {value: txpowerLevel, writable: false, enumerable: true}, + txpowerlevel : {value: txpowerlevel, writable: false, enumerable: true}, appearance : {value: appearance, writable: false, enumerable: true}, uuids : { enumerable: true, set : function(){}, - get : function(){ return uuids.slice(); } + get : function(){ return uuids ? uuids.slice() : null; } }, solicitationuuids : { enumerable: true, set : function(){}, - get : function(){ return solicitationuuids.slice(); } + get : function(){ return solicitationuuids ? solicitationuuids.slice() : null; } }, serviceData : { enumerable: true, set : function(){}, - get : function(){ return serviceData.slice(); } + get : function(){ return serviceData ? serviceData.slice() : null; } }, manufacturerData : { value: manufacturerData, diff --git a/src/bluetooth/bluetooth_le_adapter.cc b/src/bluetooth/bluetooth_le_adapter.cc index 7b333321..ef4fb6a8 100755 --- a/src/bluetooth/bluetooth_le_adapter.cc +++ b/src/bluetooth/bluetooth_le_adapter.cc @@ -16,6 +16,7 @@ #include "bluetooth/bluetooth_le_adapter.h" +#include "common/tools.h" #include "common/logger.h" #include "bluetooth/bluetooth_instance.h" @@ -106,15 +107,21 @@ class BluetoothLEServiceData : public ParsedDataHolder { class BluetoothLEManufacturerData : public ParsedDataHolder { public: BluetoothLEManufacturerData() - : ParsedDataHolder() { + : ParsedDataHolder(), + data_(nullptr), + data_length_(0) { } const std::string& id() const { return id_; } - const std::string& data() const { - return data_; + const char* const data() const { + return (const char*) data_; + } + + const int data_length() const { + return data_length_; } static bool Construct(const picojson::value& obj, @@ -131,6 +138,14 @@ class BluetoothLEManufacturerData : public ParsedDataHolder { return true; } + ~BluetoothLEManufacturerData() { + if (data_) { + delete [] data_; + data_ = nullptr; + data_length_ = 0; + } + } + private: static bool ParseId(const picojson::value& obj, BluetoothLEManufacturerData* out) { @@ -148,18 +163,29 @@ class BluetoothLEManufacturerData : public ParsedDataHolder { static bool ParseData(const picojson::value& obj, BluetoothLEManufacturerData* out) { LoggerD("Entered"); - const auto& data = obj.get("data"); - if (data.is()) { - out->data_ = data.get(); + + const auto& val_data = obj.get("data"); + + if (val_data.is()) { + const std::string& str_data = val_data.get(); + const char* p_data = str_data.c_str(); + int size = str_data.length(); + if (size > 2 && (str_data.find("0x", 0) == 0 || str_data.find("0X", 0) == 0)) { + p_data += 2; + size -= 2; + } + out->data_length_ = size / 2; + out->data_ = new unsigned char[out->data_length_]; + common::tools::HexToBin(p_data, size, out->data_, out->data_length_); + return true; } else { return false; } - - return true; } std::string id_; - std::string data_; + unsigned char* data_; + int data_length_; }; class BluetoothLEAdvertiseData : public ParsedDataHolder { @@ -568,15 +594,15 @@ void BluetoothLEAdapter::StartAdvertise(const picojson::value& data, picojson::o } const auto& manufacturer_data = advertise_data.manufacturer_data(); - if (manufacturer_data.id().empty() && manufacturer_data.data().empty()) { + if (manufacturer_data.id().empty() && manufacturer_data.data() == nullptr) { LoggerD("manufacturerData is empty"); } else { - if (manufacturer_data.valid()) { + if (manufacturer_data.valid()) { ret = bt_adapter_le_add_advertising_manufacturer_data(advertiser, packet_type, atoi(manufacturer_data.id().c_str()), - manufacturer_data.data().c_str(), - manufacturer_data.data().length()); + manufacturer_data.data(), + manufacturer_data.data_length()); if (BT_ERROR_NONE != ret) { LoggerE("bt_adapter_le_add_advertising_manufacturer_data() failed with: %d", ret); ReportError(util::GetBluetoothError(ret, "Failed to create advertiser"), &out); diff --git a/src/bluetooth/bluetooth_le_device.cc b/src/bluetooth/bluetooth_le_device.cc index 0551dcf9..bcc22c45 100755 --- a/src/bluetooth/bluetooth_le_device.cc +++ b/src/bluetooth/bluetooth_le_device.cc @@ -22,11 +22,13 @@ #include "common/converter.h" #include "common/logger.h" +#include "common/tools.h" using common::ErrorCode; using common::PlatformResult; using common::tools::ReportError; using common::tools::ReportSuccess; +using common::tools::BinToHex; namespace extension { namespace bluetooth { @@ -35,7 +37,7 @@ namespace { //le_device const std::string kDeviceName = "name"; const std::string kDeviceAddress = "address"; -const std::string kTxPowerLevel = "txpowerLevel"; +const std::string kTxPowerLevel = "txpowerlevel"; const std::string kAppearance = "appearance"; const std::string kDeviceUuids = "uuids"; const std::string kSolicitationUuids = "solicitationuuids"; @@ -107,7 +109,8 @@ static void ServiceDataToJson(bt_adapter_le_service_data_s *service_data_list, } } -static void ManufacturerToJson(int manufacturer_id, char *manufacturer_data, +static void ManufacturerToJson(int manufacturer_id, + char *manufacturer_data, int manufacturer_count, picojson::object* le_device) { LoggerD("Entered"); @@ -115,8 +118,16 @@ static void ManufacturerToJson(int manufacturer_id, char *manufacturer_data, picojson::value response = picojson::value(picojson::object()); picojson::object& response_obj = response.get(); response_obj[kId] = picojson::value(std::to_string(manufacturer_id)); - response_obj[kData] = picojson::value( - std::string(manufacturer_data, manufacturer_count)); + + char manuf_data_hex[manufacturer_count * 2 + 1]; + BinToHex((const unsigned char*) manufacturer_data, + manufacturer_count, + manuf_data_hex, + sizeof(manuf_data_hex) - 1); + manuf_data_hex[manufacturer_count * 2] = 0; + response_obj[kData] = picojson::value(std::string(manuf_data_hex)); + + le_device->insert(std::make_pair(kManufacturerData, response)); } PlatformResult BluetoothLEDevice::ToJson( @@ -147,12 +158,11 @@ PlatformResult BluetoothLEDevice::ToJson( } } - if (found) { - le_device->insert( - std::make_pair(kDeviceName, picojson::value(std::string(device_name)))); + le_device->insert( + std::make_pair(kDeviceName, picojson::value(std::string(device_name)))); + + g_free(device_name); - g_free(device_name); - } int power_level = 0; found = false; for (size_t i = 0; i < types.size() && !found; ++i) { @@ -165,11 +175,10 @@ PlatformResult BluetoothLEDevice::ToJson( } } - if (found) { - le_device->insert( + le_device->insert( std::make_pair(kTxPowerLevel, picojson::value(static_cast(power_level)))); - } + int appearance = 0; found = false; for (size_t i = 0; i < types.size() && !found; ++i) { @@ -181,11 +190,9 @@ PlatformResult BluetoothLEDevice::ToJson( } } - if (found) { - le_device->insert( + le_device->insert( std::make_pair(kAppearance, picojson::value(static_cast(appearance)))); - } char **uuids = nullptr; int count = 0; @@ -200,13 +207,11 @@ PlatformResult BluetoothLEDevice::ToJson( } } - if (found) { - UUIDsToJson(uuids, count, kDeviceUuids, le_device); - for (int i = 0; i < count; ++i) { - g_free(uuids[i]); - } - g_free(uuids); + UUIDsToJson(uuids, count, kDeviceUuids, le_device); + for (int i = 0; i < count; ++i) { + g_free(uuids[i]); } + g_free(uuids); char** service_solicitation_uuids = nullptr; int service_solicitation_uuids_count = 0; @@ -224,14 +229,12 @@ PlatformResult BluetoothLEDevice::ToJson( } } - if (found) { - UUIDsToJson(service_solicitation_uuids, service_solicitation_uuids_count, - kSolicitationUuids, le_device); - for (int i = 0; i < service_solicitation_uuids_count; ++i) { - g_free(service_solicitation_uuids[i]); - } - g_free(service_solicitation_uuids); + UUIDsToJson(service_solicitation_uuids, service_solicitation_uuids_count, + kSolicitationUuids, le_device); + for (int i = 0; i < service_solicitation_uuids_count; ++i) { + g_free(service_solicitation_uuids[i]); } + g_free(service_solicitation_uuids); bt_adapter_le_service_data_s *serviceDataList = nullptr; int service_data_list_count = 0; @@ -248,13 +251,11 @@ PlatformResult BluetoothLEDevice::ToJson( } } - if (found) { - ServiceDataToJson(serviceDataList, service_data_list_count, le_device); - ret = bt_adapter_le_free_service_data_list(serviceDataList, + ServiceDataToJson(serviceDataList, service_data_list_count, le_device); + ret = bt_adapter_le_free_service_data_list(serviceDataList, service_data_list_count); - if (BT_ERROR_NONE != ret) { - LoggerW("Failed to free service data list: %d", ret); - } + if (BT_ERROR_NONE != ret) { + LoggerW("Failed to free service data list: %d", ret); } int manufacturer_id = 0; @@ -278,6 +279,8 @@ PlatformResult BluetoothLEDevice::ToJson( ManufacturerToJson(manufacturer_id, manufacturer_data, manufacturer_data_count, le_device); g_free(manufacturer_data); + } else { + ManufacturerToJson(-1, "XX", 2, le_device); } return PlatformResult(ErrorCode::NO_ERROR); } diff --git a/src/common/tools.cc b/src/common/tools.cc index cc06772b..1271b7c8 100644 --- a/src/common/tools.cc +++ b/src/common/tools.cc @@ -282,5 +282,33 @@ std::string GetErrorString(int error_code) { return msg; } + +int HexToInt(char c) { + if (c >= '0' && c <= '9') { + return c - '0'; + } else if (c >= 'A' && c <= 'Z') { + return c - 'A'; + } else { + return c - 'a'; + } +} + +unsigned char* HexToBin(const char* hex, int size, unsigned char* bin, int bin_size) { + for (int i = 0; i < size - 1 && i / 2 < bin_size; i += 2) { + bin[i * 2] = HexToInt(hex[i]) << 4; + bin[i * 2] += HexToInt(hex[i + 1]); + } + return bin; +} + +char* BinToHex(const unsigned char* bin, int size, char* hex, int hex_size) { + static const char * const digits = "0123456789ABCDEF"; + for (int i = 0; i < size && i < hex_size / 2; i++) { + hex[i * 2] = digits[bin[i] >> 4]; + hex[i * 2 + 1] = digits[bin[i] & 15]; + } + return hex; +} + } // namespace tools } // namespace common diff --git a/src/common/tools.h b/src/common/tools.h index 56b9a8af..fcd98689 100644 --- a/src/common/tools.h +++ b/src/common/tools.h @@ -69,6 +69,10 @@ do { \ */ std::string GetErrorString(int error_code); +int HexToInt(char c); +unsigned char* HexToBin(const char* hex, int size, unsigned char* bin, int bin_size); +char* BinToHex(const unsigned char* bin, int size, char* hex, int hex_size); + } // namespace tools } // namespace common