| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromeos/dbus/dbus_thread_manager.h" | 5 #include "chromeos/dbus/dbus_thread_manager.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/chromeos/chromeos_version.h" | 9 #include "base/chromeos/chromeos_version.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 #include "dbus/dbus_statistics.h" | 47 #include "dbus/dbus_statistics.h" |
| 48 | 48 |
| 49 namespace chromeos { | 49 namespace chromeos { |
| 50 | 50 |
| 51 static DBusThreadManager* g_dbus_thread_manager = NULL; | 51 static DBusThreadManager* g_dbus_thread_manager = NULL; |
| 52 static bool g_dbus_thread_manager_set_for_testing = false; | 52 static bool g_dbus_thread_manager_set_for_testing = false; |
| 53 | 53 |
| 54 // The DBusThreadManager implementation used in production. | 54 // The DBusThreadManager implementation used in production. |
| 55 class DBusThreadManagerImpl : public DBusThreadManager { | 55 class DBusThreadManagerImpl : public DBusThreadManager { |
| 56 public: | 56 public: |
| 57 explicit DBusThreadManagerImpl(DBusClientImplementationType client_type) { | 57 explicit DBusThreadManagerImpl(DBusClientImplementationType client_type) |
| 58 : client_type_(client_type), |
| 59 client_type_override_(client_type) { |
| 58 // If --dbus-stub was requested, pass STUB to specific components; | 60 // If --dbus-stub was requested, pass STUB to specific components; |
| 59 // Many components like login are not useful with a stub implementation. | 61 // Many components like login are not useful with a stub implementation. |
| 60 DBusClientImplementationType client_type_maybe_stub = client_type; | |
| 61 if (CommandLine::ForCurrentProcess()->HasSwitch( | 62 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 62 chromeos::switches::kDbusStub)) | 63 chromeos::switches::kDbusStub)) { |
| 63 client_type_maybe_stub = STUB_DBUS_CLIENT_IMPLEMENTATION; | 64 client_type_override_ = STUB_DBUS_CLIENT_IMPLEMENTATION; |
| 65 } |
| 64 | 66 |
| 65 // Create the D-Bus thread. | 67 // Create the D-Bus thread. |
| 66 base::Thread::Options thread_options; | 68 base::Thread::Options thread_options; |
| 67 thread_options.message_loop_type = MessageLoop::TYPE_IO; | 69 thread_options.message_loop_type = MessageLoop::TYPE_IO; |
| 68 dbus_thread_.reset(new base::Thread("D-Bus thread")); | 70 dbus_thread_.reset(new base::Thread("D-Bus thread")); |
| 69 dbus_thread_->StartWithOptions(thread_options); | 71 dbus_thread_->StartWithOptions(thread_options); |
| 70 | 72 |
| 71 // Create the connection to the system bus. | 73 // Create the connection to the system bus. |
| 72 dbus::Bus::Options system_bus_options; | 74 dbus::Bus::Options system_bus_options; |
| 73 system_bus_options.bus_type = dbus::Bus::SYSTEM; | 75 system_bus_options.bus_type = dbus::Bus::SYSTEM; |
| 74 system_bus_options.connection_type = dbus::Bus::PRIVATE; | 76 system_bus_options.connection_type = dbus::Bus::PRIVATE; |
| 75 system_bus_options.dbus_task_runner = dbus_thread_->message_loop_proxy(); | 77 system_bus_options.dbus_task_runner = dbus_thread_->message_loop_proxy(); |
| 76 system_bus_ = new dbus::Bus(system_bus_options); | 78 system_bus_ = new dbus::Bus(system_bus_options); |
| 79 } |
| 77 | 80 |
| 81 // InitializeClients gets called after g_dbus_thread_manager is set. |
| 82 // NOTE: Clients that access other clients in their constructor must be |
| 83 // construced in the correct order. |
| 84 void InitializeClients() { |
| 78 bluetooth_manager_client_.reset(BluetoothManagerClient::Create( | 85 bluetooth_manager_client_.reset(BluetoothManagerClient::Create( |
| 79 client_type, system_bus_.get())); | 86 client_type_, system_bus_.get())); |
| 80 bluetooth_adapter_client_.reset(BluetoothAdapterClient::Create( | 87 bluetooth_adapter_client_.reset(BluetoothAdapterClient::Create( |
| 81 client_type, system_bus_.get(), bluetooth_manager_client_.get())); | 88 client_type_, system_bus_.get(), bluetooth_manager_client_.get())); |
| 82 bluetooth_device_client_.reset(BluetoothDeviceClient::Create( | 89 bluetooth_device_client_.reset(BluetoothDeviceClient::Create( |
| 83 client_type, system_bus_.get(), bluetooth_adapter_client_.get())); | 90 client_type_, system_bus_.get(), bluetooth_adapter_client_.get())); |
| 84 bluetooth_input_client_.reset(BluetoothInputClient::Create( | 91 bluetooth_input_client_.reset(BluetoothInputClient::Create( |
| 85 client_type, system_bus_.get(), bluetooth_adapter_client_.get())); | 92 client_type_, system_bus_.get(), bluetooth_adapter_client_.get())); |
| 86 bluetooth_node_client_.reset(BluetoothNodeClient::Create( | 93 bluetooth_node_client_.reset(BluetoothNodeClient::Create( |
| 87 client_type, system_bus_.get(), bluetooth_device_client_.get())); | 94 client_type_, system_bus_.get(), bluetooth_device_client_.get())); |
| 88 bluetooth_out_of_band_client_.reset(BluetoothOutOfBandClient::Create( | 95 bluetooth_out_of_band_client_.reset(BluetoothOutOfBandClient::Create( |
| 89 client_type, system_bus_.get())); | 96 client_type_, system_bus_.get())); |
| 90 cros_disks_client_.reset( | 97 cros_disks_client_.reset( |
| 91 CrosDisksClient::Create(client_type, system_bus_.get())); | 98 CrosDisksClient::Create(client_type_, system_bus_.get())); |
| 92 cryptohome_client_.reset( | 99 cryptohome_client_.reset( |
| 93 CryptohomeClient::Create(client_type, system_bus_.get())); | 100 CryptohomeClient::Create(client_type_, system_bus_.get())); |
| 94 debug_daemon_client_.reset( | 101 debug_daemon_client_.reset( |
| 95 DebugDaemonClient::Create(client_type, system_bus_.get())); | 102 DebugDaemonClient::Create(client_type_, system_bus_.get())); |
| 103 |
| 104 shill_manager_client_.reset( |
| 105 ShillManagerClient::Create(client_type_override_, system_bus_.get())); |
| 96 shill_device_client_.reset( | 106 shill_device_client_.reset( |
| 97 ShillDeviceClient::Create(client_type, system_bus_.get())); | 107 ShillDeviceClient::Create(client_type_override_, system_bus_.get())); |
| 98 shill_ipconfig_client_.reset( | 108 shill_ipconfig_client_.reset( |
| 99 ShillIPConfigClient::Create(client_type, system_bus_.get())); | 109 ShillIPConfigClient::Create(client_type_override_, system_bus_.get())); |
| 100 shill_manager_client_.reset( | |
| 101 ShillManagerClient::Create(client_type, system_bus_.get())); | |
| 102 shill_profile_client_.reset( | 110 shill_profile_client_.reset( |
| 103 ShillProfileClient::Create(client_type, system_bus_.get())); | 111 ShillProfileClient::Create(client_type_override_, system_bus_.get())); |
| 104 shill_service_client_.reset( | 112 shill_service_client_.reset( |
| 105 ShillServiceClient::Create(client_type, system_bus_.get())); | 113 ShillServiceClient::Create(client_type_override_, system_bus_.get())); |
| 106 gsm_sms_client_.reset( | 114 gsm_sms_client_.reset( |
| 107 GsmSMSClient::Create(client_type, system_bus_.get())); | 115 GsmSMSClient::Create(client_type_override_, system_bus_.get())); |
| 108 image_burner_client_.reset(ImageBurnerClient::Create(client_type, | 116 |
| 117 image_burner_client_.reset(ImageBurnerClient::Create(client_type_, |
| 109 system_bus_.get())); | 118 system_bus_.get())); |
| 110 introspectable_client_.reset( | 119 introspectable_client_.reset( |
| 111 IntrospectableClient::Create(client_type, system_bus_.get())); | 120 IntrospectableClient::Create(client_type_, system_bus_.get())); |
| 112 modem_messaging_client_.reset( | 121 modem_messaging_client_.reset( |
| 113 ModemMessagingClient::Create(client_type, system_bus_.get())); | 122 ModemMessagingClient::Create(client_type_, system_bus_.get())); |
| 114 permission_broker_client_.reset( | 123 permission_broker_client_.reset( |
| 115 PermissionBrokerClient::Create(client_type, system_bus_.get())); | 124 PermissionBrokerClient::Create(client_type_, system_bus_.get())); |
| 116 power_manager_client_.reset( | 125 power_manager_client_.reset( |
| 117 PowerManagerClient::Create(client_type_maybe_stub, system_bus_.get())); | 126 PowerManagerClient::Create(client_type_override_, system_bus_.get())); |
| 118 session_manager_client_.reset( | 127 session_manager_client_.reset( |
| 119 SessionManagerClient::Create(client_type, system_bus_.get())); | 128 SessionManagerClient::Create(client_type_, system_bus_.get())); |
| 120 sms_client_.reset( | 129 sms_client_.reset( |
| 121 SMSClient::Create(client_type, system_bus_.get())); | 130 SMSClient::Create(client_type_, system_bus_.get())); |
| 122 update_engine_client_.reset( | 131 update_engine_client_.reset( |
| 123 UpdateEngineClient::Create(client_type, system_bus_.get())); | 132 UpdateEngineClient::Create(client_type_, system_bus_.get())); |
| 124 | 133 |
| 125 // PowerPolicyController is dependent on PowerManagerClient, so | 134 // PowerPolicyController is dependent on PowerManagerClient, so |
| 126 // initialize it after the main list of clients. | 135 // initialize it after the main list of clients. |
| 127 power_policy_controller_.reset( | 136 power_policy_controller_.reset( |
| 128 new PowerPolicyController(this, power_manager_client_.get())); | 137 new PowerPolicyController(this, power_manager_client_.get())); |
| 129 } | 138 } |
| 130 | 139 |
| 131 virtual ~DBusThreadManagerImpl() { | 140 virtual ~DBusThreadManagerImpl() { |
| 132 FOR_EACH_OBSERVER(DBusThreadManagerObserver, observers_, | 141 FOR_EACH_OBSERVER(DBusThreadManagerObserver, observers_, |
| 133 OnDBusThreadManagerDestroying(this)); | 142 OnDBusThreadManagerDestroying(this)); |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 return; | 348 return; |
| 340 } | 349 } |
| 341 delete ibus_engine_services_[object_path]; | 350 delete ibus_engine_services_[object_path]; |
| 342 ibus_engine_services_.erase(object_path); | 351 ibus_engine_services_.erase(object_path); |
| 343 } | 352 } |
| 344 | 353 |
| 345 virtual IBusPanelService* GetIBusPanelService() OVERRIDE { | 354 virtual IBusPanelService* GetIBusPanelService() OVERRIDE { |
| 346 return ibus_panel_service_.get(); | 355 return ibus_panel_service_.get(); |
| 347 } | 356 } |
| 348 | 357 |
| 358 DBusClientImplementationType client_type_; |
| 359 DBusClientImplementationType client_type_override_; |
| 360 |
| 349 // Note: Keep this before other members so they can call AddObserver() in | 361 // Note: Keep this before other members so they can call AddObserver() in |
| 350 // their c'tors. | 362 // their c'tors. |
| 351 ObserverList<DBusThreadManagerObserver> observers_; | 363 ObserverList<DBusThreadManagerObserver> observers_; |
| 352 | 364 |
| 353 scoped_ptr<base::Thread> dbus_thread_; | 365 scoped_ptr<base::Thread> dbus_thread_; |
| 354 scoped_refptr<dbus::Bus> system_bus_; | 366 scoped_refptr<dbus::Bus> system_bus_; |
| 355 scoped_refptr<dbus::Bus> ibus_bus_; | 367 scoped_refptr<dbus::Bus> ibus_bus_; |
| 356 scoped_ptr<BluetoothAdapterClient> bluetooth_adapter_client_; | 368 scoped_ptr<BluetoothAdapterClient> bluetooth_adapter_client_; |
| 357 scoped_ptr<BluetoothDeviceClient> bluetooth_device_client_; | 369 scoped_ptr<BluetoothDeviceClient> bluetooth_device_client_; |
| 358 scoped_ptr<BluetoothInputClient> bluetooth_input_client_; | 370 scoped_ptr<BluetoothInputClient> bluetooth_input_client_; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 389 | 401 |
| 390 // static | 402 // static |
| 391 void DBusThreadManager::Initialize() { | 403 void DBusThreadManager::Initialize() { |
| 392 // Ignore Initialize() if we set a test DBusThreadManager. | 404 // Ignore Initialize() if we set a test DBusThreadManager. |
| 393 if (g_dbus_thread_manager_set_for_testing) | 405 if (g_dbus_thread_manager_set_for_testing) |
| 394 return; | 406 return; |
| 395 // If we initialize DBusThreadManager twice we may also be shutting it down | 407 // If we initialize DBusThreadManager twice we may also be shutting it down |
| 396 // early; do not allow that. | 408 // early; do not allow that. |
| 397 CHECK(g_dbus_thread_manager == NULL); | 409 CHECK(g_dbus_thread_manager == NULL); |
| 398 // Determine whether we use stub or real client implementations. | 410 // Determine whether we use stub or real client implementations. |
| 411 DBusThreadManagerImpl* dbus_thread_manager_impl; |
| 399 if (base::chromeos::IsRunningOnChromeOS()) { | 412 if (base::chromeos::IsRunningOnChromeOS()) { |
| 400 g_dbus_thread_manager = | 413 dbus_thread_manager_impl = |
| 401 new DBusThreadManagerImpl(REAL_DBUS_CLIENT_IMPLEMENTATION); | 414 new DBusThreadManagerImpl(REAL_DBUS_CLIENT_IMPLEMENTATION); |
| 402 VLOG(1) << "DBusThreadManager initialized for ChromeOS"; | 415 VLOG(1) << "DBusThreadManager initialized for ChromeOS"; |
| 403 } else { | 416 } else { |
| 404 g_dbus_thread_manager = | 417 dbus_thread_manager_impl = |
| 405 new DBusThreadManagerImpl(STUB_DBUS_CLIENT_IMPLEMENTATION); | 418 new DBusThreadManagerImpl(STUB_DBUS_CLIENT_IMPLEMENTATION); |
| 406 VLOG(1) << "DBusThreadManager initialized with Stub"; | 419 VLOG(1) << "DBusThreadManager initialized with Stub"; |
| 407 } | 420 } |
| 421 g_dbus_thread_manager = dbus_thread_manager_impl; |
| 422 dbus_thread_manager_impl->InitializeClients(); |
| 408 } | 423 } |
| 409 | 424 |
| 410 // static | 425 // static |
| 411 void DBusThreadManager::InitializeForTesting( | 426 void DBusThreadManager::InitializeForTesting( |
| 412 DBusThreadManager* dbus_thread_manager) { | 427 DBusThreadManager* dbus_thread_manager) { |
| 413 // If we initialize DBusThreadManager twice we may also be shutting it down | 428 // If we initialize DBusThreadManager twice we may also be shutting it down |
| 414 // early; do not allow that. | 429 // early; do not allow that. |
| 415 CHECK(g_dbus_thread_manager == NULL); | 430 CHECK(g_dbus_thread_manager == NULL); |
| 416 CHECK(dbus_thread_manager); | 431 CHECK(dbus_thread_manager); |
| 417 g_dbus_thread_manager = dbus_thread_manager; | 432 g_dbus_thread_manager = dbus_thread_manager; |
| 418 g_dbus_thread_manager_set_for_testing = true; | 433 g_dbus_thread_manager_set_for_testing = true; |
| 419 VLOG(1) << "DBusThreadManager initialized with test implementation"; | 434 VLOG(1) << "DBusThreadManager initialized with test implementation"; |
| 420 } | 435 } |
| 421 | 436 |
| 422 // static | 437 // static |
| 423 void DBusThreadManager::InitializeWithStub() { | 438 void DBusThreadManager::InitializeWithStub() { |
| 424 // If we initialize DBusThreadManager twice we may also be shutting it down | 439 // If we initialize DBusThreadManager twice we may also be shutting it down |
| 425 // early; do not allow that. | 440 // early; do not allow that. |
| 426 CHECK(g_dbus_thread_manager == NULL); | 441 CHECK(g_dbus_thread_manager == NULL); |
| 427 g_dbus_thread_manager = | 442 DBusThreadManagerImpl* dbus_thread_manager_impl = |
| 428 new DBusThreadManagerImpl(STUB_DBUS_CLIENT_IMPLEMENTATION); | 443 new DBusThreadManagerImpl(STUB_DBUS_CLIENT_IMPLEMENTATION); |
| 444 g_dbus_thread_manager = dbus_thread_manager_impl; |
| 445 dbus_thread_manager_impl->InitializeClients(); |
| 429 VLOG(1) << "DBusThreadManager initialized with stub implementation"; | 446 VLOG(1) << "DBusThreadManager initialized with stub implementation"; |
| 430 } | 447 } |
| 431 | 448 |
| 432 // static | 449 // static |
| 433 bool DBusThreadManager::IsInitialized() { | 450 bool DBusThreadManager::IsInitialized() { |
| 434 return g_dbus_thread_manager != NULL; | 451 return g_dbus_thread_manager != NULL; |
| 435 } | 452 } |
| 436 | 453 |
| 437 // static | 454 // static |
| 438 void DBusThreadManager::Shutdown() { | 455 void DBusThreadManager::Shutdown() { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 453 } | 470 } |
| 454 | 471 |
| 455 // static | 472 // static |
| 456 DBusThreadManager* DBusThreadManager::Get() { | 473 DBusThreadManager* DBusThreadManager::Get() { |
| 457 CHECK(g_dbus_thread_manager) | 474 CHECK(g_dbus_thread_manager) |
| 458 << "DBusThreadManager::Get() called before Initialize()"; | 475 << "DBusThreadManager::Get() called before Initialize()"; |
| 459 return g_dbus_thread_manager; | 476 return g_dbus_thread_manager; |
| 460 } | 477 } |
| 461 | 478 |
| 462 } // namespace chromeos | 479 } // namespace chromeos |
| OLD | NEW |