Index: chromeos/ime/ibus_daemon_controller.cc |
diff --git a/chromeos/ime/ibus_daemon_controller.cc b/chromeos/ime/ibus_daemon_controller.cc |
index 9fd9ac8a461256e04f3e0be8615930b13b07606f..01cd5835ade539d9e03134bd9857910a519a7c82 100644 |
--- a/chromeos/ime/ibus_daemon_controller.cc |
+++ b/chromeos/ime/ibus_daemon_controller.cc |
@@ -5,17 +5,11 @@ |
#include "chromeos/ime/ibus_daemon_controller.h" |
#include "base/bind.h" |
-#include "base/environment.h" |
+#include "base/files/file_path.h" |
#include "base/files/file_path_watcher.h" |
#include "base/location.h" |
#include "base/logging.h" |
#include "base/observer_list.h" |
-#include "base/process/launch.h" |
-#include "base/process/process_handle.h" |
-#include "base/rand_util.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "base/threading/thread_checker.h" |
#include "chromeos/dbus/dbus_thread_manager.h" |
namespace chromeos { |
@@ -59,210 +53,6 @@ void StartWatch( |
DCHECK(result); |
} |
-// The implementation of IBusDaemonController. |
-class IBusDaemonControllerImpl : public IBusDaemonController { |
- public: |
- // Represents current ibus-daemon status. |
- enum IBusDaemonStatus { |
- IBUS_DAEMON_INITIALIZING, |
- IBUS_DAEMON_RUNNING, |
- IBUS_DAEMON_SHUTTING_DOWN, |
- IBUS_DAEMON_STOP, |
- }; |
- |
- IBusDaemonControllerImpl( |
- const scoped_refptr<base::SequencedTaskRunner>& ui_task_runner, |
- const scoped_refptr<base::SequencedTaskRunner>& file_task_runner) |
- : process_handle_(base::kNullProcessHandle), |
- ibus_daemon_status_(IBUS_DAEMON_STOP), |
- ui_task_runner_(ui_task_runner), |
- file_task_runner_(file_task_runner), |
- weak_ptr_factory_(this) { |
- } |
- |
- virtual ~IBusDaemonControllerImpl() {} |
- |
- // IBusDaemonController override: |
- virtual void AddObserver(Observer* observer) OVERRIDE { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- observers_.AddObserver(observer); |
- } |
- |
- // IBusDaemonController override: |
- virtual void RemoveObserver(Observer* observer) OVERRIDE { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- observers_.RemoveObserver(observer); |
- } |
- |
- // IBusDaemonController override: |
- virtual bool Start() OVERRIDE { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (ibus_daemon_status_ == IBUS_DAEMON_RUNNING) |
- return true; |
- if (ibus_daemon_status_ == IBUS_DAEMON_STOP || |
- ibus_daemon_status_ == IBUS_DAEMON_SHUTTING_DOWN) { |
- return StartIBusDaemon(); |
- } |
- return true; |
- } |
- |
- // IBusDaemonController override: |
- virtual bool Stop() OVERRIDE { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- NOTREACHED() << "Termination of ibus-daemon is not supported" |
- << "http://crosbug.com/27051"; |
- return false; |
- } |
- |
- private: |
- // Starts ibus-daemon service. |
- bool StartIBusDaemon() { |
- if (ibus_daemon_status_ == IBUS_DAEMON_INITIALIZING || |
- ibus_daemon_status_ == IBUS_DAEMON_RUNNING) { |
- DVLOG(1) << "MaybeLaunchIBusDaemon: ibus-daemon is already running."; |
- return false; |
- } |
- |
- ibus_daemon_status_ = IBUS_DAEMON_INITIALIZING; |
- ibus_daemon_address_ = base::StringPrintf( |
- "unix:abstract=ibus-%d", |
- base::RandInt(0, std::numeric_limits<int>::max())); |
- |
- scoped_ptr<base::Environment> env(base::Environment::Create()); |
- std::string address_file_path; |
- env->GetVar("IBUS_ADDRESS_FILE", &address_file_path); |
- DCHECK(!address_file_path.empty()); |
- |
- // Set up ibus-daemon address file watcher before launching ibus-daemon, |
- // because if watcher starts after ibus-daemon, we may miss the ibus |
- // connection initialization. |
- bool success = file_task_runner_->PostTaskAndReply( |
- FROM_HERE, |
- base::Bind(&StartWatch, |
- address_file_path, |
- base::Bind(&IBusDaemonControllerImpl::FilePathChanged, |
- weak_ptr_factory_.GetWeakPtr(), |
- ibus_daemon_address_), |
- ui_task_runner_), |
- base::Bind(&IBusDaemonControllerImpl::LaunchIBusDaemon, |
- weak_ptr_factory_.GetWeakPtr(), |
- ibus_daemon_address_)); |
- DCHECK(success); |
- return true; |
- } |
- |
- // Launhes actual ibus-daemon process. |
- void LaunchIBusDaemon(const std::string& ibus_address) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK_EQ(base::kNullProcessHandle, process_handle_); |
- static const char kIBusDaemonPath[] = "/usr/bin/ibus-daemon"; |
- // TODO(zork): Send output to /var/log/ibus.log |
- std::vector<std::string> ibus_daemon_command_line; |
- ibus_daemon_command_line.push_back(kIBusDaemonPath); |
- ibus_daemon_command_line.push_back("--panel=disable"); |
- ibus_daemon_command_line.push_back("--cache=none"); |
- ibus_daemon_command_line.push_back("--restart"); |
- ibus_daemon_command_line.push_back("--replace"); |
- ibus_daemon_command_line.push_back("--address=" + ibus_address); |
- |
- if (!base::LaunchProcess(ibus_daemon_command_line, |
- base::LaunchOptions(), |
- &process_handle_)) { |
- LOG(WARNING) << "Could not launch: " |
- << JoinString(ibus_daemon_command_line, " "); |
- } |
- } |
- |
- // Called by FilePathWatcher when the ibus-daemon address file is changed. |
- // This function will be called on FILE thread. |
- void FilePathChanged(const std::string& ibus_address) { |
- ui_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&IBusDaemonControllerImpl::IBusDaemonInitializationDone, |
- weak_ptr_factory_.GetWeakPtr(), |
- ibus_address)); |
- } |
- |
- // Called by FilePathChaged function, this function should be called on UI |
- // thread. |
- void IBusDaemonInitializationDone(const std::string& ibus_address) { |
- if (ibus_daemon_address_ != ibus_address) |
- return; |
- |
- if (ibus_daemon_status_ != IBUS_DAEMON_INITIALIZING) { |
- // Stop() or OnIBusDaemonExit() has already been called. |
- return; |
- } |
- |
- DBusThreadManager::Get()->InitIBusBus( |
- ibus_address, |
- base::Bind(&IBusDaemonControllerImpl::OnIBusDaemonDisconnected, |
- weak_ptr_factory_.GetWeakPtr(), |
- base::GetProcId(process_handle_))); |
- ibus_daemon_status_ = IBUS_DAEMON_RUNNING; |
- FOR_EACH_OBSERVER(Observer, observers_, OnConnected()); |
- |
- VLOG(1) << "The ibus-daemon initialization is done."; |
- } |
- |
- // Called when the connection with ibus-daemon is disconnected. |
- void OnIBusDaemonDisconnected(base::ProcessId pid) { |
- if (!chromeos::DBusThreadManager::Get()) |
- return; // Expected disconnection at shutting down. do nothing. |
- |
- if (process_handle_ != base::kNullProcessHandle) { |
- if (base::GetProcId(process_handle_) == pid) { |
- // ibus-daemon crashed. |
- // TODO(nona): Shutdown ibus-bus connection. |
- process_handle_ = base::kNullProcessHandle; |
- } else { |
- // This condition is as follows. |
- // 1. Called Stop (process_handle_ becomes null) |
- // 2. Called LaunchProcess (process_handle_ becomes new instance) |
- // 3. Callbacked OnIBusDaemonExit for old instance and reach here. |
- // In this case, we should not reset process_handle_ as null, and do not |
- // re-launch ibus-daemon. |
- return; |
- } |
- } |
- |
- const IBusDaemonStatus on_exit_state = ibus_daemon_status_; |
- ibus_daemon_status_ = IBUS_DAEMON_STOP; |
- FOR_EACH_OBSERVER(Observer, observers_, OnDisconnected()); |
- |
- if (on_exit_state == IBUS_DAEMON_SHUTTING_DOWN) |
- return; // Normal exitting, so do nothing. |
- |
- LOG(ERROR) << "The ibus-daemon crashed. Re-launching..."; |
- StartIBusDaemon(); |
- } |
- |
- // The current ibus_daemon address. This value is assigned at the launching |
- // ibus-daemon and used in bus connection initialization. |
- std::string ibus_daemon_address_; |
- |
- // The process handle of the IBus daemon. kNullProcessHandle if it's not |
- // running. |
- base::ProcessHandle process_handle_; |
- |
- // Represents ibus-daemon's status. |
- IBusDaemonStatus ibus_daemon_status_; |
- |
- // The task runner of UI thread. |
- scoped_refptr<base::SequencedTaskRunner> ui_task_runner_; |
- |
- // The task runner of FILE thread. |
- scoped_refptr<base::SequencedTaskRunner> file_task_runner_; |
- |
- ObserverList<Observer> observers_; |
- base::ThreadChecker thread_checker_; |
- |
- // Used for making callbacks for PostTask. |
- base::WeakPtrFactory<IBusDaemonControllerImpl> weak_ptr_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(IBusDaemonControllerImpl); |
-}; |
- |
// An implementation of IBusDaemonController without ibus-daemon interaction. |
// Currently this class is used only on linux desktop. |
// TODO(nona): Remove IBusDaemonControlelr this once crbug.com/171351 is fixed. |