| Index: remoting/host/daemon_process_win.cc
|
| diff --git a/remoting/host/daemon_process_win.cc b/remoting/host/daemon_process_win.cc
|
| index 5b0a57d4f79cfcdd3aa8ac5e3c9149866fdfd3e6..a5a4358eda467ffff583185eded3f308fed0536f 100644
|
| --- a/remoting/host/daemon_process_win.cc
|
| +++ b/remoting/host/daemon_process_win.cc
|
| @@ -17,6 +17,7 @@
|
| #include "base/win/scoped_handle.h"
|
| #include "ipc/ipc_message.h"
|
| #include "ipc/ipc_message_macros.h"
|
| +#include "remoting/base/auto_thread_task_runner.h"
|
| #include "remoting/host/chromoting_messages.h"
|
| #include "remoting/host/desktop_session_win.h"
|
| #include "remoting/host/host_exit_codes.h"
|
| @@ -36,14 +37,20 @@ class WtsConsoleMonitor;
|
| class DaemonProcessWin : public DaemonProcess {
|
| public:
|
| DaemonProcessWin(
|
| - scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
|
| - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| + scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
|
| + scoped_refptr<AutoThreadTaskRunner> io_task_runner,
|
| const base::Closure& stopped_callback);
|
| virtual ~DaemonProcessWin();
|
|
|
| - // Sends an IPC message to the worker process. This method can be called only
|
| - // after successful Start() and until Stop() is called or an error occurred.
|
| + // WorkerProcessIpcDelegate implementation.
|
| + virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
|
| +
|
| + // DaemonProcess overrides.
|
| virtual void SendToNetwork(IPC::Message* message) OVERRIDE;
|
| + virtual bool OnDesktopSessionAgentAttached(
|
| + int terminal_id,
|
| + base::ProcessHandle desktop_process,
|
| + IPC::PlatformFileForTransit desktop_pipe) OVERRIDE;
|
|
|
| protected:
|
| // Stoppable implementation.
|
| @@ -57,12 +64,15 @@ class DaemonProcessWin : public DaemonProcess {
|
| private:
|
| scoped_ptr<WorkerProcessLauncher> network_launcher_;
|
|
|
| + // Handle of the network process.
|
| + ScopedHandle network_process_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(DaemonProcessWin);
|
| };
|
|
|
| DaemonProcessWin::DaemonProcessWin(
|
| - scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
|
| - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| + scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
|
| + scoped_refptr<AutoThreadTaskRunner> io_task_runner,
|
| const base::Closure& stopped_callback)
|
| : DaemonProcess(caller_task_runner, io_task_runner, stopped_callback) {
|
| }
|
| @@ -74,6 +84,17 @@ DaemonProcessWin::~DaemonProcessWin() {
|
| CHECK_EQ(stoppable_state(), Stoppable::kStopped);
|
| }
|
|
|
| +void DaemonProcessWin::OnChannelConnected(int32 peer_pid) {
|
| + // Obtain the handle of the network process.
|
| + network_process_.Set(OpenProcess(PROCESS_DUP_HANDLE, false, peer_pid));
|
| + if (!network_process_.IsValid()) {
|
| + CrashNetworkProcess(FROM_HERE);
|
| + return;
|
| + }
|
| +
|
| + DaemonProcess::OnChannelConnected(peer_pid);
|
| +}
|
| +
|
| void DaemonProcessWin::SendToNetwork(IPC::Message* message) {
|
| if (network_launcher_) {
|
| network_launcher_->Send(message);
|
| @@ -82,6 +103,25 @@ void DaemonProcessWin::SendToNetwork(IPC::Message* message) {
|
| }
|
| }
|
|
|
| +bool DaemonProcessWin::OnDesktopSessionAgentAttached(
|
| + int terminal_id,
|
| + base::ProcessHandle desktop_process,
|
| + IPC::PlatformFileForTransit desktop_pipe) {
|
| + // Prepare |desktop_process| handle for sending over to the network process.
|
| + // |desktop_pipe| is a handle in the desktop process. It will be duplicated
|
| + // by the network process directly from the desktop process.
|
| + IPC::PlatformFileForTransit desktop_process_for_transit =
|
| + IPC::GetFileHandleForProcess(desktop_process, network_process_, false);
|
| + if (desktop_process_for_transit == IPC::InvalidPlatformFileForTransit()) {
|
| + LOG(ERROR) << "Failed to duplicate the desktop process handle";
|
| + return false;
|
| + }
|
| +
|
| + SendToNetwork(new ChromotingDaemonNetworkMsg_DesktopAttached(
|
| + terminal_id, desktop_process_for_transit, desktop_pipe));
|
| + return true;
|
| +}
|
| +
|
| void DaemonProcessWin::DoStop() {
|
| DCHECK(caller_task_runner()->BelongsToCurrentThread());
|
|
|
| @@ -117,8 +157,8 @@ void DaemonProcessWin::LaunchNetworkProcess() {
|
| }
|
|
|
| scoped_ptr<DaemonProcess> DaemonProcess::Create(
|
| - scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
|
| - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| + scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
|
| + scoped_refptr<AutoThreadTaskRunner> io_task_runner,
|
| const base::Closure& stopped_callback) {
|
| scoped_ptr<DaemonProcessWin> daemon_process(
|
| new DaemonProcessWin(caller_task_runner, io_task_runner,
|
|
|