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 #include "remoting/host/daemon_process.h" | 5 #include "remoting/host/daemon_process.h" |
6 | 6 |
7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 23 matching lines...) Expand all Loading... | |
34 class WtsConsoleMonitor; | 34 class WtsConsoleMonitor; |
35 | 35 |
36 class DaemonProcessWin : public DaemonProcess { | 36 class DaemonProcessWin : public DaemonProcess { |
37 public: | 37 public: |
38 DaemonProcessWin( | 38 DaemonProcessWin( |
39 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | 39 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
40 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, | 40 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, |
41 const base::Closure& stopped_callback); | 41 const base::Closure& stopped_callback); |
42 virtual ~DaemonProcessWin(); | 42 virtual ~DaemonProcessWin(); |
43 | 43 |
44 // Sends an IPC message to the worker process. This method can be called only | 44 // WorkerProcessIpcDelegate implementation. |
45 // after successful Start() and until Stop() is called or an error occurred. | 45 virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; |
46 | |
47 // DaemonProcess overrides. | |
46 virtual void SendToNetwork(IPC::Message* message) OVERRIDE; | 48 virtual void SendToNetwork(IPC::Message* message) OVERRIDE; |
49 virtual bool OnDesktopSessionAgentAttached( | |
50 int terminal_id, | |
51 base::ProcessHandle desktop_process, | |
52 IPC::PlatformFileForTransit desktop_pipe) OVERRIDE; | |
47 | 53 |
48 protected: | 54 protected: |
49 // Stoppable implementation. | 55 // Stoppable implementation. |
50 virtual void DoStop() OVERRIDE; | 56 virtual void DoStop() OVERRIDE; |
51 | 57 |
52 // DaemonProcess implementation. | 58 // DaemonProcess implementation. |
53 virtual scoped_ptr<DesktopSession> DoCreateDesktopSession( | 59 virtual scoped_ptr<DesktopSession> DoCreateDesktopSession( |
54 int terminal_id) OVERRIDE; | 60 int terminal_id) OVERRIDE; |
55 virtual void LaunchNetworkProcess() OVERRIDE; | 61 virtual void LaunchNetworkProcess() OVERRIDE; |
56 | 62 |
57 private: | 63 private: |
58 scoped_ptr<WorkerProcessLauncher> network_launcher_; | 64 scoped_ptr<WorkerProcessLauncher> network_launcher_; |
59 | 65 |
66 // Handle of the network process. | |
67 ScopedHandle network_process_; | |
68 | |
60 DISALLOW_COPY_AND_ASSIGN(DaemonProcessWin); | 69 DISALLOW_COPY_AND_ASSIGN(DaemonProcessWin); |
61 }; | 70 }; |
62 | 71 |
63 DaemonProcessWin::DaemonProcessWin( | 72 DaemonProcessWin::DaemonProcessWin( |
64 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, | 73 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
65 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, | 74 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, |
66 const base::Closure& stopped_callback) | 75 const base::Closure& stopped_callback) |
67 : DaemonProcess(caller_task_runner, io_task_runner, stopped_callback) { | 76 : DaemonProcess(caller_task_runner, io_task_runner, stopped_callback) { |
68 } | 77 } |
69 | 78 |
70 DaemonProcessWin::~DaemonProcessWin() { | 79 DaemonProcessWin::~DaemonProcessWin() { |
71 // Make sure that the object is completely stopped. The same check exists | 80 // Make sure that the object is completely stopped. The same check exists |
72 // in Stoppable::~Stoppable() but this one helps us to fail early and | 81 // in Stoppable::~Stoppable() but this one helps us to fail early and |
73 // predictably. | 82 // predictably. |
74 CHECK_EQ(stoppable_state(), Stoppable::kStopped); | 83 CHECK_EQ(stoppable_state(), Stoppable::kStopped); |
75 } | 84 } |
76 | 85 |
86 void DaemonProcessWin::OnChannelConnected(int32 peer_pid) { | |
87 // Obtain the handle of the network process. | |
88 network_process_.Set(OpenProcess(PROCESS_DUP_HANDLE, false, peer_pid)); | |
89 if (!network_process_.IsValid()) { | |
90 RestartNetworkProcess(FROM_HERE); | |
91 return; | |
92 } | |
93 | |
94 DaemonProcess::OnChannelConnected(peer_pid); | |
95 } | |
96 | |
77 void DaemonProcessWin::SendToNetwork(IPC::Message* message) { | 97 void DaemonProcessWin::SendToNetwork(IPC::Message* message) { |
78 if (network_launcher_) { | 98 if (network_launcher_) { |
79 network_launcher_->Send(message); | 99 network_launcher_->Send(message); |
80 } else { | 100 } else { |
81 delete message; | 101 delete message; |
82 } | 102 } |
83 } | 103 } |
84 | 104 |
105 bool DaemonProcessWin::OnDesktopSessionAgentAttached( | |
Sergey Ulanov
2012/10/24 20:12:01
Did you mean to implement this method in DaemonPro
alexeypa (please no reviews)
2012/10/24 21:41:51
Done.
| |
106 int terminal_id, | |
107 base::ProcessHandle desktop_process, | |
108 IPC::PlatformFileForTransit desktop_pipe) { | |
109 // Prepare |desktop_process| handle for sending over to the network process. | |
110 IPC::PlatformFileForTransit desktop_process_for_transit = | |
111 IPC::GetFileHandleForProcess(desktop_process, network_process_, false); | |
112 if (desktop_process_for_transit == IPC::InvalidPlatformFileForTransit()) { | |
113 LOG(ERROR) << "Failed to duplicate the desktop process handle"; | |
114 return false; | |
115 } | |
116 | |
117 // Posix: |desktop_pipe| is an auto-close base::FileDescriptor. The IPC | |
118 // subsystem will make sure that it is properly closed. | |
119 // Windows: |desktop_pipe| is a handle in the desktop process. It will be | |
120 // duplicated directly from the desktop process by the network process. | |
121 #if defined(OS_POSIX) | |
122 DCHECK(desktop_pipe.auto_close); | |
123 #endif // defined(OS_POSIX) | |
124 | |
125 SendToNetwork(new ChromotingDaemonNetworkMsg_DesktopAttached( | |
126 terminal_id, desktop_process_for_transit, desktop_pipe)); | |
127 return true; | |
128 } | |
129 | |
85 void DaemonProcessWin::DoStop() { | 130 void DaemonProcessWin::DoStop() { |
86 DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 131 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
87 | 132 |
88 network_launcher_.reset(); | 133 network_launcher_.reset(); |
89 DaemonProcess::DoStop(); | 134 DaemonProcess::DoStop(); |
90 } | 135 } |
91 | 136 |
92 scoped_ptr<DesktopSession> DaemonProcessWin::DoCreateDesktopSession( | 137 scoped_ptr<DesktopSession> DaemonProcessWin::DoCreateDesktopSession( |
93 int terminal_id) { | 138 int terminal_id) { |
94 DCHECK(caller_task_runner()->BelongsToCurrentThread()); | 139 DCHECK(caller_task_runner()->BelongsToCurrentThread()); |
(...skipping 26 matching lines...) Expand all Loading... | |
121 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, | 166 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, |
122 const base::Closure& stopped_callback) { | 167 const base::Closure& stopped_callback) { |
123 scoped_ptr<DaemonProcessWin> daemon_process( | 168 scoped_ptr<DaemonProcessWin> daemon_process( |
124 new DaemonProcessWin(caller_task_runner, io_task_runner, | 169 new DaemonProcessWin(caller_task_runner, io_task_runner, |
125 stopped_callback)); | 170 stopped_callback)); |
126 daemon_process->Initialize(); | 171 daemon_process->Initialize(); |
127 return daemon_process.PassAs<DaemonProcess>(); | 172 return daemon_process.PassAs<DaemonProcess>(); |
128 } | 173 } |
129 | 174 |
130 } // namespace remoting | 175 } // namespace remoting |
OLD | NEW |