| // 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 |