| 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 // This file implements the Windows service controlling Me2Me host processes | 5 // This file implements the Windows service controlling Me2Me host processes |
| 6 // running within user sessions. | 6 // running within user sessions. |
| 7 | 7 |
| 8 #include "remoting/host/desktop_process.h" | 8 #include "remoting/host/desktop_process.h" |
| 9 | 9 |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 | 27 |
| 28 #if defined(OS_WIN) | 28 #if defined(OS_WIN) |
| 29 #include "base/win/windows_version.h" | 29 #include "base/win/windows_version.h" |
| 30 #endif // defined(OS_WIN) | 30 #endif // defined(OS_WIN) |
| 31 | 31 |
| 32 namespace remoting { | 32 namespace remoting { |
| 33 | 33 |
| 34 DesktopProcess::DesktopProcess( | 34 DesktopProcess::DesktopProcess( |
| 35 scoped_refptr<AutoThreadTaskRunner> caller_task_runner, | 35 scoped_refptr<AutoThreadTaskRunner> caller_task_runner, |
| 36 scoped_refptr<AutoThreadTaskRunner> input_task_runner, | 36 scoped_refptr<AutoThreadTaskRunner> input_task_runner, |
| 37 const std::string& daemon_channel_name) | 37 scoped_refptr<AutoThreadTaskRunner> io_task_runner, |
| 38 mojo::ScopedMessagePipeHandle daemon_channel_handle) |
| 38 : caller_task_runner_(caller_task_runner), | 39 : caller_task_runner_(caller_task_runner), |
| 39 input_task_runner_(input_task_runner), | 40 input_task_runner_(input_task_runner), |
| 40 daemon_channel_name_(daemon_channel_name) { | 41 io_task_runner_(io_task_runner), |
| 42 daemon_channel_handle_(std::move(daemon_channel_handle)) { |
| 41 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 43 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| 42 DCHECK(base::MessageLoopForUI::IsCurrent()); | 44 DCHECK(base::MessageLoopForUI::IsCurrent()); |
| 43 } | 45 } |
| 44 | 46 |
| 45 DesktopProcess::~DesktopProcess() { | 47 DesktopProcess::~DesktopProcess() { |
| 46 DCHECK(!daemon_channel_); | 48 DCHECK(!daemon_channel_); |
| 47 DCHECK(!desktop_agent_.get()); | 49 DCHECK(!desktop_agent_.get()); |
| 48 } | 50 } |
| 49 | 51 |
| 50 DesktopEnvironmentFactory& DesktopProcess::desktop_environment_factory() { | 52 DesktopEnvironmentFactory& DesktopProcess::desktop_environment_factory() { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 if (broker && !broker->IsPrivilegedBroker()) | 108 if (broker && !broker->IsPrivilegedBroker()) |
| 107 broker->DeregisterBrokerCommunicationChannel(daemon_channel_.get()); | 109 broker->DeregisterBrokerCommunicationChannel(daemon_channel_.get()); |
| 108 daemon_channel_.reset(); | 110 daemon_channel_.reset(); |
| 109 if (desktop_agent_.get()) { | 111 if (desktop_agent_.get()) { |
| 110 desktop_agent_->Stop(); | 112 desktop_agent_->Stop(); |
| 111 desktop_agent_ = nullptr; | 113 desktop_agent_ = nullptr; |
| 112 } | 114 } |
| 113 | 115 |
| 114 caller_task_runner_ = nullptr; | 116 caller_task_runner_ = nullptr; |
| 115 input_task_runner_ = nullptr; | 117 input_task_runner_ = nullptr; |
| 118 io_task_runner_ = nullptr; |
| 116 desktop_environment_factory_.reset(); | 119 desktop_environment_factory_.reset(); |
| 117 } | 120 } |
| 118 | 121 |
| 119 bool DesktopProcess::Start( | 122 bool DesktopProcess::Start( |
| 120 std::unique_ptr<DesktopEnvironmentFactory> desktop_environment_factory) { | 123 std::unique_ptr<DesktopEnvironmentFactory> desktop_environment_factory) { |
| 121 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | 124 DCHECK(caller_task_runner_->BelongsToCurrentThread()); |
| 122 DCHECK(!desktop_environment_factory_); | 125 DCHECK(!desktop_environment_factory_); |
| 123 DCHECK(desktop_environment_factory); | 126 DCHECK(desktop_environment_factory); |
| 124 | 127 |
| 125 IPC::AttachmentBrokerUnprivileged::CreateBrokerIfNeeded(); | 128 IPC::AttachmentBrokerUnprivileged::CreateBrokerIfNeeded(); |
| 126 | 129 |
| 127 desktop_environment_factory_ = std::move(desktop_environment_factory); | 130 desktop_environment_factory_ = std::move(desktop_environment_factory); |
| 128 | 131 |
| 129 // Launch the audio capturing thread. | 132 // Launch the audio capturing thread. |
| 130 scoped_refptr<AutoThreadTaskRunner> audio_task_runner; | 133 scoped_refptr<AutoThreadTaskRunner> audio_task_runner; |
| 131 #if defined(OS_WIN) | 134 #if defined(OS_WIN) |
| 132 // On Windows the AudioCapturer requires COM, so we run a single-threaded | 135 // On Windows the AudioCapturer requires COM, so we run a single-threaded |
| 133 // apartment, which requires a UI thread. | 136 // apartment, which requires a UI thread. |
| 134 audio_task_runner = | 137 audio_task_runner = |
| 135 AutoThread::CreateWithLoopAndComInitTypes("ChromotingAudioThread", | 138 AutoThread::CreateWithLoopAndComInitTypes("ChromotingAudioThread", |
| 136 caller_task_runner_, | 139 caller_task_runner_, |
| 137 base::MessageLoop::TYPE_UI, | 140 base::MessageLoop::TYPE_UI, |
| 138 AutoThread::COM_INIT_STA); | 141 AutoThread::COM_INIT_STA); |
| 139 #else // !defined(OS_WIN) | 142 #else // !defined(OS_WIN) |
| 140 audio_task_runner = AutoThread::CreateWithType( | 143 audio_task_runner = AutoThread::CreateWithType( |
| 141 "ChromotingAudioThread", caller_task_runner_, base::MessageLoop::TYPE_IO); | 144 "ChromotingAudioThread", caller_task_runner_, base::MessageLoop::TYPE_IO); |
| 142 #endif // !defined(OS_WIN) | 145 #endif // !defined(OS_WIN) |
| 143 | 146 |
| 144 // Launch the I/O thread. | |
| 145 scoped_refptr<AutoThreadTaskRunner> io_task_runner = | |
| 146 AutoThread::CreateWithType( | |
| 147 "I/O thread", caller_task_runner_, base::MessageLoop::TYPE_IO); | |
| 148 | |
| 149 // Create a desktop agent. | 147 // Create a desktop agent. |
| 150 desktop_agent_ = | 148 desktop_agent_ = |
| 151 new DesktopSessionAgent(audio_task_runner, caller_task_runner_, | 149 new DesktopSessionAgent(audio_task_runner, caller_task_runner_, |
| 152 input_task_runner_, io_task_runner); | 150 input_task_runner_, io_task_runner_); |
| 153 | 151 |
| 154 // Start the agent and create an IPC channel to talk to it. | 152 // Start the agent and create an IPC channel to talk to it. |
| 155 IPC::PlatformFileForTransit desktop_pipe; | 153 IPC::PlatformFileForTransit desktop_pipe; |
| 156 if (!desktop_agent_->Start(AsWeakPtr(), &desktop_pipe)) { | 154 if (!desktop_agent_->Start(AsWeakPtr(), &desktop_pipe)) { |
| 157 desktop_agent_ = nullptr; | 155 desktop_agent_ = nullptr; |
| 158 caller_task_runner_ = nullptr; | 156 caller_task_runner_ = nullptr; |
| 159 input_task_runner_ = nullptr; | 157 input_task_runner_ = nullptr; |
| 160 desktop_environment_factory_.reset(); | 158 desktop_environment_factory_.reset(); |
| 161 return false; | 159 return false; |
| 162 } | 160 } |
| 163 | 161 |
| 164 // Connect to the daemon. | 162 // Connect to the daemon. |
| 165 daemon_channel_.reset(new IPC::ChannelProxy(this, io_task_runner.get())); | 163 daemon_channel_.reset(new IPC::ChannelProxy(this, io_task_runner_)); |
| 166 IPC::AttachmentBroker* broker = IPC::AttachmentBroker::GetGlobal(); | 164 IPC::AttachmentBroker* broker = IPC::AttachmentBroker::GetGlobal(); |
| 167 if (broker && !broker->IsPrivilegedBroker()) { | 165 if (broker && !broker->IsPrivilegedBroker()) { |
| 168 broker->RegisterBrokerCommunicationChannel(daemon_channel_.get()); | 166 broker->RegisterBrokerCommunicationChannel(daemon_channel_.get()); |
| 169 } | 167 } |
| 170 daemon_channel_->Init(daemon_channel_name_, IPC::Channel::MODE_CLIENT, | 168 daemon_channel_->Init(daemon_channel_handle_.release(), |
| 169 IPC::Channel::MODE_CLIENT, |
| 171 /*create_pipe_now=*/true); | 170 /*create_pipe_now=*/true); |
| 172 | 171 |
| 173 // Pass |desktop_pipe| to the daemon. | 172 // Pass |desktop_pipe| to the daemon. |
| 174 daemon_channel_->Send( | 173 daemon_channel_->Send( |
| 175 new ChromotingDesktopDaemonMsg_DesktopAttached(desktop_pipe)); | 174 new ChromotingDesktopDaemonMsg_DesktopAttached(desktop_pipe)); |
| 176 | 175 |
| 177 return true; | 176 return true; |
| 178 } | 177 } |
| 179 | 178 |
| 180 void DesktopProcess::OnCrash(const std::string& function_name, | 179 void DesktopProcess::OnCrash(const std::string& function_name, |
| 181 const std::string& file_name, | 180 const std::string& file_name, |
| 182 const int& line_number) { | 181 const int& line_number) { |
| 183 char message[1024]; | 182 char message[1024]; |
| 184 base::snprintf(message, sizeof(message), | 183 base::snprintf(message, sizeof(message), |
| 185 "Requested by %s at %s, line %d.", | 184 "Requested by %s at %s, line %d.", |
| 186 function_name.c_str(), file_name.c_str(), line_number); | 185 function_name.c_str(), file_name.c_str(), line_number); |
| 187 base::debug::Alias(message); | 186 base::debug::Alias(message); |
| 188 | 187 |
| 189 // The daemon requested us to crash the process. | 188 // The daemon requested us to crash the process. |
| 190 CHECK(false) << message; | 189 CHECK(false) << message; |
| 191 } | 190 } |
| 192 | 191 |
| 193 } // namespace remoting | 192 } // namespace remoting |
| OLD | NEW |