// 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 "base/callback.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "chromeos/chromeos_export.h" #include "chromeos/dbus/dbus_client_bundle.h" namespace base { class Thread; } // namespace base namespace dbus { class Bus; class ObjectPath; } // namespace dbus namespace chromeos { // Style Note: Clients are sorted by names. class BluetoothAdapterClient; class BluetoothAgentManagerClient; class BluetoothDeviceClient; class BluetoothGattCharacteristicClient; class BluetoothGattDescriptorClient; class BluetoothGattManagerClient; class BluetoothGattServiceClient; class BluetoothInputClient; class BluetoothProfileManagerClient; class CrasAudioClient; class CrosDisksClient; class CryptohomeClient; class DBusClient; class DBusThreadManager; class DBusThreadManagerSetter; class DebugDaemonClient; class EasyUnlockClient; class GsmSMSClient; class ImageBurnerClient; class IntrospectableClient; class LorgnetteManagerClient; 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. // This will initialize real or stub DBusClients depending on command-line // arguments and whether this process runs in a ChromeOS environment. static void Initialize(); // Returns a DBusThreadManagerSetter instance that allows tests to // replace individual D-Bus clients with their own implementations. // Also initializes the main DBusThreadManager for testing if necessary. static scoped_ptr<DBusThreadManagerSetter> GetSetterForTesting(); // 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(); // Returns true if |client| is stubbed. bool IsUsingStub(DBusClientBundle::DBusClientType client); // Returns various D-Bus bus instances, owned by DBusThreadManager. dbus::Bus* GetSystemBus(); // All returned objects are owned by DBusThreadManager. Do not cache these // pointers and use them after DBusThreadManager has been shut down. BluetoothAdapterClient* GetBluetoothAdapterClient(); BluetoothAgentManagerClient* GetBluetoothAgentManagerClient(); BluetoothDeviceClient* GetBluetoothDeviceClient(); BluetoothGattCharacteristicClient* GetBluetoothGattCharacteristicClient(); BluetoothGattDescriptorClient* GetBluetoothGattDescriptorClient(); BluetoothGattManagerClient* GetBluetoothGattManagerClient(); BluetoothGattServiceClient* GetBluetoothGattServiceClient(); BluetoothInputClient* GetBluetoothInputClient(); BluetoothProfileManagerClient* GetBluetoothProfileManagerClient(); CrasAudioClient* GetCrasAudioClient(); CrosDisksClient* GetCrosDisksClient(); CryptohomeClient* GetCryptohomeClient(); DebugDaemonClient* GetDebugDaemonClient(); EasyUnlockClient* GetEasyUnlockClient(); GsmSMSClient* GetGsmSMSClient(); ImageBurnerClient* GetImageBurnerClient(); IntrospectableClient* GetIntrospectableClient(); LorgnetteManagerClient* GetLorgnetteManagerClient(); ModemMessagingClient* GetModemMessagingClient(); NfcAdapterClient* GetNfcAdapterClient(); NfcDeviceClient* GetNfcDeviceClient(); NfcManagerClient* GetNfcManagerClient(); NfcRecordClient* GetNfcRecordClient(); NfcTagClient* GetNfcTagClient(); PermissionBrokerClient* GetPermissionBrokerClient(); PowerManagerClient* GetPowerManagerClient(); PowerPolicyController* GetPowerPolicyController(); SessionManagerClient* GetSessionManagerClient(); ShillDeviceClient* GetShillDeviceClient(); ShillIPConfigClient* GetShillIPConfigClient(); ShillManagerClient* GetShillManagerClient(); ShillServiceClient* GetShillServiceClient(); ShillProfileClient* GetShillProfileClient(); SMSClient* GetSMSClient(); SystemClockClient* GetSystemClockClient(); UpdateEngineClient* GetUpdateEngineClient(); private: friend class DBusThreadManagerSetter; // Creates a new DBusThreadManager using the DBusClients set in // |client_bundle|. explicit DBusThreadManager(scoped_ptr<DBusClientBundle> client_bundle); ~DBusThreadManager(); // Creates a global instance of DBusThreadManager with the real // implementations for all clients that are listed in |unstub_client_mask| and // stub implementations for all clients that are not included. Cannot be // called more than once. static void CreateGlobalInstance( DBusClientBundle::DBusClientTypeMask unstub_client_mask); // Initialize global thread manager instance with all real dbus client // implementations. static void InitializeWithRealClients(); // Initialize global thread manager instance with stubbed-out dbus clients // implementation. static void InitializeWithStubs(); // Initialize with stub implementations for only certain clients that are // not included in the comma-separated |unstub_clients| list. static void InitializeWithPartialStub(const std::string& unstub_clients); // Initializes all currently stored DBusClients with the system bus and // performs additional setup. void InitializeClients(); scoped_ptr<base::Thread> dbus_thread_; scoped_refptr<dbus::Bus> system_bus_; scoped_ptr<DBusClientBundle> client_bundle_; scoped_ptr<PowerPolicyController> power_policy_controller_; DISALLOW_COPY_AND_ASSIGN(DBusThreadManager); }; class CHROMEOS_EXPORT DBusThreadManagerSetter { public: ~DBusThreadManagerSetter(); void SetBluetoothAdapterClient(scoped_ptr<BluetoothAdapterClient> 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 SetBluetoothProfileManagerClient( scoped_ptr<BluetoothProfileManagerClient> client); void SetCrasAudioClient(scoped_ptr<CrasAudioClient> client); void SetCrosDisksClient(scoped_ptr<CrosDisksClient> client); void SetCryptohomeClient(scoped_ptr<CryptohomeClient> client); void SetDebugDaemonClient(scoped_ptr<DebugDaemonClient> client); void SetEasyUnlockClient(scoped_ptr<EasyUnlockClient> client); void SetLorgnetteManagerClient(scoped_ptr<LorgnetteManagerClient> client); void SetShillDeviceClient(scoped_ptr<ShillDeviceClient> client); void SetShillIPConfigClient(scoped_ptr<ShillIPConfigClient> client); void SetShillManagerClient(scoped_ptr<ShillManagerClient> client); void SetShillServiceClient(scoped_ptr<ShillServiceClient> client); void SetShillProfileClient(scoped_ptr<ShillProfileClient> client); void SetGsmSMSClient(scoped_ptr<GsmSMSClient> client); void SetImageBurnerClient(scoped_ptr<ImageBurnerClient> client); void SetIntrospectableClient(scoped_ptr<IntrospectableClient> client); void SetModemMessagingClient(scoped_ptr<ModemMessagingClient> client); void SetNfcAdapterClient(scoped_ptr<NfcAdapterClient> client); void SetNfcDeviceClient(scoped_ptr<NfcDeviceClient> client); void SetNfcManagerClient(scoped_ptr<NfcManagerClient> client); void SetNfcRecordClient(scoped_ptr<NfcRecordClient> client); void SetNfcTagClient(scoped_ptr<NfcTagClient> client); void SetPermissionBrokerClient(scoped_ptr<PermissionBrokerClient> client); void SetPowerManagerClient(scoped_ptr<PowerManagerClient> client); void SetSessionManagerClient(scoped_ptr<SessionManagerClient> client); void SetSMSClient(scoped_ptr<SMSClient> client); void SetSystemClockClient(scoped_ptr<SystemClockClient> client); void SetUpdateEngineClient(scoped_ptr<UpdateEngineClient> client); private: friend class DBusThreadManager; DBusThreadManagerSetter(); DISALLOW_COPY_AND_ASSIGN(DBusThreadManagerSetter); }; } // namespace chromeos #endif // CHROMEOS_DBUS_DBUS_THREAD_MANAGER_H_