OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "remoting/host/setup/daemon_controller.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/location.h" | |
9 #include "base/single_thread_task_runner.h" | |
10 #include "base/thread_task_runner_handle.h" | |
11 #include "base/values.h" | |
12 #include "remoting/base/auto_thread.h" | |
13 #include "remoting/base/auto_thread_task_runner.h" | |
14 | |
15 namespace remoting { | |
16 | |
17 // Name of the Daemon Controller's worker thread. | |
18 const char kDaemonControllerThreadName[] = "Daemon Controller thread"; | |
19 | |
20 DaemonController::DaemonController(scoped_ptr<Delegate> delegate) | |
21 : caller_task_runner_(base::ThreadTaskRunnerHandle::Get()), | |
22 delegate_(delegate.Pass()) { | |
23 // Launch the delegate thread. | |
24 delegate_thread_.reset(new AutoThread(kDaemonControllerThreadName)); | |
25 #if defined(OS_WIN) | |
26 delegate_thread_->SetComInitType(AutoThread::COM_INIT_STA); | |
27 delegate_task_runner_ = | |
28 delegate_thread_->StartWithType(base::MessageLoop::TYPE_UI); | |
29 #else | |
30 delegate_task_runner_ = | |
31 delegate_thread_->StartWithType(base::MessageLoop::TYPE_DEFAULT); | |
32 #endif | |
33 } | |
34 | |
35 DaemonController::State DaemonController::GetState() { | |
36 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
37 return delegate_->GetState(); | |
38 } | |
39 | |
40 void DaemonController::GetConfig(const GetConfigCallback& done) { | |
41 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
42 | |
43 DaemonController::GetConfigCallback wrapped_done = base::Bind( | |
44 &DaemonController::InvokeConfigCallbackAndScheduleNext, this, done); | |
45 base::Closure request = base::Bind( | |
46 &DaemonController::DoGetConfig, this, wrapped_done); | |
47 ServiceOrQueueRequest(request); | |
48 } | |
49 | |
50 void DaemonController::SetConfigAndStart( | |
51 scoped_ptr<base::DictionaryValue> config, | |
52 bool consent, | |
53 const CompletionCallback& done) { | |
54 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
55 | |
56 DaemonController::CompletionCallback wrapped_done = base::Bind( | |
57 &DaemonController::InvokeCompletionCallbackAndScheduleNext, this, done); | |
58 base::Closure request = base::Bind( | |
59 &DaemonController::DoSetConfigAndStart, this, base::Passed(&config), | |
60 consent, wrapped_done); | |
61 ServiceOrQueueRequest(request); | |
62 } | |
63 | |
64 void DaemonController::UpdateConfig(scoped_ptr<base::DictionaryValue> config, | |
65 const CompletionCallback& done) { | |
66 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
67 | |
68 DaemonController::CompletionCallback wrapped_done = base::Bind( | |
69 &DaemonController::InvokeCompletionCallbackAndScheduleNext, this, done); | |
70 base::Closure request = base::Bind( | |
71 &DaemonController::DoUpdateConfig, this, base::Passed(&config), | |
72 wrapped_done); | |
73 ServiceOrQueueRequest(request); | |
74 } | |
75 | |
76 void DaemonController::Stop(const CompletionCallback& done) { | |
77 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
78 | |
79 DaemonController::CompletionCallback wrapped_done = base::Bind( | |
80 &DaemonController::InvokeCompletionCallbackAndScheduleNext, this, done); | |
81 base::Closure request = base::Bind( | |
82 &DaemonController::DoStop, this, wrapped_done); | |
83 ServiceOrQueueRequest(request); | |
84 } | |
85 | |
86 void DaemonController::SetWindow(void* window_handle) { | |
87 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
88 | |
89 base::Closure done = base::Bind(&DaemonController::ScheduleNext, this); | |
90 base::Closure request = base::Bind( | |
91 &DaemonController::DoSetWindow, this, window_handle, done); | |
92 ServiceOrQueueRequest(request); | |
93 } | |
94 | |
95 void DaemonController::GetVersion(const GetVersionCallback& done) { | |
96 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
97 | |
98 DaemonController::GetVersionCallback wrapped_done = base::Bind( | |
99 &DaemonController::InvokeVersionCallbackAndScheduleNext, this, done); | |
100 base::Closure request = base::Bind( | |
101 &DaemonController::DoGetVersion, this, wrapped_done); | |
102 ServiceOrQueueRequest(request); | |
103 } | |
104 | |
105 void DaemonController::GetUsageStatsConsent( | |
106 const GetUsageStatsConsentCallback& done) { | |
107 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
108 | |
109 DaemonController::GetUsageStatsConsentCallback wrapped_done = base::Bind( | |
110 &DaemonController::InvokeConsentCallbackAndScheduleNext, this, done); | |
111 base::Closure request = base::Bind( | |
112 &DaemonController::DoGetUsageStatsConsent, this, wrapped_done); | |
113 ServiceOrQueueRequest(request); | |
114 } | |
115 | |
116 DaemonController::~DaemonController() { | |
117 // Make sure |delegate_| is deleted on the background thread. | |
118 delegate_task_runner_->DeleteSoon(FROM_HERE, delegate_.release()); | |
119 | |
120 // Stop the thread. | |
121 delegate_task_runner_ = NULL; | |
122 caller_task_runner_->DeleteSoon(FROM_HERE, delegate_thread_.release()); | |
123 } | |
124 | |
125 void DaemonController::DoGetConfig(const GetConfigCallback& done) { | |
126 if (!delegate_task_runner_->BelongsToCurrentThread()) { | |
Sergey Ulanov
2013/09/09 18:12:31
Here and in other Do*() methods you can replace it
alexeypa (please no reviews)
2013/09/09 19:30:57
Only if DaemonController::ServiceNextRequest() pos
| |
127 delegate_task_runner_->PostTask( | |
128 FROM_HERE, base::Bind(&DaemonController::DoGetConfig, this, done)); | |
129 return; | |
130 } | |
131 | |
132 scoped_ptr<base::DictionaryValue> config = delegate_->GetConfig(); | |
133 caller_task_runner_->PostTask(FROM_HERE, | |
134 base::Bind(done, base::Passed(&config))); | |
135 } | |
136 | |
137 void DaemonController::DoSetConfigAndStart( | |
138 scoped_ptr<base::DictionaryValue> config, | |
139 bool consent, | |
140 const CompletionCallback& done) { | |
141 if (!delegate_task_runner_->BelongsToCurrentThread()) { | |
142 delegate_task_runner_->PostTask( | |
143 FROM_HERE, base::Bind(&DaemonController::DoSetConfigAndStart, this, | |
144 base::Passed(&config), consent, done)); | |
145 return; | |
146 } | |
147 | |
148 delegate_->SetConfigAndStart(config.Pass(), consent, done); | |
149 } | |
150 | |
151 void DaemonController::DoUpdateConfig( | |
152 scoped_ptr<base::DictionaryValue> config, | |
153 const CompletionCallback& done) { | |
154 if (!delegate_task_runner_->BelongsToCurrentThread()) { | |
155 delegate_task_runner_->PostTask( | |
156 FROM_HERE, base::Bind(&DaemonController::DoUpdateConfig, this, | |
157 base::Passed(&config), done)); | |
158 return; | |
159 } | |
160 | |
161 delegate_->UpdateConfig(config.Pass(), done); | |
162 } | |
163 | |
164 void DaemonController::DoStop(const CompletionCallback& done) { | |
165 if (!delegate_task_runner_->BelongsToCurrentThread()) { | |
166 delegate_task_runner_->PostTask( | |
167 FROM_HERE, base::Bind(&DaemonController::DoStop, this, done)); | |
168 return; | |
169 } | |
170 | |
171 delegate_->Stop(done); | |
172 } | |
173 | |
174 void DaemonController::DoSetWindow(void* window_handle, | |
175 const base::Closure& done) { | |
176 if (!delegate_task_runner_->BelongsToCurrentThread()) { | |
177 delegate_task_runner_->PostTask( | |
178 FROM_HERE, base::Bind(&DaemonController::DoSetWindow, this, | |
179 window_handle, done)); | |
180 return; | |
181 } | |
182 | |
183 delegate_->SetWindow(window_handle); | |
184 caller_task_runner_->PostTask(FROM_HERE, done); | |
185 } | |
186 | |
187 void DaemonController::DoGetVersion(const GetVersionCallback& done) { | |
188 if (!delegate_task_runner_->BelongsToCurrentThread()) { | |
189 delegate_task_runner_->PostTask( | |
190 FROM_HERE, base::Bind(&DaemonController::DoGetVersion, this, done)); | |
191 return; | |
192 } | |
193 | |
194 std::string version = delegate_->GetVersion(); | |
195 caller_task_runner_->PostTask(FROM_HERE, base::Bind(done, version)); | |
196 } | |
197 | |
198 void DaemonController::DoGetUsageStatsConsent( | |
199 const GetUsageStatsConsentCallback& done) { | |
200 if (!delegate_task_runner_->BelongsToCurrentThread()) { | |
201 delegate_task_runner_->PostTask( | |
202 FROM_HERE, base::Bind(&DaemonController::DoGetUsageStatsConsent, this, | |
203 done)); | |
204 return; | |
205 } | |
206 | |
207 DaemonController::UsageStatsConsent consent = | |
208 delegate_->GetUsageStatsConsent(); | |
209 caller_task_runner_->PostTask(FROM_HERE, base::Bind(done, consent)); | |
210 } | |
211 | |
212 void DaemonController::InvokeCompletionCallbackAndScheduleNext( | |
213 const CompletionCallback& done, | |
214 AsyncResult result) { | |
215 if (!caller_task_runner_->BelongsToCurrentThread()) { | |
216 caller_task_runner_->PostTask( | |
217 FROM_HERE, | |
218 base::Bind(&DaemonController::InvokeCompletionCallbackAndScheduleNext, | |
219 this, done, result)); | |
220 return; | |
221 } | |
222 | |
223 done.Run(result); | |
224 ScheduleNext(); | |
225 } | |
226 | |
227 void DaemonController::InvokeConfigCallbackAndScheduleNext( | |
228 const GetConfigCallback& done, | |
229 scoped_ptr<base::DictionaryValue> config) { | |
230 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
231 | |
232 done.Run(config.Pass()); | |
233 ScheduleNext(); | |
234 } | |
235 | |
236 void DaemonController::InvokeConsentCallbackAndScheduleNext( | |
237 const GetUsageStatsConsentCallback& done, | |
238 const UsageStatsConsent& consent) { | |
239 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
240 | |
241 done.Run(consent); | |
242 ScheduleNext(); | |
243 } | |
244 | |
245 void DaemonController::InvokeVersionCallbackAndScheduleNext( | |
246 const GetVersionCallback& done, | |
247 const std::string& version) { | |
248 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
249 | |
250 done.Run(version); | |
251 ScheduleNext(); | |
252 } | |
253 | |
254 void DaemonController::ScheduleNext() { | |
255 DCHECK(caller_task_runner_->BelongsToCurrentThread()); | |
256 | |
257 pending_requests_.pop(); | |
258 ServiceNextRequest(); | |
259 } | |
260 | |
261 void DaemonController::ServiceOrQueueRequest(const base::Closure& request) { | |
262 bool servicing_request = !pending_requests_.empty(); | |
263 pending_requests_.push(request); | |
264 if (!servicing_request) | |
265 ServiceNextRequest(); | |
266 } | |
267 | |
268 void DaemonController::ServiceNextRequest() { | |
269 if (!pending_requests_.empty()) | |
270 pending_requests_.front().Run(); | |
271 } | |
272 | |
273 } // namespace remoting | |
OLD | NEW |