Home | History | Annotate | Download | only in dbus
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROMEOS_DBUS_DBUS_THREAD_MANAGER_H_
      6 #define CHROMEOS_DBUS_DBUS_THREAD_MANAGER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/callback.h"
     11 #include "base/memory/ref_counted.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "chromeos/chromeos_export.h"
     14 
     15 namespace base {
     16 class Thread;
     17 };
     18 
     19 namespace dbus {
     20 class Bus;
     21 class ObjectPath;
     22 };
     23 
     24 namespace chromeos {
     25 
     26 class DBusThreadManagerObserver;
     27 
     28 // Style Note: Clients are sorted by names.
     29 class BluetoothAdapterClient;
     30 class BluetoothAgentManagerClient;
     31 class BluetoothDeviceClient;
     32 class BluetoothGattCharacteristicClient;
     33 class BluetoothGattDescriptorClient;
     34 class BluetoothGattManagerClient;
     35 class BluetoothGattServiceClient;
     36 class BluetoothInputClient;
     37 class BluetoothProfileManagerClient;
     38 class CrasAudioClient;
     39 class CrosDisksClient;
     40 class CryptohomeClient;
     41 class DBusClient;
     42 class DebugDaemonClient;
     43 class GsmSMSClient;
     44 class ImageBurnerClient;
     45 class IntrospectableClient;
     46 class LorgnetteManagerClient;
     47 class ModemMessagingClient;
     48 class NfcAdapterClient;
     49 class NfcDeviceClient;
     50 class NfcManagerClient;
     51 class NfcRecordClient;
     52 class NfcTagClient;
     53 class PermissionBrokerClient;
     54 class PowerManagerClient;
     55 class PowerPolicyController;
     56 class SessionManagerClient;
     57 class ShillDeviceClient;
     58 class ShillIPConfigClient;
     59 class ShillManagerClient;
     60 class ShillProfileClient;
     61 class ShillServiceClient;
     62 class SMSClient;
     63 class SystemClockClient;
     64 class UpdateEngineClient;
     65 
     66 // DBusThreadManager manages the D-Bus thread, the thread dedicated to
     67 // handling asynchronous D-Bus operations.
     68 //
     69 // This class also manages D-Bus connections and D-Bus clients, which
     70 // depend on the D-Bus thread to ensure the right order of shutdowns for
     71 // the D-Bus thread, the D-Bus connections, and the D-Bus clients.
     72 //
     73 // CALLBACKS IN D-BUS CLIENTS:
     74 //
     75 // D-Bus clients managed by DBusThreadManager are guaranteed to be deleted
     76 // after the D-Bus thread so the clients don't need to worry if new
     77 // incoming messages arrive from the D-Bus thread during shutdown of the
     78 // clients. The UI message loop is not running during the shutdown hence
     79 // the UI message loop won't post tasks to D-BUS clients during the
     80 // shutdown. However, to be extra cautious, clients should use
     81 // WeakPtrFactory when creating callbacks that run on UI thread. See
     82 // session_manager_client.cc for examples.
     83 //
     84 class CHROMEOS_EXPORT DBusThreadManager {
     85  public:
     86   // Sets the global instance. Must be called before any calls to Get().
     87   // We explicitly initialize and shut down the global object, rather than
     88   // making it a Singleton, to ensure clean startup and shutdown.
     89   static void Initialize();
     90 
     91   // Sets an alternative DBusThreadManager such as MockDBusThreadManager
     92   // to be used in |Initialize()| for testing. Tests that call
     93   // DBusThreadManager::Initialize() (such as browser_tests and
     94   // interactive_ui_tests) should use this instead of calling
     95   // |InitiailzeForTesting|.  The injected object will be owned by the
     96   // internal pointer and deleted by Shutdown().
     97   static void SetInstanceForTesting(DBusThreadManager* dbus_thread_manager);
     98 
     99   // Similar to Initialize(), but injects an alternative
    100   // DBusThreadManager using SetInstanceForTest first.  The injected
    101   // object will be owned by the internal pointer and deleted by
    102   // Shutdown(). Does not create any Fake client implementations.
    103   static void InitializeForTesting(DBusThreadManager* dbus_thread_manager);
    104 
    105   // Initialize with stub implementations for tests, creating a complete set
    106   // of fake/stub client implementations. Also initializes a default set of
    107   // fake Shill devices and services, customizable with switches::kShillStub.
    108   static void InitializeWithStub();
    109 
    110   // Returns true if DBusThreadManager has been initialized. Call this to
    111   // avoid initializing + shutting down DBusThreadManager more than once.
    112   static bool IsInitialized();
    113 
    114   // Destroys the global instance.
    115   static void Shutdown();
    116 
    117   // Gets the global instance. Initialize() must be called first.
    118   static DBusThreadManager* Get();
    119 
    120   // Adds or removes an observer.
    121   virtual void AddObserver(DBusThreadManagerObserver* observer) = 0;
    122   virtual void RemoveObserver(DBusThreadManagerObserver* observer) = 0;
    123 
    124   // Returns various D-Bus bus instances, owned by DBusThreadManager.
    125   virtual dbus::Bus* GetSystemBus() = 0;
    126 
    127   // All returned objects are owned by DBusThreadManager.  Do not cache these
    128   // pointers and use them after DBusThreadManager has been shut down.
    129   virtual BluetoothAdapterClient* GetBluetoothAdapterClient() = 0;
    130   virtual BluetoothAgentManagerClient* GetBluetoothAgentManagerClient() = 0;
    131   virtual BluetoothDeviceClient* GetBluetoothDeviceClient() = 0;
    132   virtual BluetoothGattCharacteristicClient*
    133       GetBluetoothGattCharacteristicClient() = 0;
    134   virtual BluetoothGattDescriptorClient* GetBluetoothGattDescriptorClient() = 0;
    135   virtual BluetoothGattManagerClient* GetBluetoothGattManagerClient() = 0;
    136   virtual BluetoothGattServiceClient* GetBluetoothGattServiceClient() = 0;
    137   virtual BluetoothInputClient* GetBluetoothInputClient() = 0;
    138   virtual BluetoothProfileManagerClient* GetBluetoothProfileManagerClient() = 0;
    139   virtual CrasAudioClient* GetCrasAudioClient() = 0;
    140   virtual CrosDisksClient* GetCrosDisksClient() = 0;
    141   virtual CryptohomeClient* GetCryptohomeClient() = 0;
    142   virtual DebugDaemonClient* GetDebugDaemonClient() = 0;
    143   virtual GsmSMSClient* GetGsmSMSClient() = 0;
    144   virtual ImageBurnerClient* GetImageBurnerClient() = 0;
    145   virtual IntrospectableClient* GetIntrospectableClient() = 0;
    146   virtual LorgnetteManagerClient* GetLorgnetteManagerClient() = 0;
    147   virtual ModemMessagingClient* GetModemMessagingClient() = 0;
    148   virtual NfcAdapterClient* GetNfcAdapterClient() = 0;
    149   virtual NfcDeviceClient* GetNfcDeviceClient() = 0;
    150   virtual NfcManagerClient* GetNfcManagerClient() = 0;
    151   virtual NfcRecordClient* GetNfcRecordClient() = 0;
    152   virtual NfcTagClient* GetNfcTagClient() = 0;
    153   virtual PermissionBrokerClient* GetPermissionBrokerClient() = 0;
    154   virtual PowerManagerClient* GetPowerManagerClient() = 0;
    155   virtual PowerPolicyController* GetPowerPolicyController() = 0;
    156   virtual SessionManagerClient* GetSessionManagerClient() = 0;
    157   virtual ShillDeviceClient* GetShillDeviceClient() = 0;
    158   virtual ShillIPConfigClient* GetShillIPConfigClient() = 0;
    159   virtual ShillManagerClient* GetShillManagerClient() = 0;
    160   virtual ShillServiceClient* GetShillServiceClient() = 0;
    161   virtual ShillProfileClient* GetShillProfileClient() = 0;
    162   virtual SMSClient* GetSMSClient() = 0;
    163   virtual SystemClockClient* GetSystemClockClient() = 0;
    164   virtual UpdateEngineClient* GetUpdateEngineClient() = 0;
    165 
    166   virtual ~DBusThreadManager();
    167 
    168  protected:
    169   DBusThreadManager();
    170 
    171  private:
    172   // InitializeClients is called after g_dbus_thread_manager is set.
    173   // NOTE: Clients that access other clients in their Init() must be
    174   // initialized in the correct order.
    175   static void InitializeClients();
    176 
    177   // Initializes |client| with the |system_bus_|.
    178   static void InitClient(DBusClient* client);
    179 
    180   DISALLOW_COPY_AND_ASSIGN(DBusThreadManager);
    181 };
    182 
    183 }  // namespace chromeos
    184 
    185 #endif  // CHROMEOS_DBUS_DBUS_THREAD_MANAGER_H_
    186