summaryrefslogtreecommitdiffstats
path: root/chromeos/dbus/dbus_thread_manager.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromeos/dbus/dbus_thread_manager.cc')
-rw-r--r--chromeos/dbus/dbus_thread_manager.cc279
1 files changed, 279 insertions, 0 deletions
diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc
new file mode 100644
index 0000000..79ba37d
--- /dev/null
+++ b/chromeos/dbus/dbus_thread_manager.cc
@@ -0,0 +1,279 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/dbus/dbus_thread_manager.h"
+
+#include "base/chromeos/chromeos_version.h"
+#include "base/threading/thread.h"
+#include "chromeos/dbus/bluetooth_adapter_client.h"
+#include "chromeos/dbus/bluetooth_device_client.h"
+#include "chromeos/dbus/bluetooth_input_client.h"
+#include "chromeos/dbus/bluetooth_manager_client.h"
+#include "chromeos/dbus/bluetooth_node_client.h"
+#include "chromeos/dbus/cashew_client.h"
+#include "chromeos/dbus/cros_disks_client.h"
+#include "chromeos/dbus/cryptohome_client.h"
+#include "chromeos/dbus/dbus_client_implementation_type.h"
+#include "chromeos/dbus/debug_daemon_client.h"
+#include "chromeos/dbus/flimflam_ipconfig_client.h"
+#include "chromeos/dbus/flimflam_network_client.h"
+#include "chromeos/dbus/flimflam_profile_client.h"
+#include "chromeos/dbus/image_burner_client.h"
+#include "chromeos/dbus/introspectable_client.h"
+#include "chromeos/dbus/power_manager_client.h"
+#include "chromeos/dbus/session_manager_client.h"
+#include "chromeos/dbus/speech_synthesizer_client.h"
+#include "chromeos/dbus/update_engine_client.h"
+#include "dbus/bus.h"
+
+namespace chromeos {
+
+static DBusThreadManager* g_dbus_thread_manager = NULL;
+
+// The DBusThreadManager implementation used in production.
+class DBusThreadManagerImpl : public DBusThreadManager {
+ public:
+ DBusThreadManagerImpl() {
+ // Create the D-Bus thread.
+ base::Thread::Options thread_options;
+ thread_options.message_loop_type = MessageLoop::TYPE_IO;
+ dbus_thread_.reset(new base::Thread("D-Bus thread"));
+ dbus_thread_->StartWithOptions(thread_options);
+
+ // Create the connection to the system bus.
+ dbus::Bus::Options system_bus_options;
+ system_bus_options.bus_type = dbus::Bus::SYSTEM;
+ system_bus_options.connection_type = dbus::Bus::PRIVATE;
+ system_bus_options.dbus_thread_message_loop_proxy =
+ dbus_thread_->message_loop_proxy();
+ system_bus_ = new dbus::Bus(system_bus_options);
+
+ // Determine whether we use stub or real client implementations.
+ const DBusClientImplementationType client_type =
+ base::chromeos::IsRunningOnChromeOS() ?
+ REAL_DBUS_CLIENT_IMPLEMENTATION : STUB_DBUS_CLIENT_IMPLEMENTATION;
+
+ // Create the bluetooth clients.
+ bluetooth_manager_client_.reset(BluetoothManagerClient::Create(
+ client_type, system_bus_.get()));
+ bluetooth_adapter_client_.reset(BluetoothAdapterClient::Create(
+ client_type, system_bus_.get(), bluetooth_manager_client_.get()));
+ bluetooth_device_client_.reset(BluetoothDeviceClient::Create(
+ client_type, system_bus_.get(), bluetooth_adapter_client_.get()));
+ bluetooth_input_client_.reset(BluetoothInputClient::Create(
+ client_type, system_bus_.get(), bluetooth_adapter_client_.get()));
+ bluetooth_node_client_.reset(BluetoothNodeClient::Create(
+ client_type, system_bus_.get(), bluetooth_device_client_.get()));
+ // Create the Cashew client.
+ cashew_client_.reset(CashewClient::Create(client_type, system_bus_.get()));
+ // Create the cros-disks client.
+ cros_disks_client_.reset(
+ CrosDisksClient::Create(client_type, system_bus_.get()));
+ // Create the Cryptohome client.
+ cryptohome_client_.reset(
+ CryptohomeClient::Create(client_type, system_bus_.get()));
+ // Create the debugdaemon client.
+ debugdaemon_client_.reset(
+ DebugDaemonClient::Create(client_type, system_bus_.get()));
+ // Create the Flimflam IPConfig client.
+ flimflam_ipconfig_client_.reset(
+ FlimflamIPConfigClient::Create(client_type, system_bus_.get()));
+ // Create the Flimflam Network client.
+ flimflam_network_client_.reset(
+ FlimflamNetworkClient::Create(client_type, system_bus_.get()));
+ // Create the Flimflam Profile client.
+ flimflam_profile_client_.reset(
+ FlimflamProfileClient::Create(client_type, system_bus_.get()));
+ // Create the image burner client.
+ image_burner_client_.reset(ImageBurnerClient::Create(client_type,
+ system_bus_.get()));
+ // Create the introspectable object client.
+ introspectable_client_.reset(
+ IntrospectableClient::Create(client_type, system_bus_.get()));
+ // Create the power manager client.
+ power_manager_client_.reset(PowerManagerClient::Create(client_type,
+ system_bus_.get()));
+ // Create the session manager client.
+ session_manager_client_.reset(
+ SessionManagerClient::Create(client_type, system_bus_.get()));
+ // Create the speech synthesizer client.
+ speech_synthesizer_client_.reset(
+ SpeechSynthesizerClient::Create(client_type, system_bus_.get()));
+ // Create the update engine client.
+ update_engine_client_.reset(
+ UpdateEngineClient::Create(client_type, system_bus_.get()));
+ }
+
+ virtual ~DBusThreadManagerImpl() {
+ // Shut down the bus. During the browser shutdown, it's ok to shut down
+ // the bus synchronously.
+ system_bus_->ShutdownOnDBusThreadAndBlock();
+
+ // Stop the D-Bus thread.
+ dbus_thread_->Stop();
+ }
+
+ // DBusThreadManager override.
+ virtual dbus::Bus* GetSystemBus() OVERRIDE {
+ return system_bus_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual BluetoothAdapterClient* GetBluetoothAdapterClient() OVERRIDE {
+ return bluetooth_adapter_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual BluetoothDeviceClient* GetBluetoothDeviceClient() OVERRIDE {
+ return bluetooth_device_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual BluetoothInputClient* GetBluetoothInputClient() OVERRIDE {
+ return bluetooth_input_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual BluetoothManagerClient* GetBluetoothManagerClient() OVERRIDE {
+ return bluetooth_manager_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual BluetoothNodeClient* GetBluetoothNodeClient() OVERRIDE {
+ return bluetooth_node_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual CashewClient* GetCashewClient() OVERRIDE {
+ return cashew_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual CrosDisksClient* GetCrosDisksClient() OVERRIDE {
+ return cros_disks_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual CryptohomeClient* GetCryptohomeClient() OVERRIDE {
+ return cryptohome_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual DebugDaemonClient* GetDebugDaemonClient() OVERRIDE {
+ return debugdaemon_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual FlimflamIPConfigClient* GetFlimflamIPConfigClient() OVERRIDE {
+ return flimflam_ipconfig_client_.get();
+ }
+
+ virtual FlimflamNetworkClient* GetFlimflamNetworkClient() OVERRIDE {
+ return flimflam_network_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual FlimflamProfileClient* GetFlimflamProfileClient() OVERRIDE {
+ return flimflam_profile_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual ImageBurnerClient* GetImageBurnerClient() OVERRIDE {
+ return image_burner_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual IntrospectableClient* GetIntrospectableClient() OVERRIDE {
+ return introspectable_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual PowerManagerClient* GetPowerManagerClient() OVERRIDE {
+ return power_manager_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual SessionManagerClient* GetSessionManagerClient() OVERRIDE {
+ return session_manager_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual SpeechSynthesizerClient* GetSpeechSynthesizerClient() OVERRIDE {
+ return speech_synthesizer_client_.get();
+ }
+
+ // DBusThreadManager override.
+ virtual UpdateEngineClient* GetUpdateEngineClient() OVERRIDE {
+ return update_engine_client_.get();
+ }
+
+ scoped_ptr<base::Thread> dbus_thread_;
+ scoped_refptr<dbus::Bus> system_bus_;
+ scoped_ptr<BluetoothAdapterClient> bluetooth_adapter_client_;
+ scoped_ptr<BluetoothDeviceClient> bluetooth_device_client_;
+ scoped_ptr<BluetoothInputClient> bluetooth_input_client_;
+ scoped_ptr<BluetoothManagerClient> bluetooth_manager_client_;
+ scoped_ptr<BluetoothNodeClient> bluetooth_node_client_;
+ scoped_ptr<CashewClient> cashew_client_;
+ scoped_ptr<CrosDisksClient> cros_disks_client_;
+ scoped_ptr<CryptohomeClient> cryptohome_client_;
+ scoped_ptr<DebugDaemonClient> debugdaemon_client_;
+ scoped_ptr<FlimflamIPConfigClient> flimflam_ipconfig_client_;
+ scoped_ptr<FlimflamNetworkClient> flimflam_network_client_;
+ scoped_ptr<FlimflamProfileClient> flimflam_profile_client_;
+ scoped_ptr<ImageBurnerClient> image_burner_client_;
+ scoped_ptr<IntrospectableClient> introspectable_client_;
+ scoped_ptr<PowerManagerClient> power_manager_client_;
+ scoped_ptr<SessionManagerClient> session_manager_client_;
+ scoped_ptr<SpeechSynthesizerClient> speech_synthesizer_client_;
+ scoped_ptr<UpdateEngineClient> update_engine_client_;
+};
+
+// static
+void DBusThreadManager::Initialize() {
+ if (g_dbus_thread_manager) {
+ LOG(WARNING) << "DBusThreadManager was already initialized";
+ return;
+ }
+ g_dbus_thread_manager = new DBusThreadManagerImpl;
+ VLOG(1) << "DBusThreadManager initialized";
+}
+
+// static
+void DBusThreadManager::InitializeForTesting(
+ DBusThreadManager* dbus_thread_manager) {
+ if (g_dbus_thread_manager) {
+ LOG(WARNING) << "DBusThreadManager was already initialized";
+ return;
+ }
+ g_dbus_thread_manager = dbus_thread_manager;
+ VLOG(1) << "DBusThreadManager initialized";
+}
+
+// static
+void DBusThreadManager::Shutdown() {
+ if (!g_dbus_thread_manager) {
+ // TODO(satorux): Make it a DCHECK() once it's ready.
+ LOG(WARNING) << "DBusThreadManager::Shutdown() called with NULL manager";
+ return;
+ }
+ delete g_dbus_thread_manager;
+ g_dbus_thread_manager = NULL;
+ VLOG(1) << "DBusThreadManager Shutdown completed";
+}
+
+DBusThreadManager::DBusThreadManager() {
+}
+
+DBusThreadManager::~DBusThreadManager() {
+}
+
+// static
+DBusThreadManager* DBusThreadManager::Get() {
+ CHECK(g_dbus_thread_manager)
+ << "DBusThreadManager::Get() called before Initialize()";
+ return g_dbus_thread_manager;
+}
+
+} // namespace chromeos