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(Delegate* delegate) 22 : delegate_(delegate), 23 dialog_box_dismissed_(false), 24 in_print_job_(false), 25 abort_printing_(false) { 26 CHECK(delegate_); 27} 28 29PrintingContext::~PrintingContext() { 30} 31 32void PrintingContext::set_margin_type(MarginType type) { 33 DCHECK(type != CUSTOM_MARGINS); 34 settings_.set_margin_type(type); 35} 36 37void PrintingContext::ResetSettings() { 38 ReleaseContext(); 39 40 settings_.Clear(); 41 42 in_print_job_ = false; 43 dialog_box_dismissed_ = false; 44 abort_printing_ = false; 45} 46 47PrintingContext::Result PrintingContext::OnError() { 48 Result result = abort_printing_ ? CANCEL : FAILED; 49 ResetSettings(); 50 return result; 51} 52 53PrintingContext::Result PrintingContext::UsePdfSettings() { 54 scoped_ptr<base::DictionaryValue> pdf_settings(new base::DictionaryValue); 55 pdf_settings->SetBoolean(kSettingHeaderFooterEnabled, false); 56 pdf_settings->SetBoolean(kSettingShouldPrintBackgrounds, false); 57 pdf_settings->SetBoolean(kSettingShouldPrintSelectionOnly, false); 58 pdf_settings->SetInteger(kSettingMarginsType, printing::NO_MARGINS); 59 pdf_settings->SetBoolean(kSettingCollate, true); 60 pdf_settings->SetInteger(kSettingCopies, 1); 61 pdf_settings->SetInteger(kSettingColor, printing::COLOR); 62 pdf_settings->SetInteger(kSettingDuplexMode, printing::SIMPLEX); 63 pdf_settings->SetBoolean(kSettingLandscape, false); 64 pdf_settings->SetString(kSettingDeviceName, ""); 65 pdf_settings->SetBoolean(kSettingPrintToPDF, true); 66 pdf_settings->SetBoolean(kSettingCloudPrintDialog, false); 67 pdf_settings->SetBoolean(kSettingPrintWithPrivet, false); 68 return UpdatePrintSettings(*pdf_settings); 69} 70 71PrintingContext::Result PrintingContext::UpdatePrintSettings( 72 const base::DictionaryValue& job_settings) { 73 ResetSettings(); 74 75 if (!PrintSettingsFromJobSettings(job_settings, &settings_)) { 76 NOTREACHED(); 77 return OnError(); 78 } 79 80 bool print_to_pdf = false; 81 bool is_cloud_dialog = false; 82 bool print_with_privet = false; 83 84 if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf) || 85 !job_settings.GetBoolean(kSettingCloudPrintDialog, &is_cloud_dialog) || 86 !job_settings.GetBoolean(kSettingPrintWithPrivet, &print_with_privet)) { 87 NOTREACHED(); 88 return OnError(); 89 } 90 91 bool print_to_cloud = job_settings.HasKey(kSettingCloudPrintId); 92 bool open_in_external_preview = 93 job_settings.HasKey(kSettingOpenPDFInPreview); 94 95 if (!open_in_external_preview && (print_to_pdf || print_to_cloud || 96 is_cloud_dialog || print_with_privet)) { 97 settings_.set_dpi(kDefaultPdfDpi); 98 gfx::Size paper_size(GetPdfPaperSizeDeviceUnits()); 99 if (!settings_.requested_media().size_microns.IsEmpty()) { 100 float deviceMicronsPerDeviceUnit = 101 (kHundrethsMMPerInch * 10.0f) / settings_.device_units_per_inch(); 102 paper_size = gfx::Size(settings_.requested_media().size_microns.width() / 103 deviceMicronsPerDeviceUnit, 104 settings_.requested_media().size_microns.height() / 105 deviceMicronsPerDeviceUnit); 106 } 107 gfx::Rect paper_rect(0, 0, paper_size.width(), paper_size.height()); 108 if (print_to_cloud || print_with_privet) { 109 paper_rect.Inset( 110 kCloudPrintMarginInch * settings_.device_units_per_inch(), 111 kCloudPrintMarginInch * settings_.device_units_per_inch()); 112 } 113 settings_.SetPrinterPrintableArea(paper_size, paper_rect, true); 114 return OK; 115 } 116 117 bool show_system_dialog = false; 118 job_settings.GetBoolean(printing::kSettingShowSystemDialog, 119 &show_system_dialog); 120 121 return UpdatePrinterSettings(open_in_external_preview, show_system_dialog); 122} 123 124} // namespace printing 125