From: Pawel Andruszkiewicz Date: Thu, 4 Feb 2016 13:22:36 +0000 (+0100) Subject: [BluetoothLE] BluetoothLEServiceData.data should be a hexadecimal string. X-Git-Tag: submit/tizen/20160212.103506^2~3^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=25ead433d8a92de015fe2c74e1e9967e12dd1e22;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [BluetoothLE] BluetoothLEServiceData.data should be a hexadecimal string. Change-Id: Ibebcb8e2d9efd63cea03b030b2427e82589d1927 Signed-off-by: Pawel Andruszkiewicz --- diff --git a/src/bluetooth/bluetooth_le_adapter.cc b/src/bluetooth/bluetooth_le_adapter.cc index 9fd02ad4..f34abd95 100755 --- a/src/bluetooth/bluetooth_le_adapter.cc +++ b/src/bluetooth/bluetooth_le_adapter.cc @@ -47,17 +47,44 @@ class ParsedDataHolder { bool valid_; }; -class BluetoothLEServiceData : public ParsedDataHolder { +class HexData { public: - BluetoothLEServiceData() - : ParsedDataHolder() { + HexData() + : length_(0) { + } + + void Parse(const std::string& d) { + const char* p_data = d.c_str(); + int size = d.length(); + if (size > 2 && (d.find("0x", 0) == 0 || d.find("0X", 0) == 0)) { + p_data += 2; + size -= 2; + } + length_ = size / 2; + pointer_.reset(new char[length_]); + common::tools::HexToBin(p_data, size, (unsigned char*)pointer(), length_); + } + + const char* const pointer() const { + return pointer_.get(); } + const int length() const { + return length_; + } + + private: + std::unique_ptr pointer_; + int length_; +}; + +class BluetoothLEServiceData : public ParsedDataHolder { + public: const std::string& uuid() const { return uuid_; } - const std::string& data() const { + const HexData& data() const { return data_; } @@ -93,7 +120,7 @@ class BluetoothLEServiceData : public ParsedDataHolder { LoggerD("Entered"); const auto& data = obj.get("data"); if (data.is()) { - out->data_ = data.get(); + out->data_.Parse(data.get()); } else { return false; } @@ -102,29 +129,19 @@ class BluetoothLEServiceData : public ParsedDataHolder { } std::string uuid_; - std::string data_; + HexData data_; }; class BluetoothLEManufacturerData : public ParsedDataHolder { public: - BluetoothLEManufacturerData() - : ParsedDataHolder(), - data_(nullptr), - data_length_(0) { - } - const std::string& id() const { return id_; } - const unsigned char* const data() const { + const HexData& data() const { return data_; } - const int data_length() const { - return data_length_; - } - static bool Construct(const picojson::value& obj, BluetoothLEManufacturerData* out) { LoggerD("Entered"); @@ -139,14 +156,6 @@ 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) { @@ -168,16 +177,7 @@ class BluetoothLEManufacturerData : public ParsedDataHolder { 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_); + out->data_.Parse(val_data.get()); return true; } else { return false; @@ -185,8 +185,7 @@ class BluetoothLEManufacturerData : public ParsedDataHolder { } std::string id_; - unsigned char* data_; - int data_length_; + HexData data_; }; class BluetoothLEAdvertiseData : public ParsedDataHolder { @@ -603,12 +602,12 @@ void BluetoothLEAdapter::StartAdvertise(const picojson::value& data, picojson::o } const auto& service_data = advertise_data.service_data(); - if (service_data.uuid().empty() && service_data.data().empty()) { + if (service_data.uuid().empty() && nullptr == service_data.data().pointer()) { LoggerD("service data is empty"); } else { ret = bt_adapter_le_add_advertising_service_data(advertiser, packet_type, service_data.uuid().c_str(), - service_data.data().c_str(), + service_data.data().pointer(), service_data.data().length()); if (BT_ERROR_NONE != ret) { LogAndReportError( @@ -620,15 +619,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() == nullptr) { + if (manufacturer_data.id().empty() && nullptr == manufacturer_data.data().pointer()) { LoggerD("manufacturerData is empty"); } else { if (manufacturer_data.valid()) { ret = bt_adapter_le_add_advertising_manufacturer_data(advertiser, packet_type, atoi(manufacturer_data.id().c_str()), - (const char*)manufacturer_data.data(), - manufacturer_data.data_length()); + manufacturer_data.data().pointer(), + manufacturer_data.data().length()); if (BT_ERROR_NONE != ret) { LogAndReportError( 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 24037505..e8196469 100755 --- a/src/bluetooth/bluetooth_le_device.cc +++ b/src/bluetooth/bluetooth_le_device.cc @@ -97,14 +97,22 @@ static void ServiceDataToJson(bt_adapter_le_service_data_s *service_data_list, std::make_pair(kServiceData, picojson::value(picojson::array()))).first ->second.get(); + std::unique_ptr service_data_hex; + for (int i = 0; i < service_data_list_count; i++) { picojson::value response = picojson::value(picojson::object()); picojson::object& response_obj = response.get(); response_obj[kServiceUuid] = picojson::value( std::string(service_data_list[i].service_uuid)); - response_obj[kData] = picojson::value( - std::string(service_data_list[i].service_data, - service_data_list[i].service_data_len)); + + const int hex_count = service_data_list[i].service_data_len * 2; + service_data_hex.reset(new char[hex_count + 1]); + BinToHex((const unsigned char*) service_data_list[i].service_data, + service_data_list[i].service_data_len, + service_data_hex.get(), + hex_count); + service_data_hex[hex_count] = '\0'; + response_obj[kData] = picojson::value(std::string(service_data_hex.get())); array.push_back(response); }