Index: chrome/service/cloud_print/printer_job_handler.cc |
=================================================================== |
--- chrome/service/cloud_print/printer_job_handler.cc (revision 53070) |
+++ chrome/service/cloud_print/printer_job_handler.cc (working copy) |
@@ -36,6 +36,8 @@ |
next_failure_handler_(NULL), |
server_error_count_(0), |
print_thread_("Chrome_CloudPrintJobPrintThread"), |
+ job_handler_message_loop_proxy_( |
+ base::MessageLoopProxy::CreateForCurrentThread()), |
shutting_down_(false), |
server_job_available_(false), |
printer_update_pending_(true), |
@@ -431,11 +433,9 @@ |
JobFailed(PRINT_FAILED); |
} else { |
print_thread_.message_loop()->PostTask( |
- FROM_HERE, NewRunnableFunction(&PrinterJobHandler::DoPrint, |
- job_details_, |
- printer_info_.printer_name, |
- print_system_, this, |
- MessageLoop::current())); |
+ FROM_HERE, NewRunnableMethod(this, &PrinterJobHandler::DoPrint, |
+ job_details_, |
+ printer_info_.printer_name)); |
} |
} |
} |
@@ -590,29 +590,41 @@ |
} |
} |
+// The following methods are called on |print_thread_|. It is not safe to |
+// access any members other than |job_handler_message_loop_proxy_|, |
+// |job_spooler_| and |print_system_|. |
void PrinterJobHandler::DoPrint(const JobDetails& job_details, |
- const std::string& printer_name, |
- scoped_refptr<cloud_print::PrintSystem> print_system, |
- PrinterJobHandler* job_handler, |
- MessageLoop* job_message_loop) { |
- DCHECK(job_handler); |
- DCHECK(job_message_loop); |
- LOG(INFO) << "CP_PROXY: Printing: " << printer_name; |
- cloud_print::PlatformJobId job_id = -1; |
- if (print_system->SpoolPrintJob(job_details.print_ticket_, |
- job_details.print_data_file_path_, |
- job_details.print_data_mime_type_, |
- printer_name, |
- job_details.job_title_, &job_id)) { |
- job_message_loop->PostTask(FROM_HERE, |
- NewRunnableMethod(job_handler, |
- &PrinterJobHandler::JobSpooled, |
- job_id)); |
+ const std::string& printer_name) { |
+ job_spooler_ = print_system_->CreateJobSpooler(); |
+ DCHECK(job_spooler_); |
+ if (job_spooler_) { |
+ job_spooler_->Spool(job_details.print_ticket_, |
+ job_details.print_data_file_path_, |
+ job_details.print_data_mime_type_, |
+ printer_name, |
+ job_details.job_title_, |
+ this); |
} else { |
- job_message_loop->PostTask(FROM_HERE, |
- NewRunnableMethod(job_handler, |
- &PrinterJobHandler::JobFailed, |
- PRINT_FAILED)); |
+ OnJobSpoolFailed(); |
} |
} |
+void PrinterJobHandler::OnJobSpoolSucceeded( |
+ const cloud_print::PlatformJobId& job_id) { |
+ DCHECK(MessageLoop::current() == print_thread_.message_loop()); |
+ job_spooler_ = NULL; |
+ job_handler_message_loop_proxy_->PostTask(FROM_HERE, |
+ NewRunnableMethod(this, |
+ &PrinterJobHandler::JobSpooled, |
+ job_id)); |
+} |
+ |
+void PrinterJobHandler::OnJobSpoolFailed() { |
+ DCHECK(MessageLoop::current() == print_thread_.message_loop()); |
+ job_spooler_ = NULL; |
+ job_handler_message_loop_proxy_->PostTask(FROM_HERE, |
+ NewRunnableMethod(this, |
+ &PrinterJobHandler::JobFailed, |
+ PRINT_FAILED)); |
+} |
+ |