Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(467)

Side by Side Diff: chrome/browser/chrome_to_mobile/receive/chrome_to_mobile_receive_backend.cc

Issue 11038063: Support chrome_to_mobile job receiving Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix format Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2012 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 "chrome/browser/chrome_to_mobile/receive/chrome_to_mobile_receive_backe nd.h"
6
7 #include "base/bind.h"
8 #include "base/message_loop.h"
9 #include "chrome/browser/chrome_to_mobile/receive/chrome_to_mobile_receive_job_o bserver.h"
10 #include "chrome/browser/signin/oauth2_token_service.h"
11 #include "chrome/browser/chrome_to_mobile/receive/chrome_to_mobile_receive_util. h"
12 #include "chrome/common/cloud_print/cloud_print_helpers.h"
13 #include "content/public/browser/browser_thread.h"
14
15 namespace chrome_to_mobile_receive {
16 ChromeToMobileReceiveBackend::ChromeToMobileReceiveBackend(
17 ChromeToMobileReceiveFrontend* frontend,
18 const GURL& cloud_print_server_url,
19 net::URLRequestContextGetter* request_context_getter,
20 OAuth2TokenService* oauth2_token_service)
21 : frontend_(frontend),
22 frontend_loop_(MessageLoop::current()),
23 chrome_to_mobile_thread_("Chrome_ChromeToMobileThread"),
24 cloud_print_server_url_(cloud_print_server_url),
25 request_context_getter_(request_context_getter),
26 oauth2_token_service_(oauth2_token_service) {
27 chrome_to_mobile_thread_.Start();
28 }
29
30 ChromeToMobileReceiveBackend::~ChromeToMobileReceiveBackend() {
31 }
32
33 void ChromeToMobileReceiveBackend::Start() {
34 chrome_to_mobile_thread_.Start();
35 }
36
37 bool ChromeToMobileReceiveBackend::IsRunning() const {
38 return chrome_to_mobile_thread_.IsRunning();
39 }
40
41 void ChromeToMobileReceiveBackend::ShutDown() {
42 DCHECK(MessageLoop::current() == frontend_loop_);
43
44 stop_device_request_.reset();
45 PostToChromeToMobileThread(base::Bind(
46 &ChromeToMobileReceiveBackend::CancelAllPendingRequestsOnBackendThreads,
47 this));
48 content::BrowserThread::PostBlockingPoolTask(FROM_HERE,
49 base::Bind(&ChromeToMobileReceiveBackend::StopThread, this));
50 }
51
52 void ChromeToMobileReceiveBackend::StopThread() {
53 chrome_to_mobile_thread_.Stop();
54 }
55
56 void ChromeToMobileReceiveBackend::CancelAllPendingRequestsOnBackendThreads() {
57 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
58 device_manager_.reset();
59 snapshots_fetcher_.reset();
60 print_jobs_fetcher_.reset();
61 }
62
63 void ChromeToMobileReceiveBackend::CancelAllPendingOperations() {
64 DCHECK(MessageLoop::current() == frontend_loop_);
65 stop_device_request_.reset();
66 PostToChromeToMobileThread(base::Bind(
67 &ChromeToMobileReceiveBackend::DoCancelAllPendingOperations, this));
68 }
69
70 void ChromeToMobileReceiveBackend::DoCancelAllPendingOperations() {
71 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
72 CancelAllPendingRequestsOnBackendThreads();
73 PostToFrontendThread(base::Bind(
74 &ChromeToMobileReceiveFrontend::OnCancelAllPendingOperationsComplete,
75 base::Unretained(frontend_)));
76 }
77
78 void ChromeToMobileReceiveBackend::StartDevice(
79 const std::string& printer_id,
80 const std::map<std::string, std::string>& printer_tags) {
81 DCHECK(MessageLoop::current() == frontend_loop_);
82 PostToChromeToMobileThread(base::Bind(
83 &ChromeToMobileReceiveBackend::DoStartDevice, this,
84 printer_id, printer_tags));
85 }
86
87 void ChromeToMobileReceiveBackend::DoStartDevice(
88 const std::string printer_id,
89 const std::map<std::string, std::string> printer_tags) {
90 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
91
92 chrome_to_mobile::CloudPrintRequest::Settings request_settings(
93 kChromeToMobileClientParameter,
94 request_context_getter_,
95 oauth2_token_service_);
96 // Callback |OnStartDeviceComplete| will be called when this request
97 // completes.
98 device_manager_.reset(
99 ChromeToMobileReceiveDeviceManager::CreateAndStart(
100 cloud_print_server_url_,
101 printer_id,
102 printer_tags,
103 request_settings,
104 this));
105 }
106
107 void ChromeToMobileReceiveBackend::OnStartDeviceComplete(
108 ChromeToMobileReceiveDeviceManager* source) {
109 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
110 if (source->HasCloudPrintAuthError())
111 HandleCloudPrintAuthError();
112 if (source->HasOAuth2AccessTokenFailure())
113 HandleGetOAuth2AccessTokenFailure();
114
115 bool success = source->IsSuccess();
116 std::string printer_id = source->GetStartedPrinterId();
117 PostToFrontendThread(base::Bind(
118 &ChromeToMobileReceiveFrontend::OnStartDeviceComplete,
119 base::Unretained(frontend_), success, printer_id));
120 device_manager_.reset();
121 }
122
123 void ChromeToMobileReceiveBackend::StopDevice(
124 const std::string& printer_id) {
125 DCHECK(MessageLoop::current() == frontend_loop_);
126 PostToChromeToMobileThread(base::Bind(
127 &ChromeToMobileReceiveBackend::CancelAllPendingRequestsOnBackendThreads,
128 this));
129 chrome_to_mobile::CloudPrintRequest::Settings request_settings(
130 kChromeToMobileClientParameter,
131 request_context_getter_,
132 oauth2_token_service_);
133 // Callback |OnRequestComplete| will be called when this request completes.
134 stop_device_request_.reset(
135 chrome_to_mobile::CloudPrintRequest::CreateAndStartGetRequest(
136 cloud_print::GetUrlForPrinterDelete(cloud_print_server_url_,
137 printer_id,
138 "chrome_to_mobile_stopped"),
139 request_settings, this));
140 }
141
142 void ChromeToMobileReceiveBackend::OnRequestComplete(
143 chrome_to_mobile::CloudPrintRequest* source) {
144 DCHECK(MessageLoop::current() == frontend_loop_);
145 bool success;
146 source->GetResponseData(&success);
147 PostToFrontendThread(base::Bind(
148 &ChromeToMobileReceiveFrontend::OnStopDeviceComplete,
149 base::Unretained(frontend_), success));
150 stop_device_request_.reset();
151 }
152
153 void ChromeToMobileReceiveBackend::FetchJobs(
154 const std::string& printer_id) {
155 DCHECK(MessageLoop::current() == frontend_loop_);
156 PostToChromeToMobileThread(base::Bind(
157 &ChromeToMobileReceiveBackend::DoFetchJobs,
158 this, printer_id));
159 }
160
161 void ChromeToMobileReceiveBackend::DoFetchJobs(
162 std::string printer_id) {
163 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
164
165 chrome_to_mobile::CloudPrintRequest::Settings request_settings(
166 kChromeToMobileClientParameter,
167 request_context_getter_,
168 oauth2_token_service_);
169
170 if (!snapshots_fetcher_.get()) {
171 snapshots_fetcher_.reset(ChromeToMobileSnapshotsFetcher::Create(
172 cloud_print_server_url_, printer_id, request_settings, this));
173 }
174 if (!print_jobs_fetcher_.get()) {
175 print_jobs_fetcher_.reset(new ChromeToMobilePrintToPhoneJobsFetcher(
176 cloud_print_server_url_, printer_id, request_settings, this));
177 }
178 snapshots_fetcher_->Fetch();
179 print_jobs_fetcher_->Fetch();
180 }
181
182 void ChromeToMobileReceiveBackend::OnSnapshotsFetchComplete(
183 ChromeToMobileSnapshotsFetcher * source) {
184 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
185 if (source->HasCloudPrintAuthError())
186 HandleCloudPrintAuthError();
187 if (source->HasOAuth2AccessTokenFailure())
188 HandleGetOAuth2AccessTokenFailure();
189 }
190
191 void ChromeToMobileReceiveBackend::OnPrintJobsFetchComplete(
192 ChromeToMobilePrintToPhoneJobsFetcher* source) {
193 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
194 if (source->HasCloudPrintAuthError())
195 HandleCloudPrintAuthError();
196 if (source->HasOAuth2AccessTokenFailure())
197 HandleGetOAuth2AccessTokenFailure();
198 }
199
200 void ChromeToMobileReceiveBackend::OnSnapshotUrlFetched(
201 const std::string& snapshot_id,
202 const std::string& original_url,
203 const std::string& title,
204 const bool& is_offline_data_expected,
205 const std::string& create_time) {
206 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
207 PostToFrontendThread(base::Bind(
208 &ChromeToMobileReceiveBackend::DoOnSnapshotUrlFetched, this,
209 snapshot_id, original_url, title, is_offline_data_expected, create_time));
210 }
211
212 void ChromeToMobileReceiveBackend::DoOnSnapshotUrlFetched(
213 const std::string& snapshot_id,
214 const std::string& original_url,
215 const std::string& title,
216 const bool& is_offline_data_expected,
217 const std::string& create_time) {
218 DCHECK(MessageLoop::current() == frontend_loop_);
219 FOR_EACH_OBSERVER(
220 ChromeToMobileReceiveJobObserver, *frontend_->GetJobObservers(),
221 OnSnapshotUrlFetched(snapshot_id, original_url, title,
222 is_offline_data_expected, create_time));
223 }
224
225 void ChromeToMobileReceiveBackend::OnSnapshotDataDownloadComplete(
226 const std::string& snapshot_id,
227 const bool& success,
228 const std::string& data_mime_type,
229 const std::string& data) {
230 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
231 PostToFrontendThread(base::Bind(
232 &ChromeToMobileReceiveBackend::DoOnSnapshotDataDownloadComplete, this,
233 snapshot_id, success, data_mime_type, data));
234 }
235
236 void ChromeToMobileReceiveBackend::DoOnSnapshotDataDownloadComplete(
237 const std::string& snapshot_id,
238 const bool& success,
239 const std::string& data_mime_type,
240 const std::string& data) {
241 DCHECK(MessageLoop::current() == frontend_loop_);
242 FOR_EACH_OBSERVER(
243 ChromeToMobileReceiveJobObserver, *frontend_->GetJobObservers(),
244 OnSnapshotDataDownloadComplete(
245 snapshot_id, success, data_mime_type, data));
246 }
247
248 void ChromeToMobileReceiveBackend::OnPrintToPhoneJobDownloadStart(
249 const std::string& job_id,
250 const std::string& title) {
251 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
252 PostToFrontendThread(base::Bind(
253 &ChromeToMobileReceiveBackend::DoOnPrintToPhoneJobDownloadStart, this,
254 job_id, title));
255 }
256
257 void ChromeToMobileReceiveBackend::DoOnPrintToPhoneJobDownloadStart(
258 const std::string& job_id,
259 const std::string& title) {
260 DCHECK(MessageLoop::current() == frontend_loop_);
261 FOR_EACH_OBSERVER(
262 ChromeToMobileReceiveJobObserver, *frontend_->GetJobObservers(),
263 OnPrintToPhoneJobDownloadStart(job_id, title));
264 }
265
266 void ChromeToMobileReceiveBackend::OnPrintToPhoneJobDownloadComplete(
267 const std::string& job_id,
268 const bool& success,
269 const std::string& data_mime_type,
270 const std::string& data) {
271 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
272 PostToFrontendThread(base::Bind(
273 &ChromeToMobileReceiveBackend::DoOnPrintToPhoneJobDownloadComplete, this,
274 job_id, success, data_mime_type, data));
275 }
276
277 void ChromeToMobileReceiveBackend::DoOnPrintToPhoneJobDownloadComplete(
278 const std::string& job_id,
279 const bool& success,
280 const std::string& data_mime_type,
281 const std::string& data) {
282 DCHECK(MessageLoop::current() == frontend_loop_);
283 FOR_EACH_OBSERVER(
284 ChromeToMobileReceiveJobObserver, *frontend_->GetJobObservers(),
285 OnPrintToPhoneJobDownloadComplete(job_id, success, data_mime_type, data));
286 }
287
288 void ChromeToMobileReceiveBackend::HandleGetOAuth2AccessTokenFailure() {
289 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
290 PostToFrontendThread(base::Bind(
291 &ChromeToMobileReceiveFrontend::OnOAuth2AccessTokenFetchError,
292 base::Unretained(frontend_)));
293 }
294
295 void ChromeToMobileReceiveBackend::HandleCloudPrintAuthError() {
296 DCHECK(MessageLoop::current() == chrome_to_mobile_thread_.message_loop());
297 PostToFrontendThread(base::Bind(
298 &ChromeToMobileReceiveFrontend::OnCloudPrintAuthError,
299 base::Unretained(frontend_)));
300 }
301
302 void ChromeToMobileReceiveBackend::PostToChromeToMobileThread(
303 const base::Closure& task) {
304 chrome_to_mobile_thread_.message_loop()->PostTask(FROM_HERE, task);
305 }
306
307 void ChromeToMobileReceiveBackend::PostToFrontendThread(
308 const base::Closure& task) {
309 frontend_loop_->PostTask(FROM_HERE, task);
310 }
311
312 } // namespace chrome_to_mobile_receive
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698