// 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 CHROMEOS_DBUS_DBUS_THREAD_MANAGER_H_
#define CHROMEOS_DBUS_DBUS_THREAD_MANAGER_H_
#include <string>
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "chromeos/chromeos_export.h"
namespace base {
class Thread;
};
namespace dbus {
class Bus;
class ObjectPath;
};
namespace chromeos {
class DBusThreadManagerObserver;
// Style Note: Clients are sorted by names.
class BluetoothAdapterClient;
class BluetoothAgentManagerClient;
class BluetoothDeviceClient;
class BluetoothInputClient;
class BluetoothProfileManagerClient;
class CrasAudioClient;
class CrosDisksClient;
class CryptohomeClient;
class DBusClient;
class DebugDaemonClient;
class GsmSMSClient;
class ImageBurnerClient;
class IntrospectableClient;
class ModemMessagingClient;
class NfcAdapterClient;
class NfcDeviceClient;
class NfcManagerClient;
class NfcRecordClient;
class NfcTagClient;
class PermissionBrokerClient;
class PowerManagerClient;
class PowerPolicyController;
class SessionManagerClient;
class ShillDeviceClient;
class ShillIPConfigClient;
class ShillManagerClient;
class ShillProfileClient;
class ShillServiceClient;
class SMSClient;
class SystemClockClient;
class UpdateEngineClient;
// DBusThreadManager manages the D-Bus thread, the thread dedicated to
// handling asynchronous D-Bus operations.
//
// This class also 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 DBusThreadManager 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 CHROMEOS_EXPORT DBusThreadManager {
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.
static void Initialize();
// Sets an alternative DBusThreadManager such as MockDBusThreadManager
// to be used in |Initialize()| for testing. Tests that call
// DBusThreadManager::Initialize() (such as browser_tests and
// interactive_ui_tests) should use this instead of calling
// |InitiailzeForTesting|. The injected object will be owned by the
// internal pointer and deleted by Shutdown().
static void SetInstanceForTesting(DBusThreadManager* dbus_thread_manager);
// Similar to Initialize(), but injects an alternative
// DBusThreadManager using SetInstanceForTest first. The injected
// object will be owned by the internal pointer and deleted by
// Shutdown().
static void InitializeForTesting(DBusThreadManager* dbus_thread_manager);
// Initialize with stub implementations for tests based on stubs.
static void InitializeWithStub();
// Returns true if DBusThreadManager has been initialized. Call this to
// avoid initializing + shutting down DBusThreadManager more than once.
static bool IsInitialized();
// Destroys the global instance.
static void Shutdown();
// Gets the global instance. Initialize() must be called first.
static DBusThreadManager* Get();
// Adds or removes an observer.
virtual void AddObserver(DBusThreadManagerObserver* observer) = 0;
virtual void RemoveObserver(DBusThreadManagerObserver* observer) = 0;
// Returns various D-Bus bus instances, owned by DBusThreadManager.
virtual dbus::Bus* GetSystemBus() = 0;
// All returned objects are owned by DBusThreadManager. Do not cache these
// pointers and use them after DBusThreadManager has been shut down.
virtual BluetoothAdapterClient* GetBluetoothAdapterClient() = 0;
virtual BluetoothAgentManagerClient* GetBluetoothAgentManagerClient() = 0;
virtual BluetoothDeviceClient* GetBluetoothDeviceClient() = 0;
virtual BluetoothInputClient* GetBluetoothInputClient() = 0;
virtual BluetoothProfileManagerClient* GetBluetoothProfileManagerClient() = 0;
virtual CrasAudioClient* GetCrasAudioClient() = 0;
virtual CrosDisksClient* GetCrosDisksClient() = 0;
virtual CryptohomeClient* GetCryptohomeClient() = 0;
virtual DebugDaemonClient* GetDebugDaemonClient() = 0;
virtual GsmSMSClient* GetGsmSMSClient() = 0;
virtual ImageBurnerClient* GetImageBurnerClient() = 0;
virtual IntrospectableClient* GetIntrospectableClient() = 0;
virtual ModemMessagingClient* GetModemMessagingClient() = 0;
virtual NfcAdapterClient* GetNfcAdapterClient() = 0;
virtual NfcDeviceClient* GetNfcDeviceClient() = 0;
virtual NfcManagerClient* GetNfcManagerClient() = 0;
virtual NfcRecordClient* GetNfcRecordClient() = 0;
virtual NfcTagClient* GetNfcTagClient() = 0;
virtual PermissionBrokerClient* GetPermissionBrokerClient() = 0;
virtual PowerManagerClient* GetPowerManagerClient() = 0;
virtual PowerPolicyController* GetPowerPolicyController() = 0;
virtual SessionManagerClient* GetSessionManagerClient() = 0;
virtual ShillDeviceClient* GetShillDeviceClient() = 0;
virtual ShillIPConfigClient* GetShillIPConfigClient() = 0;
virtual ShillManagerClient* GetShillManagerClient() = 0;
virtual ShillServiceClient* GetShillServiceClient() = 0;
virtual ShillProfileClient* GetShillProfileClient() = 0;
virtual SMSClient* GetSMSClient() = 0;
virtual SystemClockClient* GetSystemClockClient() = 0;
virtual UpdateEngineClient* GetUpdateEngineClient() = 0;
virtual ~DBusThreadManager();
protected:
DBusThreadManager();
private:
// InitializeClients is called after g_dbus_thread_manager is set.
// NOTE: Clients that access other clients in their Init() must be
// initialized in the correct order.
static void InitializeClients();
// Initializes |client| with the |system_bus_|.
static void InitClient(DBusClient* client);
DISALLOW_COPY_AND_ASSIGN(DBusThreadManager);
};
} // namespace chromeos
#endif // CHROMEOS_DBUS_DBUS_THREAD_MANAGER_H_