Index: chrome/service/cloud_print/print_system_win.cc |
diff --git a/chrome/service/cloud_print/print_system_win.cc b/chrome/service/cloud_print/print_system_win.cc |
index 7d252beb2ec263aa333f6cfeb6760b5ec353fc83..3ef1cbf222fa1f5264e58161ba437563d2c06c3a 100644 |
--- a/chrome/service/cloud_print/print_system_win.cc |
+++ b/chrome/service/cloud_print/print_system_win.cc |
@@ -23,7 +23,9 @@ |
#include "printing/backend/win_helper.h" |
#include "printing/emf_win.h" |
#include "printing/page_range.h" |
+#include "printing/pdf_render_settings.h" |
#include "printing/printing_utils.h" |
+#include "ui/gfx/geometry/rect.h" |
namespace cloud_print { |
@@ -245,12 +247,7 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { |
class Core : public ServiceUtilityProcessHost::Client, |
public base::win::ObjectWatcher::Delegate { |
public: |
- Core() |
- : last_page_printed_(-1), |
- job_id_(-1), |
- delegate_(NULL), |
- saved_dc_(0) { |
- } |
+ Core() : job_id_(-1), delegate_(NULL), saved_dc_(0) {} |
~Core() {} |
@@ -267,7 +264,6 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { |
return false; |
} |
base::string16 printer_wide = base::UTF8ToWide(printer_name); |
- last_page_printed_ = -1; |
// We only support PDF and XPS documents for now. |
if (print_data_mime_type == kContentTypePDF) { |
scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode; |
@@ -302,7 +298,7 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { |
saved_dc_ = SaveDC(printer_dc_.Get()); |
print_data_file_path_ = print_data_file_path; |
delegate_ = delegate; |
- RenderNextPDFPages(); |
+ RenderPDFPages(); |
} else if (print_data_mime_type == kContentTypeXPS) { |
DCHECK(print_ticket_mime_type == kContentTypeXML); |
bool ret = PrintXPSDocument(printer_name, |
@@ -335,21 +331,20 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { |
} |
// ServiceUtilityProcessHost::Client implementation. |
- virtual void OnRenderPDFPagesToMetafileSucceeded( |
- const printing::MetafilePlayer& metafile, |
- int highest_rendered_page_number, |
- double scale_factor) OVERRIDE { |
+ virtual void OnRenderPDFPagesToMetafilePageDone( |
+ double scale_factor, |
+ const printing::MetafilePlayer& emf) OVERRIDE { |
PreparePageDCForPrinting(printer_dc_.Get(), scale_factor); |
- metafile.SafePlayback(printer_dc_.Get()); |
- bool done_printing = (highest_rendered_page_number != |
- last_page_printed_ + kPageCountPerBatch); |
- last_page_printed_ = highest_rendered_page_number; |
- if (done_printing) |
- PrintJobDone(); |
- else |
- RenderNextPDFPages(); |
+ emf.SafePlayback(printer_dc_.Get()); |
+ } |
+ |
+ // ServiceUtilityProcessHost::Client implementation. |
+ virtual void OnRenderPDFPagesToMetafileDone(bool success) OVERRIDE { |
+ PrintJobDone(success); |
} |
+ virtual void OnChildDied() OVERRIDE { PrintJobDone(false); } |
+ |
// base::win::ObjectWatcher::Delegate implementation. |
virtual void OnObjectSignaled(HANDLE object) OVERRIDE { |
DCHECK(xps_print_job_); |
@@ -374,14 +369,6 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { |
} |
} |
- virtual void OnRenderPDFPagesToMetafileFailed() OVERRIDE { |
- PrintJobDone(); |
- } |
- |
- virtual void OnChildDied() OVERRIDE { |
- PrintJobDone(); |
- } |
- |
private: |
// Helper class to allow PrintXPSDocument() to have multiple exits. |
class PrintJobCanceler { |
@@ -405,45 +392,41 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { |
DISALLOW_COPY_AND_ASSIGN(PrintJobCanceler); |
}; |
- void PrintJobDone() { |
+ void PrintJobDone(bool success) { |
// If there is no delegate, then there is nothing pending to process. |
if (!delegate_) |
return; |
RestoreDC(printer_dc_.Get(), saved_dc_); |
EndDoc(printer_dc_.Get()); |
- if (-1 == last_page_printed_) { |
- delegate_->OnJobSpoolFailed(); |
- } else { |
+ if (success) { |
delegate_->OnJobSpoolSucceeded(job_id_); |
+ } else { |
+ delegate_->OnJobSpoolFailed(); |
} |
delegate_ = NULL; |
} |
- void RenderNextPDFPages() { |
- printing::PageRange range; |
- // Render 10 pages at a time. |
- range.from = last_page_printed_ + 1; |
- range.to = last_page_printed_ + kPageCountPerBatch; |
- std::vector<printing::PageRange> page_ranges; |
- page_ranges.push_back(range); |
- |
+ void RenderPDFPages() { |
int printer_dpi = ::GetDeviceCaps(printer_dc_.Get(), LOGPIXELSX); |
int dc_width = GetDeviceCaps(printer_dc_.Get(), PHYSICALWIDTH); |
int dc_height = GetDeviceCaps(printer_dc_.Get(), PHYSICALHEIGHT); |
gfx::Rect render_area(0, 0, dc_width, dc_height); |
g_service_process->io_thread()->message_loop_proxy()->PostTask( |
FROM_HERE, |
- base::Bind(&JobSpoolerWin::Core::RenderPDFPagesInSandbox, this, |
- print_data_file_path_, render_area, printer_dpi, |
- page_ranges, base::MessageLoopProxy::current())); |
+ base::Bind(&JobSpoolerWin::Core::RenderPDFPagesInSandbox, |
+ this, |
+ print_data_file_path_, |
+ render_area, |
+ printer_dpi, |
+ base::MessageLoopProxy::current())); |
} |
// Called on the service process IO thread. |
- void RenderPDFPagesInSandbox( |
- const base::FilePath& pdf_path, const gfx::Rect& render_area, |
- int render_dpi, const std::vector<printing::PageRange>& page_ranges, |
- const scoped_refptr<base::MessageLoopProxy>& |
- client_message_loop_proxy) { |
+ void RenderPDFPagesInSandbox(const base::FilePath& pdf_path, |
+ const gfx::Rect& render_area, |
+ int render_dpi, |
+ const scoped_refptr<base::MessageLoopProxy>& |
+ client_message_loop_proxy) { |
DCHECK(g_service_process->io_thread()->message_loop_proxy()-> |
BelongsToCurrentThread()); |
scoped_ptr<ServiceUtilityProcessHost> utility_host( |
@@ -455,10 +438,12 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { |
// PDF that matches paper size and orientation. |
if (utility_host->StartRenderPDFPagesToMetafile( |
pdf_path, |
- printing::PdfRenderSettings(render_area, render_dpi, false), |
- page_ranges)) { |
+ printing::PdfRenderSettings(render_area, render_dpi, false))) { |
// The object will self-destruct when the child process dies. |
utility_host.release(); |
+ } else { |
+ client_message_loop_proxy->PostTask( |
+ FROM_HERE, base::Bind(&Core::PrintJobDone, this, false)); |
} |
} |
@@ -509,14 +494,6 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { |
return true; |
} |
- // Some Cairo-generated PDFs from Chrome OS result in huge metafiles. |
- // So the PageCountPerBatch is set to 1 for now. |
- // TODO(sanjeevr): Figure out a smarter way to determine the pages per |
- // batch. Filed a bug to track this at |
- // http://code.google.com/p/chromium/issues/detail?id=57350. |
- static const int kPageCountPerBatch = 1; |
- |
- int last_page_printed_; |
PlatformJobId job_id_; |
PrintSystem::JobSpooler::Delegate* delegate_; |
int saved_dc_; |