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

Side by Side Diff: chrome/utility/printing_handler.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 03:22:54 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/utility/printing_handler.h" 5 #include "chrome/utility/printing_handler.h"
6 6
7 #include "base/files/file_util.h" 7 #include "base/files/file_util.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/path_service.h" 9 #include "base/path_service.h"
10 #include "base/scoped_native_library.h" 10 #include "base/scoped_native_library.h"
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 void PrintingHandler::PreSandboxStartup() { 255 void PrintingHandler::PreSandboxStartup() {
256 g_pdf_lib.Get().Init(); 256 g_pdf_lib.Get().Init();
257 } 257 }
258 258
259 bool PrintingHandler::OnMessageReceived(const IPC::Message& message) { 259 bool PrintingHandler::OnMessageReceived(const IPC::Message& message) {
260 bool handled = true; 260 bool handled = true;
261 IPC_BEGIN_MESSAGE_MAP(PrintingHandler, message) 261 IPC_BEGIN_MESSAGE_MAP(PrintingHandler, message)
262 #if defined(OS_WIN) 262 #if defined(OS_WIN)
263 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles, 263 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles,
264 OnRenderPDFPagesToMetafile) 264 OnRenderPDFPagesToMetafile)
265 IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_GetPage,
266 OnRenderPDFPagesToMetafileGetPage)
265 #endif // OS_WIN 267 #endif // OS_WIN
266 #if defined(ENABLE_FULL_PRINTING) 268 #if defined(ENABLE_FULL_PRINTING)
267 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster, 269 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster,
268 OnRenderPDFPagesToPWGRaster) 270 OnRenderPDFPagesToPWGRaster)
269 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults, 271 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterCapsAndDefaults,
270 OnGetPrinterCapsAndDefaults) 272 OnGetPrinterCapsAndDefaults)
271 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults, 273 IPC_MESSAGE_HANDLER(ChromeUtilityMsg_GetPrinterSemanticCapsAndDefaults,
272 OnGetPrinterSemanticCapsAndDefaults) 274 OnGetPrinterSemanticCapsAndDefaults)
273 #endif // ENABLE_FULL_PRINTING 275 #endif // ENABLE_FULL_PRINTING
274 IPC_MESSAGE_UNHANDLED(handled = false) 276 IPC_MESSAGE_UNHANDLED(handled = false)
275 IPC_END_MESSAGE_MAP() 277 IPC_END_MESSAGE_MAP()
276 return handled; 278 return handled;
277 } 279 }
278 280
279 #if defined(OS_WIN) 281 #if defined(OS_WIN)
280 void PrintingHandler::OnRenderPDFPagesToMetafile( 282 void PrintingHandler::OnRenderPDFPagesToMetafile(
281 IPC::PlatformFileForTransit pdf_transit, 283 IPC::PlatformFileForTransit pdf_transit,
282 const base::FilePath& metafile_path, 284 const printing::PdfRenderSettings& settings) {
283 const printing::PdfRenderSettings& settings, 285 pdf_rendering_settings_ = settings;
284 const std::vector<printing::PageRange>& page_ranges_const) {
285 bool succeeded = false;
286 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit); 286 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit);
287 int highest_rendered_page_number = 0; 287 int page_count = LoadPDF(pdf_file.Pass());
288 Send(
289 new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count));
290 }
291
292 void PrintingHandler::OnRenderPDFPagesToMetafileGetPage(
293 int page_number,
294 IPC::PlatformFileForTransit output_file) {
295 base::File emf_file = IPC::PlatformFileForTransitToFile(output_file);
288 double scale_factor = 1.0; 296 double scale_factor = 1.0;
289 std::vector<printing::PageRange> page_ranges = page_ranges_const; 297 bool success =
290 succeeded = RenderPDFToWinMetafile(pdf_file.Pass(), 298 RenderPdfPageToMetafile(page_number, emf_file.Pass(), &scale_factor);
291 metafile_path, 299 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone(
292 settings, 300 success, scale_factor));
293 &page_ranges,
294 &highest_rendered_page_number,
295 &scale_factor);
296 if (succeeded) {
297 // TODO(vitalybuka|scottmg): http://crbug.com/170859. These could
298 // potentially be sent as each page is converted so that the spool could
299 // start sooner.
300 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_Succeeded(
301 page_ranges, scale_factor));
302 } else {
303 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed());
304 }
305 ReleaseProcessIfNeeded();
306 } 301 }
307 #endif // OS_WIN 302 #endif // OS_WIN
308 303
309 #if defined(ENABLE_FULL_PRINTING) 304 #if defined(ENABLE_FULL_PRINTING)
310 void PrintingHandler::OnRenderPDFPagesToPWGRaster( 305 void PrintingHandler::OnRenderPDFPagesToPWGRaster(
311 IPC::PlatformFileForTransit pdf_transit, 306 IPC::PlatformFileForTransit pdf_transit,
312 const printing::PdfRenderSettings& settings, 307 const printing::PdfRenderSettings& settings,
313 const printing::PwgRasterSettings& bitmap_settings, 308 const printing::PwgRasterSettings& bitmap_settings,
314 IPC::PlatformFileForTransit bitmap_transit) { 309 IPC::PlatformFileForTransit bitmap_transit) {
315 base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit); 310 base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit);
316 base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit); 311 base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit);
317 if (RenderPDFPagesToPWGRaster(pdf.Pass(), settings, bitmap_settings, 312 if (RenderPDFPagesToPWGRaster(pdf.Pass(), settings, bitmap_settings,
318 bitmap.Pass())) { 313 bitmap.Pass())) {
319 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded()); 314 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded());
320 } else { 315 } else {
321 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed()); 316 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed());
322 } 317 }
323 ReleaseProcessIfNeeded(); 318 ReleaseProcessIfNeeded();
324 } 319 }
325 #endif // ENABLE_FULL_PRINTING 320 #endif // ENABLE_FULL_PRINTING
326 321
327 #if defined(OS_WIN) 322 #if defined(OS_WIN)
328 bool PrintingHandler::RenderPDFToWinMetafile( 323 int PrintingHandler::LoadPDF(base::File pdf_file) {
329 base::File pdf_file, 324 if (!g_pdf_lib.Get().IsValid())
330 const base::FilePath& metafile_path, 325 return 0;
331 const printing::PdfRenderSettings& settings,
332 std::vector<printing::PageRange>* page_ranges,
333 int* highest_rendered_page_number,
334 double* scale_factor) {
335 DCHECK(page_ranges);
336 *highest_rendered_page_number = -1;
337 *scale_factor = 1.0;
338 326
339 if (!g_pdf_lib.Get().IsValid())
340 return false;
341
342 // TODO(sanjeevr): Add a method to the PDF DLL that takes in a file handle
343 // and a page range array. That way we don't need to read the entire PDF into
344 // memory.
345 int64 length = pdf_file.GetLength(); 327 int64 length = pdf_file.GetLength();
346 if (length < 0) 328 if (length < 0)
347 return false; 329 return 0;
348 330
349 std::vector<char> buffer; 331 pdf_data_.resize(length);
350 buffer.resize(length); 332 if (length != pdf_file.Read(0, &pdf_data_.front(), pdf_data_.size()))
351 if (length != pdf_file.Read(0, &buffer.front(), length)) 333 return 0;
352 return false;
353 334
354 int total_page_count = 0; 335 int total_page_count = 0;
355 if (!g_pdf_lib.Get().GetPDFDocInfo(&buffer.front(), buffer.size(), 336 if (!g_pdf_lib.Get().GetPDFDocInfo(
356 &total_page_count, NULL)) { 337 &pdf_data_.front(), pdf_data_.size(), &total_page_count, NULL)) {
338 return 0;
339 }
340 return total_page_count;
341 }
342
343 bool PrintingHandler::RenderPdfPageToMetafile(int page_number,
344 base::File output_file,
345 double* scale_factor) {
346 printing::Emf metafile;
347 metafile.Init();
348
349 // We need to scale down DC to fit an entire page into DC available area.
350 // Current metafile is based on screen DC and have current screen size.
351 // Writing outside of those boundaries will result in the cut-off output.
352 // On metafiles (this is the case here), scaling down will still record
353 // original coordinates and we'll be able to print in full resolution.
354 // Before playback we'll need to counter the scaling up that will happen
355 // in the service (print_system_win.cc).
356 *scale_factor =
357 gfx::CalculatePageScale(metafile.context(),
358 pdf_rendering_settings_.area().right(),
359 pdf_rendering_settings_.area().bottom());
360 gfx::ScaleDC(metafile.context(), *scale_factor);
361
362 // The underlying metafile is of type Emf and ignores the arguments passed
363 // to StartPage.
364 metafile.StartPage(gfx::Size(), gfx::Rect(), 1);
365 if (!g_pdf_lib.Get().RenderPDFPageToDC(
366 &pdf_data_.front(),
367 pdf_data_.size(),
368 page_number,
369 metafile.context(),
370 pdf_rendering_settings_.dpi(),
371 pdf_rendering_settings_.dpi(),
372 pdf_rendering_settings_.area().x(),
373 pdf_rendering_settings_.area().y(),
374 pdf_rendering_settings_.area().width(),
375 pdf_rendering_settings_.area().height(),
376 true,
377 false,
378 true,
379 true,
380 pdf_rendering_settings_.autorotate())) {
357 return false; 381 return false;
358 } 382 }
383 metafile.FinishPage();
384 metafile.FinishDocument();
385 return metafile.SaveTo(&output_file);
386 }
359 387
360 // If no range supplied, do all pages.
361 if (page_ranges->empty()) {
362 printing::PageRange page_range_all;
363 page_range_all.from = 0;
364 page_range_all.to = total_page_count - 1;
365 page_ranges->push_back(page_range_all);
366 }
367
368 bool ret = false;
369 std::vector<printing::PageRange>::const_iterator iter;
370 for (iter = page_ranges->begin(); iter != page_ranges->end(); ++iter) {
371 for (int page_number = iter->from; page_number <= iter->to; ++page_number) {
372 if (page_number >= total_page_count)
373 break;
374
375 printing::Emf metafile;
376 metafile.InitToFile(metafile_path.InsertBeforeExtensionASCII(
377 base::StringPrintf(".%d", page_number)));
378
379 // We need to scale down DC to fit an entire page into DC available area.
380 // Current metafile is based on screen DC and have current screen size.
381 // Writing outside of those boundaries will result in the cut-off output.
382 // On metafiles (this is the case here), scaling down will still record
383 // original coordinates and we'll be able to print in full resolution.
384 // Before playback we'll need to counter the scaling up that will happen
385 // in the service (print_system_win.cc).
386 *scale_factor = gfx::CalculatePageScale(metafile.context(),
387 settings.area().right(),
388 settings.area().bottom());
389 gfx::ScaleDC(metafile.context(), *scale_factor);
390
391 // The underlying metafile is of type Emf and ignores the arguments passed
392 // to StartPage.
393 metafile.StartPage(gfx::Size(), gfx::Rect(), 1);
394 if (g_pdf_lib.Get().RenderPDFPageToDC(
395 &buffer.front(), buffer.size(), page_number, metafile.context(),
396 settings.dpi(), settings.dpi(), settings.area().x(),
397 settings.area().y(), settings.area().width(),
398 settings.area().height(), true, false, true, true,
399 settings.autorotate())) {
400 if (*highest_rendered_page_number < page_number)
401 *highest_rendered_page_number = page_number;
402 ret = true;
403 }
404 metafile.FinishPage();
405 metafile.FinishDocument();
406 }
407 }
408 return ret;
409 }
410 #endif // OS_WIN 388 #endif // OS_WIN
411 389
412 #if defined(ENABLE_FULL_PRINTING) 390 #if defined(ENABLE_FULL_PRINTING)
413 bool PrintingHandler::RenderPDFPagesToPWGRaster( 391 bool PrintingHandler::RenderPDFPagesToPWGRaster(
414 base::File pdf_file, 392 base::File pdf_file,
415 const printing::PdfRenderSettings& settings, 393 const printing::PdfRenderSettings& settings,
416 const printing::PwgRasterSettings& bitmap_settings, 394 const printing::PwgRasterSettings& bitmap_settings,
417 base::File bitmap_file) { 395 base::File bitmap_file) {
418 bool autoupdate = true; 396 bool autoupdate = true;
419 if (!g_pdf_lib.Get().IsValid()) 397 if (!g_pdf_lib.Get().IsValid())
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 &printer_info)) { 511 &printer_info)) {
534 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded( 512 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded(
535 printer_name, printer_info)); 513 printer_name, printer_info));
536 } else { 514 } else {
537 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed( 515 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed(
538 printer_name)); 516 printer_name));
539 } 517 }
540 ReleaseProcessIfNeeded(); 518 ReleaseProcessIfNeeded();
541 } 519 }
542 #endif // ENABLE_FULL_PRINTING 520 #endif // ENABLE_FULL_PRINTING
OLDNEW
« chrome/service/service_utility_process_host.h ('K') | « chrome/utility/printing_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698