blob: f04dec82f25c30fa6ff87a7ee0ec03b810f413a7 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// 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 <memory>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "device/bluetooth/bluetooth_export.h"
#include "device/bluetooth/dbus/bluetooth_dbus_client_bundle.h"
namespace dbus {
class Bus;
class Response;
class ErrorResponse;
} // namespace dbus
namespace floss {
class FlossManagerClient;
}
namespace bluez {
// Style Note: Clients are sorted by names.
class BluetoothAdapterClient;
class BluetoothAdminPolicyClient;
class BluetoothAdvertisementMonitorManagerClient;
class BluetoothAgentManagerClient;
class BluetoothBatteryClient;
class BluetoothDebugManagerClient;
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:
// Initializes the global instance with a real client. Must be called before
// any calls to Get(). We explicitly initialize and shutdown the global object
// rather than making it a Singleton to ensure clean startup and shutdown.
// * On Chrome OS, |system_bus| must not be null. It will be used as the
// primary bus and a secondary bus will be created.
// * On Linux, |system_bus| is ignored and a primary bus only will be created
// and used.
static void Initialize(dbus::Bus* system_bus);
// Initializes the global instance with a fake client.
static void InitializeFake();
// 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 std::unique_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();
BluezDBusManager(const BluezDBusManager&) = delete;
BluezDBusManager& operator=(const BluezDBusManager&) = delete;
// Returns various D-Bus bus instances, owned by BluezDBusManager.
dbus::Bus* GetSystemBus();
// Returns true once we know whether Object Manager is supported or not.
// Until this method returns true, no classes should try to use the
// D-Bus Clients.
bool IsObjectManagerSupportKnown() { return object_manager_support_known_; }
// Calls |callback| once we know whether Object Manager is supported or not.
void CallWhenObjectManagerSupportIsKnown(base::OnceClosure callback);
// Returns true if Object Manager is supported.
bool IsObjectManagerSupported() { return object_manager_supported_; }
// Returns true if |client| is fake.
bool IsUsingFakes() { return client_bundle_->IsUsingFakes(); }
// All returned objects are owned by BluezDBusManager. Do not use these
// pointers after BluezDBusManager has been shut down.
BluetoothAdapterClient* GetBluetoothAdapterClient();
BluetoothAdminPolicyClient* GetBluetoothAdminPolicyClient();
BluetoothAdvertisementMonitorManagerClient*
GetBluetoothAdvertisementMonitorManagerClient();
BluetoothLEAdvertisingManagerClient* GetBluetoothLEAdvertisingManagerClient();
BluetoothAgentManagerClient* GetBluetoothAgentManagerClient();
BluetoothBatteryClient* GetBluetoothBatteryClient();
BluetoothDebugManagerClient* GetBluetoothDebugManagerClient();
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, bool use_stubs);
~BluezDBusManager();
// Creates a global instance of BluezDBusManager. Cannot be called more than
// once.
static void CreateGlobalInstance(dbus::Bus* bus, bool use_stubs);
void OnObjectManagerResponse(dbus::Response* response,
dbus::ErrorResponse* error_response);
void OnFlossManagerServiceAvailable(bool is_available);
void OnFlossObjectManagerResponse(dbus::Response* response,
dbus::ErrorResponse* error_response);
// Initializes all currently stored DBusClients with the system bus and
// performs additional setup.
void InitializeClients();
raw_ptr<dbus::Bus> bus_;
std::unique_ptr<BluetoothDBusClientBundle> client_bundle_;
// Needed to enable/disable Floss at D-Bus initialization. We treat this
// D-Bus client specially and not include it in client bundle since we only
// need to Init() it and nothing else.
std::unique_ptr<floss::FlossManagerClient> floss_manager_client_;
base::OnceClosure object_manager_support_known_callback_;
bool object_manager_support_known_;
bool object_manager_supported_;
// Note: This should remain the last member so it'll be destroyed and
// invalidate its weak pointers before any other members are destroyed.
base::WeakPtrFactory<BluezDBusManager> weak_ptr_factory_{this};
};
class DEVICE_BLUETOOTH_EXPORT BluezDBusManagerSetter {
public:
BluezDBusManagerSetter(const BluezDBusManagerSetter&) = delete;
BluezDBusManagerSetter& operator=(const BluezDBusManagerSetter&) = delete;
~BluezDBusManagerSetter();
void SetBluetoothAdapterClient(
std::unique_ptr<BluetoothAdapterClient> client);
void SetBluetoothAdminPolicyClient(
std::unique_ptr<BluetoothAdminPolicyClient> client);
void SetBluetoothAdvertisementMonitorManagerClient(
std::unique_ptr<BluetoothAdvertisementMonitorManagerClient> client);
void SetBluetoothLEAdvertisingManagerClient(
std::unique_ptr<BluetoothLEAdvertisingManagerClient> client);
void SetBluetoothAgentManagerClient(
std::unique_ptr<BluetoothAgentManagerClient> client);
void SetBluetoothBatteryClient(
std::unique_ptr<BluetoothBatteryClient> client);
void SetBluetoothDebugManagerClient(
std::unique_ptr<BluetoothDebugManagerClient> client);
void SetBluetoothDeviceClient(std::unique_ptr<BluetoothDeviceClient> client);
void SetBluetoothGattCharacteristicClient(
std::unique_ptr<BluetoothGattCharacteristicClient> client);
void SetBluetoothGattDescriptorClient(
std::unique_ptr<BluetoothGattDescriptorClient> client);
void SetBluetoothGattManagerClient(
std::unique_ptr<BluetoothGattManagerClient> client);
void SetBluetoothGattServiceClient(
std::unique_ptr<BluetoothGattServiceClient> client);
void SetBluetoothInputClient(std::unique_ptr<BluetoothInputClient> client);
void SetBluetoothMediaClient(std::unique_ptr<BluetoothMediaClient> client);
void SetBluetoothMediaTransportClient(
std::unique_ptr<BluetoothMediaTransportClient> client);
void SetBluetoothProfileManagerClient(
std::unique_ptr<BluetoothProfileManagerClient> client);
private:
friend class BluezDBusManager;
BluezDBusManagerSetter();
};
} // namespace bluez
#endif // DEVICE_BLUETOOTH_DBUS_BLUEZ_DBUS_MANAGER_H_