blob: a5334e0a6989714e26ed40f895ae06cda62cdf37 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/printing/local_printer_utils_chromeos.h"
#include <optional>
#include <string>
#include <type_traits>
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback_forward.h"
#include "chrome/browser/ash/crosapi/crosapi_ash.h"
#include "chrome/browser/ash/crosapi/crosapi_manager.h"
#include "chrome/browser/ash/crosapi/local_printer_ash.h"
#include "chromeos/crosapi/mojom/local_printer.mojom.h"
#include "chromeos/printing/cups_printer_status.h"
#include "chromeos/printing/printer_configuration.h"
namespace printing {
namespace {
template <typename MojoOptionType,
typename MojoOptionValueType,
typename ChromeOsOptionValueType>
mojo::StructPtr<MojoOptionType> PrintOptionToMojom(
const chromeos::Printer::PrintOption<ChromeOsOptionValueType>& print_option,
base::RepeatingCallback<MojoOptionValueType(const ChromeOsOptionValueType&)>
get_mojo_option_value) {
auto result = MojoOptionType::New();
if (print_option.default_value.has_value()) {
result->default_value =
get_mojo_option_value.Run(print_option.default_value.value());
}
if (!print_option.allowed_values.empty()) {
result->allowed_values = std::vector<MojoOptionValueType>();
result->allowed_values->reserve(print_option.allowed_values.size());
for (const auto& allowed_value : print_option.allowed_values) {
result->allowed_values->push_back(
get_mojo_option_value.Run(allowed_value));
}
}
return result;
}
template <typename MojoOptionType,
typename MojoOptionValueType = std::remove_reference_t<
decltype(MojoOptionType().default_value.value())>,
typename ChromeOsOptionValueType>
mojo::StructPtr<MojoOptionType> PrintOptionToMojom(
const chromeos::Printer::PrintOption<ChromeOsOptionValueType>&
print_option) {
return PrintOptionToMojom<MojoOptionType>(
print_option,
base::BindRepeating([](const ChromeOsOptionValueType& value) {
return static_cast<MojoOptionValueType>(value);
}));
}
} // namespace
crosapi::mojom::LocalPrinter* GetLocalPrinterInterface() {
CHECK(crosapi::CrosapiManager::IsInitialized());
return crosapi::CrosapiManager::Get()->crosapi_ash()->local_printer_ash();
}
crosapi::mojom::CapabilitiesResponsePtr PrinterWithCapabilitiesToMojom(
const chromeos::Printer& printer,
const std::optional<printing::PrinterSemanticCapsAndDefaults>& caps) {
return crosapi::mojom::CapabilitiesResponse::New(
PrinterToMojom(printer), printer.HasSecureProtocol(),
caps, // comment to prevent git cl format
0, 0, 0, // deprecated
printing::mojom::PinModeRestriction::kUnset, // deprecated
printing::mojom::ColorModeRestriction::kUnset, // deprecated
printing::mojom::DuplexModeRestriction::kUnset, // deprecated
printing::mojom::PinModeRestriction::kUnset); // deprecated
}
crosapi::mojom::LocalDestinationInfoPtr PrinterToMojom(
const chromeos::Printer& printer) {
return crosapi::mojom::LocalDestinationInfo::New(
printer.id(), printer.display_name(), printer.description(),
printer.source() == chromeos::Printer::SRC_POLICY,
printer.uri().GetNormalized(/*always_print_port=*/true),
StatusToMojom(printer.printer_status()),
ManagedPrintOptionsToMojom(printer.print_job_options()));
}
crosapi::mojom::PrinterStatusPtr StatusToMojom(
const chromeos::CupsPrinterStatus& status) {
auto ptr = crosapi::mojom::PrinterStatus::New();
ptr->printer_id = status.GetPrinterId();
ptr->timestamp = status.GetTimestamp();
for (const auto& reason : status.GetStatusReasons()) {
if (reason.GetReason() == crosapi::mojom::StatusReason::Reason::kNoError) {
continue;
}
ptr->status_reasons.push_back(crosapi::mojom::StatusReason::New(
reason.GetReason(), reason.GetSeverity()));
}
return ptr;
}
crosapi::mojom::ManagedPrintOptionsPtr ManagedPrintOptionsToMojom(
const chromeos::Printer::ManagedPrintOptions& managed_print_options) {
auto result = crosapi::mojom::ManagedPrintOptions::New();
result->media_size = PrintOptionToMojom<crosapi::mojom::SizeOption>(
managed_print_options.media_size,
base::BindRepeating([](const chromeos::Printer::Size& value) {
return crosapi::mojom::Size::New(value.width, value.height);
}));
result->media_type = PrintOptionToMojom<crosapi::mojom::StringOption>(
managed_print_options.media_type);
result->duplex = PrintOptionToMojom<crosapi::mojom::DuplexOption>(
managed_print_options.duplex,
base::BindRepeating([](const chromeos::Printer::DuplexType& value) {
switch (value) {
case chromeos::Printer::DuplexType::kOneSided:
return crosapi::mojom::DuplexType::kOneSided;
case chromeos::Printer::DuplexType::kShortEdge:
return crosapi::mojom::DuplexType::kShortEdge;
case chromeos::Printer::DuplexType::kLongEdge:
return crosapi::mojom::DuplexType::kLongEdge;
default:
return crosapi::mojom::DuplexType::kUnknownDuplex;
}
}));
result->color = PrintOptionToMojom<crosapi::mojom::BoolOption>(
managed_print_options.color);
result->dpi = PrintOptionToMojom<crosapi::mojom::DpiOption>(
managed_print_options.dpi,
base::BindRepeating([](const chromeos::Printer::Dpi& value) {
return crosapi::mojom::Dpi::New(value.horizontal, value.vertical);
}));
result->quality = PrintOptionToMojom<crosapi::mojom::QualityOption>(
managed_print_options.quality,
base::BindRepeating([](const chromeos::Printer::QualityType& value) {
switch (value) {
case chromeos::Printer::QualityType::kDraft:
return crosapi::mojom::QualityType::kDraft;
case chromeos::Printer::QualityType::kNormal:
return crosapi::mojom::QualityType::kNormal;
case chromeos::Printer::QualityType::kHigh:
return crosapi::mojom::QualityType::kHigh;
default:
return crosapi::mojom::QualityType::kUnknownQuality;
}
}));
result->print_as_image = PrintOptionToMojom<crosapi::mojom::BoolOption>(
managed_print_options.print_as_image);
return result;
}
} // namespace printing