// 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 #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 AmplifierClient; class ApManagerClient; class AudioDspClient; class CrasAudioClient; class CrosDisksClient; class CryptohomeClient; 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 PeerDaemonManagerClient; class PermissionBrokerClient; class PowerManagerClient; class PrivetDaemonManagerClient; class SMSClient; class SessionManagerClient; class ShillDeviceClient; class ShillIPConfigClient; class ShillManagerClient; class ShillProfileClient; class ShillServiceClient; class ShillThirdPartyVpnDriverClient; 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 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 use these // pointers after DBusThreadManager has been shut down. AmplifierClient* GetAmplifierClient(); ApManagerClient* GetApManagerClient(); AudioDspClient* GetAudioDspClient(); 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(); PeerDaemonManagerClient* GetPeerDaemonManagerClient(); PermissionBrokerClient* GetPermissionBrokerClient(); PrivetDaemonManagerClient* GetPrivetDaemonManagerClient(); PowerManagerClient* GetPowerManagerClient(); SessionManagerClient* GetSessionManagerClient(); ShillDeviceClient* GetShillDeviceClient(); ShillIPConfigClient* GetShillIPConfigClient(); ShillManagerClient* GetShillManagerClient(); ShillServiceClient* GetShillServiceClient(); ShillProfileClient* GetShillProfileClient(); ShillThirdPartyVpnDriverClient* GetShillThirdPartyVpnDriverClient(); 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 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 dbus_thread_; scoped_refptr system_bus_; scoped_ptr client_bundle_; DISALLOW_COPY_AND_ASSIGN(DBusThreadManager); }; class CHROMEOS_EXPORT DBusThreadManagerSetter { public: ~DBusThreadManagerSetter(); void SetAmplifierClient(scoped_ptr client); void SetAudioDspClient(scoped_ptr client); void SetCrasAudioClient(scoped_ptr client); void SetCrosDisksClient(scoped_ptr client); void SetCryptohomeClient(scoped_ptr client); void SetDebugDaemonClient(scoped_ptr client); void SetEasyUnlockClient(scoped_ptr client); void SetLorgnetteManagerClient(scoped_ptr client); void SetShillDeviceClient(scoped_ptr client); void SetShillIPConfigClient(scoped_ptr client); void SetShillManagerClient(scoped_ptr client); void SetShillServiceClient(scoped_ptr client); void SetShillProfileClient(scoped_ptr client); void SetShillThirdPartyVpnDriverClient( scoped_ptr client); void SetGsmSMSClient(scoped_ptr client); void SetImageBurnerClient(scoped_ptr client); void SetIntrospectableClient(scoped_ptr client); void SetModemMessagingClient(scoped_ptr client); void SetNfcAdapterClient(scoped_ptr client); void SetNfcDeviceClient(scoped_ptr client); void SetNfcManagerClient(scoped_ptr client); void SetNfcRecordClient(scoped_ptr client); void SetNfcTagClient(scoped_ptr client); void SetPeerDaemonManagerClient(scoped_ptr client); void SetPermissionBrokerClient(scoped_ptr client); void SetPrivetDaemonManagerClient( scoped_ptr client); void SetPowerManagerClient(scoped_ptr client); void SetSessionManagerClient(scoped_ptr client); void SetSMSClient(scoped_ptr client); void SetSystemClockClient(scoped_ptr client); void SetUpdateEngineClient(scoped_ptr client); private: friend class DBusThreadManager; DBusThreadManagerSetter(); DISALLOW_COPY_AND_ASSIGN(DBusThreadManagerSetter); }; } // namespace chromeos #endif // CHROMEOS_DBUS_DBUS_THREAD_MANAGER_H_