Index: device/bluetooth/dbus/bluez_dbus_manager.cc |
diff --git a/device/bluetooth/dbus/bluez_dbus_manager.cc b/device/bluetooth/dbus/bluez_dbus_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..376261d9dbcf33e7cfc2d1a68d56f9af27c1250f |
--- /dev/null |
+++ b/device/bluetooth/dbus/bluez_dbus_manager.cc |
@@ -0,0 +1,250 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "device/bluetooth/dbus/bluez_dbus_manager.h" |
+ |
+#include "base/command_line.h" |
+#include "base/sys_info.h" |
+#include "base/threading/thread.h" |
+#include "dbus/bus.h" |
+#include "dbus/dbus_statistics.h" |
+#include "device/bluetooth/dbus/bluetooth_adapter_client.h" |
+#include "device/bluetooth/dbus/bluetooth_agent_manager_client.h" |
+#include "device/bluetooth/dbus/bluetooth_device_client.h" |
+#include "device/bluetooth/dbus/bluetooth_gatt_characteristic_client.h" |
+#include "device/bluetooth/dbus/bluetooth_gatt_descriptor_client.h" |
+#include "device/bluetooth/dbus/bluetooth_gatt_manager_client.h" |
+#include "device/bluetooth/dbus/bluetooth_gatt_service_client.h" |
+#include "device/bluetooth/dbus/bluetooth_input_client.h" |
+#include "device/bluetooth/dbus/bluetooth_le_advertising_manager_client.h" |
+#include "device/bluetooth/dbus/bluetooth_media_client.h" |
+#include "device/bluetooth/dbus/bluetooth_media_transport_client.h" |
+#include "device/bluetooth/dbus/bluetooth_profile_manager_client.h" |
+ |
+namespace bluez { |
+ |
+static BluezDBusManager* g_bluez_dbus_manager = nullptr; |
+static bool g_using_bluez_dbus_manager_for_testing = false; |
+ |
+BluezDBusManager::BluezDBusManager( |
+ dbus::Bus* bus, |
+ scoped_ptr<BluetoothDBusClientBundle> client_bundle) |
+ : bus_(bus), client_bundle_(client_bundle.Pass()) {} |
+ |
+BluezDBusManager::~BluezDBusManager() { |
+ // Delete all D-Bus clients before shutting down the system bus. |
+ client_bundle_.reset(); |
+} |
+ |
+dbus::Bus* bluez::BluezDBusManager::GetSystemBus() { |
+ return bus_; |
+} |
+ |
+BluetoothAdapterClient* bluez::BluezDBusManager::GetBluetoothAdapterClient() { |
+ return client_bundle_->bluetooth_adapter_client(); |
+} |
+ |
+BluetoothLEAdvertisingManagerClient* |
+bluez::BluezDBusManager::GetBluetoothLEAdvertisingManagerClient() { |
+ return client_bundle_->bluetooth_le_advertising_manager_client(); |
+} |
+ |
+BluetoothAgentManagerClient* |
+bluez::BluezDBusManager::GetBluetoothAgentManagerClient() { |
+ return client_bundle_->bluetooth_agent_manager_client(); |
+} |
+ |
+BluetoothDeviceClient* bluez::BluezDBusManager::GetBluetoothDeviceClient() { |
+ return client_bundle_->bluetooth_device_client(); |
+} |
+ |
+BluetoothGattCharacteristicClient* |
+bluez::BluezDBusManager::GetBluetoothGattCharacteristicClient() { |
+ return client_bundle_->bluetooth_gatt_characteristic_client(); |
+} |
+ |
+BluetoothGattDescriptorClient* |
+bluez::BluezDBusManager::GetBluetoothGattDescriptorClient() { |
+ return client_bundle_->bluetooth_gatt_descriptor_client(); |
+} |
+ |
+BluetoothGattManagerClient* |
+bluez::BluezDBusManager::GetBluetoothGattManagerClient() { |
+ return client_bundle_->bluetooth_gatt_manager_client(); |
+} |
+ |
+BluetoothGattServiceClient* |
+bluez::BluezDBusManager::GetBluetoothGattServiceClient() { |
+ return client_bundle_->bluetooth_gatt_service_client(); |
+} |
+ |
+BluetoothInputClient* bluez::BluezDBusManager::GetBluetoothInputClient() { |
+ return client_bundle_->bluetooth_input_client(); |
+} |
+ |
+BluetoothMediaClient* bluez::BluezDBusManager::GetBluetoothMediaClient() { |
+ return client_bundle_->bluetooth_media_client(); |
+} |
+ |
+BluetoothMediaTransportClient* |
+bluez::BluezDBusManager::GetBluetoothMediaTransportClient() { |
+ return client_bundle_->bluetooth_media_transport_client(); |
+} |
+ |
+BluetoothProfileManagerClient* |
+bluez::BluezDBusManager::GetBluetoothProfileManagerClient() { |
+ return client_bundle_->bluetooth_profile_manager_client(); |
+} |
+ |
+void BluezDBusManager::InitializeClients() { |
+ GetBluetoothAdapterClient()->Init(GetSystemBus()); |
+ GetBluetoothAgentManagerClient()->Init(GetSystemBus()); |
+ GetBluetoothDeviceClient()->Init(GetSystemBus()); |
+ GetBluetoothGattCharacteristicClient()->Init(GetSystemBus()); |
+ GetBluetoothGattDescriptorClient()->Init(GetSystemBus()); |
+ GetBluetoothGattManagerClient()->Init(GetSystemBus()); |
+ GetBluetoothGattServiceClient()->Init(GetSystemBus()); |
+ GetBluetoothInputClient()->Init(GetSystemBus()); |
+ GetBluetoothLEAdvertisingManagerClient()->Init(GetSystemBus()); |
+ GetBluetoothMediaClient()->Init(GetSystemBus()); |
+ GetBluetoothMediaTransportClient()->Init(GetSystemBus()); |
+ GetBluetoothProfileManagerClient()->Init(GetSystemBus()); |
+ |
+ // This must be called after the list of clients so they've each had a |
+ // chance to register with their object g_dbus_thread_managers. |
+ if (GetSystemBus()) |
+ GetSystemBus()->GetManagedObjects(); |
+} |
+ |
+// static |
+void BluezDBusManager::Initialize(dbus::Bus* bus, bool use_dbus_stub) { |
+ // If we initialize BluezDBusManager twice we may also be shutting it down |
+ // early; do not allow that. |
+ if (g_using_bluez_dbus_manager_for_testing) |
+ return; |
+ |
+ CHECK(!g_bluez_dbus_manager); |
+ CreateGlobalInstance(bus, use_dbus_stub); |
+} |
+ |
+// static |
+scoped_ptr<BluezDBusManagerSetter> |
+bluez::BluezDBusManager::GetSetterForTesting() { |
+ if (!g_using_bluez_dbus_manager_for_testing) { |
+ g_using_bluez_dbus_manager_for_testing = true; |
+ CreateGlobalInstance(nullptr, true); |
+ } |
+ |
+ return make_scoped_ptr(new BluezDBusManagerSetter()); |
+} |
+ |
+// static |
+void BluezDBusManager::CreateGlobalInstance(dbus::Bus* bus, bool use_stubs) { |
+ CHECK(!g_bluez_dbus_manager); |
+ g_bluez_dbus_manager = new BluezDBusManager( |
+ bus, make_scoped_ptr(new BluetoothDBusClientBundle(use_stubs))); |
+ g_bluez_dbus_manager->InitializeClients(); |
+} |
+ |
+// static |
+bool BluezDBusManager::IsInitialized() { |
+ return g_bluez_dbus_manager != nullptr; |
+} |
+ |
+// static |
+void BluezDBusManager::Shutdown() { |
+ // Ensure that we only shutdown BluezDBusManager once. |
+ CHECK(g_bluez_dbus_manager); |
+ BluezDBusManager* dbus_manager = g_bluez_dbus_manager; |
+ g_bluez_dbus_manager = nullptr; |
+ g_using_bluez_dbus_manager_for_testing = false; |
+ delete dbus_manager; |
+ VLOG(1) << "BluezDBusManager Shutdown completed"; |
+} |
+ |
+// static |
+BluezDBusManager* bluez::BluezDBusManager::Get() { |
+ CHECK(g_bluez_dbus_manager) |
+ << "bluez::BluezDBusManager::Get() called before Initialize()"; |
+ return g_bluez_dbus_manager; |
+} |
+ |
+BluezDBusManagerSetter::BluezDBusManagerSetter() {} |
+ |
+BluezDBusManagerSetter::~BluezDBusManagerSetter() {} |
+ |
+void BluezDBusManagerSetter::SetBluetoothAdapterClient( |
+ scoped_ptr<BluetoothAdapterClient> client) { |
+ bluez::BluezDBusManager::Get()->client_bundle_->bluetooth_adapter_client_ = |
+ client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothLEAdvertisingManagerClient( |
+ scoped_ptr<BluetoothLEAdvertisingManagerClient> client) { |
+ bluez::BluezDBusManager::Get() |
+ ->client_bundle_->bluetooth_le_advertising_manager_client_ = |
+ client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothAgentManagerClient( |
+ scoped_ptr<BluetoothAgentManagerClient> client) { |
+ bluez::BluezDBusManager::Get() |
+ ->client_bundle_->bluetooth_agent_manager_client_ = client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothDeviceClient( |
+ scoped_ptr<BluetoothDeviceClient> client) { |
+ bluez::BluezDBusManager::Get()->client_bundle_->bluetooth_device_client_ = |
+ client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothGattCharacteristicClient( |
+ scoped_ptr<BluetoothGattCharacteristicClient> client) { |
+ bluez::BluezDBusManager::Get() |
+ ->client_bundle_->bluetooth_gatt_characteristic_client_ = client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothGattDescriptorClient( |
+ scoped_ptr<BluetoothGattDescriptorClient> client) { |
+ bluez::BluezDBusManager::Get() |
+ ->client_bundle_->bluetooth_gatt_descriptor_client_ = client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothGattManagerClient( |
+ scoped_ptr<BluetoothGattManagerClient> client) { |
+ bluez::BluezDBusManager::Get() |
+ ->client_bundle_->bluetooth_gatt_manager_client_ = client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothGattServiceClient( |
+ scoped_ptr<BluetoothGattServiceClient> client) { |
+ bluez::BluezDBusManager::Get() |
+ ->client_bundle_->bluetooth_gatt_service_client_ = client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothInputClient( |
+ scoped_ptr<BluetoothInputClient> client) { |
+ bluez::BluezDBusManager::Get()->client_bundle_->bluetooth_input_client_ = |
+ client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothMediaClient( |
+ scoped_ptr<BluetoothMediaClient> client) { |
+ bluez::BluezDBusManager::Get()->client_bundle_->bluetooth_media_client_ = |
+ client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothMediaTransportClient( |
+ scoped_ptr<BluetoothMediaTransportClient> client) { |
+ bluez::BluezDBusManager::Get() |
+ ->client_bundle_->bluetooth_media_transport_client_ = client.Pass(); |
+} |
+ |
+void BluezDBusManagerSetter::SetBluetoothProfileManagerClient( |
+ scoped_ptr<BluetoothProfileManagerClient> client) { |
+ bluez::BluezDBusManager::Get() |
+ ->client_bundle_->bluetooth_profile_manager_client_ = client.Pass(); |
+} |
+ |
+} // namespace bluez |