Fix BLE register Dbus interactions.
Currently the data going to BlueZ for the advertising calls is not in the correct format. This CL fixes various issues causing problems. R=armansito@chromium.org, jamuraa@chromium.org BUG=496988 Review URL: https://codereview.chromium.org/1223173008 Cr-Commit-Position: refs/heads/master@{#338933}
This commit is contained in:
@@ -258,28 +258,40 @@ class BluetoothAdvertisementServiceProviderImpl
|
||||
response_sender.Run(response.Pass());
|
||||
}
|
||||
|
||||
void AppendArrayVariantOfStrings(dbus::MessageWriter* dict_writer,
|
||||
const UUIDList& strings) {
|
||||
dbus::MessageWriter strings_array_variant(nullptr);
|
||||
dict_writer->OpenVariant("as", &strings_array_variant);
|
||||
strings_array_variant.AppendArrayOfStrings(strings);
|
||||
dict_writer->CloseContainer(&strings_array_variant);
|
||||
}
|
||||
|
||||
void AppendType(dbus::MessageWriter* array_writer) {
|
||||
dbus::MessageWriter dict_entry_writer(NULL);
|
||||
array_writer->OpenDictEntry(&dict_entry_writer);
|
||||
dict_entry_writer.AppendString(bluetooth_advertisement::kTypeProperty);
|
||||
if (type_ == ADVERTISEMENT_TYPE_BROADCAST) {
|
||||
dict_entry_writer.AppendString("broadcast");
|
||||
dict_entry_writer.AppendVariantOfString("broadcast");
|
||||
} else {
|
||||
dict_entry_writer.AppendString("peripheral");
|
||||
dict_entry_writer.AppendVariantOfString("peripheral");
|
||||
}
|
||||
array_writer->CloseContainer(&dict_entry_writer);
|
||||
}
|
||||
|
||||
void AppendServiceUUIDs(dbus::MessageWriter* array_writer) {
|
||||
if (!service_uuids_)
|
||||
return;
|
||||
dbus::MessageWriter dict_entry_writer(NULL);
|
||||
array_writer->OpenDictEntry(&dict_entry_writer);
|
||||
dict_entry_writer.AppendString(
|
||||
bluetooth_advertisement::kServiceUUIDsProperty);
|
||||
dict_entry_writer.AppendArrayOfStrings(*service_uuids_);
|
||||
AppendArrayVariantOfStrings(&dict_entry_writer, *service_uuids_);
|
||||
array_writer->CloseContainer(&dict_entry_writer);
|
||||
}
|
||||
|
||||
void AppendManufacturerData(dbus::MessageWriter* array_writer) {
|
||||
if (!manufacturer_data_)
|
||||
return;
|
||||
dbus::MessageWriter dict_entry_writer(NULL);
|
||||
array_writer->OpenDictEntry(&dict_entry_writer);
|
||||
dict_entry_writer.AppendString(
|
||||
@@ -292,15 +304,19 @@ class BluetoothAdvertisementServiceProviderImpl
|
||||
}
|
||||
|
||||
void AppendSolicitUUIDs(dbus::MessageWriter* array_writer) {
|
||||
if (!solicit_uuids_)
|
||||
return;
|
||||
dbus::MessageWriter dict_entry_writer(NULL);
|
||||
array_writer->OpenDictEntry(&dict_entry_writer);
|
||||
dict_entry_writer.AppendString(
|
||||
bluetooth_advertisement::kSolicitUUIDsProperty);
|
||||
dict_entry_writer.AppendArrayOfStrings(*solicit_uuids_);
|
||||
AppendArrayVariantOfStrings(&dict_entry_writer, *solicit_uuids_);
|
||||
array_writer->CloseContainer(&dict_entry_writer);
|
||||
}
|
||||
|
||||
void AppendServiceData(dbus::MessageWriter* array_writer) {
|
||||
if (!service_data_)
|
||||
return;
|
||||
dbus::MessageWriter dict_entry_writer(NULL);
|
||||
array_writer->OpenDictEntry(&dict_entry_writer);
|
||||
dict_entry_writer.AppendString(
|
||||
@@ -313,6 +329,7 @@ class BluetoothAdvertisementServiceProviderImpl
|
||||
}
|
||||
|
||||
void AppendManufacturerDataVariant(dbus::MessageWriter* writer) {
|
||||
DCHECK(manufacturer_data_);
|
||||
dbus::MessageWriter array_writer(NULL);
|
||||
writer->OpenArray("{qay}", &array_writer);
|
||||
for (const auto& m : *manufacturer_data_) {
|
||||
@@ -330,6 +347,7 @@ class BluetoothAdvertisementServiceProviderImpl
|
||||
}
|
||||
|
||||
void AppendServiceDataVariant(dbus::MessageWriter* writer) {
|
||||
DCHECK(service_data_);
|
||||
dbus::MessageWriter array_writer(NULL);
|
||||
writer->OpenArray("{say}", &array_writer);
|
||||
for (const auto& m : *service_data_) {
|
||||
@@ -337,7 +355,7 @@ class BluetoothAdvertisementServiceProviderImpl
|
||||
|
||||
array_writer.OpenDictEntry(&entry_writer);
|
||||
|
||||
entry_writer.AppendString(m.first);
|
||||
entry_writer.AppendVariantOfString(m.first);
|
||||
entry_writer.AppendArrayOfBytes(vector_as_array(&m.second),
|
||||
m.second.size());
|
||||
|
||||
|
@@ -69,11 +69,9 @@ class BluetoothAdvertisementManagerClientImpl
|
||||
writer.AppendObjectPath(advertisement_object_path);
|
||||
|
||||
// Empty dictionary for options.
|
||||
dbus::MessageWriter dict_entry_writer(NULL);
|
||||
writer.OpenDictEntry(&dict_entry_writer);
|
||||
writer.CloseContainer(&dict_entry_writer);
|
||||
|
||||
writer.AppendObjectPath(advertisement_object_path);
|
||||
dbus::MessageWriter array_writer(NULL);
|
||||
writer.OpenArray("{sv}", &array_writer);
|
||||
writer.CloseContainer(&array_writer);
|
||||
|
||||
DCHECK(object_manager_);
|
||||
dbus::ObjectProxy* object_proxy =
|
||||
|
@@ -11,6 +11,7 @@
|
||||
#include "base/guid.h"
|
||||
#include "base/logging.h"
|
||||
#include "base/memory/scoped_ptr.h"
|
||||
#include "base/strings/string_util.h"
|
||||
#include "chromeos/dbus/bluetooth_le_advertising_manager_client.h"
|
||||
#include "chromeos/dbus/dbus_thread_manager.h"
|
||||
#include "dbus/bus.h"
|
||||
@@ -26,28 +27,43 @@ void UnregisterFailure(device::BluetoothAdvertisement::ErrorCode error) {
|
||||
<< error;
|
||||
}
|
||||
|
||||
void ErrorCallbackConnector(
|
||||
device::BluetoothAdvertisement::ErrorCode GetErrorCodeFromErrorStrings(
|
||||
const std::string& error_name,
|
||||
const std::string& error_message) {
|
||||
if (error_name == bluetooth_advertising_manager::kErrorFailed ||
|
||||
error_name == bluetooth_advertising_manager::kErrorAlreadyExists) {
|
||||
return device::BluetoothAdvertisement::ErrorCode::
|
||||
ERROR_ADVERTISEMENT_ALREADY_EXISTS;
|
||||
} else if (error_name ==
|
||||
bluetooth_advertising_manager::kErrorInvalidArguments) {
|
||||
return device::BluetoothAdvertisement::ErrorCode::
|
||||
ERROR_ADVERTISEMENT_INVALID_LENGTH;
|
||||
} else if (error_name == bluetooth_advertising_manager::kErrorDoesNotExist) {
|
||||
return device::BluetoothAdvertisement::ErrorCode::
|
||||
ERROR_ADVERTISEMENT_DOES_NOT_EXIST;
|
||||
}
|
||||
return device::BluetoothAdvertisement::ErrorCode::
|
||||
INVALID_ADVERTISEMENT_ERROR_CODE;
|
||||
}
|
||||
|
||||
void RegisterErrorCallbackConnector(
|
||||
const device::BluetoothAdapter::CreateAdvertisementErrorCallback&
|
||||
error_callback,
|
||||
const std::string& error_name,
|
||||
const std::string& error_message) {
|
||||
LOG(WARNING) << "Error while registering advertisement. error_name = "
|
||||
<< error_name << ", error_message = " << error_message;
|
||||
device::BluetoothAdvertisement::ErrorCode error_code;
|
||||
if (error_name == bluetooth_advertising_manager::kErrorFailed ||
|
||||
error_name == bluetooth_advertising_manager::kErrorAlreadyExists) {
|
||||
error_code = device::BluetoothAdvertisement::ErrorCode::
|
||||
ERROR_ADVERTISEMENT_ALREADY_EXISTS;
|
||||
} else if (error_name ==
|
||||
bluetooth_advertising_manager::kErrorInvalidArguments) {
|
||||
error_code = device::BluetoothAdvertisement::ErrorCode::
|
||||
ERROR_ADVERTISEMENT_INVALID_LENGTH;
|
||||
} else if (error_name == bluetooth_advertising_manager::kErrorDoesNotExist) {
|
||||
error_code = device::BluetoothAdvertisement::ErrorCode::
|
||||
ERROR_ADVERTISEMENT_DOES_NOT_EXIST;
|
||||
}
|
||||
LOG(ERROR) << "Error while registering advertisement. error_name = "
|
||||
<< error_name << ", error_message = " << error_message;
|
||||
error_callback.Run(GetErrorCodeFromErrorStrings(error_name, error_message));
|
||||
}
|
||||
|
||||
error_callback.Run(error_code);
|
||||
void UnregisterErrorCallbackConnector(
|
||||
const device::BluetoothAdapter::CreateAdvertisementErrorCallback&
|
||||
error_callback,
|
||||
const std::string& error_name,
|
||||
const std::string& error_message) {
|
||||
LOG(WARNING) << "Error while unregistering advertisement. error_name = "
|
||||
<< error_name << ", error_message = " << error_message;
|
||||
error_callback.Run(GetErrorCodeFromErrorStrings(error_name, error_message));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -58,8 +74,14 @@ BluetoothAdvertisementChromeOS::BluetoothAdvertisementChromeOS(
|
||||
scoped_ptr<device::BluetoothAdvertisement::Data> data,
|
||||
scoped_refptr<BluetoothAdapterChromeOS> adapter)
|
||||
: adapter_(adapter) {
|
||||
dbus::ObjectPath advertisement_object_path = dbus::ObjectPath(
|
||||
"/org/chromium/bluetooth_advertisement/" + base::GenerateGUID());
|
||||
// Generate a new object path - make sure that we strip any -'s from the
|
||||
// generated GUID string since object paths can only contain alphanumeric
|
||||
// characters and _ characters.
|
||||
std::string GuidString = base::GenerateGUID();
|
||||
base::RemoveChars(GuidString, "-", &GuidString);
|
||||
dbus::ObjectPath advertisement_object_path =
|
||||
dbus::ObjectPath("/org/chromium/bluetooth_advertisement/" + GuidString);
|
||||
|
||||
DCHECK(DBusThreadManager::Get());
|
||||
provider_ = BluetoothLEAdvertisementServiceProvider::Create(
|
||||
DBusThreadManager::Get()->GetSystemBus(), advertisement_object_path, this,
|
||||
@@ -78,7 +100,7 @@ void BluetoothAdvertisementChromeOS::Register(
|
||||
->GetBluetoothLEAdvertisingManagerClient()
|
||||
->RegisterAdvertisement(
|
||||
adapter_->object_path(), provider_->object_path(), success_callback,
|
||||
base::Bind(&ErrorCallbackConnector, error_callback));
|
||||
base::Bind(&RegisterErrorCallbackConnector, error_callback));
|
||||
}
|
||||
|
||||
BluetoothAdvertisementChromeOS::~BluetoothAdvertisementChromeOS() {
|
||||
@@ -101,7 +123,7 @@ void BluetoothAdvertisementChromeOS::Unregister(
|
||||
->GetBluetoothLEAdvertisingManagerClient()
|
||||
->UnregisterAdvertisement(
|
||||
adapter_->object_path(), provider_->object_path(), success_callback,
|
||||
base::Bind(&ErrorCallbackConnector, error_callback));
|
||||
base::Bind(&UnregisterErrorCallbackConnector, error_callback));
|
||||
provider_.reset();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user