0

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:
rkc
2015-07-15 15:25:11 -07:00
committed by Commit bot
parent f40566a73c
commit ab23b18bc2
3 changed files with 69 additions and 31 deletions

@@ -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();
}