printing_context.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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  bool print_with_privet = false;
64
65  if (!job_settings.GetBoolean(kSettingPrintToPDF, &print_to_pdf) ||
66      !job_settings.GetBoolean(kSettingCloudPrintDialog, &is_cloud_dialog) ||
67      !job_settings.GetBoolean(kSettingPrintWithPrivet, &print_with_privet)) {
68    NOTREACHED();
69    return OnError();
70  }
71
72  bool print_to_cloud = job_settings.HasKey(kSettingCloudPrintId);
73  bool open_in_external_preview =
74      job_settings.HasKey(kSettingOpenPDFInPreview);
75
76  if (!open_in_external_preview && (print_to_pdf || print_to_cloud ||
77                                    is_cloud_dialog || print_with_privet)) {
78    settings_.set_dpi(kDefaultPdfDpi);
79    // Cloud print should get size and rect from capabilities received from
80    // server.
81    gfx::Size paper_size(GetPdfPaperSizeDeviceUnits());
82    gfx::Rect paper_rect(0, 0, paper_size.width(), paper_size.height());
83    if (print_to_cloud || print_with_privet) {
84      paper_rect.Inset(
85          kCloudPrintMarginInch * settings_.device_units_per_inch(),
86          kCloudPrintMarginInch * settings_.device_units_per_inch());
87    }
88    settings_.SetPrinterPrintableArea(paper_size, paper_rect, true);
89    return OK;
90  }
91
92  return UpdatePrinterSettings(open_in_external_preview);
93}
94
95}  // namespace printing
96