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/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/observer_list.h" | 10 #include "base/observer_list.h" |
11 #include "base/sys_info.h" | 11 #include "base/sys_info.h" |
12 #include "base/threading/thread.h" | 12 #include "base/threading/thread.h" |
13 #include "chromeos/chromeos_switches.h" | 13 #include "chromeos/chromeos_switches.h" |
14 #include "chromeos/dbus/bluetooth_adapter_client.h" | 14 #include "chromeos/dbus/bluetooth_adapter_client.h" |
15 #include "chromeos/dbus/bluetooth_agent_manager_client.h" | 15 #include "chromeos/dbus/bluetooth_agent_manager_client.h" |
16 #include "chromeos/dbus/bluetooth_device_client.h" | 16 #include "chromeos/dbus/bluetooth_device_client.h" |
17 #include "chromeos/dbus/bluetooth_input_client.h" | 17 #include "chromeos/dbus/bluetooth_input_client.h" |
18 #include "chromeos/dbus/bluetooth_profile_manager_client.h" | 18 #include "chromeos/dbus/bluetooth_profile_manager_client.h" |
19 #include "chromeos/dbus/cras_audio_client.h" | 19 #include "chromeos/dbus/cras_audio_client.h" |
20 #include "chromeos/dbus/cros_disks_client.h" | 20 #include "chromeos/dbus/cros_disks_client.h" |
21 #include "chromeos/dbus/cryptohome_client.h" | 21 #include "chromeos/dbus/cryptohome_client.h" |
22 #include "chromeos/dbus/dbus_client_implementation_type.h" | 22 #include "chromeos/dbus/dbus_client_implementation_type.h" |
23 #include "chromeos/dbus/dbus_thread_manager_observer.h" | 23 #include "chromeos/dbus/dbus_thread_manager_observer.h" |
24 #include "chromeos/dbus/debug_daemon_client.h" | 24 #include "chromeos/dbus/debug_daemon_client.h" |
25 #include "chromeos/dbus/gsm_sms_client.h" | 25 #include "chromeos/dbus/gsm_sms_client.h" |
26 #include "chromeos/dbus/ibus/ibus_client.h" | 26 #include "chromeos/dbus/ibus/ibus_client.h" |
27 #include "chromeos/dbus/ibus/ibus_engine_factory_service.h" | |
28 #include "chromeos/dbus/ibus/ibus_engine_service.h" | |
29 #include "chromeos/dbus/image_burner_client.h" | 27 #include "chromeos/dbus/image_burner_client.h" |
30 #include "chromeos/dbus/introspectable_client.h" | 28 #include "chromeos/dbus/introspectable_client.h" |
31 #include "chromeos/dbus/modem_messaging_client.h" | 29 #include "chromeos/dbus/modem_messaging_client.h" |
32 #include "chromeos/dbus/nfc_adapter_client.h" | 30 #include "chromeos/dbus/nfc_adapter_client.h" |
33 #include "chromeos/dbus/nfc_device_client.h" | 31 #include "chromeos/dbus/nfc_device_client.h" |
34 #include "chromeos/dbus/nfc_manager_client.h" | 32 #include "chromeos/dbus/nfc_manager_client.h" |
35 #include "chromeos/dbus/nfc_tag_client.h" | 33 #include "chromeos/dbus/nfc_tag_client.h" |
36 #include "chromeos/dbus/permission_broker_client.h" | 34 #include "chromeos/dbus/permission_broker_client.h" |
37 #include "chromeos/dbus/power_manager_client.h" | 35 #include "chromeos/dbus/power_manager_client.h" |
38 #include "chromeos/dbus/power_policy_controller.h" | 36 #include "chromeos/dbus/power_policy_controller.h" |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 system_bus_->GetManagedObjects(); | 127 system_bus_->GetManagedObjects(); |
130 } | 128 } |
131 | 129 |
132 virtual ~DBusThreadManagerImpl() { | 130 virtual ~DBusThreadManagerImpl() { |
133 FOR_EACH_OBSERVER(DBusThreadManagerObserver, observers_, | 131 FOR_EACH_OBSERVER(DBusThreadManagerObserver, observers_, |
134 OnDBusThreadManagerDestroying(this)); | 132 OnDBusThreadManagerDestroying(this)); |
135 | 133 |
136 // Shut down the bus. During the browser shutdown, it's ok to shut down | 134 // Shut down the bus. During the browser shutdown, it's ok to shut down |
137 // the bus synchronously. | 135 // the bus synchronously. |
138 system_bus_->ShutdownOnDBusThreadAndBlock(); | 136 system_bus_->ShutdownOnDBusThreadAndBlock(); |
139 if (ibus_bus_.get()) | |
140 ibus_bus_->ShutdownOnDBusThreadAndBlock(); | |
141 | |
142 // Release IBusEngineService instances. | |
143 for (std::map<dbus::ObjectPath, IBusEngineService*>::iterator it | |
144 = ibus_engine_services_.begin(); | |
145 it != ibus_engine_services_.end(); it++) { | |
146 delete it->second; | |
147 } | |
148 | 137 |
149 // Stop the D-Bus thread. | 138 // Stop the D-Bus thread. |
150 dbus_thread_->Stop(); | 139 dbus_thread_->Stop(); |
151 } | 140 } |
152 | 141 |
153 // DBusThreadManager override. | 142 // DBusThreadManager override. |
154 virtual void AddObserver(DBusThreadManagerObserver* observer) OVERRIDE { | 143 virtual void AddObserver(DBusThreadManagerObserver* observer) OVERRIDE { |
155 DCHECK(observer); | 144 DCHECK(observer); |
156 observers_.AddObserver(observer); | 145 observers_.AddObserver(observer); |
157 } | 146 } |
158 | 147 |
159 // DBusThreadManager override. | 148 // DBusThreadManager override. |
160 virtual void RemoveObserver(DBusThreadManagerObserver* observer) OVERRIDE { | 149 virtual void RemoveObserver(DBusThreadManagerObserver* observer) OVERRIDE { |
161 DCHECK(observer); | 150 DCHECK(observer); |
162 observers_.RemoveObserver(observer); | 151 observers_.RemoveObserver(observer); |
163 } | 152 } |
164 | 153 |
165 // DBusThreadManager override. | 154 // DBusThreadManager override. |
166 virtual void InitIBusBus( | 155 virtual void InitIBusBus( |
167 const std::string &ibus_address, | 156 const std::string &ibus_address, |
168 const base::Closure& on_disconnected_callback) OVERRIDE { | 157 const base::Closure& on_disconnected_callback) OVERRIDE { |
169 DCHECK(!ibus_bus_.get()); | 158 ibus_client_.reset(IBusClient::Create()); |
170 dbus::Bus::Options ibus_bus_options; | |
171 ibus_bus_options.bus_type = dbus::Bus::CUSTOM_ADDRESS; | |
172 ibus_bus_options.address = ibus_address; | |
173 ibus_bus_options.connection_type = dbus::Bus::PRIVATE; | |
174 ibus_bus_options.dbus_task_runner = dbus_thread_->message_loop_proxy(); | |
175 ibus_bus_options.disconnected_callback = on_disconnected_callback; | |
176 ibus_bus_ = new dbus::Bus(ibus_bus_options); | |
177 ibus_address_ = ibus_address; | |
178 VLOG(1) << "Connected to ibus-daemon: " << ibus_address; | |
179 | |
180 DBusClientImplementationType client_type = STUB_DBUS_CLIENT_IMPLEMENTATION; | |
181 | |
182 ibus_client_.reset( | |
183 IBusClient::Create(client_type, ibus_bus_.get())); | |
184 ibus_engine_factory_service_.reset( | |
185 IBusEngineFactoryService::Create(ibus_bus_.get(), client_type)); | |
186 | |
187 ibus_engine_services_.clear(); | |
188 } | 159 } |
189 | 160 |
190 // DBusThreadManager overrides: | 161 // DBusThreadManager overrides: |
191 virtual dbus::Bus* GetSystemBus() OVERRIDE { | 162 virtual dbus::Bus* GetSystemBus() OVERRIDE { |
192 return system_bus_.get(); | 163 return system_bus_.get(); |
193 } | 164 } |
194 | 165 |
195 virtual dbus::Bus* GetIBusBus() OVERRIDE { | |
196 return ibus_bus_.get(); | |
197 } | |
198 | |
199 virtual BluetoothAdapterClient* GetBluetoothAdapterClient() OVERRIDE { | 166 virtual BluetoothAdapterClient* GetBluetoothAdapterClient() OVERRIDE { |
200 return bluetooth_adapter_client_.get(); | 167 return bluetooth_adapter_client_.get(); |
201 } | 168 } |
202 | 169 |
203 virtual BluetoothAgentManagerClient* GetBluetoothAgentManagerClient() | 170 virtual BluetoothAgentManagerClient* GetBluetoothAgentManagerClient() |
204 OVERRIDE { | 171 OVERRIDE { |
205 return bluetooth_agent_manager_client_.get(); | 172 return bluetooth_agent_manager_client_.get(); |
206 } | 173 } |
207 | 174 |
208 virtual BluetoothDeviceClient* GetBluetoothDeviceClient() OVERRIDE { | 175 virtual BluetoothDeviceClient* GetBluetoothDeviceClient() OVERRIDE { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 } | 278 } |
312 | 279 |
313 virtual UpdateEngineClient* GetUpdateEngineClient() OVERRIDE { | 280 virtual UpdateEngineClient* GetUpdateEngineClient() OVERRIDE { |
314 return update_engine_client_.get(); | 281 return update_engine_client_.get(); |
315 } | 282 } |
316 | 283 |
317 virtual IBusClient* GetIBusClient() OVERRIDE { | 284 virtual IBusClient* GetIBusClient() OVERRIDE { |
318 return ibus_client_.get(); | 285 return ibus_client_.get(); |
319 } | 286 } |
320 | 287 |
321 virtual IBusEngineFactoryService* GetIBusEngineFactoryService() OVERRIDE { | |
322 return ibus_engine_factory_service_.get(); | |
323 } | |
324 | |
325 virtual IBusEngineService* GetIBusEngineService( | |
326 const dbus::ObjectPath& object_path) OVERRIDE { | |
327 if (ibus_engine_services_.find(object_path) | |
328 == ibus_engine_services_.end()) { | |
329 ibus_engine_services_[object_path] = IBusEngineService::Create(); | |
330 } | |
331 return ibus_engine_services_[object_path]; | |
332 } | |
333 | |
334 virtual void RemoveIBusEngineService( | |
335 const dbus::ObjectPath& object_path) OVERRIDE { | |
336 if (ibus_engine_services_.find(object_path) != | |
337 ibus_engine_services_.end()) { | |
338 LOG(WARNING) << "Object path not found: " << object_path.value(); | |
339 return; | |
340 } | |
341 delete ibus_engine_services_[object_path]; | |
342 ibus_engine_services_.erase(object_path); | |
343 } | |
344 | |
345 private: | 288 private: |
346 // Initializes |client| with the |system_bus_|. | 289 // Initializes |client| with the |system_bus_|. |
347 void InitClient(DBusClient* client) { | 290 void InitClient(DBusClient* client) { |
348 client->Init(system_bus_.get()); | 291 client->Init(system_bus_.get()); |
349 } | 292 } |
350 | 293 |
351 // Constructs all clients -- stub or real implementation according to | 294 // Constructs all clients -- stub or real implementation according to |
352 // |client_type| and |client_type_override| -- and stores them in the | 295 // |client_type| and |client_type_override| -- and stores them in the |
353 // respective *_client_ member variable. | 296 // respective *_client_ member variable. |
354 void CreateDefaultClients(DBusClientImplementationType client_type, | 297 void CreateDefaultClients(DBusClientImplementationType client_type, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 system_clock_client_.reset(SystemClockClient::Create(client_type)); | 339 system_clock_client_.reset(SystemClockClient::Create(client_type)); |
397 update_engine_client_.reset(UpdateEngineClient::Create(client_type)); | 340 update_engine_client_.reset(UpdateEngineClient::Create(client_type)); |
398 } | 341 } |
399 | 342 |
400 // Note: Keep this before other members so they can call AddObserver() in | 343 // Note: Keep this before other members so they can call AddObserver() in |
401 // their c'tors. | 344 // their c'tors. |
402 ObserverList<DBusThreadManagerObserver> observers_; | 345 ObserverList<DBusThreadManagerObserver> observers_; |
403 | 346 |
404 scoped_ptr<base::Thread> dbus_thread_; | 347 scoped_ptr<base::Thread> dbus_thread_; |
405 scoped_refptr<dbus::Bus> system_bus_; | 348 scoped_refptr<dbus::Bus> system_bus_; |
406 scoped_refptr<dbus::Bus> ibus_bus_; | |
407 scoped_ptr<BluetoothAdapterClient> bluetooth_adapter_client_; | 349 scoped_ptr<BluetoothAdapterClient> bluetooth_adapter_client_; |
408 scoped_ptr<BluetoothAgentManagerClient> bluetooth_agent_manager_client_; | 350 scoped_ptr<BluetoothAgentManagerClient> bluetooth_agent_manager_client_; |
409 scoped_ptr<BluetoothDeviceClient> bluetooth_device_client_; | 351 scoped_ptr<BluetoothDeviceClient> bluetooth_device_client_; |
410 scoped_ptr<BluetoothInputClient> bluetooth_input_client_; | 352 scoped_ptr<BluetoothInputClient> bluetooth_input_client_; |
411 scoped_ptr<BluetoothProfileManagerClient> bluetooth_profile_manager_client_; | 353 scoped_ptr<BluetoothProfileManagerClient> bluetooth_profile_manager_client_; |
412 scoped_ptr<CrasAudioClient> cras_audio_client_; | 354 scoped_ptr<CrasAudioClient> cras_audio_client_; |
413 scoped_ptr<CrosDisksClient> cros_disks_client_; | 355 scoped_ptr<CrosDisksClient> cros_disks_client_; |
414 scoped_ptr<CryptohomeClient> cryptohome_client_; | 356 scoped_ptr<CryptohomeClient> cryptohome_client_; |
415 scoped_ptr<DebugDaemonClient> debug_daemon_client_; | 357 scoped_ptr<DebugDaemonClient> debug_daemon_client_; |
416 scoped_ptr<ShillDeviceClient> shill_device_client_; | 358 scoped_ptr<ShillDeviceClient> shill_device_client_; |
(...skipping 11 matching lines...) Expand all Loading... |
428 scoped_ptr<NfcAdapterClient> nfc_adapter_client_; | 370 scoped_ptr<NfcAdapterClient> nfc_adapter_client_; |
429 scoped_ptr<NfcDeviceClient> nfc_device_client_; | 371 scoped_ptr<NfcDeviceClient> nfc_device_client_; |
430 scoped_ptr<NfcTagClient> nfc_tag_client_; | 372 scoped_ptr<NfcTagClient> nfc_tag_client_; |
431 scoped_ptr<PermissionBrokerClient> permission_broker_client_; | 373 scoped_ptr<PermissionBrokerClient> permission_broker_client_; |
432 scoped_ptr<SystemClockClient> system_clock_client_; | 374 scoped_ptr<SystemClockClient> system_clock_client_; |
433 scoped_ptr<PowerManagerClient> power_manager_client_; | 375 scoped_ptr<PowerManagerClient> power_manager_client_; |
434 scoped_ptr<SessionManagerClient> session_manager_client_; | 376 scoped_ptr<SessionManagerClient> session_manager_client_; |
435 scoped_ptr<SMSClient> sms_client_; | 377 scoped_ptr<SMSClient> sms_client_; |
436 scoped_ptr<UpdateEngineClient> update_engine_client_; | 378 scoped_ptr<UpdateEngineClient> update_engine_client_; |
437 scoped_ptr<IBusClient> ibus_client_; | 379 scoped_ptr<IBusClient> ibus_client_; |
438 scoped_ptr<IBusEngineFactoryService> ibus_engine_factory_service_; | |
439 std::map<dbus::ObjectPath, IBusEngineService*> ibus_engine_services_; | |
440 scoped_ptr<PowerPolicyController> power_policy_controller_; | 380 scoped_ptr<PowerPolicyController> power_policy_controller_; |
441 | 381 |
442 std::string ibus_address_; | |
443 }; | 382 }; |
444 | 383 |
445 // static | 384 // static |
446 void DBusThreadManager::Initialize() { | 385 void DBusThreadManager::Initialize() { |
447 // Ignore Initialize() if we set a test DBusThreadManager. | 386 // Ignore Initialize() if we set a test DBusThreadManager. |
448 if (g_dbus_thread_manager_set_for_testing) | 387 if (g_dbus_thread_manager_set_for_testing) |
449 return; | 388 return; |
450 // If we initialize DBusThreadManager twice we may also be shutting it down | 389 // If we initialize DBusThreadManager twice we may also be shutting it down |
451 // early; do not allow that. | 390 // early; do not allow that. |
452 CHECK(g_dbus_thread_manager == NULL); | 391 CHECK(g_dbus_thread_manager == NULL); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 } | 464 } |
526 | 465 |
527 // static | 466 // static |
528 DBusThreadManager* DBusThreadManager::Get() { | 467 DBusThreadManager* DBusThreadManager::Get() { |
529 CHECK(g_dbus_thread_manager) | 468 CHECK(g_dbus_thread_manager) |
530 << "DBusThreadManager::Get() called before Initialize()"; | 469 << "DBusThreadManager::Get() called before Initialize()"; |
531 return g_dbus_thread_manager; | 470 return g_dbus_thread_manager; |
532 } | 471 } |
533 | 472 |
534 } // namespace chromeos | 473 } // namespace chromeos |
OLD | NEW |