diff options
Diffstat (limited to 'device/bluetooth/dbus/bluez_dbus_manager.h')
-rw-r--r-- | device/bluetooth/dbus/bluez_dbus_manager.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/device/bluetooth/dbus/bluez_dbus_manager.h b/device/bluetooth/dbus/bluez_dbus_manager.h new file mode 100644 index 0000000..d87fadc --- /dev/null +++ b/device/bluetooth/dbus/bluez_dbus_manager.h @@ -0,0 +1,158 @@ +// 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. + +#ifndef DEVICE_BLUETOOTH_DBUS_BLUEZ_DBUS_MANAGER_H_ +#define DEVICE_BLUETOOTH_DBUS_BLUEZ_DBUS_MANAGER_H_ + +#include <string> + +#include "base/callback.h" +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "device/bluetooth/bluetooth_export.h" +#include "device/bluetooth/dbus/bluetooth_dbus_client_bundle.h" + +namespace dbus { +class Bus; +class ObjectPath; +} // namespace dbus + +namespace bluez { + +// Style Note: Clients are sorted by names. +class BluetoothAdapterClient; +class BluetoothAgentManagerClient; +class BluetoothDeviceClient; +class BluetoothGattCharacteristicClient; +class BluetoothGattDescriptorClient; +class BluetoothGattManagerClient; +class BluetoothGattServiceClient; +class BluetoothInputClient; +class BluetoothLEAdvertisingManagerClient; +class BluetoothMediaClient; +class BluetoothMediaTransportClient; +class BluetoothProfileManagerClient; +class BluezDBusManagerSetter; + +// BluezDBusManager manages manages D-Bus connections and D-Bus clients, which +// depend on the D-Bus thread to ensure the right order of shutdowns for +// the D-Bus thread, the D-Bus connections, and the D-Bus clients. +// +// CALLBACKS IN D-BUS CLIENTS: +// +// D-Bus clients managed by BluezDBusManagerSetter are guaranteed to be deleted +// after the D-Bus thread so the clients don't need to worry if new +// incoming messages arrive from the D-Bus thread during shutdown of the +// clients. The UI message loop is not running during the shutdown hence +// the UI message loop won't post tasks to D-BUS clients during the +// shutdown. However, to be extra cautious, clients should use +// WeakPtrFactory when creating callbacks that run on UI thread. See +// session_manager_client.cc for examples. +// +class DEVICE_BLUETOOTH_EXPORT BluezDBusManager { + public: + // Sets the global instance. Must be called before any calls to Get(). + // We explicitly initialize and shut down the global object, rather than + // making it a Singleton, to ensure clean startup and shutdown. + // This will initialize real or stub DBusClients depending on command-line + // arguments and whether this process runs in a ChromeOS environment. + static void Initialize(dbus::Bus* bus, bool use_dbus_stub); + + // Returns a BluezDBusManagerSetter instance that allows tests to + // replace individual D-Bus clients with their own implementations. + // Also initializes the main BluezDBusManager for testing if necessary. + static scoped_ptr<BluezDBusManagerSetter> GetSetterForTesting(); + + // Returns true if BluezDBusManager has been initialized. Call this to + // avoid initializing + shutting down BluezDBusManager more than once. + static bool IsInitialized(); + + // Destroys the global instance. + static void Shutdown(); + + // Gets the global instance. Initialize() must be called first. + static BluezDBusManager* Get(); + + // Returns true if |client| is stubbed. + bool IsUsingStub() { return client_bundle_->IsUsingStub(); } + + // Returns various D-Bus bus instances, owned by BluezDBusManager. + dbus::Bus* GetSystemBus(); + + // All returned objects are owned by BluezDBusManager. Do not use these + // pointers after BluezDBusManager has been shut down. + BluetoothAdapterClient* GetBluetoothAdapterClient(); + BluetoothLEAdvertisingManagerClient* GetBluetoothLEAdvertisingManagerClient(); + BluetoothAgentManagerClient* GetBluetoothAgentManagerClient(); + BluetoothDeviceClient* GetBluetoothDeviceClient(); + BluetoothGattCharacteristicClient* GetBluetoothGattCharacteristicClient(); + BluetoothGattDescriptorClient* GetBluetoothGattDescriptorClient(); + BluetoothGattManagerClient* GetBluetoothGattManagerClient(); + BluetoothGattServiceClient* GetBluetoothGattServiceClient(); + BluetoothInputClient* GetBluetoothInputClient(); + BluetoothMediaClient* GetBluetoothMediaClient(); + BluetoothMediaTransportClient* GetBluetoothMediaTransportClient(); + BluetoothProfileManagerClient* GetBluetoothProfileManagerClient(); + + private: + friend class BluezDBusManagerSetter; + + // Creates a new BluezDBusManager using the DBusClients set in + // |client_bundle|. + explicit BluezDBusManager( + dbus::Bus* bus, + scoped_ptr<BluetoothDBusClientBundle> client_bundle); + ~BluezDBusManager(); + + // Creates a global instance of BluezDBusManager. Cannot be called more than + // once. + static void CreateGlobalInstance(dbus::Bus* bus, bool use_stubs); + + // Initializes all currently stored DBusClients with the system bus and + // performs additional setup. + void InitializeClients(); + + dbus::Bus* bus_; + scoped_ptr<BluetoothDBusClientBundle> client_bundle_; + + DISALLOW_COPY_AND_ASSIGN(BluezDBusManager); +}; + +class DEVICE_BLUETOOTH_EXPORT BluezDBusManagerSetter { + public: + ~BluezDBusManagerSetter(); + + void SetBluetoothAdapterClient(scoped_ptr<BluetoothAdapterClient> client); + void SetBluetoothLEAdvertisingManagerClient( + scoped_ptr<BluetoothLEAdvertisingManagerClient> client); + void SetBluetoothAgentManagerClient( + scoped_ptr<BluetoothAgentManagerClient> client); + void SetBluetoothDeviceClient(scoped_ptr<BluetoothDeviceClient> client); + void SetBluetoothGattCharacteristicClient( + scoped_ptr<BluetoothGattCharacteristicClient> client); + void SetBluetoothGattDescriptorClient( + scoped_ptr<BluetoothGattDescriptorClient> client); + void SetBluetoothGattManagerClient( + scoped_ptr<BluetoothGattManagerClient> client); + void SetBluetoothGattServiceClient( + scoped_ptr<BluetoothGattServiceClient> client); + void SetBluetoothInputClient(scoped_ptr<BluetoothInputClient> client); + void SetBluetoothMediaClient(scoped_ptr<BluetoothMediaClient> client); + void SetBluetoothMediaTransportClient( + scoped_ptr<BluetoothMediaTransportClient> client); + void SetBluetoothProfileManagerClient( + scoped_ptr<BluetoothProfileManagerClient> client); + + private: + friend class BluezDBusManager; + + BluezDBusManagerSetter(); + + DISALLOW_COPY_AND_ASSIGN(BluezDBusManagerSetter); +}; + +} // namespace bluez + +#endif // DEVICE_BLUETOOTH_DBUS_BLUEZ_DBUS_MANAGER_H_ |