1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "printing/printing_context_linux.h"
10 #include "base/check.h"
11 #include "base/notreached.h"
12 #include "base/values.h"
13 #include "build/buildflag.h"
14 #include "printing/buildflags/buildflags.h"
15 #include "printing/metafile.h"
16 #include "printing/mojom/print.mojom.h"
17 #include "printing/print_dialog_linux_interface.h"
18 #include "printing/print_job_constants.h"
19 #include "printing/units.h"
21 // Avoid using LinuxUi on Fuchsia.
22 #if BUILDFLAG(IS_LINUX)
23 #include "ui/linux/linux_ui.h"
29 std::unique_ptr<PrintingContext> PrintingContext::CreateImpl(
31 bool skip_system_calls) {
32 auto context = std::make_unique<PrintingContextLinux>(delegate);
33 #if BUILDFLAG(ENABLE_OOP_PRINTING)
34 if (skip_system_calls)
35 context->set_skip_system_calls();
40 PrintingContextLinux::PrintingContextLinux(Delegate* delegate)
41 : PrintingContext(delegate), print_dialog_(nullptr) {}
43 PrintingContextLinux::~PrintingContextLinux() {
47 print_dialog_->ReleaseDialog();
50 void PrintingContextLinux::AskUserForSettings(int max_pages,
53 PrintSettingsCallback callback) {
55 // Can only get here if the renderer is sending bad messages.
56 // http://crbug.com/341777
58 std::move(callback).Run(mojom::ResultCode::kFailed);
62 print_dialog_->ShowDialog(delegate_->GetParentView(), has_selection,
66 mojom::ResultCode PrintingContextLinux::UseDefaultSettings() {
67 DCHECK(!in_print_job_);
71 #if BUILDFLAG(IS_LINUX)
72 if (!ui::LinuxUi::instance())
73 return mojom::ResultCode::kSuccess;
76 print_dialog_ = ui::LinuxUi::instance()->CreatePrintDialog(this);
77 print_dialog_->UseDefaultSettings();
80 return mojom::ResultCode::kSuccess;
83 gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() {
84 #if BUILDFLAG(IS_LINUX)
85 if (ui::LinuxUi::instance())
86 return ui::LinuxUi::instance()->GetPdfPaperSize(this);
92 mojom::ResultCode PrintingContextLinux::UpdatePrinterSettings(
93 const PrinterSettings& printer_settings) {
94 DCHECK(!printer_settings.show_system_dialog);
95 DCHECK(!in_print_job_);
97 #if BUILDFLAG(IS_LINUX)
98 if (!ui::LinuxUi::instance())
99 return mojom::ResultCode::kSuccess;
102 print_dialog_ = ui::LinuxUi::instance()->CreatePrintDialog(this);
104 // PrintDialogGtk::UpdateSettings() calls InitWithSettings() so settings_ will
105 // remain non-null after this line.
106 print_dialog_->UpdateSettings(std::move(settings_));
110 return mojom::ResultCode::kSuccess;
113 void PrintingContextLinux::InitWithSettings(
114 std::unique_ptr<PrintSettings> settings) {
115 DCHECK(!in_print_job_);
117 settings_ = std::move(settings);
120 mojom::ResultCode PrintingContextLinux::NewDocument(
121 const std::u16string& document_name) {
122 DCHECK(!in_print_job_);
123 in_print_job_ = true;
125 // If this implementation is expanded to include system calls then such calls
126 // should be gated upon `skip_system_calls()`.
128 document_name_ = document_name;
130 return mojom::ResultCode::kSuccess;
133 mojom::ResultCode PrintingContextLinux::PrintDocument(
134 const MetafilePlayer& metafile,
135 const PrintSettings& settings,
136 uint32_t num_pages) {
138 return mojom::ResultCode::kCanceled;
139 DCHECK(in_print_job_);
140 DCHECK(print_dialog_);
141 // TODO(crbug.com/1252685) Plumb error code back from
142 // `PrintDialogLinuxInterface`.
143 print_dialog_->PrintDocument(metafile, document_name_);
144 return mojom::ResultCode::kSuccess;
147 mojom::ResultCode PrintingContextLinux::DocumentDone() {
149 return mojom::ResultCode::kCanceled;
150 DCHECK(in_print_job_);
153 return mojom::ResultCode::kSuccess;
156 void PrintingContextLinux::Cancel() {
157 abort_printing_ = true;
158 in_print_job_ = false;
161 void PrintingContextLinux::ReleaseContext() {
162 // Intentional No-op.
165 printing::NativeDrawingContext PrintingContextLinux::context() const {
166 // Intentional No-op.
170 } // namespace printing