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_no_system_dialog.h"
6
7#include <unicode/ulocdata.h>
8
9#include "base/logging.h"
10#include "base/values.h"
11#include "printing/metafile.h"
12#include "printing/print_job_constants.h"
13#include "printing/units.h"
14
15namespace printing {
16
17// static
18PrintingContext* PrintingContext::Create(const std::string& app_locale) {
19  return static_cast<PrintingContext*>(
20      new PrintingContextNoSystemDialog(app_locale));
21}
22
23PrintingContextNoSystemDialog::PrintingContextNoSystemDialog(
24    const std::string& app_locale) : PrintingContext(app_locale) {
25}
26
27PrintingContextNoSystemDialog::~PrintingContextNoSystemDialog() {
28  ReleaseContext();
29}
30
31void PrintingContextNoSystemDialog::AskUserForSettings(
32    gfx::NativeView parent_view,
33    int max_pages,
34    bool has_selection,
35    const PrintSettingsCallback& callback) {
36  // We don't want to bring up a dialog here.  Ever.  Just signal the callback.
37  callback.Run(OK);
38}
39
40PrintingContext::Result PrintingContextNoSystemDialog::UseDefaultSettings() {
41  DCHECK(!in_print_job_);
42
43  ResetSettings();
44  settings_.set_dpi(kDefaultPdfDpi);
45  gfx::Size physical_size = GetPdfPaperSizeDeviceUnits();
46  // Assume full page is printable for now.
47  gfx::Rect printable_area(0, 0, physical_size.width(), physical_size.height());
48  DCHECK_EQ(settings_.device_units_per_inch(), kDefaultPdfDpi);
49  settings_.SetPrinterPrintableArea(physical_size, printable_area, true);
50  return OK;
51}
52
53gfx::Size PrintingContextNoSystemDialog::GetPdfPaperSizeDeviceUnits() {
54  int32_t width = 0;
55  int32_t height = 0;
56  UErrorCode error = U_ZERO_ERROR;
57  ulocdata_getPaperSize(app_locale_.c_str(), &height, &width, &error);
58  if (error > U_ZERO_ERROR) {
59    // If the call failed, assume a paper size of 8.5 x 11 inches.
60    LOG(WARNING) << "ulocdata_getPaperSize failed, using 8.5 x 11, error: "
61                 << error;
62    width = static_cast<int>(
63        kLetterWidthInch * settings_.device_units_per_inch());
64    height = static_cast<int>(
65        kLetterHeightInch  * settings_.device_units_per_inch());
66  } else {
67    // ulocdata_getPaperSize returns the width and height in mm.
68    // Convert this to pixels based on the dpi.
69    float multiplier = 100 * settings_.device_units_per_inch();
70    multiplier /= kHundrethsMMPerInch;
71    width *= multiplier;
72    height *= multiplier;
73  }
74  return gfx::Size(width, height);
75}
76
77PrintingContext::Result PrintingContextNoSystemDialog::UpdatePrinterSettings(
78    bool external_preview) {
79
80  if (settings_.dpi() == 0)
81    UseDefaultSettings();
82
83  return OK;
84}
85
86PrintingContext::Result PrintingContextNoSystemDialog::InitWithSettings(
87    const PrintSettings& settings) {
88  DCHECK(!in_print_job_);
89
90  settings_ = settings;
91
92  return OK;
93}
94
95PrintingContext::Result PrintingContextNoSystemDialog::NewDocument(
96    const base::string16& document_name) {
97  DCHECK(!in_print_job_);
98  in_print_job_ = true;
99
100  return OK;
101}
102
103PrintingContext::Result PrintingContextNoSystemDialog::NewPage() {
104  if (abort_printing_)
105    return CANCEL;
106  DCHECK(in_print_job_);
107
108  // Intentional No-op.
109
110  return OK;
111}
112
113PrintingContext::Result PrintingContextNoSystemDialog::PageDone() {
114  if (abort_printing_)
115    return CANCEL;
116  DCHECK(in_print_job_);
117
118  // Intentional No-op.
119
120  return OK;
121}
122
123PrintingContext::Result PrintingContextNoSystemDialog::DocumentDone() {
124  if (abort_printing_)
125    return CANCEL;
126  DCHECK(in_print_job_);
127
128  ResetSettings();
129  return OK;
130}
131
132void PrintingContextNoSystemDialog::Cancel() {
133  abort_printing_ = true;
134  in_print_job_ = false;
135}
136
137void PrintingContextNoSystemDialog::ReleaseContext() {
138  // Intentional No-op.
139}
140
141gfx::NativeDrawingContext PrintingContextNoSystemDialog::context() const {
142  // Intentional No-op.
143  return NULL;
144}
145
146}  // namespace printing
147
148