Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: chrome/browser/printing/print_job.cc

Issue 566693002: Use file handles to interact with utility process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Mon Sep 15 18:19:41 PDT 2014 Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/browser/printing/print_job.h" 5 #include "chrome/browser/printing/print_job.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/threading/thread_restrictions.h" 10 #include "base/threading/thread_restrictions.h"
11 #include "base/threading/worker_pool.h" 11 #include "base/threading/worker_pool.h"
12 #include "base/timer/timer.h" 12 #include "base/timer/timer.h"
13 #include "chrome/browser/chrome_notification_types.h" 13 #include "chrome/browser/chrome_notification_types.h"
14 #include "chrome/browser/printing/print_job_worker.h" 14 #include "chrome/browser/printing/print_job_worker.h"
15 #include "content/public/browser/browser_thread.h" 15 #include "content/public/browser/browser_thread.h"
16 #include "content/public/browser/notification_service.h" 16 #include "content/public/browser/notification_service.h"
17 #include "printing/printed_document.h" 17 #include "printing/printed_document.h"
18 #include "printing/printed_page.h" 18 #include "printing/printed_page.h"
19 19
20 #if defined(OS_WIN)
21 #include "chrome/browser/printing/pdf_to_emf_converter.h"
22 #include "printing/pdf_render_settings.h"
23 #endif
24
20 using base::TimeDelta; 25 using base::TimeDelta;
21 26
22 namespace { 27 namespace {
23 28
29 const int kMaxNumberOfTempFilesPerDocument = 3;
30
24 // Helper function to ensure |owner| is valid until at least |callback| returns. 31 // Helper function to ensure |owner| is valid until at least |callback| returns.
25 void HoldRefCallback(const scoped_refptr<printing::PrintJobWorkerOwner>& owner, 32 void HoldRefCallback(const scoped_refptr<printing::PrintJobWorkerOwner>& owner,
26 const base::Closure& callback) { 33 const base::Closure& callback) {
27 callback.Run(); 34 callback.Run();
28 } 35 }
29 36
30 } // namespace 37 } // namespace
31 38
32 namespace printing { 39 namespace printing {
33 40
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 } 214 }
208 215
209 bool PrintJob::is_job_pending() const { 216 bool PrintJob::is_job_pending() const {
210 return is_job_pending_; 217 return is_job_pending_;
211 } 218 }
212 219
213 PrintedDocument* PrintJob::document() const { 220 PrintedDocument* PrintJob::document() const {
214 return document_.get(); 221 return document_.get();
215 } 222 }
216 223
224 #if defined(OS_WIN)
225
226 class PrintJob::PdfToEmfState {
227 public:
228 PdfToEmfState(const gfx::Size& page_size, const gfx::Rect& content_area)
229 : page_count_(0),
230 current_page_(0),
231 pages_in_progress_(0),
232 page_size_(page_size),
233 content_area_(content_area),
234 converter_(PdfToEmfConverter::CreateDefault()) {}
235
236 void Start(const scoped_refptr<base::RefCountedMemory>& data,
237 const PdfRenderSettings& conversion_settings,
238 const PdfToEmfConverter::StartCallback& start_callback) {
239 converter_->Start(data, conversion_settings, start_callback);
240 }
241
242 void GetMorePages(
243 const PdfToEmfConverter::GetPageCallback& get_page_callback) {
244 while (pages_in_progress_ < kMaxNumberOfTempFilesPerDocument &&
245 current_page_ < page_count_) {
246 ++pages_in_progress_;
247 converter_->GetPage(current_page_++, get_page_callback);
248 }
249 }
250
251 void OnPageProcessed(
252 const PdfToEmfConverter::GetPageCallback& get_page_callback) {
253 --pages_in_progress_;
254 GetMorePages(get_page_callback);
255 // Release converter because we don't need it any more.
Lei Zhang 2014/09/16 03:36:54 nit: s/because/if/
Vitaly Buka (NO REVIEWS) 2014/09/16 07:50:36 Done.
256 if (!pages_in_progress_ && current_page_ >= page_count_)
257 converter_.reset();
258 }
259
260 void set_page_count(int page_count) { page_count_ = page_count; }
261 gfx::Size page_size() const { return page_size_; }
262 gfx::Rect content_area() const { return content_area_; }
263
264 private:
265 int page_count_;
266 int current_page_;
267 int pages_in_progress_;
268 gfx::Size page_size_;
269 gfx::Rect content_area_;
270 scoped_ptr<PdfToEmfConverter> converter_;
271 };
272
273 void PrintJob::StartPdfToEmfConversion(
274 const scoped_refptr<base::RefCountedMemory>& bytes,
275 const gfx::Size& page_size,
276 const gfx::Rect& content_area) {
277 DCHECK(!ptd_to_emf_state_.get());
278 ptd_to_emf_state_.reset(new PdfToEmfState(page_size, content_area));
279 const int kPrinterDpi = settings().dpi();
280 ptd_to_emf_state_->Start(
281 bytes,
282 printing::PdfRenderSettings(content_area, kPrinterDpi, true),
283 base::Bind(&PrintJob::OnPdfToEmfStarted, this));
284 }
285
286 void PrintJob::OnPdfToEmfStarted(int page_count) {
287 if (page_count <= 0) {
288 ptd_to_emf_state_.reset();
289 Cancel();
290 return;
291 }
292 ptd_to_emf_state_->set_page_count(page_count);
293 ptd_to_emf_state_->GetMorePages(
294 base::Bind(&PrintJob::OnPdfToEmfPageConverted, this));
295 }
296
297 void PrintJob::OnPdfToEmfPageConverted(int page_number,
298 double scale_factor,
299 scoped_ptr<MetafilePlayer> emf) {
300 DCHECK(ptd_to_emf_state_);
301 if (!document_.get() || !emf) {
302 ptd_to_emf_state_.reset();
303 Cancel();
304 return;
305 }
306
307 // Update the rendered document. It will send notifications to the listener.
308 document_->SetPage(page_number,
309 emf.Pass(),
310 scale_factor,
311 ptd_to_emf_state_->page_size(),
312 ptd_to_emf_state_->content_area());
313
314 ptd_to_emf_state_->GetMorePages(
315 base::Bind(&PrintJob::OnPdfToEmfPageConverted, this));
316 }
317
318 #endif // OS_WIN
319
217 void PrintJob::UpdatePrintedDocument(PrintedDocument* new_document) { 320 void PrintJob::UpdatePrintedDocument(PrintedDocument* new_document) {
218 if (document_.get() == new_document) 321 if (document_.get() == new_document)
219 return; 322 return;
220 323
221 document_ = new_document; 324 document_ = new_document;
222 325
223 if (document_.get()) { 326 if (document_.get()) {
224 settings_ = document_->settings(); 327 settings_ = document_->settings();
225 } 328 }
226 329
(...skipping 18 matching lines...) Expand all
245 break; 348 break;
246 } 349 }
247 case JobEventDetails::USER_INIT_DONE: 350 case JobEventDetails::USER_INIT_DONE:
248 case JobEventDetails::DEFAULT_INIT_DONE: 351 case JobEventDetails::DEFAULT_INIT_DONE:
249 case JobEventDetails::USER_INIT_CANCELED: { 352 case JobEventDetails::USER_INIT_CANCELED: {
250 DCHECK_EQ(event_details.document(), document_.get()); 353 DCHECK_EQ(event_details.document(), document_.get());
251 break; 354 break;
252 } 355 }
253 case JobEventDetails::NEW_DOC: 356 case JobEventDetails::NEW_DOC:
254 case JobEventDetails::NEW_PAGE: 357 case JobEventDetails::NEW_PAGE:
255 case JobEventDetails::PAGE_DONE:
256 case JobEventDetails::JOB_DONE: 358 case JobEventDetails::JOB_DONE:
257 case JobEventDetails::ALL_PAGES_REQUESTED: { 359 case JobEventDetails::ALL_PAGES_REQUESTED: {
258 // Don't care. 360 // Don't care.
259 break; 361 break;
260 } 362 }
261 case JobEventDetails::DOC_DONE: { 363 case JobEventDetails::DOC_DONE: {
262 // This will call Stop() and broadcast a JOB_DONE message. 364 // This will call Stop() and broadcast a JOB_DONE message.
263 base::MessageLoop::current()->PostTask( 365 base::MessageLoop::current()->PostTask(
264 FROM_HERE, base::Bind(&PrintJob::OnDocumentDone, this)); 366 FROM_HERE, base::Bind(&PrintJob::OnDocumentDone, this));
265 break; 367 break;
266 } 368 }
369 case JobEventDetails::PAGE_DONE:
370 #if defined(OS_WIN)
371 ptd_to_emf_state_->OnPageProcessed(
372 base::Bind(&PrintJob::OnPdfToEmfPageConverted, this));
373 #endif // OS_WIN
374 break;
267 default: { 375 default: {
268 NOTREACHED(); 376 NOTREACHED();
269 break; 377 break;
270 } 378 }
271 } 379 }
272 } 380 }
273 381
274 void PrintJob::OnDocumentDone() { 382 void PrintJob::OnDocumentDone() {
275 // Be sure to live long enough. The instance could be destroyed by the 383 // Be sure to live long enough. The instance could be destroyed by the
276 // JOB_DONE broadcast. 384 // JOB_DONE broadcast.
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 } 454 }
347 455
348 JobEventDetails::~JobEventDetails() { 456 JobEventDetails::~JobEventDetails() {
349 } 457 }
350 458
351 PrintedDocument* JobEventDetails::document() const { return document_.get(); } 459 PrintedDocument* JobEventDetails::document() const { return document_.get(); }
352 460
353 PrintedPage* JobEventDetails::page() const { return page_.get(); } 461 PrintedPage* JobEventDetails::page() const { return page_.get(); }
354 462
355 } // namespace printing 463 } // namespace printing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698