OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/service/cloud_print/printer_job_handler.h" | 5 #include "chrome/service/cloud_print/printer_job_handler.h" |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
9 #include "base/md5.h" | 9 #include "base/md5.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 } | 62 } |
63 | 63 |
64 void PrinterJobHandler::Reset() { | 64 void PrinterJobHandler::Reset() { |
65 print_data_url_.clear(); | 65 print_data_url_.clear(); |
66 job_details_.Clear(); | 66 job_details_.Clear(); |
67 request_.reset(); | 67 request_.reset(); |
68 print_thread_.Stop(); | 68 print_thread_.Stop(); |
69 } | 69 } |
70 | 70 |
71 void PrinterJobHandler::Start() { | 71 void PrinterJobHandler::Start() { |
| 72 LOG(INFO) << "CP_PROXY: Start printer job handler, id: " << printer_id_ << |
| 73 ", task in progress: " << task_in_progress_; |
72 if (task_in_progress_) { | 74 if (task_in_progress_) { |
73 // Multiple Starts can get posted because of multiple notifications | 75 // Multiple Starts can get posted because of multiple notifications |
74 // We want to ignore the other ones that happen when a task is in progress. | 76 // We want to ignore the other ones that happen when a task is in progress. |
75 return; | 77 return; |
76 } | 78 } |
77 Reset(); | 79 Reset(); |
78 if (!shutting_down_) { | 80 if (!shutting_down_) { |
79 // Check if we have work to do. | 81 // Check if we have work to do. |
80 if (HavePendingTasks()) { | 82 if (HavePendingTasks()) { |
81 if (printer_delete_pending_) { | 83 if (printer_delete_pending_) { |
(...skipping 17 matching lines...) Expand all Loading... |
99 CloudPrintHelpers::GetUrlForJobFetch( | 101 CloudPrintHelpers::GetUrlForJobFetch( |
100 cloud_print_server_url_, printer_id_), | 102 cloud_print_server_url_, printer_id_), |
101 &PrinterJobHandler::HandleJobMetadataResponse, | 103 &PrinterJobHandler::HandleJobMetadataResponse, |
102 &PrinterJobHandler::Stop); | 104 &PrinterJobHandler::Stop); |
103 } | 105 } |
104 } | 106 } |
105 } | 107 } |
106 } | 108 } |
107 | 109 |
108 void PrinterJobHandler::Stop() { | 110 void PrinterJobHandler::Stop() { |
| 111 LOG(INFO) << "CP_PROXY: Stop printer job handler, id: " << printer_id_; |
109 task_in_progress_ = false; | 112 task_in_progress_ = false; |
110 Reset(); | 113 Reset(); |
111 if (HavePendingTasks()) { | 114 if (HavePendingTasks()) { |
112 MessageLoop::current()->PostTask( | 115 MessageLoop::current()->PostTask( |
113 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Start)); | 116 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Start)); |
114 } | 117 } |
115 } | 118 } |
116 | 119 |
117 void PrinterJobHandler::NotifyJobAvailable() { | 120 void PrinterJobHandler::NotifyJobAvailable() { |
| 121 LOG(INFO) << "CP_PROXY: Notify job available, id: " << printer_id_ << |
| 122 ", task in progress: " << task_in_progress_; |
118 server_job_available_ = true; | 123 server_job_available_ = true; |
119 if (!task_in_progress_) { | 124 if (!task_in_progress_) { |
120 MessageLoop::current()->PostTask( | 125 MessageLoop::current()->PostTask( |
121 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Start)); | 126 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Start)); |
122 } | 127 } |
123 } | 128 } |
124 | 129 |
125 bool PrinterJobHandler::UpdatePrinterInfo() { | 130 bool PrinterJobHandler::UpdatePrinterInfo() { |
| 131 LOG(INFO) << "CP_PROXY: Update printer info, id: " << printer_id_; |
126 // We need to update the parts of the printer info that have changed | 132 // We need to update the parts of the printer info that have changed |
127 // (could be printer name, description, status or capabilities). | 133 // (could be printer name, description, status or capabilities). |
128 cloud_print::PrinterBasicInfo printer_info; | 134 cloud_print::PrinterBasicInfo printer_info; |
129 printer_watcher_->GetCurrentPrinterInfo(&printer_info); | 135 printer_watcher_->GetCurrentPrinterInfo(&printer_info); |
130 cloud_print::PrinterCapsAndDefaults printer_caps; | 136 cloud_print::PrinterCapsAndDefaults printer_caps; |
131 std::string post_data; | 137 std::string post_data; |
132 std::string mime_boundary; | 138 std::string mime_boundary; |
133 if (print_system_->GetPrinterCapsAndDefaults(printer_info.printer_name, | 139 if (print_system_->GetPrinterCapsAndDefaults(printer_info.printer_name, |
134 &printer_caps)) { | 140 &printer_caps)) { |
135 std::string caps_hash = MD5String(printer_caps.printer_capabilities); | 141 std::string caps_hash = MD5String(printer_caps.printer_capabilities); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 ret = true; | 191 ret = true; |
186 } | 192 } |
187 return ret; | 193 return ret; |
188 } | 194 } |
189 | 195 |
190 // URLFetcher::Delegate implementation. | 196 // URLFetcher::Delegate implementation. |
191 void PrinterJobHandler::OnURLFetchComplete( | 197 void PrinterJobHandler::OnURLFetchComplete( |
192 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, | 198 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, |
193 int response_code, const ResponseCookies& cookies, | 199 int response_code, const ResponseCookies& cookies, |
194 const std::string& data) { | 200 const std::string& data) { |
| 201 LOG(INFO) << "CP_PROXY: Printer job handler, OnURLFetchComplete, url: " << |
| 202 url << ", response code: " << response_code; |
195 if (!shutting_down_) { | 203 if (!shutting_down_) { |
196 DCHECK(source == request_.get()); | 204 DCHECK(source == request_.get()); |
197 // We need a next response handler because we are strictly a sequential | 205 // We need a next response handler because we are strictly a sequential |
198 // state machine. We need each response handler to tell us which state to | 206 // state machine. We need each response handler to tell us which state to |
199 // advance to next. | 207 // advance to next. |
200 DCHECK(next_response_handler_); | 208 DCHECK(next_response_handler_); |
201 if (!(this->*next_response_handler_)(source, url, status, | 209 if (!(this->*next_response_handler_)(source, url, status, |
202 response_code, cookies, data)) { | 210 response_code, cookies, data)) { |
203 // By contract, if the response handler returns false, it wants us to | 211 // By contract, if the response handler returns false, it wants us to |
204 // retry the request (upto the usual limit after which we give up and | 212 // retry the request (upto the usual limit after which we give up and |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 FROM_HERE, NewRunnableMethod(index->get(), | 255 FROM_HERE, NewRunnableMethod(index->get(), |
248 &JobStatusUpdater::UpdateStatus)); | 256 &JobStatusUpdater::UpdateStatus)); |
249 } | 257 } |
250 } | 258 } |
251 | 259 |
252 bool PrinterJobHandler::HandlePrinterUpdateResponse( | 260 bool PrinterJobHandler::HandlePrinterUpdateResponse( |
253 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, | 261 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, |
254 int response_code, const ResponseCookies& cookies, | 262 int response_code, const ResponseCookies& cookies, |
255 const std::string& data) { | 263 const std::string& data) { |
256 bool ret = false; | 264 bool ret = false; |
| 265 LOG(INFO) << "CP_PROXY: Handle printer update response, id: " << printer_id_; |
257 // If there was a network error or a non-200 response (which, for our purposes | 266 // If there was a network error or a non-200 response (which, for our purposes |
258 // is the same as a network error), we want to retry. | 267 // is the same as a network error), we want to retry. |
259 if (status.is_success() && (response_code == 200)) { | 268 if (status.is_success() && (response_code == 200)) { |
260 bool succeeded = false; | 269 bool succeeded = false; |
261 DictionaryValue* response_dict = NULL; | 270 DictionaryValue* response_dict = NULL; |
262 CloudPrintHelpers::ParseResponseJSON(data, &succeeded, &response_dict); | 271 CloudPrintHelpers::ParseResponseJSON(data, &succeeded, &response_dict); |
263 // If we get valid JSON back, we are done. | 272 // If we get valid JSON back, we are done. |
264 if (NULL != response_dict) { | 273 if (NULL != response_dict) { |
265 ret = true; | 274 ret = true; |
266 } | 275 } |
267 } | 276 } |
268 if (ret) { | 277 if (ret) { |
269 // We are done here. Go to the Stop state | 278 // We are done here. Go to the Stop state |
270 MessageLoop::current()->PostTask( | 279 MessageLoop::current()->PostTask( |
271 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); | 280 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); |
272 } else { | 281 } else { |
273 // Since we failed to update the server, set the flag again. | 282 // Since we failed to update the server, set the flag again. |
274 printer_update_pending_ = true; | 283 printer_update_pending_ = true; |
275 } | 284 } |
276 return ret; | 285 return ret; |
277 } | 286 } |
278 | 287 |
279 bool PrinterJobHandler::HandlePrinterDeleteResponse( | 288 bool PrinterJobHandler::HandlePrinterDeleteResponse( |
280 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, | 289 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, |
281 int response_code, const ResponseCookies& cookies, | 290 int response_code, const ResponseCookies& cookies, |
282 const std::string& data) { | 291 const std::string& data) { |
283 bool ret = false; | 292 bool ret = false; |
| 293 LOG(INFO) << "CP_PROXY: Handler printer delete response, id: " << printer_id_; |
284 // If there was a network error or a non-200 response (which, for our purposes | 294 // If there was a network error or a non-200 response (which, for our purposes |
285 // is the same as a network error), we want to retry. | 295 // is the same as a network error), we want to retry. |
286 if (status.is_success() && (response_code == 200)) { | 296 if (status.is_success() && (response_code == 200)) { |
287 bool succeeded = false; | 297 bool succeeded = false; |
288 DictionaryValue* response_dict = NULL; | 298 DictionaryValue* response_dict = NULL; |
289 CloudPrintHelpers::ParseResponseJSON(data, &succeeded, &response_dict); | 299 CloudPrintHelpers::ParseResponseJSON(data, &succeeded, &response_dict); |
290 // If we get valid JSON back, we are done. | 300 // If we get valid JSON back, we are done. |
291 if (NULL != response_dict) { | 301 if (NULL != response_dict) { |
292 ret = true; | 302 ret = true; |
293 } | 303 } |
294 } | 304 } |
295 if (ret) { | 305 if (ret) { |
296 // The printer has been deleted. Shutdown the handler class. | 306 // The printer has been deleted. Shutdown the handler class. |
297 MessageLoop::current()->PostTask( | 307 MessageLoop::current()->PostTask( |
298 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Shutdown)); | 308 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Shutdown)); |
299 } else { | 309 } else { |
300 // Since we failed to update the server, set the flag again. | 310 // Since we failed to update the server, set the flag again. |
301 printer_delete_pending_ = true; | 311 printer_delete_pending_ = true; |
302 } | 312 } |
303 return ret; | 313 return ret; |
304 } | 314 } |
305 | 315 |
306 bool PrinterJobHandler::HandleJobMetadataResponse( | 316 bool PrinterJobHandler::HandleJobMetadataResponse( |
307 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, | 317 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, |
308 int response_code, const ResponseCookies& cookies, | 318 int response_code, const ResponseCookies& cookies, |
309 const std::string& data) { | 319 const std::string& data) { |
| 320 LOG(INFO) << "CP_PROXY: Handle job metadata response, id: " << printer_id_; |
310 // If there was a network error or a non-200 response (which, for our purposes | 321 // If there was a network error or a non-200 response (which, for our purposes |
311 // is the same as a network error), we want to retry. | 322 // is the same as a network error), we want to retry. |
312 if (!status.is_success() || (response_code != 200)) { | 323 if (!status.is_success() || (response_code != 200)) { |
313 return false; | 324 return false; |
314 } | 325 } |
315 bool succeeded = false; | 326 bool succeeded = false; |
316 DictionaryValue* response_dict = NULL; | 327 DictionaryValue* response_dict = NULL; |
317 CloudPrintHelpers::ParseResponseJSON(data, &succeeded, &response_dict); | 328 CloudPrintHelpers::ParseResponseJSON(data, &succeeded, &response_dict); |
318 if (NULL == response_dict) { | 329 if (NULL == response_dict) { |
319 // If we did not get a valid JSON response, we need to retry. | 330 // If we did not get a valid JSON response, we need to retry. |
(...skipping 28 matching lines...) Expand all Loading... |
348 delete response_dict; | 359 delete response_dict; |
349 DCHECK(next_task); | 360 DCHECK(next_task); |
350 MessageLoop::current()->PostTask(FROM_HERE, next_task); | 361 MessageLoop::current()->PostTask(FROM_HERE, next_task); |
351 return true; | 362 return true; |
352 } | 363 } |
353 | 364 |
354 bool PrinterJobHandler::HandlePrintTicketResponse( | 365 bool PrinterJobHandler::HandlePrintTicketResponse( |
355 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, | 366 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, |
356 int response_code, const ResponseCookies& cookies, | 367 int response_code, const ResponseCookies& cookies, |
357 const std::string& data) { | 368 const std::string& data) { |
| 369 LOG(INFO) << "CP_PROXY: Handle print ticket response, id: " << printer_id_; |
358 // If there was a network error or a non-200 response (which, for our purposes | 370 // If there was a network error or a non-200 response (which, for our purposes |
359 // is the same as a network error), we want to retry. | 371 // is the same as a network error), we want to retry. |
360 if (!status.is_success() || (response_code != 200)) { | 372 if (!status.is_success() || (response_code != 200)) { |
361 return false; | 373 return false; |
362 } | 374 } |
363 if (print_system_->ValidatePrintTicket(printer_info_.printer_name, data)) { | 375 if (print_system_->ValidatePrintTicket(printer_info_.printer_name, data)) { |
364 job_details_.print_ticket_ = data; | 376 job_details_.print_ticket_ = data; |
365 MessageLoop::current()->PostTask( | 377 MessageLoop::current()->PostTask( |
366 FROM_HERE, | 378 FROM_HERE, |
367 NewRunnableMethod(this, | 379 NewRunnableMethod(this, |
368 &PrinterJobHandler::MakeServerRequest, | 380 &PrinterJobHandler::MakeServerRequest, |
369 GURL(print_data_url_.c_str()), | 381 GURL(print_data_url_.c_str()), |
370 &PrinterJobHandler::HandlePrintDataResponse, | 382 &PrinterJobHandler::HandlePrintDataResponse, |
371 &PrinterJobHandler::FailedFetchingJobData)); | 383 &PrinterJobHandler::FailedFetchingJobData)); |
372 } else { | 384 } else { |
373 // The print ticket was not valid. We are done here. | 385 // The print ticket was not valid. We are done here. |
374 FailedFetchingJobData(); | 386 FailedFetchingJobData(); |
375 } | 387 } |
376 return true; | 388 return true; |
377 } | 389 } |
378 | 390 |
379 bool PrinterJobHandler::HandlePrintDataResponse(const URLFetcher* source, | 391 bool PrinterJobHandler::HandlePrintDataResponse(const URLFetcher* source, |
380 const GURL& url, | 392 const GURL& url, |
381 const URLRequestStatus& status, | 393 const URLRequestStatus& status, |
382 int response_code, | 394 int response_code, |
383 const ResponseCookies& cookies, | 395 const ResponseCookies& cookies, |
384 const std::string& data) { | 396 const std::string& data) { |
| 397 LOG(INFO) << "CP_PROXY: Handle print data response, id: " << printer_id_; |
385 // If there was a network error or a non-200 response (which, for our purposes | 398 // If there was a network error or a non-200 response (which, for our purposes |
386 // is the same as a network error), we want to retry. | 399 // is the same as a network error), we want to retry. |
387 if (!status.is_success() || (response_code != 200)) { | 400 if (!status.is_success() || (response_code != 200)) { |
388 return false; | 401 return false; |
389 } | 402 } |
390 Task* next_task = NULL; | 403 Task* next_task = NULL; |
391 if (file_util::CreateTemporaryFile(&job_details_.print_data_file_path_)) { | 404 if (file_util::CreateTemporaryFile(&job_details_.print_data_file_path_)) { |
392 int ret = file_util::WriteFile(job_details_.print_data_file_path_, | 405 int ret = file_util::WriteFile(job_details_.print_data_file_path_, |
393 data.c_str(), | 406 data.c_str(), |
394 data.length()); | 407 data.length()); |
395 source->response_headers()->GetMimeType( | 408 source->response_headers()->GetMimeType( |
396 &job_details_.print_data_mime_type_); | 409 &job_details_.print_data_mime_type_); |
397 DCHECK(ret == static_cast<int>(data.length())); | 410 DCHECK(ret == static_cast<int>(data.length())); |
398 if (ret == static_cast<int>(data.length())) { | 411 if (ret == static_cast<int>(data.length())) { |
399 next_task = NewRunnableMethod(this, &PrinterJobHandler::StartPrinting); | 412 next_task = NewRunnableMethod(this, &PrinterJobHandler::StartPrinting); |
400 } | 413 } |
401 } | 414 } |
402 // If there was no task allocated above, then there was an error in | 415 // If there was no task allocated above, then there was an error in |
403 // saving the print data, bail out here. | 416 // saving the print data, bail out here. |
404 if (!next_task) { | 417 if (!next_task) { |
405 next_task = NewRunnableMethod(this, &PrinterJobHandler::JobFailed, | 418 next_task = NewRunnableMethod(this, &PrinterJobHandler::JobFailed, |
406 JOB_DOWNLOAD_FAILED); | 419 JOB_DOWNLOAD_FAILED); |
407 } | 420 } |
408 MessageLoop::current()->PostTask(FROM_HERE, next_task); | 421 MessageLoop::current()->PostTask(FROM_HERE, next_task); |
409 return true; | 422 return true; |
410 } | 423 } |
411 | 424 |
412 void PrinterJobHandler::StartPrinting() { | 425 void PrinterJobHandler::StartPrinting() { |
| 426 LOG(INFO) << "CP_PROXY: Start printing, id: " << printer_id_; |
413 // We are done with the request object for now. | 427 // We are done with the request object for now. |
414 request_.reset(); | 428 request_.reset(); |
415 if (!shutting_down_) { | 429 if (!shutting_down_) { |
416 if (!print_thread_.Start()) { | 430 if (!print_thread_.Start()) { |
417 JobFailed(PRINT_FAILED); | 431 JobFailed(PRINT_FAILED); |
418 } else { | 432 } else { |
419 print_thread_.message_loop()->PostTask( | 433 print_thread_.message_loop()->PostTask( |
420 FROM_HERE, NewRunnableFunction(&PrinterJobHandler::DoPrint, | 434 FROM_HERE, NewRunnableFunction(&PrinterJobHandler::DoPrint, |
421 job_details_, | 435 job_details_, |
422 printer_info_.printer_name, | 436 printer_info_.printer_name, |
423 print_system_, this, | 437 print_system_, this, |
424 MessageLoop::current())); | 438 MessageLoop::current())); |
425 } | 439 } |
426 } | 440 } |
427 } | 441 } |
428 | 442 |
429 void PrinterJobHandler::JobFailed(PrintJobError error) { | 443 void PrinterJobHandler::JobFailed(PrintJobError error) { |
| 444 LOG(INFO) << "CP_PROXY: Job failed, id: " << printer_id_; |
430 if (!shutting_down_) { | 445 if (!shutting_down_) { |
431 UpdateJobStatus(cloud_print::PRINT_JOB_STATUS_ERROR, error); | 446 UpdateJobStatus(cloud_print::PRINT_JOB_STATUS_ERROR, error); |
432 } | 447 } |
433 } | 448 } |
434 | 449 |
435 void PrinterJobHandler::JobSpooled(cloud_print::PlatformJobId local_job_id) { | 450 void PrinterJobHandler::JobSpooled(cloud_print::PlatformJobId local_job_id) { |
| 451 LOG(INFO) << "CP_PROXY: Job spooled, printer id: " << printer_id_ << |
| 452 ", job id: " << local_job_id; |
436 if (!shutting_down_) { | 453 if (!shutting_down_) { |
437 local_job_id_ = local_job_id; | 454 local_job_id_ = local_job_id; |
438 UpdateJobStatus(cloud_print::PRINT_JOB_STATUS_IN_PROGRESS, SUCCESS); | 455 UpdateJobStatus(cloud_print::PRINT_JOB_STATUS_IN_PROGRESS, SUCCESS); |
439 print_thread_.Stop(); | 456 print_thread_.Stop(); |
440 } | 457 } |
441 } | 458 } |
442 | 459 |
443 void PrinterJobHandler::Shutdown() { | 460 void PrinterJobHandler::Shutdown() { |
| 461 LOG(INFO) << "CP_PROXY: Printer job handler shutdown, id: " << printer_id_; |
444 Reset(); | 462 Reset(); |
445 shutting_down_ = true; | 463 shutting_down_ = true; |
446 while (!job_status_updater_list_.empty()) { | 464 while (!job_status_updater_list_.empty()) { |
447 // Calling Stop() will cause the OnJobCompleted to be called which will | 465 // Calling Stop() will cause the OnJobCompleted to be called which will |
448 // remove the updater object from the list. | 466 // remove the updater object from the list. |
449 job_status_updater_list_.front()->Stop(); | 467 job_status_updater_list_.front()->Stop(); |
450 } | 468 } |
451 if (delegate_) { | 469 if (delegate_) { |
452 delegate_->OnPrinterJobHandlerShutdown(this, printer_id_); | 470 delegate_->OnPrinterJobHandlerShutdown(this, printer_id_); |
453 } | 471 } |
454 } | 472 } |
455 | 473 |
456 void PrinterJobHandler::HandleServerError(const GURL& url) { | 474 void PrinterJobHandler::HandleServerError(const GURL& url) { |
| 475 LOG(INFO) << "CP_PROXY: Handle server error, printer id: " << printer_id_ << |
| 476 ", url: " << url; |
457 Task* task_to_retry = NewRunnableMethod(this, | 477 Task* task_to_retry = NewRunnableMethod(this, |
458 &PrinterJobHandler::FetchURL, url); | 478 &PrinterJobHandler::FetchURL, url); |
459 Task* task_on_give_up = NewRunnableMethod(this, next_failure_handler_); | 479 Task* task_on_give_up = NewRunnableMethod(this, next_failure_handler_); |
460 CloudPrintHelpers::HandleServerError(&server_error_count_, kMaxRetryCount, | 480 CloudPrintHelpers::HandleServerError(&server_error_count_, kMaxRetryCount, |
461 -1, kBaseRetryInterval, task_to_retry, | 481 -1, kBaseRetryInterval, task_to_retry, |
462 task_on_give_up); | 482 task_on_give_up); |
463 } | 483 } |
464 | 484 |
465 void PrinterJobHandler::UpdateJobStatus(cloud_print::PrintJobStatus status, | 485 void PrinterJobHandler::UpdateJobStatus(cloud_print::PrintJobStatus status, |
466 PrintJobError error) { | 486 PrintJobError error) { |
| 487 LOG(INFO) << "CP_PROXY: Update job status, id: " << printer_id_; |
467 if (!shutting_down_) { | 488 if (!shutting_down_) { |
468 if (!job_details_.job_id_.empty()) { | 489 if (!job_details_.job_id_.empty()) { |
469 LOG(INFO) << "CP: Updating status, jod id: " << job_details_.job_id_ << | 490 LOG(INFO) << "CP_PROXY: Updating status, jod id: " << |
470 ", status: " << status; | 491 job_details_.job_id_ << ", status: " << status; |
471 | 492 |
472 ResponseHandler response_handler = NULL; | 493 ResponseHandler response_handler = NULL; |
473 if (error == SUCCESS) { | 494 if (error == SUCCESS) { |
474 response_handler = | 495 response_handler = |
475 &PrinterJobHandler::HandleSuccessStatusUpdateResponse; | 496 &PrinterJobHandler::HandleSuccessStatusUpdateResponse; |
476 } else { | 497 } else { |
477 response_handler = | 498 response_handler = |
478 &PrinterJobHandler::HandleFailureStatusUpdateResponse; | 499 &PrinterJobHandler::HandleFailureStatusUpdateResponse; |
479 } | 500 } |
480 MakeServerRequest( | 501 MakeServerRequest( |
481 CloudPrintHelpers::GetUrlForJobStatusUpdate(cloud_print_server_url_, | 502 CloudPrintHelpers::GetUrlForJobStatusUpdate(cloud_print_server_url_, |
482 job_details_.job_id_, | 503 job_details_.job_id_, |
483 status), | 504 status), |
484 response_handler, | 505 response_handler, |
485 &PrinterJobHandler::Stop); | 506 &PrinterJobHandler::Stop); |
486 } | 507 } |
487 } | 508 } |
488 } | 509 } |
489 | 510 |
490 bool PrinterJobHandler::HandleSuccessStatusUpdateResponse( | 511 bool PrinterJobHandler::HandleSuccessStatusUpdateResponse( |
491 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, | 512 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, |
492 int response_code, const ResponseCookies& cookies, | 513 int response_code, const ResponseCookies& cookies, |
493 const std::string& data) { | 514 const std::string& data) { |
| 515 LOG(INFO) << "CP_PROXY: Handle success status update response, id: " << |
| 516 printer_id_; |
494 // If there was a network error or a non-200 response (which, for our purposes | 517 // If there was a network error or a non-200 response (which, for our purposes |
495 // is the same as a network error), we want to retry. | 518 // is the same as a network error), we want to retry. |
496 if (!status.is_success() || (response_code != 200)) { | 519 if (!status.is_success() || (response_code != 200)) { |
497 return false; | 520 return false; |
498 } | 521 } |
499 // The print job has been spooled locally. We now need to create an object | 522 // The print job has been spooled locally. We now need to create an object |
500 // that monitors the status of the job and updates the server. | 523 // that monitors the status of the job and updates the server. |
501 scoped_refptr<JobStatusUpdater> job_status_updater = | 524 scoped_refptr<JobStatusUpdater> job_status_updater = |
502 new JobStatusUpdater(printer_info_.printer_name, job_details_.job_id_, | 525 new JobStatusUpdater(printer_info_.printer_name, job_details_.job_id_, |
503 local_job_id_, auth_token_, cloud_print_server_url_, | 526 local_job_id_, auth_token_, cloud_print_server_url_, |
(...skipping 10 matching lines...) Expand all Loading... |
514 } | 537 } |
515 MessageLoop::current()->PostTask( | 538 MessageLoop::current()->PostTask( |
516 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); | 539 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); |
517 return true; | 540 return true; |
518 } | 541 } |
519 | 542 |
520 bool PrinterJobHandler::HandleFailureStatusUpdateResponse( | 543 bool PrinterJobHandler::HandleFailureStatusUpdateResponse( |
521 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, | 544 const URLFetcher* source, const GURL& url, const URLRequestStatus& status, |
522 int response_code, const ResponseCookies& cookies, | 545 int response_code, const ResponseCookies& cookies, |
523 const std::string& data) { | 546 const std::string& data) { |
| 547 LOG(INFO) << "CP_PROXY: Handle failure status update response, id: " << |
| 548 printer_id_; |
524 // If there was a network error or a non-200 response (which, for our purposes | 549 // If there was a network error or a non-200 response (which, for our purposes |
525 // is the same as a network error), we want to retry. | 550 // is the same as a network error), we want to retry. |
526 if (!status.is_success() || (response_code != 200)) { | 551 if (!status.is_success() || (response_code != 200)) { |
527 return false; | 552 return false; |
528 } | 553 } |
529 MessageLoop::current()->PostTask( | 554 MessageLoop::current()->PostTask( |
530 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); | 555 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); |
531 return true; | 556 return true; |
532 } | 557 } |
533 | 558 |
534 void PrinterJobHandler::MakeServerRequest(const GURL& url, | 559 void PrinterJobHandler::MakeServerRequest(const GURL& url, |
535 ResponseHandler response_handler, | 560 ResponseHandler response_handler, |
536 FailureHandler failure_handler) { | 561 FailureHandler failure_handler) { |
| 562 LOG(INFO) << "CP_PROXY: Printer job handle, make server request, id: " << |
| 563 printer_id_ << ", url: " << url; |
537 if (!shutting_down_) { | 564 if (!shutting_down_) { |
538 server_error_count_ = 0; | 565 server_error_count_ = 0; |
539 // Set up the next response handler | 566 // Set up the next response handler |
540 next_response_handler_ = response_handler; | 567 next_response_handler_ = response_handler; |
541 next_failure_handler_ = failure_handler; | 568 next_failure_handler_ = failure_handler; |
542 FetchURL(url); | 569 FetchURL(url); |
543 } | 570 } |
544 } | 571 } |
545 | 572 |
546 void PrinterJobHandler::FetchURL(const GURL& url) { | 573 void PrinterJobHandler::FetchURL(const GURL& url) { |
| 574 LOG(INFO) << "CP_PROXY: PrinterJobHandler::FetchURL, url: " << url; |
547 request_.reset(new URLFetcher(url, URLFetcher::GET, this)); | 575 request_.reset(new URLFetcher(url, URLFetcher::GET, this)); |
548 CloudPrintHelpers::PrepCloudPrintRequest(request_.get(), auth_token_); | 576 CloudPrintHelpers::PrepCloudPrintRequest(request_.get(), auth_token_); |
549 request_->Start(); | 577 request_->Start(); |
550 } | 578 } |
551 | 579 |
552 bool PrinterJobHandler::HavePendingTasks() { | 580 bool PrinterJobHandler::HavePendingTasks() { |
553 return server_job_available_ || printer_update_pending_ || | 581 return server_job_available_ || printer_update_pending_ || |
554 printer_delete_pending_; | 582 printer_delete_pending_; |
555 } | 583 } |
556 | 584 |
557 void PrinterJobHandler::FailedFetchingJobData() { | 585 void PrinterJobHandler::FailedFetchingJobData() { |
558 if (!shutting_down_) { | 586 if (!shutting_down_) { |
559 LOG(ERROR) << "CP: Failed fetching job data for printer: " << | 587 LOG(ERROR) << "CP_PROXY: Failed fetching job data for printer: " << |
560 printer_info_.printer_name << ", job id: " << job_details_.job_id_; | 588 printer_info_.printer_name << ", job id: " << job_details_.job_id_; |
561 JobFailed(INVALID_JOB_DATA); | 589 JobFailed(INVALID_JOB_DATA); |
562 } | 590 } |
563 } | 591 } |
564 | 592 |
565 void PrinterJobHandler::DoPrint(const JobDetails& job_details, | 593 void PrinterJobHandler::DoPrint(const JobDetails& job_details, |
566 const std::string& printer_name, | 594 const std::string& printer_name, |
567 scoped_refptr<cloud_print::PrintSystem> print_system, | 595 scoped_refptr<cloud_print::PrintSystem> print_system, |
568 PrinterJobHandler* job_handler, | 596 PrinterJobHandler* job_handler, |
569 MessageLoop* job_message_loop) { | 597 MessageLoop* job_message_loop) { |
570 DCHECK(job_handler); | 598 DCHECK(job_handler); |
571 DCHECK(job_message_loop); | 599 DCHECK(job_message_loop); |
| 600 LOG(INFO) << "CP_PROXY: Printing: " << printer_name; |
572 cloud_print::PlatformJobId job_id = -1; | 601 cloud_print::PlatformJobId job_id = -1; |
573 if (print_system->SpoolPrintJob(job_details.print_ticket_, | 602 if (print_system->SpoolPrintJob(job_details.print_ticket_, |
574 job_details.print_data_file_path_, | 603 job_details.print_data_file_path_, |
575 job_details.print_data_mime_type_, | 604 job_details.print_data_mime_type_, |
576 printer_name, | 605 printer_name, |
577 job_details.job_title_, &job_id)) { | 606 job_details.job_title_, &job_id)) { |
578 job_message_loop->PostTask(FROM_HERE, | 607 job_message_loop->PostTask(FROM_HERE, |
579 NewRunnableMethod(job_handler, | 608 NewRunnableMethod(job_handler, |
580 &PrinterJobHandler::JobSpooled, | 609 &PrinterJobHandler::JobSpooled, |
581 job_id)); | 610 job_id)); |
582 } else { | 611 } else { |
583 job_message_loop->PostTask(FROM_HERE, | 612 job_message_loop->PostTask(FROM_HERE, |
584 NewRunnableMethod(job_handler, | 613 NewRunnableMethod(job_handler, |
585 &PrinterJobHandler::JobFailed, | 614 &PrinterJobHandler::JobFailed, |
586 PRINT_FAILED)); | 615 PRINT_FAILED)); |
587 } | 616 } |
588 } | 617 } |
589 | 618 |
OLD | NEW |