printing_context_linux.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. #include "printing/printing_context_linux.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/check.h"
  8. #include "base/notreached.h"
  9. #include "base/values.h"
  10. #include "build/buildflag.h"
  11. #include "printing/buildflags/buildflags.h"
  12. #include "printing/metafile.h"
  13. #include "printing/mojom/print.mojom.h"
  14. #include "printing/print_dialog_linux_interface.h"
  15. #include "printing/print_job_constants.h"
  16. #include "printing/units.h"
  17. // Avoid using LinuxUi on Fuchsia.
  18. #if BUILDFLAG(IS_LINUX)
  19. #include "ui/linux/linux_ui.h"
  20. #endif
  21. namespace printing {
  22. // static
  23. std::unique_ptr<PrintingContext> PrintingContext::CreateImpl(
  24. Delegate* delegate,
  25. bool skip_system_calls) {
  26. auto context = std::make_unique<PrintingContextLinux>(delegate);
  27. #if BUILDFLAG(ENABLE_OOP_PRINTING)
  28. if (skip_system_calls)
  29. context->set_skip_system_calls();
  30. #endif
  31. return context;
  32. }
  33. PrintingContextLinux::PrintingContextLinux(Delegate* delegate)
  34. : PrintingContext(delegate), print_dialog_(nullptr) {}
  35. PrintingContextLinux::~PrintingContextLinux() {
  36. ReleaseContext();
  37. if (print_dialog_)
  38. print_dialog_->ReleaseDialog();
  39. }
  40. void PrintingContextLinux::AskUserForSettings(int max_pages,
  41. bool has_selection,
  42. bool is_scripted,
  43. PrintSettingsCallback callback) {
  44. if (!print_dialog_) {
  45. // Can only get here if the renderer is sending bad messages.
  46. // http://crbug.com/341777
  47. NOTREACHED();
  48. std::move(callback).Run(mojom::ResultCode::kFailed);
  49. return;
  50. }
  51. print_dialog_->ShowDialog(delegate_->GetParentView(), has_selection,
  52. std::move(callback));
  53. }
  54. mojom::ResultCode PrintingContextLinux::UseDefaultSettings() {
  55. DCHECK(!in_print_job_);
  56. ResetSettings();
  57. #if BUILDFLAG(IS_LINUX)
  58. if (!ui::LinuxUi::instance())
  59. return mojom::ResultCode::kSuccess;
  60. if (!print_dialog_)
  61. print_dialog_ = ui::LinuxUi::instance()->CreatePrintDialog(this);
  62. print_dialog_->UseDefaultSettings();
  63. #endif
  64. return mojom::ResultCode::kSuccess;
  65. }
  66. gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() {
  67. #if BUILDFLAG(IS_LINUX)
  68. if (ui::LinuxUi::instance())
  69. return ui::LinuxUi::instance()->GetPdfPaperSize(this);
  70. #endif
  71. return gfx::Size();
  72. }
  73. mojom::ResultCode PrintingContextLinux::UpdatePrinterSettings(
  74. const PrinterSettings& printer_settings) {
  75. DCHECK(!printer_settings.show_system_dialog);
  76. DCHECK(!in_print_job_);
  77. #if BUILDFLAG(IS_LINUX)
  78. if (!ui::LinuxUi::instance())
  79. return mojom::ResultCode::kSuccess;
  80. if (!print_dialog_)
  81. print_dialog_ = ui::LinuxUi::instance()->CreatePrintDialog(this);
  82. // PrintDialogGtk::UpdateSettings() calls InitWithSettings() so settings_ will
  83. // remain non-null after this line.
  84. print_dialog_->UpdateSettings(std::move(settings_));
  85. DCHECK(settings_);
  86. #endif
  87. return mojom::ResultCode::kSuccess;
  88. }
  89. void PrintingContextLinux::InitWithSettings(
  90. std::unique_ptr<PrintSettings> settings) {
  91. DCHECK(!in_print_job_);
  92. settings_ = std::move(settings);
  93. }
  94. mojom::ResultCode PrintingContextLinux::NewDocument(
  95. const std::u16string& document_name) {
  96. DCHECK(!in_print_job_);
  97. in_print_job_ = true;
  98. // If this implementation is expanded to include system calls then such calls
  99. // should be gated upon `skip_system_calls()`.
  100. document_name_ = document_name;
  101. return mojom::ResultCode::kSuccess;
  102. }
  103. mojom::ResultCode PrintingContextLinux::PrintDocument(
  104. const MetafilePlayer& metafile,
  105. const PrintSettings& settings,
  106. uint32_t num_pages) {
  107. if (abort_printing_)
  108. return mojom::ResultCode::kCanceled;
  109. DCHECK(in_print_job_);
  110. DCHECK(print_dialog_);
  111. // TODO(crbug.com/1252685) Plumb error code back from
  112. // `PrintDialogLinuxInterface`.
  113. print_dialog_->PrintDocument(metafile, document_name_);
  114. return mojom::ResultCode::kSuccess;
  115. }
  116. mojom::ResultCode PrintingContextLinux::DocumentDone() {
  117. if (abort_printing_)
  118. return mojom::ResultCode::kCanceled;
  119. DCHECK(in_print_job_);
  120. ResetSettings();
  121. return mojom::ResultCode::kSuccess;
  122. }
  123. void PrintingContextLinux::Cancel() {
  124. abort_printing_ = true;
  125. in_print_job_ = false;
  126. }
  127. void PrintingContextLinux::ReleaseContext() {
  128. // Intentional No-op.
  129. }
  130. printing::NativeDrawingContext PrintingContextLinux::context() const {
  131. // Intentional No-op.
  132. return nullptr;
  133. }
  134. } // namespace printing