| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <utility> |
| #include <vector> |
| |
| #include "base/json/values_util.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/values.h" |
| #include "chromeos/crosapi/mojom/print_preview_cros.mojom.h" |
| #include "components/printing/common/print.mojom.h" |
| #include "printing/mojom/print.mojom.h" |
| #include "printing/print_job_constants.h" |
| #include "printing/print_settings_conversion_chromeos.h" |
| #include "url/gurl.h" |
| |
| namespace chromeos { |
| |
| base::Value::Dict SerializePrintSettings( |
| const crosapi::mojom::PrintSettingsPtr& settings) { |
| base::Value::Dict dict; |
| dict.Set(::printing::kPreviewRequestID, |
| static_cast<int>(settings->request_id)); |
| dict.Set(::printing::kPreviewUIID, static_cast<int>(settings->preview_id)); |
| dict.Set(::printing::kIsFirstRequest, settings->is_first_request); |
| dict.Set(::printing::kSettingPrinterType, |
| static_cast<int>(settings->printer_type)); |
| dict.Set(::printing::kSettingMarginsType, |
| static_cast<int>(settings->margin_type)); |
| dict.Set(::printing::kSettingScalingType, |
| static_cast<int>(settings->scaling_type)); |
| dict.Set(::printing::kSettingCollate, settings->collate); |
| dict.Set(::printing::kSettingCopies, static_cast<int>(settings->copies)); |
| dict.Set(::printing::kSettingColor, static_cast<int>(settings->color)); |
| dict.Set(::printing::kSettingDuplexMode, static_cast<int>(settings->duplex)); |
| dict.Set(::printing::kSettingLandscape, settings->landscape); |
| dict.Set(::printing::kSettingScaleFactor, |
| static_cast<int>(settings->scale_factor)); |
| dict.Set(::printing::kSettingRasterizePdf, settings->rasterize_pdf); |
| dict.Set(::printing::kSettingPagesPerSheet, |
| static_cast<int>(settings->pages_per_sheet)); |
| dict.Set(::printing::kSettingDpiHorizontal, |
| static_cast<int>(settings->dpi_horizontal)); |
| dict.Set(::printing::kSettingDpiVertical, |
| static_cast<int>(settings->dpi_vertical)); |
| dict.Set(::printing::kSettingHeaderFooterEnabled, |
| settings->header_footer_enabled); |
| dict.Set(::printing::kSettingShouldPrintBackgrounds, |
| settings->should_print_backgrounds); |
| dict.Set(::printing::kSettingShouldPrintSelectionOnly, |
| settings->should_print_selection_only); |
| |
| if (settings->title) { |
| dict.Set(::printing::kSettingHeaderFooterTitle, *settings->title); |
| } |
| if (settings->url) { |
| dict.Set(::printing::kSettingHeaderFooterURL, (*settings->url).spec()); |
| } |
| |
| if (settings->device_name) { |
| dict.Set(::printing::kSettingDeviceName, *settings->device_name); |
| } |
| |
| if (settings->rasterize_pdf_dpi) { |
| dict.Set(::printing::kSettingRasterizePdfDpi, |
| static_cast<int>(*settings->rasterize_pdf_dpi)); |
| } |
| |
| if (settings->borderless) { |
| dict.Set(::printing::kSettingBorderless, *settings->borderless); |
| } |
| |
| if (settings->media_type) { |
| dict.Set(::printing::kSettingMediaType, *settings->media_type); |
| } |
| |
| if (settings->preview_modifiable) { |
| dict.Set(::printing::kSettingPreviewModifiable, |
| *settings->preview_modifiable); |
| } |
| |
| if (settings->send_user_info) { |
| dict.Set(::printing::kSettingSendUserInfo, *settings->send_user_info); |
| } |
| |
| if (settings->user_name) { |
| dict.Set(::printing::kSettingUsername, *settings->user_name); |
| } |
| |
| if (settings->chromeos_access_oauth_token) { |
| dict.Set(::printing::kSettingChromeOSAccessOAuthToken, |
| *settings->chromeos_access_oauth_token); |
| } |
| |
| if (settings->pin_value) { |
| dict.Set(::printing::kSettingPinValue, *settings->pin_value); |
| } |
| |
| if (settings->printer_manually_selected) { |
| dict.Set(::printing::kSettingPrinterManuallySelected, |
| *settings->printer_manually_selected); |
| } |
| |
| if (settings->printer_status_reason) { |
| dict.Set(::printing::kSettingPrinterStatusReason, |
| static_cast<int>(*settings->printer_status_reason)); |
| } |
| |
| if (settings->capabilities) { |
| dict.Set(::printing::kSettingCapabilities, *settings->capabilities); |
| } |
| |
| if (settings->open_pdf_in_preview) { |
| dict.Set(::printing::kSettingOpenPDFInPreview, |
| *settings->open_pdf_in_preview); |
| } |
| |
| if (settings->dpi_default) { |
| dict.Set(::printing::kSettingDpiDefault, *settings->dpi_default); |
| } |
| |
| if (settings->page_count) { |
| dict.Set(::printing::kSettingPreviewPageCount, |
| static_cast<int>(*settings->page_count)); |
| } |
| |
| if (settings->show_system_dialog) { |
| dict.Set(::printing::kSettingShowSystemDialog, |
| *settings->show_system_dialog); |
| } |
| |
| if (settings->ipp_client_info) { |
| std::vector<::printing::mojom::IppClientInfo> client_info_list; |
| client_info_list.reserve((*settings->ipp_client_info).size()); |
| for (const ::printing::mojom::IppClientInfoPtr& client_info : |
| *settings->ipp_client_info) { |
| client_info_list.emplace_back(std::move(*client_info)); |
| } |
| dict.Set(::printing::kSettingIppClientInfo, |
| ::printing::ConvertClientInfoToJobSetting(client_info_list)); |
| } |
| |
| if (settings->advanced_settings) { |
| base::Value::Dict advanced_settings; |
| for (auto& setting : *settings->advanced_settings) { |
| advanced_settings.Set(setting.first, setting.second.Clone()); |
| } |
| dict.Set(::printing::kSettingAdvancedSettings, |
| std::move(advanced_settings)); |
| } |
| |
| if (settings->page_range.size() == 2) { |
| base::Value::Dict page_range; |
| page_range.Set(::printing::kSettingPageRangeFrom, |
| static_cast<int>(settings->page_range[0])); |
| page_range.Set(::printing::kSettingPageRangeTo, |
| static_cast<int>(settings->page_range[1])); |
| base::Value::List page_range_list; |
| page_range_list.Append(std::move(page_range)); |
| dict.Set(::printing::kSettingPageRange, std::move(page_range_list)); |
| } |
| |
| base::Value::Dict margins_custom; |
| margins_custom.Set(::printing::kSettingMarginTop, |
| static_cast<int>(settings->margins_custom->margin_top)); |
| margins_custom.Set(::printing::kSettingMarginRight, |
| static_cast<int>(settings->margins_custom->margin_right)); |
| margins_custom.Set(::printing::kSettingMarginLeft, |
| static_cast<int>(settings->margins_custom->margin_left)); |
| margins_custom.Set(::printing::kSettingMarginBottom, |
| static_cast<int>(settings->margins_custom->margin_bottom)); |
| dict.Set(::printing::kSettingMarginsCustom, std::move(margins_custom)); |
| |
| base::Value::Dict media_size; |
| media_size.Set(::printing::kSettingMediaSizeHeightMicrons, |
| static_cast<int>(settings->media_size->height_microns)); |
| media_size.Set(::printing::kSettingMediaSizeWidthMicrons, |
| static_cast<int>(settings->media_size->width_microns)); |
| media_size.Set( |
| ::printing::kSettingsImageableAreaLeftMicrons, |
| static_cast<int>(settings->media_size->imageable_area_left_microns)); |
| media_size.Set( |
| ::printing::kSettingsImageableAreaTopMicrons, |
| static_cast<int>(settings->media_size->imageable_area_top_microns)); |
| media_size.Set( |
| ::printing::kSettingsImageableAreaRightMicrons, |
| static_cast<int>(settings->media_size->imageable_area_right_microns)); |
| media_size.Set( |
| ::printing::kSettingsImageableAreaBottomMicrons, |
| static_cast<int>(settings->media_size->imageable_area_bottom_microns)); |
| if (settings->media_size->vendor_id) { |
| media_size.Set(::printing::kSettingMediaSizeVendorId, |
| *settings->media_size->vendor_id); |
| } |
| if (settings->media_size->is_default) { |
| media_size.Set(::printing::kSettingMediaSizeIsDefault, |
| *settings->media_size->is_default); |
| } |
| dict.Set(::printing::kSettingMediaSize, std::move(media_size)); |
| |
| return dict; |
| } |
| |
| } // namespace chromeos |