blob: a5334e0a6989714e26ed40f895ae06cda62cdf37 [file] [log] [blame]
Andrew Rayskiyf90c7e82023-11-07 14:46:181// Copyright 2022 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.
4
5#include "chrome/browser/printing/local_printer_utils_chromeos.h"
6
Arthur Sonzognife132ee2024-01-15 11:01:047#include <optional>
Andrew Rayskiyf90c7e82023-11-07 14:46:188#include <string>
Andrei Nedoluzhko3eea9fb2024-11-14 13:48:079#include <type_traits>
10#include <utility>
Andrew Rayskiyf90c7e82023-11-07 14:46:1811
Andrei Nedoluzhko3eea9fb2024-11-14 13:48:0712#include "base/functional/bind.h"
13#include "base/functional/callback_forward.h"
Andrew Rayskiyf90c7e82023-11-07 14:46:1814#include "chrome/browser/ash/crosapi/crosapi_ash.h"
15#include "chrome/browser/ash/crosapi/crosapi_manager.h"
16#include "chrome/browser/ash/crosapi/local_printer_ash.h"
Andrei Nedoluzhko3eea9fb2024-11-14 13:48:0717#include "chromeos/crosapi/mojom/local_printer.mojom.h"
18#include "chromeos/printing/cups_printer_status.h"
19#include "chromeos/printing/printer_configuration.h"
Andrew Rayskiyf90c7e82023-11-07 14:46:1820
21namespace printing {
22
Andrei Nedoluzhko3eea9fb2024-11-14 13:48:0723namespace {
24
25template <typename MojoOptionType,
26 typename MojoOptionValueType,
27 typename ChromeOsOptionValueType>
28mojo::StructPtr<MojoOptionType> PrintOptionToMojom(
29 const chromeos::Printer::PrintOption<ChromeOsOptionValueType>& print_option,
30 base::RepeatingCallback<MojoOptionValueType(const ChromeOsOptionValueType&)>
31 get_mojo_option_value) {
32 auto result = MojoOptionType::New();
33
34 if (print_option.default_value.has_value()) {
35 result->default_value =
36 get_mojo_option_value.Run(print_option.default_value.value());
37 }
38
39 if (!print_option.allowed_values.empty()) {
40 result->allowed_values = std::vector<MojoOptionValueType>();
41 result->allowed_values->reserve(print_option.allowed_values.size());
42 for (const auto& allowed_value : print_option.allowed_values) {
43 result->allowed_values->push_back(
44 get_mojo_option_value.Run(allowed_value));
45 }
46 }
47
48 return result;
49}
50
51template <typename MojoOptionType,
52 typename MojoOptionValueType = std::remove_reference_t<
53 decltype(MojoOptionType().default_value.value())>,
54 typename ChromeOsOptionValueType>
55mojo::StructPtr<MojoOptionType> PrintOptionToMojom(
56 const chromeos::Printer::PrintOption<ChromeOsOptionValueType>&
57 print_option) {
58 return PrintOptionToMojom<MojoOptionType>(
59 print_option,
60 base::BindRepeating([](const ChromeOsOptionValueType& value) {
61 return static_cast<MojoOptionValueType>(value);
62 }));
63}
64
65} // namespace
66
Andrew Rayskiyf90c7e82023-11-07 14:46:1867crosapi::mojom::LocalPrinter* GetLocalPrinterInterface() {
Andrew Rayskiyf90c7e82023-11-07 14:46:1868 CHECK(crosapi::CrosapiManager::IsInitialized());
69 return crosapi::CrosapiManager::Get()->crosapi_ash()->local_printer_ash();
Andrew Rayskiyf90c7e82023-11-07 14:46:1870}
71
72crosapi::mojom::CapabilitiesResponsePtr PrinterWithCapabilitiesToMojom(
73 const chromeos::Printer& printer,
Arthur Sonzognife132ee2024-01-15 11:01:0474 const std::optional<printing::PrinterSemanticCapsAndDefaults>& caps) {
Andrew Rayskiyf90c7e82023-11-07 14:46:1875 return crosapi::mojom::CapabilitiesResponse::New(
76 PrinterToMojom(printer), printer.HasSecureProtocol(),
77 caps, // comment to prevent git cl format
78 0, 0, 0, // deprecated
79 printing::mojom::PinModeRestriction::kUnset, // deprecated
80 printing::mojom::ColorModeRestriction::kUnset, // deprecated
81 printing::mojom::DuplexModeRestriction::kUnset, // deprecated
82 printing::mojom::PinModeRestriction::kUnset); // deprecated
83}
84
85crosapi::mojom::LocalDestinationInfoPtr PrinterToMojom(
86 const chromeos::Printer& printer) {
87 return crosapi::mojom::LocalDestinationInfo::New(
88 printer.id(), printer.display_name(), printer.description(),
89 printer.source() == chromeos::Printer::SRC_POLICY,
90 printer.uri().GetNormalized(/*always_print_port=*/true),
Andrei Nedoluzhko3eea9fb2024-11-14 13:48:0791 StatusToMojom(printer.printer_status()),
92 ManagedPrintOptionsToMojom(printer.print_job_options()));
Andrew Rayskiyf90c7e82023-11-07 14:46:1893}
94
95crosapi::mojom::PrinterStatusPtr StatusToMojom(
96 const chromeos::CupsPrinterStatus& status) {
97 auto ptr = crosapi::mojom::PrinterStatus::New();
98 ptr->printer_id = status.GetPrinterId();
99 ptr->timestamp = status.GetTimestamp();
100 for (const auto& reason : status.GetStatusReasons()) {
101 if (reason.GetReason() == crosapi::mojom::StatusReason::Reason::kNoError) {
102 continue;
103 }
104 ptr->status_reasons.push_back(crosapi::mojom::StatusReason::New(
105 reason.GetReason(), reason.GetSeverity()));
106 }
107 return ptr;
108}
109
Andrei Nedoluzhko3eea9fb2024-11-14 13:48:07110crosapi::mojom::ManagedPrintOptionsPtr ManagedPrintOptionsToMojom(
111 const chromeos::Printer::ManagedPrintOptions& managed_print_options) {
112 auto result = crosapi::mojom::ManagedPrintOptions::New();
113
114 result->media_size = PrintOptionToMojom<crosapi::mojom::SizeOption>(
115 managed_print_options.media_size,
116 base::BindRepeating([](const chromeos::Printer::Size& value) {
117 return crosapi::mojom::Size::New(value.width, value.height);
118 }));
119
120 result->media_type = PrintOptionToMojom<crosapi::mojom::StringOption>(
121 managed_print_options.media_type);
122
123 result->duplex = PrintOptionToMojom<crosapi::mojom::DuplexOption>(
124 managed_print_options.duplex,
125 base::BindRepeating([](const chromeos::Printer::DuplexType& value) {
126 switch (value) {
127 case chromeos::Printer::DuplexType::kOneSided:
128 return crosapi::mojom::DuplexType::kOneSided;
129 case chromeos::Printer::DuplexType::kShortEdge:
130 return crosapi::mojom::DuplexType::kShortEdge;
131 case chromeos::Printer::DuplexType::kLongEdge:
132 return crosapi::mojom::DuplexType::kLongEdge;
133 default:
134 return crosapi::mojom::DuplexType::kUnknownDuplex;
135 }
136 }));
137
138 result->color = PrintOptionToMojom<crosapi::mojom::BoolOption>(
139 managed_print_options.color);
140
141 result->dpi = PrintOptionToMojom<crosapi::mojom::DpiOption>(
142 managed_print_options.dpi,
143 base::BindRepeating([](const chromeos::Printer::Dpi& value) {
144 return crosapi::mojom::Dpi::New(value.horizontal, value.vertical);
145 }));
146
147 result->quality = PrintOptionToMojom<crosapi::mojom::QualityOption>(
148 managed_print_options.quality,
149 base::BindRepeating([](const chromeos::Printer::QualityType& value) {
150 switch (value) {
151 case chromeos::Printer::QualityType::kDraft:
152 return crosapi::mojom::QualityType::kDraft;
153 case chromeos::Printer::QualityType::kNormal:
154 return crosapi::mojom::QualityType::kNormal;
155 case chromeos::Printer::QualityType::kHigh:
156 return crosapi::mojom::QualityType::kHigh;
157 default:
158 return crosapi::mojom::QualityType::kUnknownQuality;
159 }
160 }));
161
162 result->print_as_image = PrintOptionToMojom<crosapi::mojom::BoolOption>(
163 managed_print_options.print_as_image);
164
165 return result;
166}
167
Andrew Rayskiyf90c7e82023-11-07 14:46:18168} // namespace printing