1// Copyright 2014 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_linux.h"
6
7#include "base/logging.h"
8#include "base/values.h"
9#include "printing/metafile.h"
10#include "printing/print_dialog_gtk_interface.h"
11#include "printing/print_job_constants.h"
12#include "printing/units.h"
13
14namespace {
15
16// Function pointer for creating print dialogs. |callback| is only used when
17// |show_dialog| is true.
18printing::PrintDialogGtkInterface* (*create_dialog_func_)(
19    printing::PrintingContextLinux* context) = NULL;
20
21// Function pointer for determining paper size.
22gfx::Size (*get_pdf_paper_size_)(
23    printing::PrintingContextLinux* context) = NULL;
24
25}  // namespace
26
27namespace printing {
28
29// static
30PrintingContext* PrintingContext::Create(const std::string& app_locale) {
31  return static_cast<PrintingContext*>(new PrintingContextLinux(app_locale));
32}
33
34PrintingContextLinux::PrintingContextLinux(const std::string& app_locale)
35    : PrintingContext(app_locale),
36      print_dialog_(NULL) {
37}
38
39PrintingContextLinux::~PrintingContextLinux() {
40  ReleaseContext();
41
42  if (print_dialog_)
43    print_dialog_->ReleaseDialog();
44}
45
46// static
47void PrintingContextLinux::SetCreatePrintDialogFunction(
48    PrintDialogGtkInterface* (*create_dialog_func)(
49        PrintingContextLinux* context)) {
50  DCHECK(create_dialog_func);
51  DCHECK(!create_dialog_func_);
52  create_dialog_func_ = create_dialog_func;
53}
54
55// static
56void PrintingContextLinux::SetPdfPaperSizeFunction(
57    gfx::Size (*get_pdf_paper_size)(PrintingContextLinux* context)) {
58  DCHECK(get_pdf_paper_size);
59  DCHECK(!get_pdf_paper_size_);
60  get_pdf_paper_size_ = get_pdf_paper_size;
61}
62
63void PrintingContextLinux::PrintDocument(const Metafile* metafile) {
64  DCHECK(print_dialog_);
65  DCHECK(metafile);
66  print_dialog_->PrintDocument(metafile, document_name_);
67}
68
69void PrintingContextLinux::AskUserForSettings(
70    gfx::NativeView parent_view,
71    int max_pages,
72    bool has_selection,
73    const PrintSettingsCallback& callback) {
74  if (!print_dialog_) {
75    // Can only get here if the renderer is sending bad messages.
76    // http://crbug.com/341777
77    NOTREACHED();
78    callback.Run(FAILED);
79    return;
80  }
81
82  print_dialog_->ShowDialog(parent_view, has_selection, callback);
83}
84
85PrintingContext::Result PrintingContextLinux::UseDefaultSettings() {
86  DCHECK(!in_print_job_);
87
88  ResetSettings();
89
90  if (!create_dialog_func_)
91    return OK;
92
93  if (!print_dialog_) {
94    print_dialog_ = create_dialog_func_(this);
95    print_dialog_->AddRefToDialog();
96  }
97  print_dialog_->UseDefaultSettings();
98
99  return OK;
100}
101
102gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() {
103  if (get_pdf_paper_size_)
104    return get_pdf_paper_size_(this);
105
106  return gfx::Size();
107}
108
109PrintingContext::Result PrintingContextLinux::UpdatePrinterSettings(
110    bool external_preview) {
111  DCHECK(!in_print_job_);
112  DCHECK(!external_preview) << "Not implemented";
113
114  if (!create_dialog_func_)
115    return OK;
116
117  if (!print_dialog_) {
118    print_dialog_ = create_dialog_func_(this);
119    print_dialog_->AddRefToDialog();
120  }
121
122  if (!print_dialog_->UpdateSettings(&settings_))
123    return OnError();
124
125  return OK;
126}
127
128PrintingContext::Result PrintingContextLinux::InitWithSettings(
129    const PrintSettings& settings) {
130  DCHECK(!in_print_job_);
131
132  settings_ = settings;
133
134  return OK;
135}
136
137PrintingContext::Result PrintingContextLinux::NewDocument(
138    const base::string16& document_name) {
139  DCHECK(!in_print_job_);
140  in_print_job_ = true;
141
142  document_name_ = document_name;
143
144  return OK;
145}
146
147PrintingContext::Result PrintingContextLinux::NewPage() {
148  if (abort_printing_)
149    return CANCEL;
150  DCHECK(in_print_job_);
151
152  // Intentional No-op.
153
154  return OK;
155}
156
157PrintingContext::Result PrintingContextLinux::PageDone() {
158  if (abort_printing_)
159    return CANCEL;
160  DCHECK(in_print_job_);
161
162  // Intentional No-op.
163
164  return OK;
165}
166
167PrintingContext::Result PrintingContextLinux::DocumentDone() {
168  if (abort_printing_)
169    return CANCEL;
170  DCHECK(in_print_job_);
171
172  ResetSettings();
173  return OK;
174}
175
176void PrintingContextLinux::Cancel() {
177  abort_printing_ = true;
178  in_print_job_ = false;
179}
180
181void PrintingContextLinux::ReleaseContext() {
182  // Intentional No-op.
183}
184
185gfx::NativeDrawingContext PrintingContextLinux::context() const {
186  // Intentional No-op.
187  return NULL;
188}
189
190}  // namespace printing
191