[BluetoothLE] BluetoothLEServiceData.data should be a hexadecimal string.
authorPawel Andruszkiewicz <p.andruszkie@samsung.com>
Thu, 4 Feb 2016 13:22:36 +0000 (14:22 +0100)
committerPawel Andruszkiewicz <p.andruszkie@samsung.com>
Thu, 4 Feb 2016 13:22:36 +0000 (14:22 +0100)
Change-Id: Ibebcb8e2d9efd63cea03b030b2427e82589d1927
Signed-off-by: Pawel Andruszkiewicz <p.andruszkie@samsung.com>
src/bluetooth/bluetooth_le_adapter.cc
src/bluetooth/bluetooth_le_device.cc

index 9fd02ad4d545c55209070e4070ed5c83c487b0bf..f34abd953eb7d43970ef6c0217cbc6e7904a7732 100755 (executable)
@@ -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<char[]> 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<std::string>()) {
-      out->data_ = data.get<std::string>();
+      out->data_.Parse(data.get<std::string>());
     } 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<std::string>()) {
-      const std::string& str_data = val_data.get<std::string>();
-      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<std::string>());
       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,
index 24037505fe7965e69d6de320637be59d46c21949..e8196469d9da915dc53dcd3b69474b45d3e67978 100755 (executable)
@@ -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<picojson::array>();
 
+  std::unique_ptr<char[]> 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<picojson::object>();
     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);
   }