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_;
}
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;
}
}
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");
return true;
}
- ~BluetoothLEManufacturerData() {
- if (data_) {
- delete [] data_;
- data_ = nullptr;
- data_length_ = 0;
- }
- }
-
private:
static bool ParseId(const picojson::value& obj,
BluetoothLEManufacturerData* out) {
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;
}
std::string id_;
- unsigned char* data_;
- int data_length_;
+ HexData data_;
};
class BluetoothLEAdvertiseData : public ParsedDataHolder {
}
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(
}
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,
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);
}