Index: chromeos/dbus/dbus_thread_manager.cc |
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc |
index 85dfeca4eda52803e6761c715456753d3f39a1bd..ab1c195b5998c1a26d532cb0873c7a976b2a0a44 100644 |
--- a/chromeos/dbus/dbus_thread_manager.cc |
+++ b/chromeos/dbus/dbus_thread_manager.cc |
@@ -19,9 +19,11 @@ |
#include "chromeos/dbus/cras_audio_client.h" |
#include "chromeos/dbus/cros_disks_client.h" |
#include "chromeos/dbus/cryptohome_client.h" |
+#include "chromeos/dbus/dbus_client.h" |
#include "chromeos/dbus/dbus_client_implementation_type.h" |
#include "chromeos/dbus/dbus_thread_manager_observer.h" |
#include "chromeos/dbus/debug_daemon_client.h" |
+#include "chromeos/dbus/fake_dbus_thread_manager.h" |
#include "chromeos/dbus/gsm_sms_client.h" |
#include "chromeos/dbus/ibus/ibus_client.h" |
#include "chromeos/dbus/image_burner_client.h" |
@@ -42,6 +44,7 @@ |
#include "chromeos/dbus/shill_service_client.h" |
#include "chromeos/dbus/shill_stub_helper.h" |
#include "chromeos/dbus/sms_client.h" |
+#include "chromeos/dbus/stub_dbus_thread_manager_helper.h" |
#include "chromeos/dbus/system_clock_client.h" |
#include "chromeos/dbus/update_engine_client.h" |
#include "dbus/bus.h" |
@@ -55,15 +58,7 @@ static bool g_dbus_thread_manager_set_for_testing = false; |
// The DBusThreadManager implementation used in production. |
class DBusThreadManagerImpl : public DBusThreadManager { |
public: |
- explicit DBusThreadManagerImpl(DBusClientImplementationType client_type) { |
- DBusClientImplementationType client_type_override = client_type; |
- // If --dbus-stub was requested, pass STUB to specific components; |
- // Many components like login are not useful with a stub implementation. |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- chromeos::switches::kDbusStub)) { |
- client_type_override = STUB_DBUS_CLIENT_IMPLEMENTATION; |
- } |
- |
+ explicit DBusThreadManagerImpl() { |
// Create the D-Bus thread. |
base::Thread::Options thread_options; |
thread_options.message_loop_type = base::MessageLoop::TYPE_IO; |
@@ -77,54 +72,7 @@ class DBusThreadManagerImpl : public DBusThreadManager { |
system_bus_options.dbus_task_runner = dbus_thread_->message_loop_proxy(); |
system_bus_ = new dbus::Bus(system_bus_options); |
- CreateDefaultClients(client_type, client_type_override); |
- } |
- |
- // InitializeClients gets called after g_dbus_thread_manager is set. |
- // NOTE: Clients that access other clients in their Init() must be |
- // initialized in the correct order. This is the only place where Clients' |
- // Init() should be called if DBusThreadManager is being used. |
- void InitializeClients() { |
- InitClient(bluetooth_adapter_client_.get()); |
- InitClient(bluetooth_agent_manager_client_.get()); |
- InitClient(bluetooth_device_client_.get()); |
- InitClient(bluetooth_input_client_.get()); |
- InitClient(bluetooth_profile_manager_client_.get()); |
- InitClient(cras_audio_client_.get()); |
- InitClient(cros_disks_client_.get()); |
- InitClient(cryptohome_client_.get()); |
- InitClient(debug_daemon_client_.get()); |
- InitClient(shill_manager_client_.get()); |
- InitClient(shill_device_client_.get()); |
- InitClient(shill_ipconfig_client_.get()); |
- InitClient(shill_service_client_.get()); |
- InitClient(shill_profile_client_.get()); |
- InitClient(gsm_sms_client_.get()); |
- InitClient(image_burner_client_.get()); |
- InitClient(introspectable_client_.get()); |
- InitClient(modem_messaging_client_.get()); |
- // Initialize the NFC clients in the correct order. |
- InitClient(nfc_manager_client_.get()); |
- InitClient(nfc_adapter_client_.get()); |
- InitClient(nfc_device_client_.get()); |
- InitClient(nfc_tag_client_.get()); |
- InitClient(permission_broker_client_.get()); |
- InitClient(power_manager_client_.get()); |
- InitClient(session_manager_client_.get()); |
- InitClient(sms_client_.get()); |
- InitClient(system_clock_client_.get()); |
- InitClient(update_engine_client_.get()); |
- |
- // PowerPolicyController is dependent on PowerManagerClient, so |
- // initialize it after the main list of clients. |
- power_policy_controller_.reset( |
- new PowerPolicyController(this, power_manager_client_.get())); |
- |
- shill_stub_helper::SetupDefaultEnvironment(); |
- |
- // This must be called after the list of clients so they've each had a |
- // chance to register with their object managers. |
- system_bus_->GetManagedObjects(); |
+ CreateDefaultClients(); |
} |
virtual ~DBusThreadManagerImpl() { |
@@ -139,26 +87,23 @@ class DBusThreadManagerImpl : public DBusThreadManager { |
dbus_thread_->Stop(); |
} |
- // DBusThreadManager override. |
+ // DBusThreadManager overrides: |
virtual void AddObserver(DBusThreadManagerObserver* observer) OVERRIDE { |
DCHECK(observer); |
observers_.AddObserver(observer); |
} |
- // DBusThreadManager override. |
virtual void RemoveObserver(DBusThreadManagerObserver* observer) OVERRIDE { |
DCHECK(observer); |
observers_.RemoveObserver(observer); |
} |
- // DBusThreadManager override. |
virtual void InitIBusBus( |
const std::string &ibus_address, |
const base::Closure& on_disconnected_callback) OVERRIDE { |
ibus_client_.reset(IBusClient::Create()); |
} |
- // DBusThreadManager overrides: |
virtual dbus::Bus* GetSystemBus() OVERRIDE { |
return system_bus_.get(); |
} |
@@ -286,16 +231,20 @@ class DBusThreadManagerImpl : public DBusThreadManager { |
} |
private: |
- // Initializes |client| with the |system_bus_|. |
- void InitClient(DBusClient* client) { |
- client->Init(system_bus_.get()); |
- } |
- |
// Constructs all clients -- stub or real implementation according to |
// |client_type| and |client_type_override| -- and stores them in the |
// respective *_client_ member variable. |
- void CreateDefaultClients(DBusClientImplementationType client_type, |
- DBusClientImplementationType client_type_override) { |
+ void CreateDefaultClients() { |
+ DBusClientImplementationType client_type = REAL_DBUS_CLIENT_IMPLEMENTATION; |
+ DBusClientImplementationType client_type_override = |
+ REAL_DBUS_CLIENT_IMPLEMENTATION; |
+ // If --dbus-stub was requested, pass STUB to specific components; |
+ // Many components like login are not useful with a stub implementation. |
+ if (CommandLine::ForCurrentProcess()->HasSwitch( |
+ chromeos::switches::kDbusStub)) { |
+ client_type_override = STUB_DBUS_CLIENT_IMPLEMENTATION; |
+ } |
+ |
bluetooth_adapter_client_.reset( |
BluetoothAdapterClient::Create(client_type)); |
bluetooth_agent_manager_client_.reset( |
@@ -338,6 +287,8 @@ class DBusThreadManagerImpl : public DBusThreadManager { |
sms_client_.reset(SMSClient::Create(client_type)); |
system_clock_client_.reset(SystemClockClient::Create(client_type)); |
update_engine_client_.reset(UpdateEngineClient::Create(client_type)); |
+ |
+ power_policy_controller_.reset(new PowerPolicyController); |
} |
// Note: Keep this before other members so they can call AddObserver() in |
@@ -377,8 +328,8 @@ class DBusThreadManagerImpl : public DBusThreadManager { |
scoped_ptr<SMSClient> sms_client_; |
scoped_ptr<UpdateEngineClient> update_engine_client_; |
scoped_ptr<IBusClient> ibus_client_; |
- scoped_ptr<PowerPolicyController> power_policy_controller_; |
+ scoped_ptr<PowerPolicyController> power_policy_controller_; |
}; |
// static |
@@ -389,19 +340,16 @@ void DBusThreadManager::Initialize() { |
// If we initialize DBusThreadManager twice we may also be shutting it down |
// early; do not allow that. |
CHECK(g_dbus_thread_manager == NULL); |
+ |
// Determine whether we use stub or real client implementations. |
- DBusThreadManagerImpl* dbus_thread_manager_impl; |
if (base::SysInfo::IsRunningOnChromeOS()) { |
- dbus_thread_manager_impl = |
- new DBusThreadManagerImpl(REAL_DBUS_CLIENT_IMPLEMENTATION); |
+ g_dbus_thread_manager = new DBusThreadManagerImpl; |
+ InitializeClients(); |
VLOG(1) << "DBusThreadManager initialized for ChromeOS"; |
} else { |
- dbus_thread_manager_impl = |
- new DBusThreadManagerImpl(STUB_DBUS_CLIENT_IMPLEMENTATION); |
- VLOG(1) << "DBusThreadManager initialized with Stub"; |
+ InitializeWithStub(); |
+ return; |
} |
- g_dbus_thread_manager = dbus_thread_manager_impl; |
- dbus_thread_manager_impl->InitializeClients(); |
} |
// static |
@@ -413,6 +361,7 @@ void DBusThreadManager::InitializeForTesting( |
CHECK(dbus_thread_manager); |
g_dbus_thread_manager = dbus_thread_manager; |
g_dbus_thread_manager_set_for_testing = true; |
+ InitializeClients(); |
VLOG(1) << "DBusThreadManager initialized with test implementation"; |
} |
@@ -421,10 +370,11 @@ void DBusThreadManager::InitializeWithStub() { |
// If we initialize DBusThreadManager twice we may also be shutting it down |
// early; do not allow that. |
CHECK(g_dbus_thread_manager == NULL); |
- DBusThreadManagerImpl* dbus_thread_manager_impl = |
- new DBusThreadManagerImpl(STUB_DBUS_CLIENT_IMPLEMENTATION); |
- g_dbus_thread_manager = dbus_thread_manager_impl; |
- dbus_thread_manager_impl->InitializeClients(); |
+ FakeDBusThreadManager* fake_dbus_thread_manager = new FakeDBusThreadManager; |
+ SetStubClients(fake_dbus_thread_manager); |
+ g_dbus_thread_manager = fake_dbus_thread_manager; |
+ InitializeClients(); |
+ shill_stub_helper::SetupDefaultEnvironment(); |
VLOG(1) << "DBusThreadManager initialized with stub implementation"; |
} |
@@ -470,4 +420,55 @@ DBusThreadManager* DBusThreadManager::Get() { |
return g_dbus_thread_manager; |
} |
+// static |
+void DBusThreadManager::InitializeClients() { |
+ InitClient(g_dbus_thread_manager->GetBluetoothAdapterClient()); |
+ InitClient(g_dbus_thread_manager->GetBluetoothAgentManagerClient()); |
+ InitClient(g_dbus_thread_manager->GetBluetoothDeviceClient()); |
+ InitClient(g_dbus_thread_manager->GetBluetoothInputClient()); |
+ InitClient(g_dbus_thread_manager->GetBluetoothProfileManagerClient()); |
+ InitClient(g_dbus_thread_manager->GetCrasAudioClient()); |
+ InitClient(g_dbus_thread_manager->GetCrosDisksClient()); |
+ InitClient(g_dbus_thread_manager->GetCryptohomeClient()); |
+ InitClient(g_dbus_thread_manager->GetDebugDaemonClient()); |
+ InitClient(g_dbus_thread_manager->GetGsmSMSClient()); |
+ InitClient(g_dbus_thread_manager->GetImageBurnerClient()); |
+ InitClient(g_dbus_thread_manager->GetIntrospectableClient()); |
+ InitClient(g_dbus_thread_manager->GetModemMessagingClient()); |
+ // Initialize the NFC clients in the correct order. |
+ InitClient(g_dbus_thread_manager->GetNfcAdapterClient()); |
+ InitClient(g_dbus_thread_manager->GetNfcManagerClient()); |
+ InitClient(g_dbus_thread_manager->GetNfcDeviceClient()); |
+ InitClient(g_dbus_thread_manager->GetNfcTagClient()); |
+ InitClient(g_dbus_thread_manager->GetPermissionBrokerClient()); |
+ InitClient(g_dbus_thread_manager->GetPowerManagerClient()); |
+ InitClient(g_dbus_thread_manager->GetSessionManagerClient()); |
+ InitClient(g_dbus_thread_manager->GetShillDeviceClient()); |
+ InitClient(g_dbus_thread_manager->GetShillIPConfigClient()); |
+ InitClient(g_dbus_thread_manager->GetShillManagerClient()); |
+ InitClient(g_dbus_thread_manager->GetShillServiceClient()); |
+ InitClient(g_dbus_thread_manager->GetShillProfileClient()); |
+ InitClient(g_dbus_thread_manager->GetSMSClient()); |
+ InitClient(g_dbus_thread_manager->GetSystemClockClient()); |
+ InitClient(g_dbus_thread_manager->GetUpdateEngineClient()); |
+ |
+ // PowerPolicyController is dependent on PowerManagerClient, so |
+ // initialize it after the main list of clients. |
+ if (g_dbus_thread_manager->GetPowerPolicyController()) { |
+ g_dbus_thread_manager->GetPowerPolicyController()->Init( |
+ g_dbus_thread_manager); |
+ } |
+ |
+ // This must be called after the list of clients so they've each had a |
+ // chance to register with their object g_dbus_thread_managers. |
+ if (g_dbus_thread_manager->GetSystemBus()) |
+ g_dbus_thread_manager->GetSystemBus()->GetManagedObjects(); |
+} |
+ |
+// static |
+void DBusThreadManager::InitClient(DBusClient* client) { |
+ if (client) |
+ client->Init(g_dbus_thread_manager->GetSystemBus()); |
+} |
+ |
} // namespace chromeos |