printing_context.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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_settings_initializer.h"
12#include "printing/units.h"
13
14namespace printing {
15
16namespace {
17const float kCloudPrintMarginInch = 0.25;
18}
19
20PrintingContext::PrintingContext(const std::string& app_locale)
21    : dialog_box_dismissed_(false),
22      in_print_job_(false),
23      abort_printing_(false),
24      app_locale_(app_locale) {
25}
26
27PrintingContext::~PrintingContext() {
28}
29
30void PrintingContext::set_margin_type(MarginType type) {
31  DCHECK(type != CUSTOM_MARGINS);
32  settings_.set_margin_type(type);
33}
34
35void PrintingContext::ResetSettings() {
36  ReleaseContext();
37
38  settings_.Clear();
39
40  in_print_job_ = false;
41  dialog_box_dismissed_ = false;
42  abort_printing_ = false;
43}
44
45PrintingContext::Result PrintingContext::OnError() {
46  ResetSettings();
47  return abort_printing_ ? CANCEL : FAILED;
48}
49
50PrintingContext::Result PrintingContext::UpdatePrintSettings(
51    const base::DictionaryValue& job_settings,
52    const PageRanges& ranges) {
53  ResetSettings();
54
55  if (!PrintSettingsInitializer::InitSettings(job_settings, ranges,
56                                              &settings_)) {
57    NOTREACHED();
58    return OnError();
59  }
60
61  bool print_to_pdf = false;
62  bool is_cloud_dialog = false;
63
64  if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf) ||
65      !job_settings.GetBoolean(kSettingCloudPrintDialog, &is_cloud_dialog)) {
66    NOTREACHED();
67    return OnError();
68  }
69
70  bool print_to_cloud = job_settings.HasKey(kSettingCloudPrintId);
71  bool open_in_external_preview =
72      job_settings.HasKey(kSettingOpenPDFInPreview);
73
74  if (!open_in_external_preview &&
75      (print_to_pdf || print_to_cloud || is_cloud_dialog)) {
76    settings_.set_dpi(kDefaultPdfDpi);
77    // Cloud print should get size and rect from capabilities received from
78    // server.
79    gfx::Size paper_size(GetPdfPaperSizeDeviceUnits());
80    gfx::Rect paper_rect(0, 0, paper_size.width(), paper_size.height());
81    if (print_to_cloud) {
82      paper_rect.Inset(
83          kCloudPrintMarginInch * settings_.device_units_per_inch(),
84          kCloudPrintMarginInch * settings_.device_units_per_inch());
85    }
86    DCHECK_EQ(settings_.device_units_per_inch(), kDefaultPdfDpi);
87    settings_.SetPrinterPrintableArea(paper_size, paper_rect, true);
88    return OK;
89  }
90
91  return UpdatePrinterSettings(open_in_external_preview);
92}
93
94}  // namespace printing
95