Chromium Code Reviews| Index: remoting/host/setup/daemon_controller_delegate_linux.cc |
| diff --git a/remoting/host/setup/daemon_controller_linux.cc b/remoting/host/setup/daemon_controller_delegate_linux.cc |
| similarity index 55% |
| rename from remoting/host/setup/daemon_controller_linux.cc |
| rename to remoting/host/setup/daemon_controller_delegate_linux.cc |
| index 3d4588599c582f06f1352689da8d428262d05f2b..e1e982822a053ac21136173bb281e2aae679b5d8 100644 |
| --- a/remoting/host/setup/daemon_controller_linux.cc |
| +++ b/remoting/host/setup/daemon_controller_delegate_linux.cc |
| @@ -2,7 +2,7 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#include "remoting/host/setup/daemon_controller.h" |
| +#include "remoting/host/setup/daemon_controller_delegate_linux.h" |
| #include <unistd.h> |
| @@ -22,7 +22,7 @@ |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/string_split.h" |
| #include "base/strings/string_util.h" |
| -#include "base/threading/thread.h" |
| +#include "base/thread_task_runner_handle.h" |
| #include "base/values.h" |
| #include "net/base/net_util.h" |
| #include "remoting/host/host_config.h" |
| @@ -44,6 +44,8 @@ const int64 kDaemonTimeoutMs = 60000; |
| // Timeout for commands that require password prompt - 5 minutes. |
| const int64 kSudoTimeoutSeconds = 5 * 60; |
| +void Dummy() {} |
|
Sergey Ulanov
2013/09/09 18:12:31
not used anywhere
alexeypa (please no reviews)
2013/09/09 19:30:57
Done.
|
| + |
| std::string GetMd5(const std::string& value) { |
| base::MD5Context ctx; |
| base::MD5Init(&ctx); |
| @@ -53,46 +55,13 @@ std::string GetMd5(const std::string& value) { |
| return StringToLowerASCII(base::HexEncode(digest.a, sizeof(digest.a))); |
| } |
| -class DaemonControllerLinux : public remoting::DaemonController { |
| - public: |
| - DaemonControllerLinux(); |
| - |
| - virtual State GetState() OVERRIDE; |
| - virtual void GetConfig(const GetConfigCallback& callback) OVERRIDE; |
| - virtual void SetConfigAndStart( |
| - scoped_ptr<base::DictionaryValue> config, |
| - bool consent, |
| - const CompletionCallback& done) OVERRIDE; |
| - virtual void UpdateConfig(scoped_ptr<base::DictionaryValue> config, |
| - const CompletionCallback& done_callback) OVERRIDE; |
| - virtual void Stop(const CompletionCallback& done_callback) OVERRIDE; |
| - virtual void SetWindow(void* window_handle) OVERRIDE; |
| - virtual void GetVersion(const GetVersionCallback& done_callback) OVERRIDE; |
| - virtual void GetUsageStatsConsent( |
| - const GetUsageStatsConsentCallback& done) OVERRIDE; |
| - |
| - private: |
| - base::FilePath GetConfigPath(); |
| - |
| - void DoGetConfig(const GetConfigCallback& callback); |
| - void DoSetConfigAndStart(scoped_ptr<base::DictionaryValue> config, |
| - const CompletionCallback& done); |
| - void DoUpdateConfig(scoped_ptr<base::DictionaryValue> config, |
| - const CompletionCallback& done_callback); |
| - void DoStop(const CompletionCallback& done_callback); |
| - void DoGetVersion(const GetVersionCallback& done_callback); |
| - |
| - base::Thread file_io_thread_; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(DaemonControllerLinux); |
| -}; |
| - |
| -DaemonControllerLinux::DaemonControllerLinux() |
| - : file_io_thread_("DaemonControllerFileIO") { |
| - file_io_thread_.Start(); |
| +base::FilePath GetConfigPath() { |
| + std::string filename = "host#" + GetMd5(net::GetHostName()) + ".json"; |
| + return file_util::GetHomeDir(). |
| + Append(".config/chrome-remote-desktop").Append(filename); |
| } |
| -static bool GetScriptPath(base::FilePath* result) { |
| +bool GetScriptPath(base::FilePath* result) { |
| base::FilePath candidate_exe(kDaemonScript); |
| if (access(candidate_exe.value().c_str(), X_OK) == 0) { |
| *result = candidate_exe; |
| @@ -101,7 +70,7 @@ static bool GetScriptPath(base::FilePath* result) { |
| return false; |
| } |
| -static bool RunHostScriptWithTimeout( |
| +bool RunHostScriptWithTimeout( |
| const std::vector<std::string>& args, |
| base::TimeDelta timeout, |
| int* exit_code) { |
| @@ -147,13 +116,21 @@ static bool RunHostScriptWithTimeout( |
| return true; |
| } |
| -static bool RunHostScript(const std::vector<std::string>& args, |
| +bool RunHostScript(const std::vector<std::string>& args, |
| int* exit_code) { |
| return RunHostScriptWithTimeout( |
| args, base::TimeDelta::FromMilliseconds(kDaemonTimeoutMs), exit_code); |
| } |
| -remoting::DaemonController::State DaemonControllerLinux::GetState() { |
| +} // namespace |
| + |
| +DaemonControllerDelegateLinux::DaemonControllerDelegateLinux() { |
| +} |
| + |
| +DaemonControllerDelegateLinux::~DaemonControllerDelegateLinux() { |
| +} |
| + |
| +DaemonController::State DaemonControllerDelegateLinux::GetState() { |
| std::vector<std::string> args; |
| args.push_back("--check-running"); |
| int exit_code = 0; |
| @@ -161,74 +138,20 @@ remoting::DaemonController::State DaemonControllerLinux::GetState() { |
| // TODO(jamiewalch): When we have a good story for installing, return |
| // NOT_INSTALLED rather than NOT_IMPLEMENTED (the former suppresses |
| // the relevant UI in the web-app). |
| - return remoting::DaemonController::STATE_NOT_IMPLEMENTED; |
| + return DaemonController::STATE_NOT_IMPLEMENTED; |
| } |
| if (exit_code == 0) { |
| - return remoting::DaemonController::STATE_STARTED; |
| + return DaemonController::STATE_STARTED; |
| } else { |
| - return remoting::DaemonController::STATE_STOPPED; |
| + return DaemonController::STATE_STOPPED; |
| } |
| } |
| -void DaemonControllerLinux::GetConfig(const GetConfigCallback& callback) { |
| - // base::Unretained() is safe because we control lifetime of the thread. |
| - file_io_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| - &DaemonControllerLinux::DoGetConfig, base::Unretained(this), callback)); |
| -} |
| - |
| -void DaemonControllerLinux::GetUsageStatsConsent( |
| - const GetUsageStatsConsentCallback& done) { |
| - // Crash dump collection is not implemented on Linux yet. |
| - // http://crbug.com/130678. |
| - done.Run(false, false, false); |
| -} |
| - |
| -void DaemonControllerLinux::SetConfigAndStart( |
| - scoped_ptr<base::DictionaryValue> config, |
| - bool /* consent */, |
| - const CompletionCallback& done) { |
| - // base::Unretained() is safe because we control lifetime of the thread. |
| - file_io_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| - &DaemonControllerLinux::DoSetConfigAndStart, base::Unretained(this), |
| - base::Passed(&config), done)); |
| -} |
| - |
| -void DaemonControllerLinux::UpdateConfig( |
| - scoped_ptr<base::DictionaryValue> config, |
| - const CompletionCallback& done_callback) { |
| - file_io_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| - &DaemonControllerLinux::DoUpdateConfig, base::Unretained(this), |
| - base::Passed(&config), done_callback)); |
| -} |
| - |
| -void DaemonControllerLinux::Stop(const CompletionCallback& done_callback) { |
| - file_io_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| - &DaemonControllerLinux::DoStop, base::Unretained(this), |
| - done_callback)); |
| -} |
| - |
| -void DaemonControllerLinux::SetWindow(void* window_handle) { |
| - // noop |
| -} |
| - |
| -void DaemonControllerLinux::GetVersion( |
| - const GetVersionCallback& done_callback) { |
| - file_io_thread_.message_loop()->PostTask(FROM_HERE, base::Bind( |
| - &DaemonControllerLinux::DoGetVersion, base::Unretained(this), |
| - done_callback)); |
| -} |
| - |
| -base::FilePath DaemonControllerLinux::GetConfigPath() { |
| - std::string filename = "host#" + GetMd5(net::GetHostName()) + ".json"; |
| - return file_util::GetHomeDir(). |
| - Append(".config/chrome-remote-desktop").Append(filename); |
| -} |
| - |
| -void DaemonControllerLinux::DoGetConfig(const GetConfigCallback& callback) { |
| +scoped_ptr<base::DictionaryValue> DaemonControllerDelegateLinux::GetConfig() { |
| scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); |
| - if (GetState() != remoting::DaemonController::STATE_NOT_IMPLEMENTED) { |
| + if (GetState() != DaemonController::STATE_NOT_IMPLEMENTED) { |
| JsonHostConfig config(GetConfigPath()); |
| if (config.Read()) { |
| std::string value; |
| @@ -243,13 +166,13 @@ void DaemonControllerLinux::DoGetConfig(const GetConfigCallback& callback) { |
| } |
| } |
| - callback.Run(result.Pass()); |
| + return result.Pass(); |
| } |
| -void DaemonControllerLinux::DoSetConfigAndStart( |
| +void DaemonControllerDelegateLinux::SetConfigAndStart( |
| scoped_ptr<base::DictionaryValue> config, |
| - const CompletionCallback& done_callback) { |
| - |
| + bool consent, |
| + const DaemonController::CompletionCallback& done) { |
| // Add the user to chrome-remote-desktop group first. |
| std::vector<std::string> args; |
| args.push_back("--add-user"); |
| @@ -259,7 +182,7 @@ void DaemonControllerLinux::DoSetConfigAndStart( |
| &exit_code) || |
| exit_code != 0) { |
| LOG(ERROR) << "Failed to add user to chrome-remote-desktop group."; |
| - done_callback.Run(RESULT_FAILED); |
| + done.Run(DaemonController::RESULT_FAILED); |
| return; |
| } |
| @@ -268,7 +191,7 @@ void DaemonControllerLinux::DoSetConfigAndStart( |
| if (!base::DirectoryExists(config_dir) && |
| !file_util::CreateDirectory(config_dir)) { |
| LOG(ERROR) << "Failed to create config directory " << config_dir.value(); |
| - done_callback.Run(RESULT_FAILED); |
| + done.Run(DaemonController::RESULT_FAILED); |
| return; |
| } |
| @@ -277,66 +200,62 @@ void DaemonControllerLinux::DoSetConfigAndStart( |
| if (!config_file.CopyFrom(config.get()) || |
| !config_file.Save()) { |
| LOG(ERROR) << "Failed to update config file."; |
| - done_callback.Run(RESULT_FAILED); |
| + done.Run(DaemonController::RESULT_FAILED); |
| return; |
| } |
| // Finally start the host. |
| args.clear(); |
| args.push_back("--start"); |
| - AsyncResult result; |
| - if (RunHostScript(args, &exit_code)) { |
| - result = (exit_code == 0) ? RESULT_OK : RESULT_FAILED; |
| - } else { |
| - result = RESULT_FAILED; |
| - } |
| - done_callback.Run(result); |
| + DaemonController::AsyncResult result = DaemonController::RESULT_FAILED; |
| + if (RunHostScript(args, &exit_code) && (exit_code == 0)) |
| + result = DaemonController::RESULT_OK; |
| + |
| + done.Run(result); |
| } |
| -void DaemonControllerLinux::DoUpdateConfig( |
| +void DaemonControllerDelegateLinux::UpdateConfig( |
| scoped_ptr<base::DictionaryValue> config, |
| - const CompletionCallback& done_callback) { |
| + const DaemonController::CompletionCallback& done) { |
| JsonHostConfig config_file(GetConfigPath()); |
| if (!config_file.Read() || |
| !config_file.CopyFrom(config.get()) || |
| !config_file.Save()) { |
| LOG(ERROR) << "Failed to update config file."; |
| - done_callback.Run(RESULT_FAILED); |
| + done.Run(DaemonController::RESULT_FAILED); |
| return; |
| } |
| std::vector<std::string> args; |
| args.push_back("--reload"); |
| - AsyncResult result; |
| - int exit_code; |
| - if (RunHostScript(args, &exit_code)) { |
| - result = (exit_code == 0) ? RESULT_OK : RESULT_FAILED; |
| - } else { |
| - result = RESULT_FAILED; |
| - } |
| + int exit_code = 0; |
| + DaemonController::AsyncResult result = DaemonController::RESULT_FAILED; |
| + if (RunHostScript(args, &exit_code) && (exit_code == 0)) |
| + result = DaemonController::RESULT_OK; |
| - done_callback.Run(result); |
| + done.Run(result); |
| } |
| -void DaemonControllerLinux::DoStop(const CompletionCallback& done_callback) { |
| +void DaemonControllerDelegateLinux::Stop( |
| + const DaemonController::CompletionCallback& done) { |
| std::vector<std::string> args; |
| args.push_back("--stop"); |
| int exit_code = 0; |
| - AsyncResult result; |
| - if (RunHostScript(args, &exit_code)) { |
| - result = (exit_code == 0) ? RESULT_OK : RESULT_FAILED; |
| - } else { |
| - result = RESULT_FAILED; |
| - } |
| - done_callback.Run(result); |
| + DaemonController::AsyncResult result = DaemonController::RESULT_FAILED; |
| + if (RunHostScript(args, &exit_code) && (exit_code == 0)) |
| + result = DaemonController::RESULT_OK; |
| + |
| + done.Run(result); |
| } |
| -void DaemonControllerLinux::DoGetVersion( |
| - const GetVersionCallback& done_callback) { |
| +void DaemonControllerDelegateLinux::SetWindow(void* window_handle) { |
| + // noop |
| +} |
| + |
| +std::string DaemonControllerDelegateLinux::GetVersion() { |
| base::FilePath script_path; |
| if (!GetScriptPath(&script_path)) { |
| - done_callback.Run(std::string()); |
| - return; |
| + return std::string(); |
| } |
| CommandLine command_line(script_path); |
| command_line.AppendArg("--host-version"); |
| @@ -348,24 +267,33 @@ void DaemonControllerLinux::DoGetVersion( |
| if (!result || exit_code != 0) { |
| LOG(ERROR) << "Failed to run \"" << command_line.GetCommandLineString() |
| << "\". Exit code: " << exit_code; |
| - done_callback.Run(std::string()); |
| - return; |
| + return std::string(); |
| } |
| TrimWhitespaceASCII(version, TRIM_ALL, &version); |
| if (!ContainsOnlyChars(version, "0123456789.")) { |
| LOG(ERROR) << "Received invalid host version number: " << version; |
| - done_callback.Run(std::string()); |
| - return; |
| + return std::string(); |
| } |
| - done_callback.Run(version); |
| + return version; |
| } |
| -} // namespace |
| +DaemonController::UsageStatsConsent |
| +DaemonControllerDelegateLinux::GetUsageStatsConsent() { |
| + // Crash dump collection is not implemented on Linux yet. |
| + // http://crbug.com/130678. |
| + DaemonController::UsageStatsConsent consent; |
| + consent.supported = false; |
| + consent.allowed = false; |
| + consent.set_by_policy = false; |
| + return consent; |
| +} |
| -scoped_ptr<DaemonController> remoting::DaemonController::Create() { |
| - return scoped_ptr<DaemonController>(new DaemonControllerLinux()); |
| +scoped_refptr<DaemonController> DaemonController::Create() { |
| + scoped_ptr<DaemonController::Delegate> delegate( |
| + new DaemonControllerDelegateLinux()); |
| + return new DaemonController(delegate.Pass()); |
| } |
| } // namespace remoting |