OLD | NEW |
(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 |
OLD | NEW |