| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/stringprintf.h" | 10 #include "base/stringprintf.h" |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 std::string()); | 275 std::string()); |
| 276 } else { | 276 } else { |
| 277 // We are done here. Go to the Stop state | 277 // We are done here. Go to the Stop state |
| 278 MessageLoop::current()->PostTask( | 278 MessageLoop::current()->PostTask( |
| 279 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); | 279 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); |
| 280 } | 280 } |
| 281 } | 281 } |
| 282 | 282 |
| 283 // CloudPrintURLFetcher::Delegate implementation. | 283 // CloudPrintURLFetcher::Delegate implementation. |
| 284 CloudPrintURLFetcher::ResponseAction PrinterJobHandler::HandleRawResponse( | 284 CloudPrintURLFetcher::ResponseAction PrinterJobHandler::HandleRawResponse( |
| 285 const URLFetcher* source, | 285 const content::URLFetcher* source, |
| 286 const GURL& url, | 286 const GURL& url, |
| 287 const net::URLRequestStatus& status, | 287 const net::URLRequestStatus& status, |
| 288 int response_code, | 288 int response_code, |
| 289 const net::ResponseCookies& cookies, | 289 const net::ResponseCookies& cookies, |
| 290 const std::string& data) { | 290 const std::string& data) { |
| 291 // 415 (Unsupported media type) error while fetching data from the server | 291 // 415 (Unsupported media type) error while fetching data from the server |
| 292 // means data conversion error. Stop fetching process and mark job as error. | 292 // means data conversion error. Stop fetching process and mark job as error. |
| 293 if (next_data_handler_ == (&PrinterJobHandler::HandlePrintDataResponse) && | 293 if (next_data_handler_ == (&PrinterJobHandler::HandlePrintDataResponse) && |
| 294 response_code == RC_UNSUPPORTED_MEDIA_TYPE) { | 294 response_code == RC_UNSUPPORTED_MEDIA_TYPE) { |
| 295 MessageLoop::current()->PostTask( | 295 MessageLoop::current()->PostTask( |
| 296 FROM_HERE, | 296 FROM_HERE, |
| 297 NewRunnableMethod(this, &PrinterJobHandler::JobFailed, | 297 NewRunnableMethod(this, &PrinterJobHandler::JobFailed, |
| 298 JOB_DOWNLOAD_FAILED)); | 298 JOB_DOWNLOAD_FAILED)); |
| 299 return CloudPrintURLFetcher::STOP_PROCESSING; | 299 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 300 } | 300 } |
| 301 return CloudPrintURLFetcher::CONTINUE_PROCESSING; | 301 return CloudPrintURLFetcher::CONTINUE_PROCESSING; |
| 302 } | 302 } |
| 303 | 303 |
| 304 CloudPrintURLFetcher::ResponseAction PrinterJobHandler::HandleRawData( | 304 CloudPrintURLFetcher::ResponseAction PrinterJobHandler::HandleRawData( |
| 305 const URLFetcher* source, | 305 const content::URLFetcher* source, |
| 306 const GURL& url, | 306 const GURL& url, |
| 307 const std::string& data) { | 307 const std::string& data) { |
| 308 if (!next_data_handler_) | 308 if (!next_data_handler_) |
| 309 return CloudPrintURLFetcher::CONTINUE_PROCESSING; | 309 return CloudPrintURLFetcher::CONTINUE_PROCESSING; |
| 310 return (this->*next_data_handler_)(source, url, data); | 310 return (this->*next_data_handler_)(source, url, data); |
| 311 } | 311 } |
| 312 | 312 |
| 313 CloudPrintURLFetcher::ResponseAction PrinterJobHandler::HandleJSONData( | 313 CloudPrintURLFetcher::ResponseAction PrinterJobHandler::HandleJSONData( |
| 314 const URLFetcher* source, | 314 const content::URLFetcher* source, |
| 315 const GURL& url, | 315 const GURL& url, |
| 316 DictionaryValue* json_data, | 316 DictionaryValue* json_data, |
| 317 bool succeeded) { | 317 bool succeeded) { |
| 318 DCHECK(next_json_data_handler_); | 318 DCHECK(next_json_data_handler_); |
| 319 return (this->*next_json_data_handler_)(source, | 319 return (this->*next_json_data_handler_)(source, |
| 320 url, | 320 url, |
| 321 json_data, | 321 json_data, |
| 322 succeeded); | 322 succeeded); |
| 323 } | 323 } |
| 324 | 324 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 index != job_status_updater_list_.end(); index++) { | 379 index != job_status_updater_list_.end(); index++) { |
| 380 MessageLoop::current()->PostTask( | 380 MessageLoop::current()->PostTask( |
| 381 FROM_HERE, NewRunnableMethod(index->get(), | 381 FROM_HERE, NewRunnableMethod(index->get(), |
| 382 &JobStatusUpdater::UpdateStatus)); | 382 &JobStatusUpdater::UpdateStatus)); |
| 383 } | 383 } |
| 384 } | 384 } |
| 385 | 385 |
| 386 // Begin Response handlers | 386 // Begin Response handlers |
| 387 CloudPrintURLFetcher::ResponseAction | 387 CloudPrintURLFetcher::ResponseAction |
| 388 PrinterJobHandler::HandlePrinterUpdateResponse( | 388 PrinterJobHandler::HandlePrinterUpdateResponse( |
| 389 const URLFetcher* source, | 389 const content::URLFetcher* source, |
| 390 const GURL& url, | 390 const GURL& url, |
| 391 DictionaryValue* json_data, | 391 DictionaryValue* json_data, |
| 392 bool succeeded) { | 392 bool succeeded) { |
| 393 VLOG(1) << "CP_PROXY: Handle printer update response, id: " | 393 VLOG(1) << "CP_PROXY: Handle printer update response, id: " |
| 394 << printer_info_cloud_.printer_id; | 394 << printer_info_cloud_.printer_id; |
| 395 // We are done here. Go to the Stop state | 395 // We are done here. Go to the Stop state |
| 396 MessageLoop::current()->PostTask( | 396 MessageLoop::current()->PostTask( |
| 397 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); | 397 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); |
| 398 return CloudPrintURLFetcher::STOP_PROCESSING; | 398 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 399 } | 399 } |
| 400 | 400 |
| 401 CloudPrintURLFetcher::ResponseAction | 401 CloudPrintURLFetcher::ResponseAction |
| 402 PrinterJobHandler::HandlePrinterDeleteResponse( | 402 PrinterJobHandler::HandlePrinterDeleteResponse( |
| 403 const URLFetcher* source, | 403 const content::URLFetcher* source, |
| 404 const GURL& url, | 404 const GURL& url, |
| 405 DictionaryValue* json_data, | 405 DictionaryValue* json_data, |
| 406 bool succeeded) { | 406 bool succeeded) { |
| 407 VLOG(1) << "CP_PROXY: Handler printer delete response, id: " | 407 VLOG(1) << "CP_PROXY: Handler printer delete response, id: " |
| 408 << printer_info_cloud_.printer_id; | 408 << printer_info_cloud_.printer_id; |
| 409 // The printer has been deleted. Shutdown the handler class. | 409 // The printer has been deleted. Shutdown the handler class. |
| 410 MessageLoop::current()->PostTask( | 410 MessageLoop::current()->PostTask( |
| 411 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Shutdown)); | 411 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Shutdown)); |
| 412 return CloudPrintURLFetcher::STOP_PROCESSING; | 412 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 413 } | 413 } |
| 414 | 414 |
| 415 CloudPrintURLFetcher::ResponseAction | 415 CloudPrintURLFetcher::ResponseAction |
| 416 PrinterJobHandler::HandleJobMetadataResponse( | 416 PrinterJobHandler::HandleJobMetadataResponse( |
| 417 const URLFetcher* source, | 417 const content::URLFetcher* source, |
| 418 const GURL& url, | 418 const GURL& url, |
| 419 DictionaryValue* json_data, | 419 DictionaryValue* json_data, |
| 420 bool succeeded) { | 420 bool succeeded) { |
| 421 VLOG(1) << "CP_PROXY: Handle job metadata response, id: " | 421 VLOG(1) << "CP_PROXY: Handle job metadata response, id: " |
| 422 << printer_info_cloud_.printer_id; | 422 << printer_info_cloud_.printer_id; |
| 423 bool job_available = false; | 423 bool job_available = false; |
| 424 if (succeeded) { | 424 if (succeeded) { |
| 425 ListValue* job_list = NULL; | 425 ListValue* job_list = NULL; |
| 426 if (json_data->GetList(kJobListValue, &job_list) && job_list) { | 426 if (json_data->GetList(kJobListValue, &job_list) && job_list) { |
| 427 // Even though it is a job list, for now we are only interested in the | 427 // Even though it is a job list, for now we are only interested in the |
| (...skipping 27 matching lines...) Expand all Loading... |
| 455 } | 455 } |
| 456 } | 456 } |
| 457 // If no jobs are available, go to the Stop state. | 457 // If no jobs are available, go to the Stop state. |
| 458 if (!job_available) | 458 if (!job_available) |
| 459 MessageLoop::current()->PostTask( | 459 MessageLoop::current()->PostTask( |
| 460 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); | 460 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); |
| 461 return CloudPrintURLFetcher::STOP_PROCESSING; | 461 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 462 } | 462 } |
| 463 | 463 |
| 464 CloudPrintURLFetcher::ResponseAction | 464 CloudPrintURLFetcher::ResponseAction |
| 465 PrinterJobHandler::HandlePrintTicketResponse(const URLFetcher* source, | 465 PrinterJobHandler::HandlePrintTicketResponse(const content::URLFetcher* source, |
| 466 const GURL& url, | 466 const GURL& url, |
| 467 const std::string& data) { | 467 const std::string& data) { |
| 468 VLOG(1) << "CP_PROXY: Handle print ticket response, id: " | 468 VLOG(1) << "CP_PROXY: Handle print ticket response, id: " |
| 469 << printer_info_cloud_.printer_id; | 469 << printer_info_cloud_.printer_id; |
| 470 if (print_system_->ValidatePrintTicket(printer_info_.printer_name, data)) { | 470 if (print_system_->ValidatePrintTicket(printer_info_.printer_name, data)) { |
| 471 job_details_.print_ticket_ = data; | 471 job_details_.print_ticket_ = data; |
| 472 SetNextDataHandler(&PrinterJobHandler::HandlePrintDataResponse); | 472 SetNextDataHandler(&PrinterJobHandler::HandlePrintDataResponse); |
| 473 request_ = new CloudPrintURLFetcher; | 473 request_ = new CloudPrintURLFetcher; |
| 474 std::string accept_headers = "Accept: "; | 474 std::string accept_headers = "Accept: "; |
| 475 accept_headers += print_system_->GetSupportedMimeTypes(); | 475 accept_headers += print_system_->GetSupportedMimeTypes(); |
| 476 request_->StartGetRequest(GURL(print_data_url_.c_str()), | 476 request_->StartGetRequest(GURL(print_data_url_.c_str()), |
| 477 this, | 477 this, |
| 478 kJobDataMaxRetryCount, | 478 kJobDataMaxRetryCount, |
| 479 accept_headers); | 479 accept_headers); |
| 480 } else { | 480 } else { |
| 481 // The print ticket was not valid. We are done here. | 481 // The print ticket was not valid. We are done here. |
| 482 FailedFetchingJobData(); | 482 FailedFetchingJobData(); |
| 483 } | 483 } |
| 484 return CloudPrintURLFetcher::STOP_PROCESSING; | 484 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 485 } | 485 } |
| 486 | 486 |
| 487 CloudPrintURLFetcher::ResponseAction | 487 CloudPrintURLFetcher::ResponseAction |
| 488 PrinterJobHandler::HandlePrintDataResponse(const URLFetcher* source, | 488 PrinterJobHandler::HandlePrintDataResponse(const content::URLFetcher* source, |
| 489 const GURL& url, | 489 const GURL& url, |
| 490 const std::string& data) { | 490 const std::string& data) { |
| 491 VLOG(1) << "CP_PROXY: Handle print data response, id: " | 491 VLOG(1) << "CP_PROXY: Handle print data response, id: " |
| 492 << printer_info_cloud_.printer_id; | 492 << printer_info_cloud_.printer_id; |
| 493 Task* next_task = NULL; | 493 Task* next_task = NULL; |
| 494 if (file_util::CreateTemporaryFile(&job_details_.print_data_file_path_)) { | 494 if (file_util::CreateTemporaryFile(&job_details_.print_data_file_path_)) { |
| 495 int ret = file_util::WriteFile(job_details_.print_data_file_path_, | 495 int ret = file_util::WriteFile(job_details_.print_data_file_path_, |
| 496 data.c_str(), | 496 data.c_str(), |
| 497 data.length()); | 497 data.length()); |
| 498 source->response_headers()->GetMimeType( | 498 source->GetResponseHeaders()->GetMimeType( |
| 499 &job_details_.print_data_mime_type_); | 499 &job_details_.print_data_mime_type_); |
| 500 DCHECK(ret == static_cast<int>(data.length())); | 500 DCHECK(ret == static_cast<int>(data.length())); |
| 501 if (ret == static_cast<int>(data.length())) { | 501 if (ret == static_cast<int>(data.length())) { |
| 502 next_task = NewRunnableMethod(this, &PrinterJobHandler::StartPrinting); | 502 next_task = NewRunnableMethod(this, &PrinterJobHandler::StartPrinting); |
| 503 } | 503 } |
| 504 } | 504 } |
| 505 // If there was no task allocated above, then there was an error in | 505 // If there was no task allocated above, then there was an error in |
| 506 // saving the print data, bail out here. | 506 // saving the print data, bail out here. |
| 507 if (!next_task) { | 507 if (!next_task) { |
| 508 next_task = NewRunnableMethod(this, &PrinterJobHandler::JobFailed, | 508 next_task = NewRunnableMethod(this, &PrinterJobHandler::JobFailed, |
| 509 JOB_DOWNLOAD_FAILED); | 509 JOB_DOWNLOAD_FAILED); |
| 510 } | 510 } |
| 511 MessageLoop::current()->PostTask(FROM_HERE, next_task); | 511 MessageLoop::current()->PostTask(FROM_HERE, next_task); |
| 512 return CloudPrintURLFetcher::STOP_PROCESSING; | 512 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 513 } | 513 } |
| 514 | 514 |
| 515 CloudPrintURLFetcher::ResponseAction | 515 CloudPrintURLFetcher::ResponseAction |
| 516 PrinterJobHandler::HandleSuccessStatusUpdateResponse( | 516 PrinterJobHandler::HandleSuccessStatusUpdateResponse( |
| 517 const URLFetcher* source, | 517 const content::URLFetcher* source, |
| 518 const GURL& url, | 518 const GURL& url, |
| 519 DictionaryValue* json_data, | 519 DictionaryValue* json_data, |
| 520 bool succeeded) { | 520 bool succeeded) { |
| 521 VLOG(1) << "CP_PROXY: Handle success status update response, id: " | 521 VLOG(1) << "CP_PROXY: Handle success status update response, id: " |
| 522 << printer_info_cloud_.printer_id; | 522 << printer_info_cloud_.printer_id; |
| 523 // The print job has been spooled locally. We now need to create an object | 523 // The print job has been spooled locally. We now need to create an object |
| 524 // that monitors the status of the job and updates the server. | 524 // that monitors the status of the job and updates the server. |
| 525 scoped_refptr<JobStatusUpdater> job_status_updater( | 525 scoped_refptr<JobStatusUpdater> job_status_updater( |
| 526 new JobStatusUpdater(printer_info_.printer_name, job_details_.job_id_, | 526 new JobStatusUpdater(printer_info_.printer_name, job_details_.job_id_, |
| 527 local_job_id_, cloud_print_server_url_, | 527 local_job_id_, cloud_print_server_url_, |
| 528 print_system_.get(), this)); | 528 print_system_.get(), this)); |
| 529 job_status_updater_list_.push_back(job_status_updater); | 529 job_status_updater_list_.push_back(job_status_updater); |
| 530 MessageLoop::current()->PostTask( | 530 MessageLoop::current()->PostTask( |
| 531 FROM_HERE, NewRunnableMethod(job_status_updater.get(), | 531 FROM_HERE, NewRunnableMethod(job_status_updater.get(), |
| 532 &JobStatusUpdater::UpdateStatus)); | 532 &JobStatusUpdater::UpdateStatus)); |
| 533 if (succeeded) { | 533 if (succeeded) { |
| 534 // Since we just printed successfully, we want to look for more jobs. | 534 // Since we just printed successfully, we want to look for more jobs. |
| 535 CheckForJobs(kJobFetchReasonQueryMore); | 535 CheckForJobs(kJobFetchReasonQueryMore); |
| 536 } | 536 } |
| 537 MessageLoop::current()->PostTask( | 537 MessageLoop::current()->PostTask( |
| 538 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); | 538 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); |
| 539 return CloudPrintURLFetcher::STOP_PROCESSING; | 539 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 540 } | 540 } |
| 541 | 541 |
| 542 CloudPrintURLFetcher::ResponseAction | 542 CloudPrintURLFetcher::ResponseAction |
| 543 PrinterJobHandler::HandleFailureStatusUpdateResponse( | 543 PrinterJobHandler::HandleFailureStatusUpdateResponse( |
| 544 const URLFetcher* source, | 544 const content::URLFetcher* source, |
| 545 const GURL& url, | 545 const GURL& url, |
| 546 DictionaryValue* json_data, | 546 DictionaryValue* json_data, |
| 547 bool succeeded) { | 547 bool succeeded) { |
| 548 VLOG(1) << "CP_PROXY: Handle failure status update response, id: " | 548 VLOG(1) << "CP_PROXY: Handle failure status update response, id: " |
| 549 << printer_info_cloud_.printer_id; | 549 << printer_info_cloud_.printer_id; |
| 550 MessageLoop::current()->PostTask( | 550 MessageLoop::current()->PostTask( |
| 551 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); | 551 FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::Stop)); |
| 552 return CloudPrintURLFetcher::STOP_PROCESSING; | 552 return CloudPrintURLFetcher::STOP_PROCESSING; |
| 553 } | 553 } |
| 554 // End Response handlers | 554 // End Response handlers |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 } | 681 } |
| 682 | 682 |
| 683 void PrinterJobHandler::OnJobSpoolFailed() { | 683 void PrinterJobHandler::OnJobSpoolFailed() { |
| 684 DCHECK(MessageLoop::current() == print_thread_.message_loop()); | 684 DCHECK(MessageLoop::current() == print_thread_.message_loop()); |
| 685 job_spooler_ = NULL; | 685 job_spooler_ = NULL; |
| 686 job_handler_message_loop_proxy_->PostTask(FROM_HERE, | 686 job_handler_message_loop_proxy_->PostTask(FROM_HERE, |
| 687 NewRunnableMethod(this, | 687 NewRunnableMethod(this, |
| 688 &PrinterJobHandler::JobFailed, | 688 &PrinterJobHandler::JobFailed, |
| 689 PRINT_FAILED)); | 689 PRINT_FAILED)); |
| 690 } | 690 } |
| OLD | NEW |