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