Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Unified Diff: device/bluetooth/dbus/fake_bluetooth_gatt_manager_client.cc

Issue 1914893002: DBus changes for implementing local GATT attributes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bluetooth_classes
Patch Set: test leak fix Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: device/bluetooth/dbus/fake_bluetooth_gatt_manager_client.cc
diff --git a/device/bluetooth/dbus/fake_bluetooth_gatt_manager_client.cc b/device/bluetooth/dbus/fake_bluetooth_gatt_manager_client.cc
index 284a17c7c267265994ac5cf1f644323d166b2e1e..7faf1657429607a6d8696f2b2c9c66894d236ff9 100644
--- a/device/bluetooth/dbus/fake_bluetooth_gatt_manager_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_gatt_manager_client.cc
@@ -4,14 +4,90 @@
#include "device/bluetooth/dbus/fake_bluetooth_gatt_manager_client.h"
+#include <set>
+#include <string>
+
+#include "base/callback.h"
#include "base/logging.h"
-#include "device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_service_provider.h"
-#include "device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_service_provider.h"
-#include "device/bluetooth/dbus/fake_bluetooth_gatt_service_service_provider.h"
+#include "base/strings/string_util.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
namespace bluez {
+std::set<dbus::ObjectPath> FakeBluetoothGattManagerClient::FindServiceProviders(
+ dbus::ObjectPath application_path) {
+ std::set<dbus::ObjectPath> services;
+ for (const auto& service : service_map_) {
+ if (base::StartsWith(service.first.value(), application_path.value(),
+ base::CompareCase::SENSITIVE))
+ services.insert(service.first);
+ }
+ return services;
+}
+
+std::set<dbus::ObjectPath>
+FakeBluetoothGattManagerClient::FindCharacteristicProviders(
+ dbus::ObjectPath application_path) {
+ std::set<dbus::ObjectPath> characteristics;
+ for (const auto& characteristic : characteristic_map_) {
+ if (base::StartsWith(characteristic.first.value(), application_path.value(),
+ base::CompareCase::SENSITIVE)) {
+ characteristics.insert(characteristic.first);
+ }
+ }
+ return characteristics;
+}
+
+std::set<dbus::ObjectPath>
+FakeBluetoothGattManagerClient::FindDescriptorProviders(
+ dbus::ObjectPath application_path) {
+ std::set<dbus::ObjectPath> descriptors;
+ for (const auto& descriptor : descriptor_map_) {
+ if (base::StartsWith(descriptor.first.value(), application_path.value(),
+ base::CompareCase::SENSITIVE)) {
+ descriptors.insert(descriptor.first);
+ }
+ }
+ return descriptors;
+}
+
+bool FakeBluetoothGattManagerClient::VerifyProviderHierarchy(
+ FakeBluetoothGattApplicationServiceProvider* application_provider) {
+ dbus::ObjectPath application_path = application_provider->object_path();
+ std::set<dbus::ObjectPath> services = FindServiceProviders(application_path);
+ std::set<dbus::ObjectPath> characteristics =
+ FindCharacteristicProviders(application_path);
+ std::set<dbus::ObjectPath> descriptors =
+ FindDescriptorProviders(application_path);
+
+ VLOG(1) << "Verifying " << services.size()
+ << " services in application: " << application_path.value();
+
+ for (const auto& descriptor : descriptors) {
+ if (characteristics.count(
+ descriptor_map_[descriptor]->characteristic_path()) != 1) {
+ return false;
+ }
+ VLOG(1) << "Descriptor " << descriptor.value()
+ << " verified, has parent characteristic ("
+ << descriptor_map_[descriptor]->characteristic_path().value()
+ << ") in hierarchy.";
+ }
+
+ for (const auto& characteristic : characteristics) {
+ if (services.count(characteristic_map_[characteristic]->service_path()) !=
+ 1) {
+ return false;
+ }
+ VLOG(1) << "Characteristic " << characteristic.value()
+ << " verified, has parent service ("
+ << characteristic_map_[characteristic]->service_path().value()
+ << ") in hierarchy.";
+ }
+
+ return true;
+}
+
FakeBluetoothGattManagerClient::FakeBluetoothGattManagerClient() {}
FakeBluetoothGattManagerClient::~FakeBluetoothGattManagerClient() {}
@@ -20,60 +96,56 @@ FakeBluetoothGattManagerClient::~FakeBluetoothGattManagerClient() {}
void FakeBluetoothGattManagerClient::Init(dbus::Bus* bus) {}
// BluetoothGattManagerClient overrides.
-void FakeBluetoothGattManagerClient::RegisterService(
- const dbus::ObjectPath& service_path,
+void FakeBluetoothGattManagerClient::RegisterApplication(
+ const dbus::ObjectPath& application_path,
const Options& options,
const base::Closure& callback,
const ErrorCallback& error_callback) {
- VLOG(1) << "Register GATT service: " << service_path.value();
-
- // If a service provider wasn't created before, return error.
- ServiceMap::iterator iter = service_map_.find(service_path);
- if (iter == service_map_.end()) {
- error_callback.Run(bluetooth_gatt_manager::kErrorInvalidArguments,
- "GATT service doesn't exist: " + service_path.value());
- return;
- }
-
- // Check to see if this GATT service was already registered.
- ServiceProvider* provider = &iter->second;
- if (provider->first) {
- error_callback.Run(
- bluetooth_gatt_manager::kErrorAlreadyExists,
- "GATT service already registered: " + service_path.value());
- return;
- }
-
- // Success!
- provider->first = true;
+ VLOG(1) << "Register GATT application: " << application_path.value();
+ ApplicationProvider* provider =
+ GetApplicationServiceProvider(application_path);
+ if (!provider || provider->second)
+ error_callback.Run(bluetooth_gatt_service::kErrorFailed, "");
+ if (!VerifyProviderHierarchy(provider->first))
+ error_callback.Run(bluetooth_gatt_service::kErrorFailed, "");
+ provider->second = true;
callback.Run();
}
-void FakeBluetoothGattManagerClient::UnregisterService(
- const dbus::ObjectPath& service_path,
+// BluetoothGattManagerClient overrides.
+void FakeBluetoothGattManagerClient::UnregisterApplication(
+ const dbus::ObjectPath& application_path,
const base::Closure& callback,
const ErrorCallback& error_callback) {
- VLOG(1) << "Unregister GATT service: " << service_path.value();
+ VLOG(1) << "Unregister GATT application: " << application_path.value();
+ ApplicationProvider* provider =
+ GetApplicationServiceProvider(application_path);
+ if (!provider || !provider->second)
+ error_callback.Run(bluetooth_gatt_service::kErrorFailed, "");
+ provider->second = false;
+ callback.Run();
+}
- // If a service provider wasn't created before, return error.
- ServiceMap::iterator iter = service_map_.find(service_path);
- if (iter == service_map_.end()) {
- error_callback.Run(bluetooth_gatt_manager::kErrorInvalidArguments,
- "GATT service doesn't exist: " + service_path.value());
- return;
- }
+void FakeBluetoothGattManagerClient::RegisterApplicationServiceProvider(
+ FakeBluetoothGattApplicationServiceProvider* provider) {
+ application_map_[provider->object_path()] =
+ std::pair<FakeBluetoothGattApplicationServiceProvider*, bool>(provider,
+ false);
+}
- // Return error if the GATT service wasn't registered before.
- ServiceProvider* provider = &iter->second;
- if (!provider->first) {
- error_callback.Run(bluetooth_gatt_manager::kErrorDoesNotExist,
- "GATT service not registered: " + service_path.value());
- return;
- }
+void FakeBluetoothGattManagerClient::UnregisterApplicationServiceProvider(
+ FakeBluetoothGattApplicationServiceProvider* provider) {
+ ApplicationMap::iterator iter =
+ application_map_.find(provider->object_path());
+ if (iter != application_map_.end() && iter->second.first == provider)
+ application_map_.erase(iter);
+}
- // Success!
- provider->first = false;
- callback.Run();
+FakeBluetoothGattManagerClient::ApplicationProvider*
+FakeBluetoothGattManagerClient::GetApplicationServiceProvider(
+ const dbus::ObjectPath& object_path) {
+ ApplicationMap::iterator iter = application_map_.find(object_path);
+ return (iter != application_map_.end()) ? &iter->second : nullptr;
}
void FakeBluetoothGattManagerClient::RegisterServiceServiceProvider(
@@ -85,7 +157,7 @@ void FakeBluetoothGattManagerClient::RegisterServiceServiceProvider(
<< "object path: " << provider->object_path().value();
return;
}
- service_map_[provider->object_path()] = std::make_pair(false, provider);
+ service_map_[provider->object_path()] = provider;
}
void FakeBluetoothGattManagerClient::RegisterCharacteristicServiceProvider(
@@ -116,7 +188,7 @@ void FakeBluetoothGattManagerClient::RegisterDescriptorServiceProvider(
void FakeBluetoothGattManagerClient::UnregisterServiceServiceProvider(
FakeBluetoothGattServiceServiceProvider* provider) {
ServiceMap::iterator iter = service_map_.find(provider->object_path());
- if (iter != service_map_.end() && iter->second.second == provider)
+ if (iter != service_map_.end() && iter->second == provider)
service_map_.erase(iter);
}
@@ -136,7 +208,7 @@ FakeBluetoothGattManagerClient::GetServiceServiceProvider(
ServiceMap::const_iterator iter = service_map_.find(object_path);
if (iter == service_map_.end())
return NULL;
- return iter->second.second;
+ return iter->second;
}
FakeBluetoothGattCharacteristicServiceProvider*
@@ -159,11 +231,19 @@ FakeBluetoothGattManagerClient::GetDescriptorServiceProvider(
}
bool FakeBluetoothGattManagerClient::IsServiceRegistered(
- const dbus::ObjectPath& object_path) const {
- ServiceMap::const_iterator iter = service_map_.find(object_path);
- if (iter == service_map_.end())
+ const dbus::ObjectPath& service_path) const {
+ const auto& service = service_map_.find(service_path);
+ if (service == service_map_.end())
return false;
- return iter->second.first;
+
+ for (const auto& application : application_map_) {
+ if (base::StartsWith(service_path.value(),
+ application.second.first->object_path().value(),
+ base::CompareCase::SENSITIVE)) {
+ return application.second.second;
+ }
+ }
+ return false;
}
} // namespace bluez

Powered by Google App Engine
This is Rietveld 408576698