printing_context.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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 3// found in the LICENSE file. 4 5#include "printing/printing_context.h" 6 7#include "base/logging.h" 8#include "base/values.h" 9#include "printing/page_setup.h" 10#include "printing/page_size_margins.h" 11#include "printing/print_job_constants.h" 12#include "printing/print_settings_conversion.h" 13#include "printing/units.h" 14 15namespace printing { 16 17namespace { 18const float kCloudPrintMarginInch = 0.25; 19} 20 21PrintingContext::PrintingContext(const std::string& app_locale) 22 : dialog_box_dismissed_(false), 23 in_print_job_(false), 24 abort_printing_(false), 25 app_locale_(app_locale) { 26} 27 28PrintingContext::~PrintingContext() { 29} 30 31void PrintingContext::set_margin_type(MarginType type) { 32 DCHECK(type != CUSTOM_MARGINS); 33 settings_.set_margin_type(type); 34} 35 36void PrintingContext::ResetSettings() { 37 ReleaseContext(); 38 39 settings_.Clear(); 40 41 in_print_job_ = false; 42 dialog_box_dismissed_ = false; 43 abort_printing_ = false; 44} 45 46PrintingContext::Result PrintingContext::OnError() { 47 Result result = abort_printing_ ? CANCEL : FAILED; 48 ResetSettings(); 49 return result; 50} 51 52PrintingContext::Result PrintingContext::UsePdfSettings() { 53 scoped_ptr<base::DictionaryValue> pdf_settings(new base::DictionaryValue); 54 pdf_settings->SetBoolean(kSettingHeaderFooterEnabled, false); 55 pdf_settings->SetBoolean(kSettingShouldPrintBackgrounds, false); 56 pdf_settings->SetBoolean(kSettingShouldPrintSelectionOnly, false); 57 pdf_settings->SetInteger(kSettingMarginsType, printing::NO_MARGINS); 58 pdf_settings->SetBoolean(kSettingCollate, true); 59 pdf_settings->SetInteger(kSettingCopies, 1); 60 pdf_settings->SetInteger(kSettingColor, printing::COLOR); 61 pdf_settings->SetInteger(kSettingDuplexMode, printing::SIMPLEX); 62 pdf_settings->SetBoolean(kSettingLandscape, false); 63 pdf_settings->SetString(kSettingDeviceName, ""); 64 pdf_settings->SetBoolean(kSettingPrintToPDF, true); 65 pdf_settings->SetBoolean(kSettingCloudPrintDialog, false); 66 pdf_settings->SetBoolean(kSettingPrintWithPrivet, false); 67 return UpdatePrintSettings(*pdf_settings); 68} 69 70PrintingContext::Result PrintingContext::UpdatePrintSettings( 71 const base::DictionaryValue& job_settings) { 72 ResetSettings(); 73 74 if (!PrintSettingsFromJobSettings(job_settings, &settings_)) { 75 NOTREACHED(); 76 return OnError(); 77 } 78 79 bool print_to_pdf = false; 80 bool is_cloud_dialog = false; 81 bool print_with_privet = false; 82 83 if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf) || 84 !job_settings.GetBoolean(kSettingCloudPrintDialog, &is_cloud_dialog) || 85 !job_settings.GetBoolean(kSettingPrintWithPrivet, &print_with_privet)) { 86 NOTREACHED(); 87 return OnError(); 88 } 89 90 bool print_to_cloud = job_settings.HasKey(kSettingCloudPrintId); 91 bool open_in_external_preview = 92 job_settings.HasKey(kSettingOpenPDFInPreview); 93 94 if (!open_in_external_preview && (print_to_pdf || print_to_cloud || 95 is_cloud_dialog || print_with_privet)) { 96 settings_.set_dpi(kDefaultPdfDpi); 97 gfx::Size paper_size(GetPdfPaperSizeDeviceUnits()); 98 if (!settings_.requested_media().size_microns.IsEmpty()) { 99 float deviceMicronsPerDeviceUnit = 100 (kHundrethsMMPerInch * 10.0f) / settings_.device_units_per_inch(); 101 paper_size = gfx::Size(settings_.requested_media().size_microns.width() / 102 deviceMicronsPerDeviceUnit, 103 settings_.requested_media().size_microns.height() / 104 deviceMicronsPerDeviceUnit); 105 } 106 gfx::Rect paper_rect(0, 0, paper_size.width(), paper_size.height()); 107 if (print_to_cloud || print_with_privet) { 108 paper_rect.Inset( 109 kCloudPrintMarginInch * settings_.device_units_per_inch(), 110 kCloudPrintMarginInch * settings_.device_units_per_inch()); 111 } 112 settings_.SetPrinterPrintableArea(paper_size, paper_rect, true); 113 return OK; 114 } 115 116 return UpdatePrinterSettings(open_in_external_preview); 117} 118 119} // namespace printing 120