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