diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-07-16 11:45:35 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-07-17 08:59:23 +0000 |
commit | 552906b0f222c5d5dd11b9fd73829d510980461a (patch) | |
tree | 3a11e6ed0538a81dd83b20cf3a4783e297f26d91 /chromium/printing | |
parent | 1b05827804eaf047779b597718c03e7d38344261 (diff) | |
download | qtwebengine-chromium-552906b0f222c5d5dd11b9fd73829d510980461a.tar.gz |
BASELINE: Update Chromium to 83.0.4103.122
Change-Id: Ie3a82f5bb0076eec2a7c6a6162326b4301ee291e
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/printing')
80 files changed, 5527 insertions, 976 deletions
diff --git a/chromium/printing/BUILD.gn b/chromium/printing/BUILD.gn index 2b303d036cd..9b19b2d53eb 100644 --- a/chromium/printing/BUILD.gn +++ b/chromium/printing/BUILD.gn @@ -14,6 +14,15 @@ if (is_mac) { if (is_android) { import("//build/config/android/rules.gni") } +if (use_cups && is_chromeos) { + import("//printing/backend/tools/code_generator.gni") +} + +# Reset sources_assignment_filter for the BUILD.gn file to prevent +# regression during the migration of Chromium away from the feature. +# See docs/no_sources_assignment_filter.md for more information. +# TODO(crbug.com/1018739): remove this when migration is done. +set_sources_assignment_filter([]) if ((enable_basic_printing && is_win) || enable_print_preview) { # Windows basic printing or print preview requires pdf enabled. @@ -25,26 +34,17 @@ if ((enable_basic_printing && is_win) || enable_print_preview) { # Several targets want to include this header file. We separate it out # here so multiple targets can depend on it. source_set("printing_export") { - sources = [ - "printing_export.h", - ] + sources = [ "printing_export.h" ] } -attributes_path = "backend/tools/ipp-registrations-2.csv" -ipp_handler_map_path = "$target_gen_dir/backend/ipp_handler_map.cc" +if (use_cups && is_chromeos) { + ipp_handler_map_path = "$target_gen_dir/backend/ipp_handler_map.cc" -action("ipp_code_generate") { - script = "backend/tools/code_generator.py" - inputs = [ - attributes_path, - ] - outputs = [ - ipp_handler_map_path, - ] - args = [ - "--attributes-file=" + rebase_path(attributes_path, root_build_dir), - "--ipp-handler-map=" + rebase_path(ipp_handler_map_path, root_build_dir), - ] + ipp_code_generate("ipp_handlers_generate") { + outputs = [ ipp_handler_map_path ] + args = [ "--ipp-handler-map=" + + rebase_path(ipp_handler_map_path, root_build_dir) ] + } } component("printing") { @@ -54,10 +54,6 @@ component("printing") { "backend/print_backend_consts.cc", "backend/print_backend_consts.h", "backend/print_backend_dummy.cc", - "backend/printing_info_win.cc", - "backend/printing_info_win.h", - "emf_win.cc", - "emf_win.h", "metafile.cc", "metafile.h", "metafile_skia.cc", @@ -72,8 +68,6 @@ component("printing") { "page_setup.cc", "page_setup.h", "page_size_margins.h", - "pdf_metafile_cg_mac.cc", - "pdf_metafile_cg_mac.h", "pdf_render_settings.h", "print_dialog_gtk_interface.h", "print_job_constants.cc", @@ -82,16 +76,12 @@ component("printing") { "print_settings.h", "print_settings_conversion.cc", "print_settings_conversion.h", - "print_settings_initializer_mac.cc", - "print_settings_initializer_mac.h", - "print_settings_initializer_win.cc", - "print_settings_initializer_win.h", "printed_document.cc", "printed_document.h", - "printed_document_mac.cc", - "printed_document_win.cc", "printing_context.cc", "printing_context.h", + "printing_features.cc", + "printing_features.h", "printing_utils.cc", "printing_utils.h", "pwg_raster_settings.h", @@ -103,11 +93,8 @@ component("printing") { cflags = [] defines = [ "PRINTING_IMPLEMENTATION" ] - public_deps = [ - "//printing/buildflags", - ] + public_deps = [ "//printing/buildflags" ] deps = [ - ":ipp_code_generate", ":printing_export", "//base", "//base:i18n", @@ -116,25 +103,63 @@ component("printing") { "//printing/common", "//skia", "//third_party/icu", + "//ui/accessibility", "//ui/gfx", "//ui/gfx/geometry", "//url", ] - if (use_aura) { - deps += [ "//ui/aura" ] + if (is_android) { + sources += [ + "printed_document_android.cc", + "printing_context_android.cc", + "printing_context_android.h", + ] + + deps += [ + ":printing_jni_headers", + "//ui/android", + ] + } + + if (is_chromeos) { + defines += [ "PRINT_BACKEND_AVAILABLE" ] + + sources += [ + "backend/print_backend_chromeos.cc", + "backend/printing_restrictions.cc", + "backend/printing_restrictions.h", + "printed_document_chromeos.cc", + "printing_context_no_system_dialog.cc", + "printing_context_no_system_dialog.h", + ] + } + + if (is_desktop_linux) { + sources += [ + "printed_document_linux.cc", + "printing_context_linux.cc", + "printing_context_linux.h", + ] } if (is_mac) { + sources += [ + "pdf_metafile_cg_mac.cc", + "pdf_metafile_cg_mac.h", + "print_settings_initializer_mac.cc", + "print_settings_initializer_mac.h", + ] + # Mac-Aura does not support printing. - if (use_aura) { - sources -= [ "printed_document_mac.cc" ] - } else { + if (!use_aura) { sources += [ + "printed_document_mac.cc", "printing_context_mac.h", "printing_context_mac.mm", ] } + libs = [ "AppKit.framework", "QuartzCore.framework", @@ -150,8 +175,15 @@ component("printing") { defines += [ "PRINT_BACKEND_AVAILABLE" ] sources += [ "backend/print_backend_win.cc", + "backend/printing_info_win.cc", + "backend/printing_info_win.h", "backend/win_helper.cc", "backend/win_helper.h", + "emf_win.cc", + "emf_win.h", + "print_settings_initializer_win.cc", + "print_settings_initializer_win.h", + "printed_document_win.cc", "printed_page_win.cc", "printed_page_win.h", "printing_context_system_dialog_win.cc", @@ -161,34 +193,23 @@ component("printing") { ] } - if (is_android) { - deps += [ "//ui/android" ] + if (use_aura) { + deps += [ "//ui/aura" ] } if (use_cups) { configs += [ ":cups" ] if (is_linux) { - cflags += [ - # CUPS 1.6 deprecated the PPD APIs, but we will stay with this - # API for now as supported Linux and Mac OS'es are still using - # older versions of CUPS. More info: crbug.com/226176 - "-Wno-deprecated-declarations", - # CUPS 1.7 deprecates httpConnectEncrypt(), see the mac section - # below. - ] + # CUPS 1.6 deprecated the PPD APIs, but we will stay with this API + # for now as the suitability of the replacement is unclear. + # More info: crbug.com/226176 + cflags += [ "-Wno-deprecated-declarations" ] } if (is_mac) { - # The 10.9 SDK includes cups 1.7, which deprecates - # httpConnectEncrypt() in favor of httpConnect2(). hhttpConnect2() - # is new in 1.7, so it doesn't exist on OS X 10.6-10.8 and we - # can't use it until 10.9 is our minimum system version. - # (cups_version isn't reliable on OS X, so key the check off of - # mac_sdk). - # With a 10.8 deployment target, several other APIs are deprecated. - # We're still on CUPS 1.4 until Linux no longer needs to support it, see - # comment above. + # CUPS 1.6 deprecated the PPD APIs. We need to evaluate the + # effect of migrating Mac. More info: crbug.com/226176 cflags += [ "-Wno-deprecated-declarations" ] } @@ -196,7 +217,7 @@ component("printing") { # of the print backend and enables a custom implementation instead. defines += [ "PRINT_BACKEND_AVAILABLE" ] - if (is_chromeos) { + if (is_chromeos || is_mac) { sources += [ "backend/cups_connection.cc", "backend/cups_connection.h", @@ -204,22 +225,33 @@ component("printing") { "backend/cups_deleters.h", "backend/cups_ipp_constants.cc", "backend/cups_ipp_constants.h", - "backend/cups_ipp_util.cc", - "backend/cups_ipp_util.h", + "backend/cups_ipp_helper.cc", + "backend/cups_ipp_helper.h", + "backend/cups_ipp_utils.cc", + "backend/cups_ipp_utils.h", "backend/cups_jobs.cc", "backend/cups_jobs.h", "backend/cups_printer.cc", "backend/cups_printer.h", + "backend/print_backend_cups_ipp.cc", + "backend/print_backend_cups_ipp.h", + ] + } + + if (is_chromeos) { + deps += [ ":ipp_handlers_generate" ] + + sources += [ "backend/ipp_handler_map.h", "backend/ipp_handlers.cc", "backend/ipp_handlers.h", - "backend/print_backend_cups_ipp.cc", - "backend/print_backend_cups_ipp.h", "printing_context_chromeos.cc", "printing_context_chromeos.h", ipp_handler_map_path, ] } else { + # TODO(crbug.com/1062136): Remove the original CUPS backend for macOS + # when Cloud Print support is terminated. Follow up after Jan 1, 2021. sources += [ "backend/cups_helper.cc", "backend/cups_helper.h", @@ -232,40 +264,18 @@ component("printing") { sources += [ "backend/cups_ipp_constants.cc", "backend/cups_ipp_constants.h", - "backend/cups_ipp_util.cc", - "backend/cups_ipp_util.h", + "backend/cups_ipp_helper.cc", + "backend/cups_ipp_helper.h", ] } } } - if (is_chromeos) { - defines += [ "PRINT_BACKEND_AVAILABLE" ] - - sources += [ - "backend/print_backend_chromeos.cc", - "backend/printing_restrictions.cc", - "backend/printing_restrictions.h", - "printed_document_chromeos.cc", - "printer_query_result_chromeos.h", - "printing_context_no_system_dialog.cc", - "printing_context_no_system_dialog.h", - "printing_features_chromeos.cc", - "printing_features_chromeos.h", - ] - } else if (is_android) { - sources += [ - "printed_document_android.cc", - "printing_context_android.cc", - "printing_context_android.h", - ] - - deps += [ ":printing_jni_headers" ] - } else if (is_linux) { # Desktop Linux. + if (is_chromeos || is_mac) { sources += [ - "printed_document_linux.cc", - "printing_context_linux.cc", - "printing_context_linux.h", + "printer_query_result.h", + "printer_status.cc", + "printer_status.h", ] } } @@ -277,14 +287,7 @@ static_library("test_support") { "backend/test_print_backend.h", "image.cc", "image.h", - "image_android.cc", - "image_linux.cc", - "image_mac.cc", - "image_win.cc", ] - if (is_fuchsia) { - sources += [ "image_fuchsia.cc" ] - } configs += [ "//build/config/compiler:noshadowing" ] public_deps = [ @@ -296,19 +299,32 @@ static_library("test_support") { "//skia", "//ui/gfx", ] + + if (is_android) { + sources += [ "image_android.cc" ] + } + if (is_fuchsia) { + sources += [ "image_fuchsia.cc" ] + } + if (is_linux) { + sources += [ "image_linux.cc" ] + } + if (is_mac) { + sources += [ "image_mac.cc" ] + } + if (is_win) { + sources += [ "image_win.cc" ] + } } test("printing_unittests") { sources = [ - "emf_win_unittest.cc", "metafile_skia_unittest.cc", "nup_parameters_unittest.cc", "page_number_unittest.cc", "page_range_unittest.cc", "page_setup_unittest.cc", - "pdf_metafile_cg_mac_unittest.cc", "print_settings_conversion_unittest.cc", - "printing_context_win_unittest.cc", "printing_test.h", "printing_utils_unittest.cc", "units_unittest.cc", @@ -328,27 +344,41 @@ test("printing_unittests") { "//ui/gfx/geometry", ] - if (is_win || is_mac) { - sources += [ "printed_document_unittest.cc" ] + if (is_mac) { + sources += [ "pdf_metafile_cg_mac_unittest.cc" ] + + data = [ + "test/data/pdf_cg/", + "../pdf/test/data/", + ] } if (is_win) { - sources += [ "printed_page_win_unittest.cc" ] + sources += [ + "emf_win_unittest.cc", + "printed_page_win_unittest.cc", + "printing_context_win_unittest.cc", + ] + + data = [ "test/data/emf/" ] + } + + if (is_win || is_mac) { + sources += [ "printed_document_unittest.cc" ] } if (use_cups) { configs += [ ":cups" ] - if (is_chromeos) { - sources += [ "backend/cups_ipp_util_unittest.cc" ] - } else { - sources += [ "backend/cups_helper_unittest.cc" ] - if (is_linux) { - sources += [ "backend/print_backend_cups_linux_unittest.cc" ] - } - if (is_mac) { - sources += [ "backend/print_backend_cups_mac_unittest.cc" ] - } + if (is_chromeos || is_mac) { + sources += [ "backend/cups_ipp_helper_unittest.cc" ] + } + + if (!is_chromeos) { + sources += [ + "backend/cups_helper_unittest.cc", + "backend/print_backend_cups_unittest.cc", + ] } } } @@ -379,9 +409,7 @@ if (use_cups) { if (is_android) { generate_jni("printing_jni_headers") { - sources = [ - "android/java/src/org/chromium/printing/PrintingContext.java", - ] + sources = [ "android/java/src/org/chromium/printing/PrintingContext.java" ] } android_library("printing_java") { @@ -390,7 +418,7 @@ if (is_android) { "//base:jni_java", "//ui/android:ui_java", ] - java_files = [ + sources = [ "android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java", "android/java/src/org/chromium/printing/PrintManagerDelegate.java", "android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java", diff --git a/chromium/printing/DEPS b/chromium/printing/DEPS index 41732d72750..71708c22400 100644 --- a/chromium/printing/DEPS +++ b/chromium/printing/DEPS @@ -5,6 +5,7 @@ include_rules = [ "+third_party/icu/source/common/unicode", "+third_party/icu/source/i18n/unicode", "+third_party/skia", + "+ui/accessibility", "+ui/android", "+ui/aura", "+ui/base/resource", diff --git a/chromium/printing/backend/cups_connection.cc b/chromium/printing/backend/cups_connection.cc index 79dd875d008..dc16e06faec 100644 --- a/chromium/printing/backend/cups_connection.cc +++ b/chromium/printing/backend/cups_connection.cc @@ -106,12 +106,17 @@ std::vector<CupsPrinter> CupsConnection::GetDests() { return std::vector<CupsPrinter>(); } + // On macOS, AirPrint destinations show up even if they're not added to the + // system, and their capabilities cannot be read in that situation + // (crbug.com/1027834). Therefore, only show discovered destinations that have + // been added locally. Also exclude fax and scanner devices. + constexpr cups_ptype_t kMask = + CUPS_PRINTER_FAX | CUPS_PRINTER_SCANNER | CUPS_PRINTER_DISCOVERED; DestinationEnumerator enumerator; - int success = + const int success = cupsEnumDests(CUPS_DEST_FLAGS_NONE, kTimeoutMs, - nullptr, // no cancel signal - 0, // all the printers - CUPS_PRINTER_SCANNER, // except the scanners + /*cancel=*/nullptr, + /*type=*/CUPS_PRINTER_LOCAL, kMask, &DestinationEnumerator::cups_callback, &enumerator); if (!success) { diff --git a/chromium/printing/backend/cups_connection.h b/chromium/printing/backend/cups_connection.h index 6d7f766c6ff..bf0e616ecd6 100644 --- a/chromium/printing/backend/cups_connection.h +++ b/chromium/printing/backend/cups_connection.h @@ -16,6 +16,7 @@ #include "printing/backend/cups_deleters.h" #include "printing/backend/cups_jobs.h" #include "printing/backend/cups_printer.h" +#include "printing/printer_status.h" #include "printing/printing_export.h" #include "url/gurl.h" diff --git a/chromium/printing/backend/cups_helper.cc b/chromium/printing/backend/cups_helper.cc index 978820a9a2f..fcc0534d1cd 100644 --- a/chromium/printing/backend/cups_helper.cc +++ b/chromium/printing/backend/cups_helper.cc @@ -17,9 +17,11 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" +#include "base/time/time.h" #include "base/values.h" #include "printing/backend/print_backend.h" #include "printing/backend/print_backend_consts.h" +#include "printing/printing_utils.h" #include "printing/units.h" #include "url/gurl.h" @@ -30,13 +32,30 @@ namespace printing { // This section contains helper code for PPD parsing for semantic capabilities. namespace { -const char kColorDevice[] = "ColorDevice"; -const char kColorModel[] = "ColorModel"; -const char kColorMode[] = "ColorMode"; -const char kProcessColorModel[] = "ProcessColorModel"; -const char kPrintoutMode[] = "PrintoutMode"; -const char kDraftGray[] = "Draft.Gray"; -const char kHighGray[] = "High.Gray"; +// Function availability can be tested by checking whether its address is not +// nullptr. Weak symbols remove the need for platform specific build flags and +// allow for appropriate CUPS usage on platforms with non-uniform version +// support, namely Linux. +#define WEAK_CUPS_FN(x) extern "C" __attribute__((weak)) decltype(x) x + +WEAK_CUPS_FN(httpConnect2); + +// Timeout for establishing a CUPS connection. It is expected that cupsd is +// able to start and respond on all systems within this duration. +constexpr base::TimeDelta kCupsTimeout = base::TimeDelta::FromSeconds(5); + +// CUPS default max copies value (taken from default cupsMaxCopies parsing in +// cups/ppd-cache.c). +constexpr int32_t kDefaultMaxCopies = 9999; + +constexpr char kColorDevice[] = "ColorDevice"; +constexpr char kColorModel[] = "ColorModel"; +constexpr char kColorMode[] = "ColorMode"; +constexpr char kInk[] = "Ink"; +constexpr char kProcessColorModel[] = "ProcessColorModel"; +constexpr char kPrintoutMode[] = "PrintoutMode"; +constexpr char kDraftGray[] = "Draft.Gray"; +constexpr char kHighGray[] = "High.Gray"; constexpr char kDuplex[] = "Duplex"; constexpr char kDuplexNone[] = "None"; @@ -49,10 +68,25 @@ constexpr char kBrotherDuplex[] = "BRDuplex"; constexpr char kBrotherMonoColor[] = "BRMonoColor"; constexpr char kBrotherPrintQuality[] = "BRPrintQuality"; +// HP printer specific options. +constexpr char kHpColorMode[] = "HPColorMode"; +constexpr char kHpColorPrint[] = "ColorPrint"; +constexpr char kHpGrayscalePrint[] = "GrayscalePrint"; + // Samsung printer specific options. constexpr char kSamsungColorTrue[] = "True"; constexpr char kSamsungColorFalse[] = "False"; +// Sharp printer specific options. +constexpr char kSharpARCMode[] = "ARCMode"; +constexpr char kSharpCMColor[] = "CMColor"; +constexpr char kSharpCMBW[] = "CMBW"; + +// Xerox printer specific options. +constexpr char kXeroxXRXColor[] = "XRXColor"; +constexpr char kXeroxAutomatic[] = "Automatic"; +constexpr char kXeroxBW[] = "BW"; + void ParseLpOptions(const base::FilePath& filepath, base::StringPiece printer_name, int* num_options, @@ -317,7 +351,7 @@ bool GetHPColorSettings(ppd_file_t* ppd, ColorModel* color_model_for_black, ColorModel* color_model_for_color, bool* color_is_default) { - // HP printers use "Color/Color Model" attribute in their PPDs. + // Some HP printers use "Color/Color Model" attribute in their PPDs. ppd_option_t* color_mode_option = ppdFindOption(ppd, kColor); if (!color_mode_option) return false; @@ -338,6 +372,114 @@ bool GetHPColorSettings(ppd_file_t* ppd, return true; } +bool GetHPColorModeSettings(ppd_file_t* ppd, + ColorModel* color_model_for_black, + ColorModel* color_model_for_color, + bool* color_is_default) { + // Some HP printers use "HPColorMode/Mode" attribute in their PPDs. + ppd_option_t* color_mode_option = ppdFindOption(ppd, kHpColorMode); + if (!color_mode_option) + return false; + + if (ppdFindChoice(color_mode_option, kHpColorPrint)) + *color_model_for_color = HP_COLOR_COLOR; + if (ppdFindChoice(color_mode_option, kHpGrayscalePrint)) + *color_model_for_black = HP_COLOR_BLACK; + + ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kHpColorMode); + if (!mode_choice) { + mode_choice = + ppdFindChoice(color_mode_option, color_mode_option->defchoice); + } + if (mode_choice) { + *color_is_default = + EqualsCaseInsensitiveASCII(mode_choice->choice, kHpColorPrint); + } + return true; +} + +bool GetEpsonInkSettings(ppd_file_t* ppd, + ColorModel* color_model_for_black, + ColorModel* color_model_for_color, + bool* color_is_default) { + // Epson printers use "Ink" attribute in their PPDs. + ppd_option_t* color_mode_option = ppdFindOption(ppd, kInk); + if (!color_mode_option) + return false; + + if (ppdFindChoice(color_mode_option, kColor)) + *color_model_for_color = EPSON_INK_COLOR; + if (ppdFindChoice(color_mode_option, kMono)) + *color_model_for_black = EPSON_INK_MONO; + + ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kInk); + if (!mode_choice) { + mode_choice = + ppdFindChoice(color_mode_option, color_mode_option->defchoice); + } + + if (mode_choice) { + *color_is_default = EqualsCaseInsensitiveASCII(mode_choice->choice, kColor); + } + return true; +} + +bool GetSharpARCModeSettings(ppd_file_t* ppd, + ColorModel* color_model_for_black, + ColorModel* color_model_for_color, + bool* color_is_default) { + // Sharp printers use "ARCMode" attribute in their PPDs. + ppd_option_t* color_mode_option = ppdFindOption(ppd, kSharpARCMode); + if (!color_mode_option) + return false; + + if (ppdFindChoice(color_mode_option, kSharpCMColor)) + *color_model_for_color = SHARP_ARCMODE_CMCOLOR; + if (ppdFindChoice(color_mode_option, kSharpCMBW)) + *color_model_for_black = SHARP_ARCMODE_CMBW; + + ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kSharpARCMode); + if (!mode_choice) { + mode_choice = + ppdFindChoice(color_mode_option, color_mode_option->defchoice); + } + + if (mode_choice) { + // Many Sharp printers use "CMAuto" as the default color mode. + *color_is_default = + !EqualsCaseInsensitiveASCII(mode_choice->choice, kSharpCMBW); + } + return true; +} + +bool GetXeroxColorSettings(ppd_file_t* ppd, + ColorModel* color_model_for_black, + ColorModel* color_model_for_color, + bool* color_is_default) { + // Some Xerox printers use "XRXColor" attribute in their PPDs. + ppd_option_t* color_mode_option = ppdFindOption(ppd, kXeroxXRXColor); + if (!color_mode_option) + return false; + + if (ppdFindChoice(color_mode_option, kXeroxAutomatic)) + *color_model_for_color = XEROX_XRXCOLOR_AUTOMATIC; + if (ppdFindChoice(color_mode_option, kXeroxBW)) + *color_model_for_black = XEROX_XRXCOLOR_BW; + + ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kXeroxXRXColor); + if (!mode_choice) { + mode_choice = + ppdFindChoice(color_mode_option, color_mode_option->defchoice); + } + + if (mode_choice) { + // Many Xerox printers use "Automatic" as the default color mode. + *color_is_default = + !EqualsCaseInsensitiveASCII(mode_choice->choice, kXeroxBW); + } + return true; +} + bool GetProcessColorModelSettings(ppd_file_t* ppd, ColorModel* color_model_for_black, ColorModel* color_model_for_color, @@ -383,7 +525,11 @@ bool GetColorModelSettings(ppd_file_t* ppd, GetPrintOutModeColorSettings(ppd, cm_black, cm_color, is_color) || GetColorModeSettings(ppd, cm_black, cm_color, is_color) || GetHPColorSettings(ppd, cm_black, cm_color, is_color) || + GetHPColorModeSettings(ppd, cm_black, cm_color, is_color) || GetBrotherColorSettings(ppd, cm_black, cm_color, is_color) || + GetEpsonInkSettings(ppd, cm_black, cm_color, is_color) || + GetSharpARCModeSettings(ppd, cm_black, cm_color, is_color) || + GetXeroxColorSettings(ppd, cm_black, cm_color, is_color) || GetProcessColorModelSettings(ppd, cm_black, cm_color, is_color); } @@ -395,7 +541,8 @@ const int kDefaultIPPServerPort = 631; // Helper wrapper around http_t structure, with connection and cleanup // functionality. HttpConnectionCUPS::HttpConnectionCUPS(const GURL& print_server_url, - http_encryption_t encryption) + http_encryption_t encryption, + bool blocking) : http_(nullptr) { // If we have an empty url, use default print server. if (print_server_url.is_empty()) @@ -405,11 +552,26 @@ HttpConnectionCUPS::HttpConnectionCUPS(const GURL& print_server_url, if (port == url::PORT_UNSPECIFIED) port = kDefaultIPPServerPort; - http_ = httpConnectEncrypt(print_server_url.host().c_str(), port, encryption); + if (httpConnect2) { + http_ = httpConnect2(print_server_url.host().c_str(), port, + /*addrlist=*/nullptr, AF_UNSPEC, encryption, + blocking ? 1 : 0, kCupsTimeout.InMilliseconds(), + /*cancel=*/nullptr); + } else { + // Continue to use deprecated CUPS calls because because older Linux + // distribution such as RHEL/CentOS 7 are shipped with CUPS 1.6. + http_ = + httpConnectEncrypt(print_server_url.host().c_str(), port, encryption); + } + if (!http_) { LOG(ERROR) << "CP_CUPS: Failed connecting to print server: " << print_server_url; + return; } + + if (!httpConnect2) + httpBlocking(http_, blocking ? 1 : 0); } HttpConnectionCUPS::~HttpConnectionCUPS() { @@ -417,15 +579,12 @@ HttpConnectionCUPS::~HttpConnectionCUPS() { httpClose(http_); } -void HttpConnectionCUPS::SetBlocking(bool blocking) { - httpBlocking(http_, blocking ? 1 : 0); -} - http_t* HttpConnectionCUPS::http() { return http_; } bool ParsePpdCapabilities(base::StringPiece printer_name, + base::StringPiece locale, base::StringPiece printer_capabilities, PrinterSemanticCapsAndDefaults* printer_info) { base::FilePath ppd_file_path; @@ -453,7 +612,8 @@ bool ParsePpdCapabilities(base::StringPiece printer_name, PrinterSemanticCapsAndDefaults caps; caps.collate_capable = true; caps.collate_default = true; - caps.copies_capable = true; + // TODO(crbug.com/1027830): Parse PPD for cupsMaxCopies value. + caps.copies_max = kDefaultMaxCopies; GetDuplexSettings(ppd, &caps.duplex_modes, &caps.duplex_default); @@ -474,11 +634,12 @@ bool ParsePpdCapabilities(base::StringPiece printer_name, if (ppd->num_sizes > 0 && ppd->sizes) { VLOG(1) << "Paper list size - " << ppd->num_sizes; ppd_option_t* paper_option = ppdFindOption(ppd, kPageSize); + bool is_default_found = false; for (int i = 0; i < ppd->num_sizes; ++i) { gfx::Size paper_size_microns( ConvertUnit(ppd->sizes[i].width, kPointsPerInch, kMicronsPerInch), ConvertUnit(ppd->sizes[i].length, kPointsPerInch, kMicronsPerInch)); - if (paper_size_microns.width() > 0 && paper_size_microns.height() > 0) { + if (!paper_size_microns.IsEmpty()) { PrinterSemanticCapsAndDefaults::Paper paper; paper.size_um = paper_size_microns; paper.vendor_id = ppd->sizes[i].name; @@ -492,11 +653,33 @@ bool ParsePpdCapabilities(base::StringPiece printer_name, } } caps.papers.push_back(paper); - if (i == 0 || ppd->sizes[i].marked) { + if (ppd->sizes[i].marked) { caps.default_paper = paper; + is_default_found = true; } } } + if (!is_default_found) { + gfx::Size locale_paper_microns = + GetDefaultPaperSizeFromLocaleMicrons(locale); + for (const PrinterSemanticCapsAndDefaults::Paper& paper : caps.papers) { + // Set epsilon to 500 microns to allow tolerance of rounded paper sizes. + // While the above utility function returns paper sizes in microns, they + // are still rounded to the nearest millimeter (1000 microns). + constexpr int kSizeEpsilon = 500; + if (SizesEqualWithinEpsilon(paper.size_um, locale_paper_microns, + kSizeEpsilon)) { + caps.default_paper = paper; + is_default_found = true; + break; + } + } + + // If no default was set in the PPD or if the locale default is not within + // the printer's capabilities, select the first on the list. + if (!is_default_found) + caps.default_paper = caps.papers[0]; + } } ppdClose(ppd); diff --git a/chromium/printing/backend/cups_helper.h b/chromium/printing/backend/cups_helper.h index b72903ff89d..4a261e26439 100644 --- a/chromium/printing/backend/cups_helper.h +++ b/chromium/printing/backend/cups_helper.h @@ -23,11 +23,10 @@ struct PrinterSemanticCapsAndDefaults; class PRINTING_EXPORT HttpConnectionCUPS { public: HttpConnectionCUPS(const GURL& print_server_url, - http_encryption_t encryption); + http_encryption_t encryption, + bool blocking); ~HttpConnectionCUPS(); - void SetBlocking(bool blocking); - http_t* http(); private: @@ -38,6 +37,7 @@ class PRINTING_EXPORT HttpConnectionCUPS { // semantic options. PRINTING_EXPORT bool ParsePpdCapabilities( base::StringPiece printer_name, + base::StringPiece locale, base::StringPiece printer_capabilities, PrinterSemanticCapsAndDefaults* printer_info); diff --git a/chromium/printing/backend/cups_helper_unittest.cc b/chromium/printing/backend/cups_helper_unittest.cc index 049a64746d1..995d23cd6b3 100644 --- a/chromium/printing/backend/cups_helper_unittest.cc +++ b/chromium/printing/backend/cups_helper_unittest.cc @@ -3,200 +3,205 @@ // found in the LICENSE file. #include "printing/backend/cups_helper.h" + #include "printing/backend/print_backend.h" +#include "printing/printing_utils.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +namespace printing { + +namespace { + +// Returns true if the papers have the same name, vendor ID, and size. +bool PapersEqual(const PrinterSemanticCapsAndDefaults::Paper& lhs, + const PrinterSemanticCapsAndDefaults::Paper& rhs) { + return lhs.display_name == rhs.display_name && + lhs.vendor_id == rhs.vendor_id && lhs.size_um == rhs.size_um; +} + +} // namespace + TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexShortEdge) { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*OpenGroup: General/General\n\n" - "*OpenUI *ColorModel/Color Model: PickOne\n" - "*DefaultColorModel: Gray\n" - "*ColorModel Gray/Grayscale: \"" - "<</cupsColorSpace 0/cupsColorOrder 0>>" - "setpagedevice\"\n" - "*ColorModel Black/Inverted Grayscale: \"" - "<</cupsColorSpace 3/cupsColorOrder 0>>" - "setpagedevice\"\n" - "*CloseUI: *ColorModel\n" - "*OpenUI *Duplex/2-Sided Printing: PickOne\n" - "*DefaultDuplex: DuplexTumble\n" - "*Duplex None/Off: \"<</Duplex false>>" - "setpagedevice\"\n" - "*Duplex DuplexNoTumble/LongEdge: \"" - "<</Duplex true/Tumble false>>setpagedevice\"\n" - "*Duplex DuplexTumble/ShortEdge: \"" - "<</Duplex true/Tumble true>>setpagedevice\"\n" - "*CloseUI: *Duplex\n\n" - "*CloseGroup: General\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*OpenGroup: General/General +*OpenUI *ColorModel/Color Model: PickOne +*DefaultColorModel: Gray +*ColorModel Gray/Grayscale: " + <</cupsColorSpace 0/cupsColorOrder 0>>setpagedevice" +*ColorModel Black/Inverted Grayscale: " + <</cupsColorSpace 3/cupsColorOrder 0>>setpagedevice" +*CloseUI: *ColorModel +*OpenUI *Duplex/2-Sided Printing: PickOne +*DefaultDuplex: DuplexTumble +*Duplex None/Off: " + <</Duplex false>>setpagedevice" +*Duplex DuplexNoTumble/LongEdge: " + </Duplex true/Tumble false>>setpagedevice" +*Duplex DuplexTumble/ShortEdge: " + <</Duplex true/Tumble true>>setpagedevice" +*CloseUI: *Duplex +*CloseGroup: General)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_default); - EXPECT_TRUE(caps.copies_capable); - EXPECT_THAT(caps.duplex_modes, testing::UnorderedElementsAre( - printing::SIMPLEX, printing::LONG_EDGE, - printing::SHORT_EDGE)); - EXPECT_EQ(printing::SHORT_EDGE, caps.duplex_default); + EXPECT_GT(caps.copies_max, 1); + EXPECT_THAT(caps.duplex_modes, + testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE)); + EXPECT_EQ(SHORT_EDGE, caps.duplex_default); EXPECT_FALSE(caps.color_changeable); EXPECT_FALSE(caps.color_default); } // Test duplex detection code, which regressed in http://crbug.com/103999. TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexSimples) { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*OpenGroup: General/General\n\n" - "*OpenUI *Duplex/Double-Sided Printing: PickOne\n" - "*DefaultDuplex: None\n" - "*Duplex None/Off: " - "\"<</Duplex false>>setpagedevice\"\n" - "*Duplex DuplexNoTumble/Long Edge (Standard): " - "\"<</Duplex true/Tumble false>>setpagedevice\"\n" - "*Duplex DuplexTumble/Short Edge (Flip): " - "\"<</Duplex true/Tumble true>>setpagedevice\"\n" - "*CloseUI: *Duplex\n\n" - "*CloseGroup: General\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*OpenGroup: General/General +*OpenUI *Duplex/Double-Sided Printing: PickOne +*DefaultDuplex: None +*Duplex None/Off: " + <</Duplex false>>setpagedevice" +*Duplex DuplexNoTumble/Long Edge (Standard): " + <</Duplex true/Tumble false>>setpagedevice" +*Duplex DuplexTumble/Short Edge (Flip): " + <</Duplex true/Tumble true>>setpagedevice" +*CloseUI: *Duplex +*CloseGroup: General)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_default); - EXPECT_TRUE(caps.copies_capable); - EXPECT_THAT(caps.duplex_modes, testing::UnorderedElementsAre( - printing::SIMPLEX, printing::LONG_EDGE, - printing::SHORT_EDGE)); - EXPECT_EQ(printing::SIMPLEX, caps.duplex_default); + EXPECT_GT(caps.copies_max, 1); + EXPECT_THAT(caps.duplex_modes, + testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE)); + EXPECT_EQ(SIMPLEX, caps.duplex_default); EXPECT_FALSE(caps.color_changeable); EXPECT_FALSE(caps.color_default); } TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorNoDuplex) { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*OpenGroup: General/General\n\n" - "*OpenUI *ColorModel/Color Model: PickOne\n" - "*DefaultColorModel: Gray\n" - "*ColorModel Gray/Grayscale: \"" - "<</cupsColorSpace 0/cupsColorOrder 0>>" - "setpagedevice\"\n" - "*ColorModel Black/Inverted Grayscale: \"" - "<</cupsColorSpace 3/cupsColorOrder 0>>" - "setpagedevice\"\n" - "*CloseUI: *ColorModel\n" - "*CloseGroup: General\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*OpenGroup: General/General +*OpenUI *ColorModel/Color Model: PickOne +*DefaultColorModel: Gray +*ColorModel Gray/Grayscale: " + <</cupsColorSpace 0/cupsColorOrder 0>>setpagedevice" +*ColorModel Black/Inverted Grayscale: " + <</cupsColorSpace 3/cupsColorOrder 0>>setpagedevice" +*CloseUI: *ColorModel +*CloseGroup: General)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_default); - EXPECT_TRUE(caps.copies_capable); + EXPECT_GT(caps.copies_max, 1); EXPECT_THAT(caps.duplex_modes, testing::UnorderedElementsAre()); - EXPECT_EQ(printing::UNKNOWN_DUPLEX_MODE, caps.duplex_default); + EXPECT_EQ(UNKNOWN_DUPLEX_MODE, caps.duplex_default); EXPECT_FALSE(caps.color_changeable); EXPECT_FALSE(caps.color_default); } TEST(PrintBackendCupsHelperTest, TestPpdParsingColorTrueDuplexShortEdge) { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*ColorDevice: True\n" - "*DefaultColorSpace: CMYK\n\n" - "*OpenGroup: General/General\n\n" - "*OpenUI *ColorModel/Color Model: PickOne\n" - "*DefaultColorModel: CMYK\n" - "*ColorModel CMYK/Color: " - "\"(cmyk) RCsetdevicecolor\"\n" - "*ColorModel Gray/Black and White: " - "\"(gray) RCsetdevicecolor\"\n" - "*CloseUI: *ColorModel\n" - "*OpenUI *Duplex/2-Sided Printing: PickOne\n" - "*DefaultDuplex: DuplexTumble\n" - "*Duplex None/Off: \"<</Duplex false>>" - "setpagedevice\"\n" - "*Duplex DuplexNoTumble/LongEdge: \"" - "<</Duplex true/Tumble false>>setpagedevice\"\n" - "*Duplex DuplexTumble/ShortEdge: \"" - "<</Duplex true/Tumble true>>setpagedevice\"\n" - "*CloseUI: *Duplex\n\n" - "*CloseGroup: General\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*DefaultColorSpace: CMYK +*OpenGroup: General/General +*OpenUI *ColorModel/Color Model: PickOne +*DefaultColorModel: CMYK +*ColorModel CMYK/Color: "(cmyk) RCsetdevicecolor" +*ColorModel Gray/Black and White: "(gray) RCsetdevicecolor" +*CloseUI: *ColorModel +*OpenUI *Duplex/2-Sided Printing: PickOne +*DefaultDuplex: DuplexTumble +*Duplex None/Off: " + <</Duplex false>>setpagedevice" +*Duplex DuplexNoTumble/LongEdge: " + <</Duplex true/Tumble false>>setpagedevice" +*Duplex DuplexTumble/ShortEdge: " + <</Duplex true/Tumble true>>setpagedevice" +*CloseUI: *Duplex +*CloseGroup: General)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_default); - EXPECT_TRUE(caps.copies_capable); - EXPECT_THAT(caps.duplex_modes, testing::UnorderedElementsAre( - printing::SIMPLEX, printing::LONG_EDGE, - printing::SHORT_EDGE)); - EXPECT_EQ(printing::SHORT_EDGE, caps.duplex_default); + EXPECT_GT(caps.copies_max, 1); + EXPECT_THAT(caps.duplex_modes, + testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE)); + EXPECT_EQ(SHORT_EDGE, caps.duplex_default); EXPECT_TRUE(caps.color_changeable); EXPECT_TRUE(caps.color_default); } TEST(PrintBackendCupsHelperTest, TestPpdParsingColorFalseDuplexLongEdge) { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*ColorDevice: True\n" - "*DefaultColorSpace: CMYK\n\n" - "*OpenGroup: General/General\n\n" - "*OpenUI *ColorModel/Color Model: PickOne\n" - "*DefaultColorModel: Grayscale\n" - "*ColorModel Color/Color: " - "\"%% FoomaticRIPOptionSetting: ColorModel=Color\"\n" - "*FoomaticRIPOptionSetting ColorModel=Color: " - "\"JCLDatamode=Color GSCmdLine=Color\"\n" - "*ColorModel Grayscale/Grayscale: " - "\"%% FoomaticRIPOptionSetting: ColorModel=Grayscale\"\n" - "*FoomaticRIPOptionSetting ColorModel=Grayscale: " - "\"JCLDatamode=Grayscale GSCmdLine=Grayscale\"\n" - "*CloseUI: *ColorModel\n" - "*OpenUI *Duplex/2-Sided Printing: PickOne\n" - "*DefaultDuplex: DuplexNoTumble\n" - "*Duplex None/Off: \"<</Duplex false>>" - "setpagedevice\"\n" - "*Duplex DuplexNoTumble/LongEdge: \"" - "<</Duplex true/Tumble false>>setpagedevice\"\n" - "*Duplex DuplexTumble/ShortEdge: \"" - "<</Duplex true/Tumble true>>setpagedevice\"\n" - "*CloseUI: *Duplex\n\n" - "*CloseGroup: General\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*DefaultColorSpace: CMYK +*OpenGroup: General/General +*OpenUI *ColorModel/Color Model: PickOne +*DefaultColorModel: Grayscale +*ColorModel Color/Color: " + %% FoomaticRIPOptionSetting: ColorModel=Color" +*FoomaticRIPOptionSetting ColorModel=Color: " + JCLDatamode=Color GSCmdLine=Color" +*ColorModel Grayscale/Grayscale: " + %% FoomaticRIPOptionSetting: ColorModel=Grayscale" +*FoomaticRIPOptionSetting ColorModel=Grayscale: " + JCLDatamode=Grayscale GSCmdLine=Grayscale" +*CloseUI: *ColorModel +*OpenUI *Duplex/2-Sided Printing: PickOne +*DefaultDuplex: DuplexNoTumble +*Duplex None/Off: " + <</Duplex false>>setpagedevice" +*Duplex DuplexNoTumble/LongEdge: " + <</Duplex true/Tumble false>>setpagedevice" +*Duplex DuplexTumble/ShortEdge: " + <</Duplex true/Tumble true>>setpagedevice" +*CloseUI: *Duplex +*CloseGroup: General)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_default); - EXPECT_TRUE(caps.copies_capable); - EXPECT_THAT(caps.duplex_modes, testing::UnorderedElementsAre( - printing::SIMPLEX, printing::LONG_EDGE, - printing::SHORT_EDGE)); - EXPECT_EQ(printing::LONG_EDGE, caps.duplex_default); + EXPECT_GT(caps.copies_max, 1); + EXPECT_THAT(caps.duplex_modes, + testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE)); + EXPECT_EQ(LONG_EDGE, caps.duplex_default); EXPECT_TRUE(caps.color_changeable); EXPECT_FALSE(caps.color_default); } TEST(PrintBackendCupsHelperTest, TestPpdParsingPageSize) { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*OpenUI *PageSize: PickOne\n" - "*DefaultPageSize: Letter\n" - "*PageSize Letter/US Letter: \"" - " <</DeferredMediaSelection true /PageSize [612 792] " - " /ImagingBBox null /MediaClass null >> setpagedevice\"\n" - "*End\n" - "*PageSize Legal/US Legal: \"" - " <</DeferredMediaSelection true /PageSize [612 1008] " - " /ImagingBBox null /MediaClass null >> setpagedevice\"\n" - "*End\n" - "*DefaultPaperDimension: Letter\n" - "*PaperDimension Letter/US Letter: \"612 792\"\n" - "*PaperDimension Legal/US Legal: \"612 1008\"\n\n" - "*CloseUI: *PageSize\n\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*OpenUI *PageSize: PickOne +*DefaultPageSize: Legal +*PageSize Letter/US Letter: " + <</DeferredMediaSelection true /PageSize [612 792] + /ImagingBBox null /MediaClass null >> setpagedevice" +*End +*PageSize Legal/US Legal: " + <</DeferredMediaSelection true /PageSize [612 1008] + /ImagingBBox null /MediaClass null >> setpagedevice" +*End +*DefaultPaperDimension: Legal +*PaperDimension Letter/US Letter: "612 792" +*PaperDimension Legal/US Legal: "612 1008" +*CloseUI: *PageSize)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); ASSERT_EQ(2UL, caps.papers.size()); EXPECT_EQ("Letter", caps.papers[0].vendor_id); EXPECT_EQ("US Letter", caps.papers[0].display_name); @@ -206,81 +211,215 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingPageSize) { EXPECT_EQ("US Legal", caps.papers[1].display_name); EXPECT_EQ(215900, caps.papers[1].size_um.width()); EXPECT_EQ(355600, caps.papers[1].size_um.height()); + EXPECT_TRUE(PapersEqual(caps.papers[1], caps.default_paper)); +} + +TEST(PrintBackendCupsHelperTest, TestPpdParsingPageSizeNoDefaultSpecified) { + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*OpenUI *PageSize: PickOne +*PageSize A3/ISO A3: " + << /DeferredMediaSelection true /PageSize [842 1191] + /ImagingBBox null >> setpagedevice" +*End +*PageSize A4/ISO A4: " + << /DeferredMediaSelection true /PageSize [595 842] + /ImagingBBox null >> setpagedevice" +*End +*PageSize Legal/US Legal: " + << /DeferredMediaSelection true /PageSize [612 1008] + /ImagingBBox null >> setpagedevice" +*End +*PageSize Letter/US Letter: " + << /DeferredMediaSelection true /PageSize [612 792] + /ImagingBBox null >> setpagedevice" +*End +*PaperDimension A3/ISO A3: "842 1191" +*PaperDimension A4/ISO A4: "595 842" +*PaperDimension Legal/US Legal: "612 1008" +*PaperDimension Letter/US Letter: "612 792" +*CloseUI: *PageSize)"; + + { + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "en-US", kTestPpdData, &caps)); + ASSERT_EQ(4UL, caps.papers.size()); + EXPECT_EQ("Letter", caps.papers[3].vendor_id); + EXPECT_EQ("US Letter", caps.papers[3].display_name); + EXPECT_EQ(215900, caps.papers[3].size_um.width()); + EXPECT_EQ(279400, caps.papers[3].size_um.height()); + EXPECT_TRUE(PapersEqual(caps.papers[3], caps.default_paper)); + } + { + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "en-UK", kTestPpdData, &caps)); + ASSERT_EQ(4UL, caps.papers.size()); + EXPECT_EQ("A4", caps.papers[1].vendor_id); + EXPECT_EQ("ISO A4", caps.papers[1].display_name); + EXPECT_EQ(209903, caps.papers[1].size_um.width()); + EXPECT_EQ(297039, caps.papers[1].size_um.height()); + EXPECT_TRUE(PapersEqual(caps.papers[1], caps.default_paper)); + } } TEST(PrintBackendCupsHelperTest, TestPpdParsingBrotherPrinters) { { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*ColorDevice: True\n" - "*OpenUI *BRPrintQuality/Color/Mono: PickOne\n" - "*DefaultBRPrintQuality: Auto\n" - "*BRPrintQuality Auto/Auto: \"\"\n" - "*BRPrintQuality Color/Color: \"\"\n" - "*BRPrintQuality Black/Mono: \"\"\n" - "*CloseUI: *BRPrintQuality\n\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*OpenUI *BRPrintQuality/Color/Mono: PickOne +*DefaultBRPrintQuality: Auto +*BRPrintQuality Auto/Auto: "" +*BRPrintQuality Color/Color: "" +*BRPrintQuality Black/Mono: "" +*CloseUI: *BRPrintQuality)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(caps.color_changeable); EXPECT_TRUE(caps.color_default); - EXPECT_EQ(printing::BROTHER_BRSCRIPT3_COLOR, caps.color_model); - EXPECT_EQ(printing::BROTHER_BRSCRIPT3_BLACK, caps.bw_model); + EXPECT_EQ(BROTHER_BRSCRIPT3_COLOR, caps.color_model); + EXPECT_EQ(BROTHER_BRSCRIPT3_BLACK, caps.bw_model); } { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*ColorDevice: True\n" - "*OpenUI *BRMonoColor/Color / Mono: PickOne\n" - "*DefaultBRMonoColor: Auto\n" - "*BRMonoColor Auto/Auto: \"\"\n" - "*BRMonoColor FullColor/Color: \"\"\n" - "*BRMonoColor Mono/Mono: \"\"\n" - "*CloseUI: *BRMonoColor\n\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*OpenUI *BRMonoColor/Color / Mono: PickOne +*DefaultBRMonoColor: Auto +*BRMonoColor Auto/Auto: "" +*BRMonoColor FullColor/Color: "" +*BRMonoColor Mono/Mono: "" +*CloseUI: *BRMonoColor)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(caps.color_changeable); EXPECT_TRUE(caps.color_default); - EXPECT_EQ(printing::BROTHER_CUPS_COLOR, caps.color_model); - EXPECT_EQ(printing::BROTHER_CUPS_MONO, caps.bw_model); + EXPECT_EQ(BROTHER_CUPS_COLOR, caps.color_model); + EXPECT_EQ(BROTHER_CUPS_MONO, caps.bw_model); } { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*ColorDevice: True\n" - "*OpenUI *BRDuplex/Two-Sided Printing: PickOne\n" - "*DefaultBRDuplex: DuplexTumble\n" - "*BRDuplex DuplexTumble/Short-Edge Binding: \"\"\n" - "*BRDuplex DuplexNoTumble/Long-Edge Binding: \"\"\n" - "*BRDuplex None/Off: \"\"\n" - "*CloseUI: *BRDuplex\n\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); - EXPECT_THAT(caps.duplex_modes, testing::UnorderedElementsAre( - printing::SIMPLEX, printing::LONG_EDGE, - printing::SHORT_EDGE)); - EXPECT_EQ(printing::SHORT_EDGE, caps.duplex_default); + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*OpenUI *BRDuplex/Two-Sided Printing: PickOne +*DefaultBRDuplex: DuplexTumble +*BRDuplex DuplexTumble/Short-Edge Binding: "" +*BRDuplex DuplexNoTumble/Long-Edge Binding: "" +*BRDuplex None/Off: "" +*CloseUI: *BRDuplex)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); + EXPECT_THAT(caps.duplex_modes, + testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE)); + EXPECT_EQ(SHORT_EDGE, caps.duplex_default); } } +TEST(PrintBackendCupsHelperTest, TestPpdParsingHpPrinters) { + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*OpenUI *HPColorMode/Mode: PickOne +*DefaultHPColorMode: ColorPrint +*HPColorMode ColorPrint/Color: " + << /ProcessColorModel /DeviceCMYK >> setpagedevice" +*HPColorMode GrayscalePrint/Grayscale: " + << /ProcessColorModel /DeviceGray >> setpagedevice" +*CloseUI: *HPColorMode)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); + EXPECT_TRUE(caps.color_changeable); + EXPECT_TRUE(caps.color_default); + EXPECT_EQ(HP_COLOR_COLOR, caps.color_model); + EXPECT_EQ(HP_COLOR_BLACK, caps.bw_model); +} + +TEST(PrintBackendCupsHelperTest, TestPpdParsingEpsonPrinters) { + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*OpenUI *Ink/Ink: PickOne +*DefaultInk: COLOR +*Ink COLOR/Color: " + <</cupsBitsPerColor 8 /cupsColorOrder 0 + /cupsColorSpace 1 /cupsCompression 1>> setpagedevice" +*Ink MONO/Monochrome: " + <</cupsBitsPerColor 8 /cupsColorOrder 0 + /cupsColorSpace 0 /cupsCompression 1>> setpagedevice" +*CloseUI: *Ink)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); + EXPECT_TRUE(caps.color_changeable); + EXPECT_TRUE(caps.color_default); + EXPECT_EQ(EPSON_INK_COLOR, caps.color_model); + EXPECT_EQ(EPSON_INK_MONO, caps.bw_model); +} + TEST(PrintBackendCupsHelperTest, TestPpdParsingSamsungPrinters) { - { - const char kTestPpdData[] = - "*PPD-Adobe: \"4.3\"\n\n" - "*ColorDevice: True\n" - "*OpenUI *ColorMode/Color Mode: Boolean\n" - "*DefaultColorMode: True\n" - "*ColorMode False/Grayscale: \"\"\n" - "*ColorMode True/Color: \"\"\n" - "*CloseUI: *ColorMode\n\n"; - - printing::PrinterSemanticCapsAndDefaults caps; - EXPECT_TRUE(printing::ParsePpdCapabilities("test", kTestPpdData, &caps)); - EXPECT_TRUE(caps.color_changeable); - EXPECT_TRUE(caps.color_default); - EXPECT_EQ(printing::COLORMODE_COLOR, caps.color_model); - EXPECT_EQ(printing::COLORMODE_MONOCHROME, caps.bw_model); - } + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*OpenUI *ColorMode/Color Mode: Boolean +*DefaultColorMode: True +*ColorMode False/Grayscale: "" +*ColorMode True/Color: "" +*CloseUI: *ColorMode)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); + EXPECT_TRUE(caps.color_changeable); + EXPECT_TRUE(caps.color_default); + EXPECT_EQ(COLORMODE_COLOR, caps.color_model); + EXPECT_EQ(COLORMODE_MONOCHROME, caps.bw_model); +} + +TEST(PrintBackendCupsHelperTest, TestPpdParsingSharpPrinters) { + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*OpenUI *ARCMode/Color Mode: PickOne +*OrderDependency: 180 AnySetup *ARCMode +*DefaultARCMode: CMAuto +*ARCMode CMAuto/Automatic: "" +*End +*ARCMode CMColor/Color: "" +*End +*ARCMode CMBW/Black and White: "" +*End +*CloseUI: *ARCMode)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); + EXPECT_TRUE(caps.color_changeable); + EXPECT_TRUE(caps.color_default); + EXPECT_EQ(SHARP_ARCMODE_CMCOLOR, caps.color_model); + EXPECT_EQ(SHARP_ARCMODE_CMBW, caps.bw_model); } + +TEST(PrintBackendCupsHelperTest, TestPpdParsingXeroxPrinters) { + constexpr char kTestPpdData[] = + R"(*PPD-Adobe: "4.3" +*ColorDevice: True +*OpenUI *XRXColor/Color Correction: PickOne +*OrderDependency: 48.0 AnySetup *XRXColor +*DefaultXRXColor: Automatic +*XRXColor Automatic/Automatic: " + <</ProcessColorModel /DeviceCMYK>> setpagedevice" +*XRXColor BW/Black and White: " + <</ProcessColorModel /DeviceGray>> setpagedevice" +*CloseUI: *XRXColor)"; + + PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); + EXPECT_TRUE(caps.color_changeable); + EXPECT_TRUE(caps.color_default); + EXPECT_EQ(XEROX_XRXCOLOR_AUTOMATIC, caps.color_model); + EXPECT_EQ(XEROX_XRXCOLOR_BW, caps.bw_model); +} + +} // namespace printing diff --git a/chromium/printing/backend/cups_ipp_constants.cc b/chromium/printing/backend/cups_ipp_constants.cc index b87c25c75b9..d67e5004998 100644 --- a/chromium/printing/backend/cups_ipp_constants.cc +++ b/chromium/printing/backend/cups_ipp_constants.cc @@ -8,7 +8,7 @@ namespace printing { -constexpr char kIppCollate[] = "sheet-collate"; // RFC 3381 +constexpr char kIppCollate[] = "multiple-document-handling"; // PWG 5100.19 constexpr char kIppCopies[] = CUPS_COPIES; constexpr char kIppColor[] = CUPS_PRINT_COLOR_MODE; constexpr char kIppMedia[] = CUPS_MEDIA; @@ -19,8 +19,8 @@ constexpr char kIppPin[] = "job-password"; // PWG 5100.11 constexpr char kIppPinEncryption[] = "job-password-encryption"; // PWG 5100.11 // collation values -constexpr char kCollated[] = "collated"; -constexpr char kUncollated[] = "uncollated"; +constexpr char kCollated[] = "separate-documents-collated-copies"; +constexpr char kUncollated[] = "separate-documents-uncollated-copies"; #if defined(OS_CHROMEOS) diff --git a/chromium/printing/backend/cups_ipp_util.cc b/chromium/printing/backend/cups_ipp_helper.cc index 12d424ae04d..717b2650a07 100644 --- a/chromium/printing/backend/cups_ipp_util.cc +++ b/chromium/printing/backend/cups_ipp_helper.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "printing/backend/cups_ipp_util.h" +#include "printing/backend/cups_ipp_helper.h" #include <cups/cups.h> @@ -17,6 +17,7 @@ #include "base/strings/string_piece.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" +#include "printing/backend/cups_connection.h" #include "printing/backend/cups_ipp_constants.h" #include "printing/backend/cups_printer.h" #include "printing/backend/print_backend_consts.h" @@ -27,7 +28,7 @@ #include "base/metrics/histogram_functions.h" #include "base/no_destructor.h" #include "printing/backend/ipp_handler_map.h" -#include "printing/printing_features_chromeos.h" +#include "printing/printing_features.h" #endif // defined(OS_CHROMEOS) namespace printing { @@ -254,7 +255,8 @@ void ExtractCopies(const CupsOptionProvider& printer, int lower_bound; int upper_bound; CopiesRange(printer, &lower_bound, &upper_bound); - printer_info->copies_capable = (lower_bound != -1) && (upper_bound >= 2); + printer_info->copies_max = + (lower_bound != -1 && upper_bound >= 2) ? upper_bound : 1; } // Reads resolution from |attr| and puts into |size| in dots per inch. @@ -316,7 +318,8 @@ PrinterSemanticCapsAndDefaults::Papers SupportedPapers( bool CollateCapable(const CupsOptionProvider& printer) { std::vector<base::StringPiece> values = printer.GetSupportedOptionValueStrings(kIppCollate); - return base::Contains(values, kCollated); + return base::Contains(values, kCollated) && + base::Contains(values, kUncollated); } bool CollateDefault(const CupsOptionProvider& printer) { @@ -408,7 +411,7 @@ void CapsAndDefaultsFromPrinter(const CupsOptionProvider& printer, #if defined(OS_CHROMEOS) printer_info->pin_supported = PinSupported(printer); - if (base::FeatureList::IsEnabled(printing::kAdvancedPpdAttributes)) + if (base::FeatureList::IsEnabled(printing::features::kAdvancedPpdAttributes)) ExtractAdvancedCapabilities(printer, printer_info); #endif // defined(OS_CHROMEOS) diff --git a/chromium/printing/backend/cups_ipp_util.h b/chromium/printing/backend/cups_ipp_helper.h index 7d13f20b78e..92681c16f57 100644 --- a/chromium/printing/backend/cups_ipp_util.h +++ b/chromium/printing/backend/cups_ipp_helper.h @@ -4,8 +4,8 @@ // Methods for parsing IPP Printer attributes. -#ifndef PRINTING_BACKEND_CUPS_IPP_UTIL_H_ -#define PRINTING_BACKEND_CUPS_IPP_UTIL_H_ +#ifndef PRINTING_BACKEND_CUPS_IPP_HELPER_H_ +#define PRINTING_BACKEND_CUPS_IPP_HELPER_H_ #include <memory> @@ -33,4 +33,4 @@ PRINTING_EXPORT ScopedIppPtr WrapIpp(ipp_t* ipp); } // namespace printing -#endif // PRINTING_BACKEND_CUPS_IPP_UTIL_H_ +#endif // PRINTING_BACKEND_CUPS_IPP_HELPER_H_ diff --git a/chromium/printing/backend/cups_ipp_util_unittest.cc b/chromium/printing/backend/cups_ipp_helper_unittest.cc index d2d950a9b8a..694dba82ea7 100644 --- a/chromium/printing/backend/cups_ipp_util_unittest.cc +++ b/chromium/printing/backend/cups_ipp_helper_unittest.cc @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "printing/backend/cups_ipp_helper.h" + #include <cups/cups.h> #include <map> @@ -10,9 +12,9 @@ #include "base/logging.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" -#include "printing/backend/cups_ipp_util.h" +#include "build/build_config.h" #include "printing/backend/cups_printer.h" -#include "printing/printing_features_chromeos.h" +#include "printing/printing_features.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -68,7 +70,7 @@ class MockCupsOptionProvider : public CupsOptionProvider { std::map<base::StringPiece, ipp_attribute_t*> default_attributes_; }; -class PrintBackendCupsIppUtilTest : public ::testing::Test { +class PrintBackendCupsIppHelperTest : public ::testing::Test { protected: void SetUp() override { ipp_ = ippNew(); @@ -110,24 +112,24 @@ ipp_attribute_t* MakeStringCollection(ipp_t* ipp, strings.size(), nullptr, strings.data()); } -TEST_F(PrintBackendCupsIppUtilTest, CopiesCapable) { +TEST_F(PrintBackendCupsIppHelperTest, CopiesCapable) { printer_->SetSupportedOptions("copies", MakeRange(ipp_, 1, 2)); PrinterSemanticCapsAndDefaults caps; CapsAndDefaultsFromPrinter(*printer_, &caps); - EXPECT_TRUE(caps.copies_capable); + EXPECT_EQ(2, caps.copies_max); } -TEST_F(PrintBackendCupsIppUtilTest, CopiesNotCapable) { +TEST_F(PrintBackendCupsIppHelperTest, CopiesNotCapable) { // copies missing, no setup PrinterSemanticCapsAndDefaults caps; CapsAndDefaultsFromPrinter(*printer_, &caps); - EXPECT_FALSE(caps.copies_capable); + EXPECT_EQ(1, caps.copies_max); } -TEST_F(PrintBackendCupsIppUtilTest, ColorPrinter) { +TEST_F(PrintBackendCupsIppHelperTest, ColorPrinter) { printer_->SetSupportedOptions( "print-color-mode", MakeStringCollection(ipp_, {"color", "monochrome"})); printer_->SetOptionDefault("print-color-mode", MakeString(ipp_, "color")); @@ -139,7 +141,7 @@ TEST_F(PrintBackendCupsIppUtilTest, ColorPrinter) { EXPECT_TRUE(caps.color_default); } -TEST_F(PrintBackendCupsIppUtilTest, BWPrinter) { +TEST_F(PrintBackendCupsIppHelperTest, BWPrinter) { printer_->SetSupportedOptions("print-color-mode", MakeStringCollection(ipp_, {"monochrome"})); printer_->SetOptionDefault("print-color-mode", @@ -152,7 +154,7 @@ TEST_F(PrintBackendCupsIppUtilTest, BWPrinter) { EXPECT_FALSE(caps.color_default); } -TEST_F(PrintBackendCupsIppUtilTest, DuplexSupported) { +TEST_F(PrintBackendCupsIppHelperTest, DuplexSupported) { printer_->SetSupportedOptions( "sides", MakeStringCollection(ipp_, {"two-sided-long-edge", "one-sided"})); @@ -166,7 +168,7 @@ TEST_F(PrintBackendCupsIppUtilTest, DuplexSupported) { EXPECT_EQ(SIMPLEX, caps.duplex_default); } -TEST_F(PrintBackendCupsIppUtilTest, DuplexNotSupported) { +TEST_F(PrintBackendCupsIppHelperTest, DuplexNotSupported) { printer_->SetSupportedOptions("sides", MakeStringCollection(ipp_, {"one-sided"})); printer_->SetOptionDefault("sides", MakeString(ipp_, "one-sided")); @@ -178,7 +180,7 @@ TEST_F(PrintBackendCupsIppUtilTest, DuplexNotSupported) { EXPECT_EQ(SIMPLEX, caps.duplex_default); } -TEST_F(PrintBackendCupsIppUtilTest, A4PaperSupported) { +TEST_F(PrintBackendCupsIppHelperTest, A4PaperSupported) { printer_->SetSupportedOptions( "media", MakeStringCollection(ipp_, {"iso_a4_210x297mm"})); @@ -194,7 +196,7 @@ TEST_F(PrintBackendCupsIppUtilTest, A4PaperSupported) { EXPECT_EQ(297000, paper.size_um.height()); } -TEST_F(PrintBackendCupsIppUtilTest, LegalPaperDefault) { +TEST_F(PrintBackendCupsIppHelperTest, LegalPaperDefault) { printer_->SetOptionDefault("media", MakeString(ipp_, "na_legal_8.5x14in")); PrinterSemanticCapsAndDefaults caps; @@ -211,7 +213,7 @@ TEST_F(PrintBackendCupsIppUtilTest, LegalPaperDefault) { // with badly formatted vendor IDs - such papers will not transform into // meaningful ParsedPaper instances and are sometimes inimical to // ARC++. -TEST_F(PrintBackendCupsIppUtilTest, OmitPapersWithoutVendorIds) { +TEST_F(PrintBackendCupsIppHelperTest, OmitPapersWithoutVendorIds) { printer_->SetSupportedOptions( "media", MakeStringCollection(ipp_, {"jis_b5_182x257mm", "invalidsize", "", "iso_b5_176x250mm"})); @@ -239,7 +241,7 @@ TEST_F(PrintBackendCupsIppUtilTest, OmitPapersWithoutVendorIds) { // Tests that CapsAndDefaultsFromPrinter() does not propagate the // special IPP values that CUPS happens to expose to the Chromium print // backend. -TEST_F(PrintBackendCupsIppUtilTest, OmitPapersWithSpecialVendorIds) { +TEST_F(PrintBackendCupsIppHelperTest, OmitPapersWithSpecialVendorIds) { // Maintainer's note: there's no reason why a printer would deliver // two discrete sizes for custom_min* and custom_max*; in practice, // we always see the fully qualified custom_m(in|ax)_<DIMENSIONS> @@ -274,7 +276,8 @@ TEST_F(PrintBackendCupsIppUtilTest, OmitPapersWithSpecialVendorIds) { "iso b0"))); } -TEST_F(PrintBackendCupsIppUtilTest, PinSupported) { +#if defined(OS_CHROMEOS) +TEST_F(PrintBackendCupsIppHelperTest, PinSupported) { printer_->SetSupportedOptions("job-password", MakeInteger(ipp_, 4)); printer_->SetSupportedOptions("job-password-encryption", MakeStringCollection(ipp_, {"none"})); @@ -285,7 +288,7 @@ TEST_F(PrintBackendCupsIppUtilTest, PinSupported) { EXPECT_TRUE(caps.pin_supported); } -TEST_F(PrintBackendCupsIppUtilTest, PinNotSupported) { +TEST_F(PrintBackendCupsIppHelperTest, PinNotSupported) { // Pin support missing, no setup. PrinterSemanticCapsAndDefaults caps; CapsAndDefaultsFromPrinter(*printer_, &caps); @@ -293,7 +296,7 @@ TEST_F(PrintBackendCupsIppUtilTest, PinNotSupported) { EXPECT_FALSE(caps.pin_supported); } -TEST_F(PrintBackendCupsIppUtilTest, PinEncryptionNotSupported) { +TEST_F(PrintBackendCupsIppHelperTest, PinEncryptionNotSupported) { printer_->SetSupportedOptions("job-password", MakeInteger(ipp_, 4)); PrinterSemanticCapsAndDefaults caps; @@ -302,7 +305,7 @@ TEST_F(PrintBackendCupsIppUtilTest, PinEncryptionNotSupported) { EXPECT_FALSE(caps.pin_supported); } -TEST_F(PrintBackendCupsIppUtilTest, PinTooShort) { +TEST_F(PrintBackendCupsIppHelperTest, PinTooShort) { printer_->SetSupportedOptions("job-password", MakeInteger(ipp_, 3)); printer_->SetSupportedOptions("job-password-encryption", MakeStringCollection(ipp_, {"none"})); @@ -313,16 +316,16 @@ TEST_F(PrintBackendCupsIppUtilTest, PinTooShort) { EXPECT_FALSE(caps.pin_supported); } -TEST_F(PrintBackendCupsIppUtilTest, AdvancedCaps) { +TEST_F(PrintBackendCupsIppHelperTest, AdvancedCaps) { base::HistogramTester histograms; base::test::ScopedFeatureList features; - features.InitAndEnableFeature(printing::kAdvancedPpdAttributes); + features.InitAndEnableFeature(printing::features::kAdvancedPpdAttributes); printer_->SetSupportedOptions( "job-creation-attributes", MakeStringCollection( - ipp_, {"copies", "ipp-attribute-fidelity", "finishings", "job-name", - "output-bin", "print-quality"})); + ipp_, {"copies", "confirmation-sheet-print", "finishings", + "job-message-to-operator", "output-bin", "print-quality"})); printer_->SetSupportedOptions("finishings", MakeIntCollection(ipp_, {3, 7, 10})); printer_->SetSupportedOptions( @@ -334,13 +337,13 @@ TEST_F(PrintBackendCupsIppUtilTest, AdvancedCaps) { CapsAndDefaultsFromPrinter(*printer_, &caps); EXPECT_EQ(6u, caps.advanced_capabilities.size()); - EXPECT_EQ("ipp-attribute-fidelity", caps.advanced_capabilities[0].name); + EXPECT_EQ("confirmation-sheet-print", caps.advanced_capabilities[0].name); EXPECT_EQ(base::Value::Type::BOOLEAN, caps.advanced_capabilities[0].type); EXPECT_EQ("finishings/7", caps.advanced_capabilities[1].name); EXPECT_EQ(base::Value::Type::BOOLEAN, caps.advanced_capabilities[1].type); EXPECT_EQ("finishings/10", caps.advanced_capabilities[2].name); EXPECT_EQ(base::Value::Type::BOOLEAN, caps.advanced_capabilities[2].type); - EXPECT_EQ("job-name", caps.advanced_capabilities[3].name); + EXPECT_EQ("job-message-to-operator", caps.advanced_capabilities[3].name); EXPECT_EQ(base::Value::Type::STRING, caps.advanced_capabilities[3].type); EXPECT_EQ("output-bin", caps.advanced_capabilities[4].name); EXPECT_EQ(2u, caps.advanced_capabilities[4].values.size()); @@ -348,5 +351,6 @@ TEST_F(PrintBackendCupsIppUtilTest, AdvancedCaps) { EXPECT_EQ(3u, caps.advanced_capabilities[5].values.size()); histograms.ExpectUniqueSample("Printing.CUPS.IppAttributesCount", 5, 1); } +#endif // defined(OS_CHROMEOS) } // namespace printing diff --git a/chromium/printing/backend/cups_ipp_utils.cc b/chromium/printing/backend/cups_ipp_utils.cc new file mode 100644 index 00000000000..f37e7e8afe5 --- /dev/null +++ b/chromium/printing/backend/cups_ipp_utils.cc @@ -0,0 +1,48 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "printing/backend/cups_ipp_utils.h" + +#include <cups/cups.h> + +#include <string> + +#include "base/optional.h" +#include "base/values.h" +#include "printing/backend/cups_connection.h" +#include "printing/backend/print_backend_consts.h" +#include "url/gurl.h" + +namespace printing { + +std::unique_ptr<CupsConnection> CreateConnection( + const base::Value* print_backend_settings) { + std::string print_server_url_str; + std::string cups_blocking_str; + int encryption = HTTP_ENCRYPT_NEVER; + if (print_backend_settings && print_backend_settings->is_dict()) { + const std::string* url_from_settings = + print_backend_settings->FindStringKey(kCUPSPrintServerURL); + if (url_from_settings) + print_server_url_str = *url_from_settings; + + const std::string* blocking_from_settings = + print_backend_settings->FindStringKey(kCUPSBlocking); + if (blocking_from_settings) + cups_blocking_str = *blocking_from_settings; + + encryption = print_backend_settings->FindIntKey(kCUPSEncryption) + .value_or(HTTP_ENCRYPT_NEVER); + } + + // CupsConnection can take an empty GURL. + GURL print_server_url = GURL(print_server_url_str); + bool cups_blocking = cups_blocking_str == kValueTrue; + + return std::make_unique<CupsConnection>( + print_server_url, static_cast<http_encryption_t>(encryption), + cups_blocking); +} + +} // namespace printing diff --git a/chromium/printing/backend/cups_ipp_utils.h b/chromium/printing/backend/cups_ipp_utils.h new file mode 100644 index 00000000000..91c54bddb3c --- /dev/null +++ b/chromium/printing/backend/cups_ipp_utils.h @@ -0,0 +1,26 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// CUPS IPP utility methods + +#ifndef PRINTING_BACKEND_CUPS_IPP_UTILS_H_ +#define PRINTING_BACKEND_CUPS_IPP_UTILS_H_ + +#include <memory> + +namespace base { +class Value; +} // namespace base + +namespace printing { + +class CupsConnection; + +// Creates a CUPS connection using |print_backend_settings|. +std::unique_ptr<CupsConnection> CreateConnection( + const base::Value* print_backend_settings); + +} // namespace printing + +#endif // PRINTING_BACKEND_CUPS_IPP_UTILS_H_ diff --git a/chromium/printing/backend/cups_jobs.cc b/chromium/printing/backend/cups_jobs.cc index 32a5656d4cf..5e58a45e034 100644 --- a/chromium/printing/backend/cups_jobs.cc +++ b/chromium/printing/backend/cups_jobs.cc @@ -17,7 +17,8 @@ #include "base/threading/scoped_blocking_call.h" #include "base/version.h" #include "printing/backend/cups_deleters.h" -#include "printing/backend/cups_ipp_util.h" +#include "printing/backend/cups_ipp_helper.h" +#include "printing/printer_status.h" namespace printing { namespace { @@ -110,9 +111,10 @@ constexpr int kHttpConnectTimeoutMs = 1000; constexpr std::array<const char* const, 3> kPrinterAttributes{ {kPrinterState, kPrinterStateReasons, kPrinterStateMessage}}; -constexpr std::array<const char* const, 5> kPrinterInfo{ +constexpr std::array<const char* const, 8> kPrinterInfoAndStatus{ {kPrinterMakeAndModel, kIppVersionsSupported, kIppFeaturesSupported, - kDocumentFormatSupported, kPwgRasterDocumentResolutionSupported}}; + kDocumentFormatSupported, kPwgRasterDocumentResolutionSupported, + kPrinterState, kPrinterStateReasons, kPrinterStateMessage}}; // Converts an IPP attribute |attr| to the appropriate JobState enum. CupsJob::JobState ToJobState(ipp_attribute_t* attr) { @@ -352,12 +354,6 @@ CupsJob::CupsJob(const CupsJob& other) = default; CupsJob::~CupsJob() = default; -PrinterStatus::PrinterStatus() = default; - -PrinterStatus::PrinterStatus(const PrinterStatus& other) = default; - -PrinterStatus::~PrinterStatus() = default; - PrinterInfo::PrinterInfo() = default; PrinterInfo::~PrinterInfo() = default; @@ -420,6 +416,8 @@ ScopedIppPtr GetPrinterAttributes(http_t* http, } void ParsePrinterStatus(ipp_t* response, PrinterStatus* printer_status) { + *printer_status = PrinterStatus(); + for (ipp_attribute_t* attr = ippFirstAttribute(response); attr != nullptr; attr = ippNextAttribute(response)) { base::StringPiece name = ippGetName(attr); @@ -446,7 +444,11 @@ PrinterQueryResult GetPrinterInfo(const std::string& address, const int port, const std::string& resource, bool encrypted, - PrinterInfo* printer_info) { + PrinterInfo* printer_info, + PrinterStatus* printer_status) { + DCHECK(printer_info); + DCHECK(printer_status); + ScopedHttpPtr http = ScopedHttpPtr(httpConnect2( address.c_str(), port, nullptr, AF_INET, encrypted ? HTTP_ENCRYPTION_ALWAYS : HTTP_ENCRYPTION_IF_REQUESTED, 0, @@ -467,14 +469,16 @@ PrinterQueryResult GetPrinterInfo(const std::string& address, address.c_str(), port, path.c_str()); ipp_status_t status; - ScopedIppPtr response = - GetPrinterAttributes(http.get(), printer_uri, resource, - kPrinterInfo.size(), kPrinterInfo.data(), &status); + ScopedIppPtr response = GetPrinterAttributes( + http.get(), printer_uri, resource, kPrinterInfoAndStatus.size(), + kPrinterInfoAndStatus.data(), &status); if (StatusError(status) || response.get() == nullptr) { LOG(WARNING) << "Get attributes failure: " << status; return PrinterQueryResult::UNKNOWN_FAILURE; } + ParsePrinterStatus(response.get(), printer_status); + if (ParsePrinterInfo(response.get(), printer_info)) { return PrinterQueryResult::SUCCESS; } diff --git a/chromium/printing/backend/cups_jobs.h b/chromium/printing/backend/cups_jobs.h index fab540447fc..2cf0c596624 100644 --- a/chromium/printing/backend/cups_jobs.h +++ b/chromium/printing/backend/cups_jobs.h @@ -14,7 +14,7 @@ #include <vector> #include "base/version.h" -#include "printing/printer_query_result_chromeos.h" +#include "printing/printer_query_result.h" #include "printing/printing_export.h" // This file contains a collection of functions used to query IPP printers or @@ -23,6 +23,8 @@ namespace printing { +struct PrinterStatus; + // Represents a print job sent to the queue. struct PRINTING_EXPORT CupsJob { // Corresponds to job-state from RFC2911. @@ -56,66 +58,6 @@ struct PRINTING_EXPORT CupsJob { int processing_started = 0; }; -// Represents the status of a printer containing the properties printer-state, -// printer-state-reasons, and printer-state-message. -struct PRINTING_EXPORT PrinterStatus { - struct PrinterReason { - // Standardized reasons from RFC2911. - enum Reason { - UNKNOWN_REASON, - NONE, - MEDIA_NEEDED, - MEDIA_JAM, - MOVING_TO_PAUSED, - PAUSED, - SHUTDOWN, - CONNECTING_TO_DEVICE, - TIMED_OUT, - STOPPING, - STOPPED_PARTLY, - TONER_LOW, - TONER_EMPTY, - SPOOL_AREA_FULL, - COVER_OPEN, - INTERLOCK_OPEN, - DOOR_OPEN, - INPUT_TRAY_MISSING, - MEDIA_LOW, - MEDIA_EMPTY, - OUTPUT_TRAY_MISSING, - OUTPUT_AREA_ALMOST_FULL, - OUTPUT_AREA_FULL, - MARKER_SUPPLY_LOW, - MARKER_SUPPLY_EMPTY, - MARKER_WASTE_ALMOST_FULL, - MARKER_WASTE_FULL, - FUSER_OVER_TEMP, - FUSER_UNDER_TEMP, - OPC_NEAR_EOL, - OPC_LIFE_OVER, - DEVELOPER_LOW, - DEVELOPER_EMPTY, - INTERPRETER_RESOURCE_UNAVAILABLE - }; - - // Severity of the state-reason. - enum Severity { UNKNOWN_SEVERITY, REPORT, WARNING, ERROR }; - - Reason reason; - Severity severity; - }; - - PrinterStatus(); - PrinterStatus(const PrinterStatus& other); - ~PrinterStatus(); - - // printer-state - ipp_pstate_t state; - // printer-state-reasons - std::vector<PrinterReason> reasons; - // printer-state-message - std::string message; -}; struct PRINTING_EXPORT PrinterInfo { PrinterInfo(); @@ -164,11 +106,13 @@ void ParsePrinterStatus(ipp_t* response, PrinterStatus* printer_status); // Queries the printer at |address| on |port| with a Get-Printer-Attributes // request to populate |printer_info|. If |encrypted| is true, request is made // using ipps, otherwise, ipp is used. Returns false if the request failed. -PrinterQueryResult PRINTING_EXPORT GetPrinterInfo(const std::string& address, - const int port, - const std::string& resource, - bool encrypted, - PrinterInfo* printer_info); +PrinterQueryResult PRINTING_EXPORT +GetPrinterInfo(const std::string& address, + int port, + const std::string& resource, + bool encrypted, + PrinterInfo* printer_info, + PrinterStatus* printer_status); // Attempts to retrieve printer status using connection |http| for |printer_id|. // Returns true if succcssful and updates the fields in |printer_status| as diff --git a/chromium/printing/backend/cups_printer.cc b/chromium/printing/backend/cups_printer.cc index ce0d7813869..7434c653711 100644 --- a/chromium/printing/backend/cups_printer.cc +++ b/chromium/printing/backend/cups_printer.cc @@ -10,17 +10,11 @@ #include <utility> #include "base/strings/string_number_conversions.h" +#include "build/build_config.h" #include "printing/backend/cups_connection.h" #include "printing/backend/print_backend.h" #include "printing/backend/print_backend_consts.h" -namespace { - -const char kCUPSPrinterInfoOpt[] = "printer-info"; -const char kCUPSPrinterStateOpt[] = "printer-state"; - -} // namespace - namespace printing { CupsPrinter::CupsPrinter(http_t* http, ScopedDestination dest) @@ -56,7 +50,7 @@ std::vector<base::StringPiece> CupsPrinter::GetSupportedOptionValueStrings( base::StringPiece value; int num_options = ippGetCount(attr); for (int i = 0; i < num_options; ++i) { - value.set(ippGetString(attr, i, nullptr)); + value = ippGetString(attr, i, nullptr); values.push_back(value); } @@ -88,20 +82,26 @@ bool CupsPrinter::ToPrinterInfo(PrinterBasicInfo* printer_info) const { printer_info->printer_name = printer->name; printer_info->is_default = printer->is_default; - const char* info = cupsGetOption(kCUPSPrinterInfoOpt, printer->num_options, - printer->options); - if (info) - printer_info->printer_description = info; - - const char* state = cupsGetOption(kCUPSPrinterStateOpt, printer->num_options, + const std::string info = GetInfo(); + const std::string make_and_model = GetMakeAndModel(); + +#if defined(OS_MACOSX) + // On Mac, "printer-info" option specifies the human-readable printer name, + // while "printer-make-and-model" specifies the printer description. + printer_info->display_name = info; + printer_info->printer_description = make_and_model; +#else + // On other platforms, "printer-info" specifies the printer description. + printer_info->display_name = printer->name; + printer_info->printer_description = info; +#endif // defined(OS_MACOSX) + + const char* state = cupsGetOption(kCUPSOptPrinterState, printer->num_options, printer->options); if (state) base::StringToInt(state, &printer_info->printer_status); - const char* drv_info = - cupsGetOption(kDriverNameTagName, printer->num_options, printer->options); - if (drv_info) - printer_info->options[kDriverInfoTagName] = *drv_info; + printer_info->options[kDriverInfoTagName] = make_and_model; // Store printer options. for (int opt_index = 0; opt_index < printer->num_options; ++opt_index) { @@ -117,12 +117,26 @@ std::string CupsPrinter::GetName() const { } std::string CupsPrinter::GetMakeAndModel() const { - const char* make_and_model = cupsGetOption( - kDriverNameTagName, destination_->num_options, destination_->options); + const char* make_and_model = + cupsGetOption(kCUPSOptPrinterMakeAndModel, destination_->num_options, + destination_->options); return make_and_model ? std::string(make_and_model) : std::string(); } +std::string CupsPrinter::GetInfo() const { + const char* info = cupsGetOption( + kCUPSOptPrinterInfo, destination_->num_options, destination_->options); + + return info ? std::string(info) : std::string(); +} + +std::string CupsPrinter::GetUri() const { + const char* uri = cupsGetOption(kCUPSOptDeviceUri, destination_->num_options, + destination_->options); + return uri ? std::string(uri) : std::string(); +} + bool CupsPrinter::EnsureDestInfo() const { if (dest_info_) return true; @@ -206,4 +220,16 @@ bool CupsPrinter::CancelJob(int job_id) { return status == IPP_STATUS_OK; } +CupsPrinter::CupsMediaMargins CupsPrinter::GetMediaMarginsByName( + const std::string& media_id) { + cups_size_t cups_media; + if (!EnsureDestInfo() || + !cupsGetDestMediaByName(cups_http_, destination_.get(), dest_info_.get(), + media_id.c_str(), CUPS_MEDIA_FLAGS_DEFAULT, + &cups_media)) { + return {0, 0, 0, 0}; + } + return {cups_media.bottom, cups_media.left, cups_media.right, cups_media.top}; +} + } // namespace printing diff --git a/chromium/printing/backend/cups_printer.h b/chromium/printing/backend/cups_printer.h index c1310ac0d94..4e250d3195d 100644 --- a/chromium/printing/backend/cups_printer.h +++ b/chromium/printing/backend/cups_printer.h @@ -50,6 +50,16 @@ class PRINTING_EXPORT CupsOptionProvider { // share an http connection which the CupsConnection closes on destruction. class PRINTING_EXPORT CupsPrinter : public CupsOptionProvider { public: + // Represents the margins that CUPS reports for some given media. + // Its members are valued in PWG units (100ths of mm). + // This struct approximates a cups_size_t, which is BLRT. + struct CupsMediaMargins { + int bottom; + int left; + int right; + int top; + }; + // Create a printer with a connection defined by |http| and |dest|. CupsPrinter(http_t* http, ScopedDestination dest); @@ -77,6 +87,11 @@ class PRINTING_EXPORT CupsPrinter : public CupsOptionProvider { std::string GetMakeAndModel() const; + // Returns the "printer-info" option of the printer as configured in CUPS. + std::string GetInfo() const; + + std::string GetUri() const; + // Lazily initialize dest info as it can require a network call bool EnsureDestInfo() const; @@ -120,6 +135,15 @@ class PRINTING_EXPORT CupsPrinter : public CupsOptionProvider { // Returns false if it failed for any reason. bool CancelJob(int job_id); + // Queries CUPS for the margins of the media named by |media_id|. + // + // A |media_id| is any vendor ID known to CUPS for a given printer. + // Vendor IDs are exemplified by the keys of the big map in + // print_media_l10n.cc. + // + // Returns all zeroes if the CUPS API call fails. + CupsMediaMargins GetMediaMarginsByName(const std::string& media_id); + private: // http connection owned by the CupsConnection which created this object http_t* const cups_http_; diff --git a/chromium/printing/backend/print_backend.cc b/chromium/printing/backend/print_backend.cc index 7da066a0232..feb023e6da9 100644 --- a/chromium/printing/backend/print_backend.cc +++ b/chromium/printing/backend/print_backend.cc @@ -61,9 +61,20 @@ scoped_refptr<PrintBackend> PrintBackend::CreateInstance( const std::string& locale) { return g_print_backend_for_test ? g_print_backend_for_test - : PrintBackend::CreateInstanceImpl(print_backend_settings, locale); + : PrintBackend::CreateInstanceImpl(print_backend_settings, locale, + /*for_cloud_print=*/false); } +#if defined(USE_CUPS) +// static +scoped_refptr<PrintBackend> PrintBackend::CreateInstanceForCloudPrint( + const base::DictionaryValue* print_backend_settings) { + return PrintBackend::CreateInstanceImpl(print_backend_settings, + /*locale=*/std::string(), + /*for_cloud_print=*/true); +} +#endif // defined(USE_CUPS) + // static void PrintBackend::SetPrintBackendForTesting(PrintBackend* backend) { g_print_backend_for_test = backend; diff --git a/chromium/printing/backend/print_backend.h b/chromium/printing/backend/print_backend.h index fe7681171af..2c3848a4225 100644 --- a/chromium/printing/backend/print_backend.h +++ b/chromium/printing/backend/print_backend.h @@ -93,7 +93,10 @@ struct PRINTING_EXPORT PrinterSemanticCapsAndDefaults { bool collate_capable = false; bool collate_default = false; - bool copies_capable = false; + // If |copies_max| > 1, copies are supported. + // If |copies_max| = 1, copies are not supported. + // |copies_max| should never be < 1. + int32_t copies_max = 1; std::vector<DuplexMode> duplex_modes; DuplexMode duplex_default = UNKNOWN_DUPLEX_MODE; @@ -110,6 +113,7 @@ struct PRINTING_EXPORT PrinterSemanticCapsAndDefaults { }; using Papers = std::vector<Paper>; Papers papers; + Papers user_defined_papers; Paper default_paper; std::vector<gfx::Size> dpis; @@ -163,12 +167,10 @@ class PRINTING_EXPORT PrintBackend const std::string& printer_name, PrinterSemanticCapsAndDefaults* printer_info) = 0; -#if !defined(OS_CHROMEOS) // Gets the capabilities and defaults for a specific printer. virtual bool GetPrinterCapsAndDefaults( const std::string& printer_name, PrinterCapsAndDefaults* printer_info) = 0; -#endif // !defined(OS_CHROMEOS) // Gets the information about driver for a specific printer. virtual std::string GetPrinterDriverInfo(const std::string& printer_name) = 0; @@ -182,6 +184,15 @@ class PRINTING_EXPORT PrintBackend const base::DictionaryValue* print_backend_settings, const std::string& locale); +#if defined(USE_CUPS) + // TODO(crbug.com/1062136): Remove this static function when Cloud Print is + // supposed to stop working. Follow up after Jan 1, 2021. + // Similar to CreateInstance(), but ensures that the CUPS PPD backend is used + // instead of the CUPS IPP backend. + static scoped_refptr<PrintBackend> CreateInstanceForCloudPrint( + const base::DictionaryValue* print_backend_settings); +#endif // defined(USE_CUPS) + // Test method to override the print backend for testing. Caller should // retain ownership. static void SetPrintBackendForTesting(PrintBackend* print_backend); @@ -194,7 +205,8 @@ class PRINTING_EXPORT PrintBackend // Provide the actual backend for CreateInstance(). static scoped_refptr<PrintBackend> CreateInstanceImpl( const base::DictionaryValue* print_backend_settings, - const std::string& locale); + const std::string& locale, + bool for_cloud_print); const std::string& locale() const { return locale_; } diff --git a/chromium/printing/backend/print_backend_chromeos.cc b/chromium/printing/backend/print_backend_chromeos.cc index 5c21cfeea84..4a776de1854 100644 --- a/chromium/printing/backend/print_backend_chromeos.cc +++ b/chromium/printing/backend/print_backend_chromeos.cc @@ -7,37 +7,13 @@ #include "base/logging.h" #include "base/memory/ref_counted.h" #include "base/values.h" -#include "printing/backend/print_backend_consts.h" -#include "url/gurl.h" #if defined(USE_CUPS) +#include "printing/backend/cups_ipp_utils.h" #include "printing/backend/print_backend_cups_ipp.h" #endif // defined(USE_CUPS) namespace printing { -namespace { - -#if defined(USE_CUPS) -std::unique_ptr<CupsConnection> CreateConnection( - const base::DictionaryValue* print_backend_settings) { - std::string print_server_url_str; - std::string cups_blocking; - int encryption = HTTP_ENCRYPT_NEVER; - if (print_backend_settings) { - print_backend_settings->GetString(kCUPSPrintServerURL, - &print_server_url_str); - print_backend_settings->GetString(kCUPSBlocking, &cups_blocking); - print_backend_settings->GetInteger(kCUPSEncryption, &encryption); - } - GURL print_server_url(print_server_url_str); - - return std::make_unique<CupsConnection>( - print_server_url, static_cast<http_encryption_t>(encryption), - cups_blocking == kValueTrue); -} -#endif // defined(USE_CUPS) - -} // namespace // Provides either a stubbed out PrintBackend implementation or a CUPS IPP // implementation for use on ChromeOS. @@ -50,6 +26,8 @@ class PrintBackendChromeOS : public PrintBackend { std::string GetDefaultPrinterName() override; bool GetPrinterBasicInfo(const std::string& printer_name, PrinterBasicInfo* printer_info) override; + bool GetPrinterCapsAndDefaults(const std::string& printer_name, + PrinterCapsAndDefaults* printer_info) override; bool GetPrinterSemanticCapsAndDefaults( const std::string& printer_name, PrinterSemanticCapsAndDefaults* printer_info) override; @@ -72,6 +50,13 @@ bool PrintBackendChromeOS::GetPrinterBasicInfo(const std::string& printer_name, return false; } +bool PrintBackendChromeOS::GetPrinterCapsAndDefaults( + const std::string& printer_name, + PrinterCapsAndDefaults* printer_info) { + NOTREACHED(); + return false; +} + bool PrintBackendChromeOS::GetPrinterSemanticCapsAndDefaults( const std::string& printer_name, PrinterSemanticCapsAndDefaults* printer_info) { @@ -97,7 +82,8 @@ bool PrintBackendChromeOS::IsValidPrinter(const std::string& printer_name) { // static scoped_refptr<PrintBackend> PrintBackend::CreateInstanceImpl( const base::DictionaryValue* print_backend_settings, - const std::string& locale) { + const std::string& locale, + bool /*for_cloud_print*/) { #if defined(USE_CUPS) return base::MakeRefCounted<PrintBackendCupsIpp>( CreateConnection(print_backend_settings), locale); diff --git a/chromium/printing/backend/print_backend_consts.cc b/chromium/printing/backend/print_backend_consts.cc index 8ae607d16a1..7497e1c039c 100644 --- a/chromium/printing/backend/print_backend_consts.cc +++ b/chromium/printing/backend/print_backend_consts.cc @@ -6,13 +6,22 @@ #include "printing/backend/print_backend_consts.h" +// TODO(dhoss): Evaluate removing the strings used as keys for +// |PrinterBasicInfo.options| in favor of fields in PrinterBasicInfo. const char kCUPSBlocking[] = "cups_blocking"; const char kCUPSEncryption[] = "cups_encryption"; const char kCUPSEnterprisePrinter[] = "cupsEnterprisePrinter"; const char kCUPSPrintServerURL[] = "print_server_url"; const char kDriverInfoTagName[] = "system_driverinfo"; -const char kDriverNameTagName[] = "printer-make-and-model"; // Match CUPS. -const char kLocationTagName[] = "printer-location"; // Match CUPS. -const char kPrinterEulaURL[] = "printerEulaUrl"; +const char kDriverNameTagName[] = "printer-make-and-model"; +const char kLocationTagName[] = "printer-location"; const char kValueFalse[] = "false"; const char kValueTrue[] = "true"; + +// The following values must match those defined in CUPS. +const char kCUPSOptDeviceUri[] = "device-uri"; +const char kCUPSOptPrinterInfo[] = "printer-info"; +const char kCUPSOptPrinterLocation[] = "printer-location"; +const char kCUPSOptPrinterMakeAndModel[] = "printer-make-and-model"; +const char kCUPSOptPrinterState[] = "printer-state"; +const char kCUPSOptPrinterType[] = "printer-type"; diff --git a/chromium/printing/backend/print_backend_consts.h b/chromium/printing/backend/print_backend_consts.h index 3b3ab7011bd..55232b36956 100644 --- a/chromium/printing/backend/print_backend_consts.h +++ b/chromium/printing/backend/print_backend_consts.h @@ -14,8 +14,15 @@ PRINTING_EXPORT extern const char kCUPSPrintServerURL[]; PRINTING_EXPORT extern const char kDriverInfoTagName[]; PRINTING_EXPORT extern const char kDriverNameTagName[]; PRINTING_EXPORT extern const char kLocationTagName[]; -PRINTING_EXPORT extern const char kPrinterEulaURL[]; PRINTING_EXPORT extern const char kValueFalse[]; PRINTING_EXPORT extern const char kValueTrue[]; +// CUPS destination option names. +PRINTING_EXPORT extern const char kCUPSOptDeviceUri[]; +PRINTING_EXPORT extern const char kCUPSOptPrinterInfo[]; +PRINTING_EXPORT extern const char kCUPSOptPrinterLocation[]; +PRINTING_EXPORT extern const char kCUPSOptPrinterMakeAndModel[]; +PRINTING_EXPORT extern const char kCUPSOptPrinterState[]; +PRINTING_EXPORT extern const char kCUPSOptPrinterType[]; + #endif // PRINTING_BACKEND_PRINT_BACKEND_CONSTS_H_ diff --git a/chromium/printing/backend/print_backend_cups.cc b/chromium/printing/backend/print_backend_cups.cc index 9d2f92edeee..db324056841 100644 --- a/chromium/printing/backend/print_backend_cups.cc +++ b/chromium/printing/backend/print_backend_cups.cc @@ -24,15 +24,14 @@ #include "printing/backend/print_backend_consts.h" #include "url/gurl.h" -namespace printing { - -namespace { - -const char kCUPSPrinterInfoOpt[] = "printer-info"; -const char kCUPSPrinterStateOpt[] = "printer-state"; -const char kCUPSPrinterTypeOpt[] = "printer-type"; +#if defined(OS_MACOSX) +#include "printing/backend/cups_connection.h" +#include "printing/backend/cups_ipp_utils.h" +#include "printing/backend/print_backend_cups_ipp.h" +#include "printing/printing_features.h" +#endif // defined(OS_MACOSX) -} // namespace +namespace printing { PrintBackendCUPS::PrintBackendCUPS(const GURL& print_server_url, http_encryption_t encryption, @@ -47,29 +46,36 @@ PrintBackendCUPS::PrintBackendCUPS(const GURL& print_server_url, bool PrintBackendCUPS::PrinterBasicInfoFromCUPS( const cups_dest_t& printer, PrinterBasicInfo* printer_info) { - // CUPS can have 'printers' that are actually scanners. (not MFC) - // At least on Mac. Check for scanners and skip them. const char* type_str = - cupsGetOption(kCUPSPrinterTypeOpt, printer.num_options, printer.options); + cupsGetOption(kCUPSOptPrinterType, printer.num_options, printer.options); if (type_str) { - int type; - if (base::StringToInt(type_str, &type) && (type & CUPS_PRINTER_SCANNER)) - return false; + cups_ptype_t type; + if (base::StringToUint(type_str, &type)) { + // Exclude fax and scanner devices. + // Also exclude discovered printers that have not been added locally. + // On macOS, AirPrint destinations show up even if they're not added to + // the system, and their capabilities cannot be read in that situation. + // (crbug.com/1027834) + constexpr cups_ptype_t kMask = + CUPS_PRINTER_FAX | CUPS_PRINTER_SCANNER | CUPS_PRINTER_DISCOVERED; + if (type & kMask) + return false; + } } printer_info->printer_name = printer.name; printer_info->is_default = printer.is_default; const char* info = - cupsGetOption(kCUPSPrinterInfoOpt, printer.num_options, printer.options); + cupsGetOption(kCUPSOptPrinterInfo, printer.num_options, printer.options); const char* state = - cupsGetOption(kCUPSPrinterStateOpt, printer.num_options, printer.options); + cupsGetOption(kCUPSOptPrinterState, printer.num_options, printer.options); if (state) base::StringToInt(state, &printer_info->printer_status); - const char* drv_info = - cupsGetOption(kDriverNameTagName, printer.num_options, printer.options); + const char* drv_info = cupsGetOption(kCUPSOptPrinterMakeAndModel, + printer.num_options, printer.options); if (drv_info) printer_info->options[kDriverInfoTagName] = *drv_info; @@ -158,7 +164,7 @@ bool PrintBackendCUPS::GetPrinterSemanticCapsAndDefaults( if (!GetPrinterCapsAndDefaults(printer_name, &info)) return false; - return ParsePpdCapabilities(printer_name, info.printer_capabilities, + return ParsePpdCapabilities(printer_name, locale(), info.printer_capabilities, printer_info); } @@ -212,10 +218,17 @@ bool PrintBackendCUPS::IsValidPrinter(const std::string& printer_name) { return !!GetNamedDest(printer_name); } -#if !defined(OS_CHROMEOS) scoped_refptr<PrintBackend> PrintBackend::CreateInstanceImpl( const base::DictionaryValue* print_backend_settings, - const std::string& locale) { + const std::string& locale, + bool for_cloud_print) { +#if defined(OS_MACOSX) + if (!for_cloud_print && + base::FeatureList::IsEnabled(features::kCupsIppPrintingBackend)) { + return base::MakeRefCounted<PrintBackendCupsIpp>( + CreateConnection(print_backend_settings), locale); + } +#endif // defined(OS_MACOSX) std::string print_server_url_str, cups_blocking; int encryption = HTTP_ENCRYPT_NEVER; if (print_backend_settings) { @@ -231,14 +244,16 @@ scoped_refptr<PrintBackend> PrintBackend::CreateInstanceImpl( print_server_url, static_cast<http_encryption_t>(encryption), cups_blocking == kValueTrue, locale); } -#endif // !defined(OS_CHROMEOS) int PrintBackendCUPS::GetDests(cups_dest_t** dests) { - if (print_server_url_.is_empty()) // Use default (local) print server. - return cupsGetDests(dests); + // Default to the local print server (CUPS scheduler) + if (print_server_url_.is_empty()) + return cupsGetDests2(CUPS_HTTP_DEFAULT, dests); + + HttpConnectionCUPS http(print_server_url_, cups_encryption_, blocking_); - HttpConnectionCUPS http(print_server_url_, cups_encryption_); - http.SetBlocking(blocking_); + // This call must be made in the same scope as |http| because its destructor + // closes the connection. return cupsGetDests2(http.http(), dests); } @@ -261,8 +276,7 @@ base::FilePath PrintBackendCUPS::GetPPD(const char* name) { // connection will timeout after 10 seconds of no data period. And it will // return the same way as if data was completely and successfully // downloaded. - HttpConnectionCUPS http(print_server_url_, cups_encryption_); - http.SetBlocking(blocking_); + HttpConnectionCUPS http(print_server_url_, cups_encryption_, blocking_); ppd_file_path = cupsGetPPD2(http.http(), name); // Check if the get full PPD, since non-blocking call may simply return // normally after timeout expired. @@ -298,8 +312,7 @@ PrintBackendCUPS::ScopedDestination PrintBackendCUPS::GetNamedDest( // Use default (local) print server. dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer_name.c_str(), nullptr); } else { - HttpConnectionCUPS http(print_server_url_, cups_encryption_); - http.SetBlocking(blocking_); + HttpConnectionCUPS http(print_server_url_, cups_encryption_, blocking_); dest = cupsGetNamedDest(http.http(), printer_name.c_str(), nullptr); } return ScopedDestination(dest); diff --git a/chromium/printing/backend/print_backend_cups_ipp.cc b/chromium/printing/backend/print_backend_cups_ipp.cc index ec75367609b..173b9858adc 100644 --- a/chromium/printing/backend/print_backend_cups_ipp.cc +++ b/chromium/printing/backend/print_backend_cups_ipp.cc @@ -15,7 +15,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "printing/backend/cups_connection.h" -#include "printing/backend/cups_ipp_util.h" +#include "printing/backend/cups_ipp_helper.h" #include "printing/backend/print_backend_consts.h" #include "printing/units.h" @@ -75,6 +75,13 @@ bool PrintBackendCupsIpp::GetPrinterBasicInfo(const std::string& printer_name, return printer->ToPrinterInfo(printer_info); } +bool PrintBackendCupsIpp::GetPrinterCapsAndDefaults( + const std::string& printer_name, + PrinterCapsAndDefaults* printer_info) { + NOTREACHED(); + return false; +} + bool PrintBackendCupsIpp::GetPrinterSemanticCapsAndDefaults( const std::string& printer_name, PrinterSemanticCapsAndDefaults* printer_info) { diff --git a/chromium/printing/backend/print_backend_cups_ipp.h b/chromium/printing/backend/print_backend_cups_ipp.h index 67497cb2098..693c989929d 100644 --- a/chromium/printing/backend/print_backend_cups_ipp.h +++ b/chromium/printing/backend/print_backend_cups_ipp.h @@ -26,6 +26,8 @@ class PrintBackendCupsIpp : public PrintBackend { std::string GetDefaultPrinterName() override; bool GetPrinterBasicInfo(const std::string& printer_name, PrinterBasicInfo* printer_info) override; + bool GetPrinterCapsAndDefaults(const std::string& printer_name, + PrinterCapsAndDefaults* printer_info) override; bool GetPrinterSemanticCapsAndDefaults( const std::string& printer_name, PrinterSemanticCapsAndDefaults* printer_info) override; diff --git a/chromium/printing/backend/print_backend_cups_linux_unittest.cc b/chromium/printing/backend/print_backend_cups_linux_unittest.cc deleted file mode 100644 index ae11eb24f94..00000000000 --- a/chromium/printing/backend/print_backend_cups_linux_unittest.cc +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <cups/cups.h> - -#include "printing/backend/print_backend.h" -#include "printing/backend/print_backend_cups.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace printing { - -TEST(PrintBackendCupsLinuxTest, PrinterBasicInfoFromCUPS) { - const char kName[] = "printer"; - cups_dest_t* printer = nullptr; - ASSERT_EQ(1, cupsAddDest(kName, nullptr, 0, &printer)); - - int num_options = 0; - cups_option_t* options = nullptr; - num_options = - cupsAddOption("printer-info", "description", num_options, &options); - printer->num_options = num_options; - printer->options = options; - - PrinterBasicInfo printer_info; - PrintBackendCUPS::PrinterBasicInfoFromCUPS(*printer, &printer_info); - cupsFreeDests(1, printer); - - EXPECT_EQ("printer", printer_info.printer_name); - EXPECT_EQ("printer", printer_info.display_name); - EXPECT_EQ("description", printer_info.printer_description); -} - -} // namespace printing diff --git a/chromium/printing/backend/print_backend_cups_mac_unittest.cc b/chromium/printing/backend/print_backend_cups_mac_unittest.cc deleted file mode 100644 index 6732df04014..00000000000 --- a/chromium/printing/backend/print_backend_cups_mac_unittest.cc +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include <cups/cups.h> - -#include "printing/backend/print_backend.h" -#include "printing/backend/print_backend_cups.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace printing { - -TEST(PrintBackendCupsMacTest, PrinterBasicInfoFromCUPS) { - const char kName[] = "printer"; - cups_dest_t* printer = nullptr; - ASSERT_EQ(1, cupsAddDest(kName, nullptr, 0, &printer)); - - int num_options = 0; - cups_option_t* options = nullptr; - num_options = cupsAddOption("printer-info", "name", num_options, &options); - num_options = cupsAddOption("printer-make-and-model", "description", - num_options, &options); - printer->num_options = num_options; - printer->options = options; - - PrinterBasicInfo printer_info; - PrintBackendCUPS::PrinterBasicInfoFromCUPS(*printer, &printer_info); - cupsFreeDests(1, printer); - - EXPECT_EQ("printer", printer_info.printer_name); - EXPECT_EQ("name", printer_info.display_name); - EXPECT_EQ("description", printer_info.printer_description); -} - -} // namespace printing diff --git a/chromium/printing/backend/print_backend_cups_unittest.cc b/chromium/printing/backend/print_backend_cups_unittest.cc new file mode 100644 index 00000000000..cf5f08f34f6 --- /dev/null +++ b/chromium/printing/backend/print_backend_cups_unittest.cc @@ -0,0 +1,91 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "printing/backend/print_backend_cups.h" + +#include <cups/cups.h> + +#include "base/strings/string_number_conversions.h" +#include "build/build_config.h" +#include "printing/backend/print_backend.h" +#include "printing/backend/print_backend_consts.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace printing { + +namespace { + +bool IsDestTypeEligible(int dest_type) { + cups_dest_t* dest = nullptr; + int num_dests = 0; + num_dests = + cupsAddDest(/*name=*/"test_dest", /*instance=*/nullptr, num_dests, &dest); + if (num_dests != 1) + return false; + + cups_option_t* options = nullptr; + int num_options = 0; + num_options = cupsAddOption(kCUPSOptPrinterType, + base::NumberToString(dest_type).c_str(), + num_options, &options); + dest->num_options = num_options; + dest->options = options; + + PrinterBasicInfo printer_info; + const bool eligible = + PrintBackendCUPS::PrinterBasicInfoFromCUPS(*dest, &printer_info); + + cupsFreeDests(num_dests, dest); + return eligible; +} + +} // namespace + +TEST(PrintBackendCupsTest, PrinterBasicInfoFromCUPS) { + constexpr char kName[] = "printer"; + cups_dest_t* printer = nullptr; + ASSERT_EQ( + 1, cupsAddDest(kName, /*instance=*/nullptr, /*num_dests=*/0, &printer)); + + int num_options = 0; + cups_option_t* options = nullptr; +#if defined(OS_MACOSX) + num_options = + cupsAddOption(kCUPSOptPrinterInfo, "info", num_options, &options); + num_options = cupsAddOption(kCUPSOptPrinterMakeAndModel, "description", + num_options, &options); +#else + num_options = + cupsAddOption(kCUPSOptPrinterInfo, "description", num_options, &options); +#endif + printer->num_options = num_options; + printer->options = options; + + PrinterBasicInfo printer_info; + EXPECT_TRUE( + PrintBackendCUPS::PrinterBasicInfoFromCUPS(*printer, &printer_info)); + cupsFreeDests(/*num_dests=*/1, printer); + + EXPECT_EQ(kName, printer_info.printer_name); +#if defined(OS_MACOSX) + EXPECT_EQ("info", printer_info.display_name); +#else + EXPECT_EQ(kName, printer_info.display_name); +#endif + EXPECT_EQ("description", printer_info.printer_description); +} + +TEST(PrintBackendCupsTest, EligibleDestTypes) { + EXPECT_FALSE(IsDestTypeEligible(CUPS_PRINTER_FAX)); + EXPECT_FALSE(IsDestTypeEligible(CUPS_PRINTER_SCANNER)); + EXPECT_FALSE(IsDestTypeEligible(CUPS_PRINTER_DISCOVERED)); + EXPECT_TRUE(IsDestTypeEligible(CUPS_PRINTER_LOCAL)); + + // Try combos. |CUPS_PRINTER_LOCAL| has a value of 0, but keep these test + // cases in the event that the constant values change in CUPS. + EXPECT_FALSE(IsDestTypeEligible(CUPS_PRINTER_LOCAL | CUPS_PRINTER_FAX)); + EXPECT_FALSE(IsDestTypeEligible(CUPS_PRINTER_LOCAL | CUPS_PRINTER_SCANNER)); +} + +} // namespace printing diff --git a/chromium/printing/backend/print_backend_dummy.cc b/chromium/printing/backend/print_backend_dummy.cc index d885f8f88db..c03fd06b1e4 100644 --- a/chromium/printing/backend/print_backend_dummy.cc +++ b/chromium/printing/backend/print_backend_dummy.cc @@ -57,7 +57,8 @@ class DummyPrintBackend : public PrintBackend { // static scoped_refptr<PrintBackend> PrintBackend::CreateInstanceImpl( const base::DictionaryValue* print_backend_settings, - const std::string& locale) { + const std::string& locale, + bool /*for_cloud_print*/) { return base::MakeRefCounted<DummyPrintBackend>(locale); } diff --git a/chromium/printing/backend/print_backend_win.cc b/chromium/printing/backend/print_backend_win.cc index 15cbc73af08..b9952e1ee67 100644 --- a/chromium/printing/backend/print_backend_win.cc +++ b/chromium/printing/backend/print_backend_win.cc @@ -304,8 +304,8 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( caps.collate_capable = (DeviceCapabilities(name, port, DC_COLLATE, nullptr, nullptr) == 1); - caps.copies_capable = - (DeviceCapabilities(name, port, DC_COPIES, nullptr, nullptr) > 1); + caps.copies_max = + std::max(1, DeviceCapabilities(name, port, DC_COPIES, nullptr, nullptr)); LoadPaper(name, port, user_settings.get(), &caps); LoadDpi(name, port, user_settings.get(), &caps); @@ -393,7 +393,8 @@ bool PrintBackendWin::IsValidPrinter(const std::string& printer_name) { // static scoped_refptr<PrintBackend> PrintBackend::CreateInstanceImpl( const base::DictionaryValue* print_backend_settings, - const std::string& locale) { + const std::string& locale, + bool /*for_cloud_print*/) { return base::MakeRefCounted<PrintBackendWin>(locale); } diff --git a/chromium/printing/backend/test_print_backend.cc b/chromium/printing/backend/test_print_backend.cc index 1fece59b942..1e46d62c471 100644 --- a/chromium/printing/backend/test_print_backend.cc +++ b/chromium/printing/backend/test_print_backend.cc @@ -50,14 +50,12 @@ bool TestPrintBackend::GetPrinterSemanticCapsAndDefaults( return true; } -#if !defined(OS_CHROMEOS) bool TestPrintBackend::GetPrinterCapsAndDefaults( const std::string& printer_name, PrinterCapsAndDefaults* printer_info) { // not implemented return false; } -#endif // !defined(OS_CHROMEOS) std::string TestPrintBackend::GetPrinterDriverInfo( const std::string& printr_name) { diff --git a/chromium/printing/backend/test_print_backend.h b/chromium/printing/backend/test_print_backend.h index a80355ad336..9e3bbd15789 100644 --- a/chromium/printing/backend/test_print_backend.h +++ b/chromium/printing/backend/test_print_backend.h @@ -28,10 +28,8 @@ class TestPrintBackend : public PrintBackend { bool GetPrinterSemanticCapsAndDefaults( const std::string& printer_name, PrinterSemanticCapsAndDefaults* printer_info) override; -#if !defined(OS_CHROMEOS) bool GetPrinterCapsAndDefaults(const std::string& printer_name, PrinterCapsAndDefaults* printer_info) override; -#endif // !defined(OS_CHROMEOS) std::string GetPrinterDriverInfo(const std::string& printer_name) override; bool IsValidPrinter(const std::string& printer_name) override; @@ -47,9 +45,10 @@ class TestPrintBackend : public PrintBackend { void AddValidPrinter(const std::string& printer_name, std::unique_ptr<PrinterSemanticCapsAndDefaults> caps); - private: + protected: ~TestPrintBackend() override; + private: std::string default_printer_name_; PrinterList printer_list_; std::map<std::string, std::unique_ptr<PrinterSemanticCapsAndDefaults>> diff --git a/chromium/printing/backend/tools/README.md b/chromium/printing/backend/tools/README.md index dbb792c94f6..65bcf6465fc 100644 --- a/chromium/printing/backend/tools/README.md +++ b/chromium/printing/backend/tools/README.md @@ -1,9 +1,13 @@ # IPP Attribute code generation -This directory contains tools to generate mapping from IPP attribute name to a -handler appropriate for its type. The authoritative source for -[ipp-registrations-2.csv](ipp-registrations-2.csv) is the +This directory contains tools to handle IPP attributes based on data provided in +IPP registrations. The authoritative source for CSVs in this directory is the [registrations page hosted by IANA](https://www.iana.org/assignments/ipp-registrations/ipp-registrations.xhtml) -([direct link to Attributes CSV](https://www.iana.org/assignments/ipp-registrations/ipp-registrations-2.csv)). +([direct link to Attributes CSV](https://www.iana.org/assignments/ipp-registrations/ipp-registrations-2.csv), +[direct link to Keyword Values CSV](https://www.iana.org/assignments/ipp-registrations/ipp-registrations-4.csv), +[direct link to Enum Values CSV](https://www.iana.org/assignments/ipp-registrations/ipp-registrations-6.csv)). -If CSV is updated one should be able to drop the new version as is. +If CSVs are updated one should be able to drop in the new version as is but +localizations might have to be added to +[components/printing_component_strings.grdp](components/printing_component_strings.grdp). +TODO: Generate placeholders in grdp. diff --git a/chromium/printing/backend/tools/code_generator.gni b/chromium/printing/backend/tools/code_generator.gni new file mode 100644 index 00000000000..094e6ef3dd3 --- /dev/null +++ b/chromium/printing/backend/tools/code_generator.gni @@ -0,0 +1,26 @@ +# Copyright 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +attributes_path = "//printing/backend/tools/ipp-registrations-2.csv" +keyword_values_path = "//printing/backend/tools/ipp-registrations-4.csv" +enum_values_path = "//printing/backend/tools/ipp-registrations-6.csv" + +template("ipp_code_generate") { + action(target_name) { + script = "//printing/backend/tools/code_generator.py" + inputs = [ + attributes_path, + keyword_values_path, + enum_values_path, + ] + outputs = invoker.outputs + args = [ + "--attributes-file=" + rebase_path(attributes_path, root_build_dir), + "--keyword-values-file=" + + rebase_path(keyword_values_path, root_build_dir), + "--enum-values-file=" + rebase_path(enum_values_path, root_build_dir), + ] + args += invoker.args + } +} diff --git a/chromium/printing/backend/tools/code_generator.py b/chromium/printing/backend/tools/code_generator.py index df262a27706..5a558829266 100755 --- a/chromium/printing/backend/tools/code_generator.py +++ b/chromium/printing/backend/tools/code_generator.py @@ -10,6 +10,57 @@ import argparse import csv import re +# We skip attributes that are already implemented in print preview. +NOOP_ATTRS = [ + 'copies', 'job-hold-until', 'job-copies', 'job-password', + 'job-password-encryption', 'media', 'media-col', 'number-up', + 'orientation-requested', 'page-ranges', 'presentation-direction-number-up', + 'print-color-mode', 'print-scaling', 'printer-resolution', 'sheet-collate', + 'sides' +] + +# RFC 8011 (5.1.4) requires keywords to start with a letter. There's however at +# least one keyword that starts with a digit. +KEYWORD_PATTERN = re.compile('^[a-z1-9][a-z0-9\._-]*$') + +HANDLER_HEADER = """// DO NOT MODIFY +// Generated by printing/backend/tools/code_generator.py + +#include "printing/backend/ipp_handler_map.h" + +#include "base/bind.h" +#include "printing/backend/ipp_handlers.h" + +namespace printing { + +HandlerMap GenerateHandlers() { + HandlerMap result; +""" + +HANDLER_FOOTER = """ return result; +} + +} // namespace printing +""" + +L10N_HEADER = """// DO NOT MODIFY +// Generated by printing/backend/tools/code_generator.py + +#include "components/printing/browser/ipp_l10n.h" + +#include "base/no_destructor.h" +#include "components/strings/grit/components_strings.h" + +const std::map<base::StringPiece, int>& CapabilityLocalizationMap() { + static const base::NoDestructor<std::map<base::StringPiece, int>> l10n_map({ +""" + +L10N_FOOTER = """ }); + return *l10n_map; +} +""" + + def get_handler(syntax, name): if syntax.startswith('1setOf'): handler = get_handler(syntax[6:].strip(), name) @@ -18,10 +69,12 @@ def get_handler(syntax, name): # IPP enums always use positive numbers so we can use 0 in other cases. default = 3 if name.endswith('finishings') else 0 return 'MultivalueEnumHandler, %d' % default + + # TODO(crbug.com/964919): Add other multivalue handlers. return '' if syntax == 'collection': - # TODO(crbug.com/964919): Add collection handler + # TODO(crbug.com/964919): Add collection handler. return '' if syntax.startswith('type1') or syntax.startswith('type2'): @@ -38,7 +91,7 @@ def get_handler(syntax, name): return 'BooleanHandler' if syntax.startswith('integer'): - # TODO(crbug.com/964919): Add integer handler + # TODO(crbug.com/964919): Add integer handler. return 'NumberHandler' if syntax.startswith('name') or syntax.startswith('text'): @@ -46,80 +99,154 @@ def get_handler(syntax, name): return '' -# We skip attributes that are already implemented in print preview -NOOP_ATTRS = ['copies', 'job-hold-until', 'job-password', - 'job-password-encryption', 'media', 'media-col', 'number-up', - 'page-ranges', 'print-color-mode', 'printer-resolution', - 'sheet-collate', 'sides'] -OUTPUT_HEADER = """// DO NOT MODIFY -// Generated by printing/backend/tools/code_generator.py +# Remove annotations like '(obsolete)', '(deprecated)' etc. +def remove_annotation(keyword): + parenthesis = keyword.find('(') + return keyword if parenthesis == -1 else keyword[:parenthesis].strip() -#include "printing/backend/ipp_handler_map.h" -#include "base/bind.h" -#include "printing/backend/ipp_handlers.h" +SPECIAL_CHARS = re.compile('[-/\.]') -namespace printing { -HandlerMap GenerateHandlers() { - HandlerMap result; -""" +def add_l10n(l10n_file, ipp_id, grit_id=None): + if not grit_id: + grit_id = ipp_id -OUTPUT_FOOTER = """ return result; -} + l10n_file.write(' {"%s", IDS_PRINT_%s},\n' % + (ipp_id, SPECIAL_CHARS.sub('_', grit_id.upper()))) -} // namespace printing -""" def main(): parser = argparse.ArgumentParser(usage=__doc__) - parser.add_argument('-i', '--attributes-file', dest='attributes_file', - help='path to ipp-registrations-2.csv input file', - metavar='FILE', required=True) - parser.add_argument('-o', '--ipp-handler-map', dest='ipp_handler_map', - help='path to ipp_handler_map.cc output file', - metavar='FILE', required=True) + parser.add_argument( + '-a', + '--attributes-file', + dest='attributes_file', + help='path to ipp-registrations-2.csv input file', + metavar='FILE', + required=True) + parser.add_argument( + '-k', + '--keyword-values-file', + dest='keyword_values_file', + help='path to ipp-registrations-4.csv input file', + metavar='FILE', + required=True) + parser.add_argument( + '-e', + '--enum-values-file', + dest='enum_values_file', + help='path to ipp-registrations-6.csv input file', + metavar='FILE', + required=True) + parser.add_argument( + '-i', + '--ipp-handler-map', + dest='ipp_handler_map', + help='path to ipp_handler_map.cc output file', + metavar='FILE') + parser.add_argument( + '-l', + '--localization-map', + dest='localization_map', + help='path to ipp_l10n.cc output file', + metavar='FILE') args = parser.parse_args() - with open(args.ipp_handler_map, 'w') as mapfile: - with open(args.attributes_file, 'r') as attrfile: - reader = csv.reader(attrfile) - mapfile.write(OUTPUT_HEADER) - name_pattern = re.compile('^[a-z][a-z-]*[a-z]$') - - for attr in reader: - group = attr[0] - if group not in ['Job Template', 'Operation']: - continue - - sub_attr = attr[2] - if sub_attr != '': - # Skip collections for now. - continue - - attr_name = attr[1] - # Remove annotations like '(obsolete)', '(deprecated)' etc. - parenthesis = attr_name.find('(') - if parenthesis != -1: - attr_name = attr_name[:parenthesis].strip() - - if not name_pattern.match(attr_name): - print('Warning: attribute name %s is invalid' % attr_name) - continue - - syntax = attr[4] - handler = 'NoOpHandler' - if attr_name not in NOOP_ATTRS: - handler = get_handler(syntax.strip(), attr_name); - - if handler == '': - continue - - mapfile.write(' result.emplace("' + attr_name + - '", base::BindRepeating(&' + handler + '));\n') + if not (args.ipp_handler_map or args.localization_map): + parser.error('No output file selected') + + handlers = [] + supported_items = set() + with open(args.attributes_file, 'r') as attr_file: + attr_reader = csv.reader(attr_file) + + for attr in attr_reader: + # Filter out by attribute group. + if attr[0] != 'Job Template': + continue + + # Skip sub-attributes. + if attr[2] != '': + continue + + attr_name = remove_annotation(attr[1]) + # Skip duplicates + if attr_name in supported_items: + continue + + if not KEYWORD_PATTERN.match(attr_name): + print('Warning: attribute name %s is invalid' % attr_name) + continue + + syntax = attr[4] + handler = 'NoOpHandler' + if attr_name not in NOOP_ATTRS: + handler = get_handler(syntax.strip(), attr_name) + + if handler == '': + continue + + handlers.append((attr_name, handler)) + if handler != 'NoOpHandler': + supported_items.add(attr_name) + + if args.ipp_handler_map: + handler_file = open(args.ipp_handler_map, 'w') + handler_file.write(HANDLER_HEADER) + + for (attr_name, handler) in handlers: + handler_file.write(' result.emplace("%s", base::BindRepeating(&%s));\n' + % (attr_name, handler)) + + handler_file.write(HANDLER_FOOTER) + handler_file.close() + + if args.localization_map: + l10n_file = open(args.localization_map, 'w') + l10n_file.write(L10N_HEADER) + + for (attr_name, handler) in handlers: + if handler != 'NoOpHandler': + if args.localization_map and not handler.startswith('Multivalue'): + add_l10n(l10n_file, attr_name) + + with open(args.keyword_values_file, 'r') as keyword_file: + keyword_reader = csv.reader(keyword_file) + for keyword_item in keyword_reader: + attr_name = keyword_item[0] + if attr_name in supported_items: + keyword_value = remove_annotation(keyword_item[1]) + # TODO(crbug.com/964919): Also handle some plain English cases. + if KEYWORD_PATTERN.match(keyword_value): + l10n_key = '%s/%s' % (attr_name, keyword_value) + # Skip duplicates. + if l10n_key not in supported_items: + supported_items.add(l10n_key) + add_l10n(l10n_file, l10n_key) + + with open(args.enum_values_file, 'r') as enum_file: + enum_reader = csv.reader(enum_file) + for enum_item in enum_reader: + attr_name = enum_item[0] + if attr_name in supported_items: + enum_value = enum_item[1] + try: + int(enum_value) + l10n_key = attr_name + '/' + enum_value + # Skip duplicates and finishings 'none' value. + if l10n_key not in supported_items and l10n_key != 'finishings/3': + supported_items.add(l10n_key) + add_l10n(l10n_file, l10n_key, + attr_name + '_' + remove_annotation(enum_item[2])) + except ValueError: + # TODO(crbug.com/964919): Handle some plain English cases. + pass + + l10n_file.write(L10N_FOOTER) + l10n_file.close() - mapfile.write(OUTPUT_FOOTER) if __name__ == '__main__': main() diff --git a/chromium/printing/backend/tools/ipp-registrations-4.csv b/chromium/printing/backend/tools/ipp-registrations-4.csv new file mode 100644 index 00000000000..4c68e18e004 --- /dev/null +++ b/chromium/printing/backend/tools/ipp-registrations-4.csv @@ -0,0 +1,2840 @@ +Attribute,Keyword Value,Syntax,Type,Reference +accuracy-units,,type2 keyword,,[PWG5100.21] +accuracy-units,mm,type2 keyword,,[PWG5100.21] +accuracy-units,nm,type2 keyword,,[PWG5100.21] +accuracy-units,um,type2 keyword,,[PWG5100.21] +accuracy-units-supported,,1setOf type2 keyword,,[PWG5100.21] +accuracy-units-supported,< any accuracy-units values >,1setOf type2 keyword,,[PWG5100.21] +accuracy-units-supported,"<Any ""accuracy-units"" value>",1setOf type2 keyword,,[PWG5100.21] +baling-type,,type2 keyword | name(MAX),,[PWG5100.1] +baling-type,band,type2 keyword | name(MAX),,[PWG5100.1] +baling-type,shrink-wrap,type2 keyword | name(MAX),,[PWG5100.1] +baling-type,wrap,type2 keyword | name(MAX),,[PWG5100.1] +baling-type-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.1] +baling-type-supported,"<Any ""baling-type"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.1] +baling-when,,type2 keyword,,[PWG5100.1] +baling-when,after-job,type2 keyword,,[PWG5100.1] +baling-when,after-sets,type2 keyword,,[PWG5100.1] +baling-when-supported,,1setOf type2 keyword,,[PWG5100.1] +baling-when-supported,"<Any ""baling-when"" value>",1setOf type2 keyword,,[PWG5100.1] +binding-reference-edge,,type1 keyword,,[PWG5100.1] +binding-reference-edge,bottom,type1 keyword,,[PWG5100.1] +binding-reference-edge,left,type1 keyword,,[PWG5100.1] +binding-reference-edge,right,type1 keyword,,[PWG5100.1] +binding-reference-edge,top,type1 keyword,,[PWG5100.1] +binding-reference-edge-supported,,1setOf type1 keyword,,[PWG5100.1] +binding-reference-edge-supported,"<Any ""binding-reference-edge"" value>",1setOf type1 keyword,,[PWG5100.1] +binding-type,,type2 keyword | name(MAX),,[PWG5100.1] +binding-type,adhesive,type2 keyword | name(MAX),,[PWG5100.1] +binding-type,comb,type2 keyword | name(MAX),,[PWG5100.1] +binding-type,flat,type2 keyword | name(MAX),,[PWG5100.1] +binding-type,padding,type2 keyword | name(MAX),,[PWG5100.1] +binding-type,perfect,type2 keyword | name(MAX),,[PWG5100.1] +binding-type,spiral,type2 keyword | name(MAX),,[PWG5100.1] +binding-type,tape,type2 keyword | name(MAX),,[PWG5100.1] +binding-type,velo,type2 keyword | name(MAX),,[PWG5100.1] +binding-type-supported,,(1setOf type2 keyword | name(MAX)),,[PWG5100.1] +binding-type-supported,"<Any ""binding-type"" value>",(1setOf type2 keyword | name(MAX)),,[PWG5100.1] +coating-sides,,type1 keyword,,[PWG5100.1] +coating-sides,back,type1 keyword,,[PWG5100.1] +coating-sides,both,type1 keyword,,[PWG5100.1] +coating-sides,front,type1 keyword,,[PWG5100.1] +coating-sides-supported,,1setOf type1 keyword,,[PWG5100.1] +coating-sides-supported,"<Any ""coating-sides"" value>",1setOf type1 keyword,,[PWG5100.1] +coating-type,,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,archival,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,archival-glossy,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,archival-matte,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,archival-semi-gloss,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,glossy,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,high-gloss,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,matte,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,semi-gloss,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,silicone,type2 keyword | name(MAX),,[PWG5100.1] +coating-type,translucent,type2 keyword | name(MAX),,[PWG5100.1] +coating-type-supported,,(1setOf type2 keyword | name(MAX)),,[PWG5100.1] +coating-type-supported,"<Any ""coating-type"" value>",(1setOf type2 keyword | name(MAX)),,[PWG5100.1] +compression,,type2 keyword,,[RFC8011] +compression,compress,type2 keyword,,[RFC8011] +compression,deflate,1setOf type2 keyword,,[RFC8011] +compression,gzip,type2 keyword,,[RFC8011] +compression,none,type2 keyword,,[RFC8011] +compression-accepted,,1setOf type2 keyword,,[PWG5100.17] +compression-accepted,"<Any ""compression"" value>",1setOf type2 keyword,,[PWG5100.17] +compression-supported,,1setOf type2 keyword,,[RFC8011] +compression-supported,"<Any ""compression"" value>",1setOf type2 keyword,,[RFC8011] +cover-type,,type2 keyword,,[PWG5100.3] +cover-type,no-cover,type2 keyword,,[PWG5100.3] +cover-type,print-back,type2 keyword,,[PWG5100.3] +cover-type,print-both,type2 keyword,,[PWG5100.3] +cover-type,print-front,type2 keyword,,[PWG5100.3] +cover-type,print-none,type2 keyword,,[PWG5100.3] +covering-name,,type2 keyword | name(MAX),,[PWG5100.1] +covering-name,plain,type2 keyword | name(MAX),,[PWG5100.1] +covering-name,pre-cut,type2 keyword | name(MAX),,[PWG5100.1] +covering-name,pre-printed,type2 keyword | name(MAX),,[PWG5100.1] +covering-name-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.1] +covering-name-supported,"<Any ""covering-name"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.1] +current-page-order,,type2 keyword,,[PWG5100.3] +current-page-order,"<Any ""page-order-received"" value>",type2 keyword,,[PWG5100.3] +document-digital-signature,,type2 keyword,,[PWG5100.7] +document-digital-signature,dss,type2 keyword,,[PWG5100.7] +document-digital-signature,none,type2 keyword,,[PWG5100.7] +document-digital-signature,pgp,type2 keyword,,[PWG5100.7] +document-digital-signature,smime,type2 keyword,,[PWG5100.7] +document-digital-signature,xmldsig,type2 keyword,,[PWG5100.7] +document-digital-signature-default,,type2 keyword,,[PWG5100.7] +document-digital-signature-default,"<Any ""document-digital-signature"" value>",type2 keyword,,[PWG5100.7] +document-digital-signature-supported,,1setOf type2 keyword,,[PWG5100.7] +document-digital-signature-supported,"<Any ""document-digital-signature"" value>",1setOf type2 keyword,,[PWG5100.7] +document-format-varying-attributes,,1setOf type2 keyword,,[RFC3380] +document-format-varying-attributes,<Any Printer attribute keyword name>,1setOf type2 keyword,,[RFC3380] +document-format-varying-attributes,none,1setOf type2 keyword,,[RFC3380] +document-privacy-attributes,,1setOf type2 keyword,,[IPPPRIVACY10] +document-privacy-attributes,< any Document object attribute >,1setOf type2 keyword,,[IPPPRIVACY10] +document-privacy-attributes,all,1setOf type2 keyword,,[IPPPRIVACY10] +document-privacy-attributes,default,1setOf type2 keyword,,[IPPPRIVACY10] +document-privacy-attributes,document-description,1setOf type2 keyword,,[IPPPRIVACY10] +document-privacy-attributes,document-template,1setOf type2 keyword,,[IPPPRIVACY10] +document-privacy-attributes,none,1setOf type2 keyword,,[IPPPRIVACY10] +document-privacy-scope,,type2 keyword,,[IPPPRIVACY10] +document-privacy-scope,all,type2 keyword,,[IPPPRIVACY10] +document-privacy-scope,default,type2 keyword,,[IPPPRIVACY10] +document-privacy-scope,none,type2 keyword,,[IPPPRIVACY10] +document-privacy-scope,owner,type2 keyword,,[IPPPRIVACY10] +document-state-reasons,,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,aborted-by-system,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,canceled-at-device,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,canceled-by-operator,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,canceled-by-user,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,completed-successfully,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,completed-with-errors,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,completed-with-warnings,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,compression-error,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,data-insufficient,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,digital-signature-did-not-verify,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,digital-signature-type-not-supported,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,digital-signature-wait,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,document-access-error,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,document-fetchable,1setOf type2 keyword,,[PWG5100.18] +document-state-reasons,document-format-error,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,document-password-error,1setOf type2 keyword,,[PWG5100.13] +document-state-reasons,document-permission-error,1setOf type2 keyword,,[PWG5100.13] +document-state-reasons,document-security-error,1setOf type2 keyword,,[PWG5100.13] +document-state-reasons,document-unprintable-error,1setOf type2 keyword,,[PWG5100.13] +document-state-reasons,errors-detected,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,incoming,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,interpreting,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,none,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,outgoing,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,printing,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,processing-to-stop-point,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,queued,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,queued-for-marker,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,queued-in-device,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,resources-are-not-ready,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,resources-are-not-supported,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,submission-interrupted,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,transforming,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,unsupported-compression,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,unsupported-document-format,1setOf type2 keyword,,[PWG5100.5] +document-state-reasons,warnings-detected,1setOf type2 keyword,,[PWG5100.5] +feed-orientation,,type2 keyword,,[PWG5100.11] +feed-orientation,long-edge-first,type2 keyword,,[PWG5100.11] +feed-orientation,short-edge-first,type2 keyword,,[PWG5100.11] +feed-orientation-supported,,1setOf type2 keyword,,[PWG5100.11] +feed-orientation-supported,"<Any ""feed-orientation"" value>",1setOf type2 keyword,,[PWG5100.11] +finishing-template,,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,bale,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,bind,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,bind-bottom,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,bind-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,bind-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,bind-top,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,booklet-maker,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,coat,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,cover,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,edge-stitch,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,edge-stitch-bottom,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,edge-stitch-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,edge-stitch-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,edge-stitch-top,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-accordion,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-double-gate,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-engineering-z,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-gate,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-half,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-half-z,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-left-gate,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-letter,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-parallel,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-poster,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-right-gate,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,fold-z,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f2-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f4-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f4-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f6-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f6-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f6-3,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f6-4,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f6-5,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f6-6,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f6-7,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f6-8,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f8-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f8-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f8-3,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f8-4,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f8-5,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f8-6,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f8-7,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f10-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f10-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f10-3,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-3,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-4,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-5,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-6,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-7,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-8,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-9,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-10,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-11,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-12,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-13,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f12-14,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f14-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-3,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-4,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-5,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-6,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-7,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-8,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-9,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-10,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-11,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-12,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-13,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f16-14,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f18-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f18-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f18-3,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f18-4,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f18-5,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f18-6,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f18-7,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f18-8,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f18-9,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f20-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f20-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-3,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-4,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-5,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-6,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-7,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-8,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-9,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-10,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f24-11,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f28-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f32-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f32-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f32-3,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f32-4,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f32-5,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f32-6,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f32-7,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f32-8,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f32-9,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f36-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f36-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f40-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f48-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f48-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f64-1,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jdf-f64-2,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jog-offset,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,jog-offset(deprecated),type2 keyword | name(MAX),,[IPP-JOG-OFFSET] +finishing-template,laminate,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-bottom-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-bottom-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-dual-bottom,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-dual-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-dual-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-dual-top,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-multiple-bottom,type2 keyword | name(MAX),,[CANON-PUNCHING] +finishing-template,punch-multiple-left,type2 keyword | name(MAX),,[CANON-PUNCHING] +finishing-template,punch-multiple-right,type2 keyword | name(MAX),,[CANON-PUNCHING] +finishing-template,punch-multiple-top,type2 keyword | name(MAX),,[CANON-PUNCHING] +finishing-template,punch-quad-bottom,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-quad-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-quad-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-quad-top,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-top-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-top-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-triple-bottom,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-triple-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-triple-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,punch-triple-top,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,saddle-stitch,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-bottom-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-bottom-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-dual-bottom,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-dual-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-dual-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-dual-top,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-top-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-top-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-triple-bottom,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-triple-left,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-triple-right,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,staple-triple-top,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,trim,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,trim-after-copies,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,trim-after-documents,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,trim-after-job,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template,trim-after-pages,type2 keyword | name(MAX),,[PWG5100.1] +finishing-template-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.1] +finishing-template-supported,"<Any ""finishing-template"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.1] +folding-direction,,type1 keyword,,[PWG5100.1] +folding-direction,inward,type1 keyword,,[PWG5100.1] +folding-direction,outward,type1 keyword,,[PWG5100.1] +folding-direction-supported,,1setOf type1 keyword,,[PWG5100.1] +folding-direction-supported,"<Any ""folding-direction"" value>",1setOf type1 keyword,,[PWG5100.1] +folding-reference-edge,,type1 keyword,,[PWG5100.1] +folding-reference-edge,bottom,type1 keyword,,[PWG5100.1] +folding-reference-edge,left,type1 keyword,,[PWG5100.1] +folding-reference-edge,right,type1 keyword,,[PWG5100.1] +folding-reference-edge,top,type1 keyword,,[PWG5100.1] +folding-reference-edge-supported,,1setOf type1 keyword,,[PWG5100.1] +folding-reference-edge-supported,"<Any ""folding-reference-edge"" value>",1setOf type1 keyword,,[PWG5100.1] +identify-actions,,1setOf type2 keyword,,[PWG5100.13] +identify-actions,display,1setOf type2 keyword,,[PWG5100.13] +identify-actions,flash,1setOf type2 keyword,,[PWG5100.13] +identify-actions,sound,1setOf type2 keyword,,[PWG5100.13] +identify-actions,speak,1setOf type2 keyword,,[PWG5100.13] +identify-actions-default,,1setOf type2 keyword,,[PWG5100.13] +identify-actions-default,"<Any ""identify-actions"" value>",1setOf type2 keyword,,[PWG5100.13] +identify-actions-supported,,1setOf type2 keyword,,[PWG5100.13] +identify-actions-supported,"<Any ""identify-actions"" value>",1setOf type2 keyword,,[PWG5100.13] +imposition-template,,type2 keyword | name(MAX),,[PWG5100.3] +imposition-template,none,type2 keyword | name(MAX),,[PWG5100.3] +imposition-template,signature,type2 keyword | name(MAX),,[PWG5100.3] +input-color-mode,,type2 keyword,,[PWG5100.15] +input-color-mode,auto,type2 keyword,,[PWG5100.15] +input-color-mode,bi-level,type2 keyword,,[PWG5100.15] +input-color-mode,cmyk_8,type2 keyword,,[PWG5100.17] +input-color-mode,cmyk_16,type2 keyword,,[PWG5100.17] +input-color-mode,color,type2 keyword,,[PWG5100.15] +input-color-mode,color_8,type2 keyword,,[PWG5100.17] +input-color-mode,monochrome,type2 keyword,,[PWG5100.15] +input-color-mode,monochrome_4,type2 keyword,,[PWG5100.17] +input-color-mode,monochrome_8,type2 keyword,,[PWG5100.17] +input-color-mode,monochrome_16,type2 keyword,,[PWG5100.17] +input-color-mode,rgb_16,type2 keyword,,[PWG5100.17] +input-color-mode,rgba_8,type2 keyword,,[PWG5100.17] +input-color-mode,rgba_16,type2 keyword,,[PWG5100.17] +input-color-mode-supported,,1setOf type2 keyword,,[PWG5100.15] +input-color-mode-supported,"<Any ""input-color-mode"" value>",1setOf type2 keyword,,[PWG5100.15] +input-content-type,,type2 keyword,,[PWG5100.15] +input-content-type,auto,type2 keyword,,[PWG5100.15] +input-content-type,halftone,type2 keyword,,[PWG5100.15] +input-content-type,line-art,type2 keyword,,[PWG5100.15] +input-content-type,magazine,type2 keyword,,[PWG5100.15] +input-content-type,photo,type2 keyword,,[PWG5100.15] +input-content-type,text,type2 keyword,,[PWG5100.15] +input-content-type,text-and-photo,type2 keyword,,[PWG5100.15] +input-content-type-supported,,1setOf type2 keyword,,[PWG5100.15] +input-content-type-supported,"<Any ""input-content-type"" value>",1setOf type2 keyword,,[PWG5100.15] +input-film-scan-mode,,type2 keyword,,[PWG5100.15] +input-film-scan-mode,black-and-white-negative-film,type2 keyword,,[PWG5100.15] +input-film-scan-mode,color-negative-film,type2 keyword,,[PWG5100.15] +input-film-scan-mode,color-slide-film,type2 keyword,,[PWG5100.15] +input-film-scan-mode,not-applicable,type2 keyword,,[PWG5100.15] +input-film-scan-mode-supported,,1setOf type2 keyword,,[PWG5100.15] +input-film-scan-mode-supported,"<Any ""input-film-scan-mode"" value>",1setOf type2 keyword,,[PWG5100.15] +input-media,,type2 keyword | name(MAX),,[PWG5100.15] +input-media,"<Any ""media"" size name value>",type2 keyword | name(MAX),,[PWG5100.15] +input-media,auto,type2 keyword | name(MAX),,[PWG5100.15] +input-media-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.15] +input-media-supported,"<Any ""media"" size name value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.15] +input-sides,,type2 keyword,,[PWG5100.15] +input-sides,"<Any ""sides"" value>",type2 keyword,,[PWG5100.15] +input-sides-supported,,1setOf type2 keyword,,[PWG5100.15] +input-sides-supported,"<Any ""sides"" value>",1setOf type2 keyword,,[PWG5100.15] +input-source,,type2 keyword,,[PWG5100.15] +input-source,adf,type2 keyword,,[PWG5100.15] +input-source,film-reader,type2 keyword,,[PWG5100.15] +input-source,platen,type2 keyword,,[PWG5100.15] +input-source-supported,,1setOf type2 keyword,,[PWG5100.15] +input-source-supported,"<Any ""input-source"" value>",1setOf type2 keyword,,[PWG5100.15] +ipp-features-supported,,1setOf type2 keyword,,[PWG5100.13] +ipp-features-supported,document-object,1setOf type2 keyword,,[PWG5100.13] +ipp-features-supported,faxout,1setOf type2 keyword,,[PWG5100.15] +ipp-features-supported,icc-color-matching,1setOf type2 keyword,,[APPLE-ICC] +ipp-features-supported,infrastructure-printer,1setOf type2 keyword,,[PWG5100.18] +ipp-features-supported,ipp-3d,1setOf type2 keyword,,[PWG5100.21] +ipp-features-supported,ipp-everywhere,1setOf type2 keyword,,[PWG5100.14] +ipp-features-supported,job-save,1setOf type2 keyword,,[PWG5100.13] +ipp-features-supported,none,1setOf type2 keyword,,[PWG5100.13] +ipp-features-supported,page-overrides,1setOf type2 keyword,,[PWG5100.13] +ipp-features-supported,proof-print,1setOf type2 keyword,,[PWG5100.13] +ipp-features-supported,resource-object,1setOf type2 keyword,,[PWG5100.22] +ipp-features-supported,scan,1setOf type2 keyword,,[PWG5100.17] +ipp-features-supported,subscription-object,1setOf type2 keyword,,[PWG5100.13] +ipp-features-supported,system-object,1setOf type2 keyword,,[PWG5100.22] +ipp-versions-supported,,1setOf type2 keyword,,[RFC8011] +ipp-versions-supported,1.0,1setOf type2 keyword,,[RFC8011] +ipp-versions-supported,1.1,1setOf type2 keyword,,[RFC8011] +ipp-versions-supported,2.0,1setOf type2 keyword,,[PWG5100.10] +ipp-versions-supported,2.1,1setOf type2 keyword,,[PWG5100.10] +ipp-versions-supported,2.2,1setOf type2 keyword,,[PWG5100.12] +job-account-type,,type2 keyword | name(MAX),,[PWG5100.16] +job-account-type,general,type2 keyword | name(MAX),,[PWG5100.16] +job-account-type,group,type2 keyword | name(MAX),,[PWG5100.16] +job-account-type,none,type2 keyword | name(MAX),,[PWG5100.16] +job-account-type-default,,type2 keyword | name(MAX),,[PWG5100.16] +job-account-type-default,"<Any ""job-account-type"" value>",type2 keyword | name(MAX),,[PWG5100.16] +job-account-type-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +job-account-type-supported,"<Any ""job-account-type"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +job-accounting-output-bin,,type2 keyword | name(MAX),,[PWG5100.3] +job-accounting-output-bin,"<Any ""output-bin"" value keyword>",type2 keyword | name(MAX),,[PWG5100.2] +job-accounting-sheets-type,,type2 keyword | name(MAX),,[PWG5100.3] +job-accounting-sheets-type,none,type2 keyword | name(MAX),,[PWG5100.3] +job-accounting-sheets-type,standard,type2 keyword | name(MAX),,[PWG5100.3] +job-cover-back-supported,"<Any ""cover-back-supported"" value>",1setOf type2 keyword,,[PWG5100.7] +job-cover-front-supported,"<Any ""cover-front-supported"" value>",1setOf type2 keyword,,[PWG5100.7] +job-delay-output-until,,type2 keyword | name(MAX),,[PWG5100.11] +job-delay-output-until,day-time,type2 keyword,,[PWG5100.11] +job-delay-output-until,evening,type2 keyword,,[PWG5100.11] +job-delay-output-until,indefinite,type2 keyword,,[PWG5100.11] +job-delay-output-until,night,type2 keyword,,[PWG5100.11] +job-delay-output-until,no-delay-output,type2 keyword,,[PWG5100.11] +job-delay-output-until,second-shift,type2 keyword,,[PWG5100.11] +job-delay-output-until,third-shift,type2 keyword,,[PWG5100.11] +job-delay-output-until,weekend,type2 keyword,,[PWG5100.11] +job-delay-output-until-default,,type2 keyword | name(MAX),,[PWG5100.11] +job-delay-output-until-default,"<Any ""job-default-output-until"" value>",type2 keyword,,[PWG5100.11] +job-delay-output-until-default,"<Any ""job-delay-output-until"" value>",type2 keyword | name(MAX),,[PWG5100.7] +job-delay-output-until-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.11] +job-delay-output-until-supported,"<Any ""job-default-output-until"" value>",1setOf type2 keyword,,[PWG5100.11] +job-delay-output-until-supported,"<Any ""job-delay-output-until"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +job-destination-spooling-supported,,type2 keyword,,[PWG5100.17] +job-destination-spooling-supported,automatic,type2 keyword,,[PWG5100.17] +job-destination-spooling-supported,spool,type2 keyword,,[PWG5100.17] +job-destination-spooling-supported,stream,type2 keyword,,[PWG5100.17] +job-error-action,,type2 keyword,,[PWG5100.13] +job-error-action,abort-job,type2 keyword,,[PWG5100.13] +job-error-action,cancel-job,type2 keyword,,[PWG5100.13] +job-error-action,continue-job,type2 keyword,,[PWG5100.13] +job-error-action,suspend-job,type2 keyword,,[PWG5100.13] +job-error-action-default,,type2 keyword,,[PWG5100.13] +job-error-action-default,"<Any ""job-error-action"" value>",type2 keyword,,[PWG5100.13] +job-error-action-supported,,1setOf type2 keyword,,[PWG5100.13] +job-error-action-supported,"<Any ""job-error-action"" value>",1setOf type2 keyword,,[PWG5100.13] +job-error-sheet-type,,type2 keyword | name(MAX),,[PWG5100.3] +job-error-sheet-type,none,type2 keyword | name(MAX),,[PWG5100.3] +job-error-sheet-type,standard,type2 keyword | name(MAX),,[PWG5100.3] +job-error-sheet-when,,type2 keyword,,[PWG5100.3] +job-error-sheet-when,always,type2 keyword,,[PWG5100.3] +job-error-sheet-when,on-error,type2 keyword,,[PWG5100.3] +job-hold-until,,type2 keyword | name(MAX),,[RFC8011] +job-hold-until,day-time,type2 keyword | name(MAX),,[RFC8011] +job-hold-until,evening,type2 keyword | name(MAX),,[RFC8011] +job-hold-until,indefinite,type2 keyword | name(MAX),,[RFC8011] +job-hold-until,night,type2 keyword | name(MAX),,[RFC8011] +job-hold-until,no-hold,type2 keyword | name(MAX),,[RFC8011] +job-hold-until,second-shift,type2 keyword | name(MAX),,[RFC8011] +job-hold-until,third-shift,type2 keyword | name(MAX),,[RFC8011] +job-hold-until,weekend,type2 keyword | name(MAX),,[RFC8011] +job-hold-until-default,,type2 keyword | name(MAX),,[RFC8011] +job-hold-until-default,"<Any ""job-hold-until"" value>",type2 keyword | name(MAX),,[RFC8011] +job-hold-until-supported,,1setOf (type2 keyword | name(MAX)),,[RFC8011] +job-hold-until-supported,"<Any ""job-hold-until"" value>",1setOf (type2 keyword | name(MAX)),,[RFC8011] +job-password-encryption,,type2 keyword,,[PWG5100.11] +job-password-encryption,md2,type2 keyword,,[PWG5100.11] +job-password-encryption,md2(deprecated),type2 keyword,,[IPPWG20160229-1] +job-password-encryption,md4,type2 keyword,,[PWG5100.11] +job-password-encryption,md4(deprecated),type2 keyword,,[IPPWG20160229-1] +job-password-encryption,md5,type2 keyword,,[PWG5100.11] +job-password-encryption,md5(deprecated),type2 keyword,,[IPPWG20160229-1] +job-password-encryption,none,type2 keyword,,[PWG5100.11] +job-password-encryption,sha,type2 keyword,,[PWG5100.11] +job-password-encryption,sha(deprecated),type2 keyword,,[IPPWG20160229-1] +job-password-encryption,sha2-224,type2 keyword,,[IPPWG20140616] +job-password-encryption,sha2-256,type2 keyword,,[IPPWG20140616] +job-password-encryption,sha2-384,type2 keyword,,[IPPWG20140616] +job-password-encryption,sha2-512,type2 keyword,,[IPPWG20140616] +job-password-encryption,sha2-512_224,type2 keyword,,[IPPWG20151009] +job-password-encryption,sha2-512_256,type2 keyword,,[IPPWG20140616] +job-password-encryption,sha3-224,type2 keyword,,[IPPWG20151009] +job-password-encryption,sha3-256,type2 keyword,,[IPPWG20151009] +job-password-encryption,sha3-384,type2 keyword,,[IPPWG20151009] +job-password-encryption,sha3-512,type2 keyword,,[IPPWG20151009] +job-password-encryption,sha3-512_224,type2 keyword,,[IPPWG20151009] +job-password-encryption,sha3-512_256,type2 keyword,,[IPPWG20151009] +job-password-encryption,shake-128,type2 keyword,,[IPPWG20151009] +job-password-encryption,shake-256,type2 keyword,,[IPPWG20151009] +job-password-encryption-supported,,1setOf type2 keyword,,[PWG5100.11] +job-password-encryption-supported,"<Any ""job-password-encryption"" value>",1setOf type2 keyword,,[PWG5100.11] +job-password-repertoire-configured,,type2 keyword | name(MAX),,[IPPWG20160229-1] +job-password-repertoire-configured,"<Any ""job-password-repertoire-supported"" value>",type2 keyword | name(MAX),,[IPPWG20160229-1] +job-password-repertoire-supported,,1setOf (type2 keyword | name(MAX)),,[IPPWG20160229-1] +job-password-repertoire-supported,iana_us-ascii_any,1setOf (type2 keyword | name(MAX)),,[IPPWG20160229-1] +job-password-repertoire-supported,iana_us-ascii_complex,1setOf (type2 keyword | name(MAX)),,[IPPWG20160229-1] +job-password-repertoire-supported,iana_us-ascii_digits,1setOf (type2 keyword | name(MAX)),,[IPPWG20160229-1] +job-password-repertoire-supported,iana_us-ascii_letters,1setOf (type2 keyword | name(MAX)),,[IPPWG20160229-1] +job-password-repertoire-supported,iana_utf-8_any,1setOf (type2 keyword | name(MAX)),,[IPPWG20160229-1] +job-password-repertoire-supported,iana_utf-8_digits,1setOf (type2 keyword | name(MAX)),,[IPPWG20160229-1] +job-password-repertoire-supported,iana_utf-8_letters,1setOf (type2 keyword | name(MAX)),,[IPPWG20160229-1] +job-privacy-attributes,,1setOf type2 keyword,,[IPPPRIVACY10] +job-privacy-attributes,< any Job object attribute >,1setOf type2 keyword,,[IPPPRIVACY10] +job-privacy-attributes,all,1setOf type2 keyword,,[IPPPRIVACY10] +job-privacy-attributes,default,1setOf type2 keyword,,[IPPPRIVACY10] +job-privacy-attributes,job-description,1setOf type2 keyword,,[IPPPRIVACY10] +job-privacy-attributes,job-template,1setOf type2 keyword,,[IPPPRIVACY10] +job-privacy-attributes,none,1setOf type2 keyword,,[IPPPRIVACY10] +job-privacy-scope,,type2 keyword,,[IPPPRIVACY10] +job-privacy-scope,all,type2 keyword,,[IPPPRIVACY10] +job-privacy-scope,default,type2 keyword,,[IPPPRIVACY10] +job-privacy-scope,none,type2 keyword,,[IPPPRIVACY10] +job-privacy-scope,owner,type2 keyword,,[IPPPRIVACY10] +job-retain-until,,type2 keyword | name(MAX),,[PWG5100.7] +job-retain-until,end-of-day,type2 keyword | name(MAX),,[PWG5100.7] +job-retain-until,end-of-month,type2 keyword | name(MAX),,[PWG5100.7] +job-retain-until,end-of-week,type2 keyword | name(MAX),,[PWG5100.7] +job-retain-until,indefinite,type2 keyword | name(MAX),,[PWG5100.7] +job-retain-until,none,type2 keyword | name(MAX),,[PWG5100.7] +job-retain-until-default,,type2 keyword | name(MAX),,[PWG5100.7] +job-retain-until-default,"<Any ""job-retain-until"" value>",type2 keyword | name(MAX),,[PWG5100.7] +job-retain-until-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +job-retain-until-supported,"<Any ""job-retain-until"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +job-save-disposition-supported,,1setOf type2 keyword,,[PWG5100.11] +job-save-disposition-supported,save-disposition,1setOf type2 keyword,,[PWG5100.11] +job-save-disposition-supported,save-info,1setOf type2 keyword,,[PWG5100.11] +job-sheets,,type2 keyword | name(MAX),,[RFC8011] +job-sheets,first-print-stream-page,type2 keyword | name(MAX),,[PWG5100.3] +job-sheets,job-both-sheet,type2 keyword | name(MAX),,[PWG5100.3] +job-sheets,job-end-sheet,type2 keyword | name(MAX),,[PWG5100.3] +job-sheets,job-start-sheet,type2 keyword | name(MAX),,[PWG5100.3] +job-sheets,none,type2 keyword | name(MAX),,[RFC8011] +job-sheets,standard,type2 keyword | name(MAX),,[RFC8011] +job-sheets-default,,type2 keyword | name(MAX),,[RFC8011] +job-sheets-default,"<Any ""job-sheets"" value>",type2 keyword | name(MAX),,[RFC8011] +job-sheets-supported,,1setOf (type2 keyword | name(MAX)),,[RFC8011] +job-sheets-supported,"<Any ""job-sheets"" value>",1setOf (type2 keyword | name(MAX)),,[RFC8011] +job-spooling-supported,,type2 keyword,,[PWG5100.11] +job-spooling-supported,automatic,type2 keyword,,[PWG5100.11] +job-spooling-supported,spool,type2 keyword,,[PWG5100.11] +job-spooling-supported,stream,type2 keyword,,[PWG5100.11] +job-state-reasons,,1setOf type2 keyword,,[RFC8011] +job-state-reasons,aborted-by-system,1setOf type2 keyword,,[RFC8011] +job-state-reasons,account-authorization-failed,1setOf type2 keyword,,[PWG5100.16] +job-state-reasons,account-closed,1setOf type2 keyword,,[PWG5100.16] +job-state-reasons,account-info-needed,1setOf type2 keyword,,[PWG5100.16] +job-state-reasons,account-limit-reached,1setOf type2 keyword,,[PWG5100.16] +job-state-reasons,compression-error,1setOf type2 keyword,,[RFC8011] +job-state-reasons,conflicting-attributes,1setOf type2 keyword,,[PWG5100.16] +job-state-reasons,connected-to-destination,1setOf type2 keyword,,[PWG5100.15] +job-state-reasons,connecting-to-destination,1setOf type2 keyword,,[PWG5100.15] +job-state-reasons,destination-uri-failed,1setOf type2 keyword,,[PWG5100.15] +job-state-reasons,digital-signature-did-not-verify,1setOf type2 keyword,,[PWG5100.7] +job-state-reasons,digital-signature-type-not-supported,1setOf type2 keyword,,[PWG5100.7] +job-state-reasons,digital-signature-type-not-supported(obsolete),1setOf type2 keyword,,[PWG5100.7] +job-state-reasons,document-access-error,1setOf type2 keyword,,[RFC8011] +job-state-reasons,document-format-error,1setOf type2 keyword,,[RFC8011] +job-state-reasons,document-password-error,1setOf type2 keyword,,[PWG5100.13] +job-state-reasons,document-permission-error,1setOf type2 keyword,,[PWG5100.13] +job-state-reasons,document-security-error,1setOf type2 keyword,,[PWG5100.13] +job-state-reasons,document-unprintable-error,1setOf type2 keyword,,[PWG5100.13] +job-state-reasons,errors-detected,1setOf type2 keyword,,[PWG5100.7] +job-state-reasons,job-canceled-at-device,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-canceled-by-operator,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-canceled-by-user,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-completed-successfully,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-completed-with-errors,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-completed-with-warnings,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-data-insufficient,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-delay-output-until-specified,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-digital-signature-wait,1setOf type2 keyword,,[PWG5100.7] +job-state-reasons,job-digital-signature-wait(obsolete),1setOf type2 keyword,,[PWG5100.7] +job-state-reasons,job-fetchable,1setOf type2 keyword,,[PWG5100.18] +job-state-reasons,job-held-for-review,1setOf type2 keyword,,[PWG5100.16] +job-state-reasons,job-hold-until-specified,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-incoming,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-interpreting,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-outgoing,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-password-wait,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-printed-successfully,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-printed-with-errors,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-printed-with-warnings,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-printing,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-queued,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-queued-for-marker,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-release-wait,1setOf type2 keyword,,[PWG5100.16] +job-state-reasons,job-restartable,1setOf type2 keyword,,[RFC8011] +job-state-reasons,job-resuming,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-saved-successfully,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-saved-with-errors,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-saved-with-warnings,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-saving,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-spooling,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-streaming,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-suspended,1setOf type2 keyword,,[RFC3998] +job-state-reasons,job-suspended-by-operator,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-suspended-by-system,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-suspended-by-user,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-suspending,1setOf type2 keyword,,[PWG5100.11] +job-state-reasons,job-transferring,1setOf type2 keyword,,[PWG5100.15] +job-state-reasons,job-transforming,1setOf type2 keyword,,[RFC8011] +job-state-reasons,none,1setOf type2 keyword,,[RFC8011] +job-state-reasons,printer-stopped,1setOf type2 keyword,,[RFC8011] +job-state-reasons,printer-stopped-partly,1setOf type2 keyword,,[RFC8011] +job-state-reasons,processing-to-stop-point,1setOf type2 keyword,,[RFC8011] +job-state-reasons,queued-in-device,1setOf type2 keyword,,[RFC8011] +job-state-reasons,resources-are-not-ready,1setOf type2 keyword,,[RFC8011] +job-state-reasons,resources-are-not-supported,1setOf type2 keyword,,[PWG5100.3] +job-state-reasons,service-off-line,1setOf type2 keyword,,[RFC8011] +job-state-reasons,submission-interrupted,1setOf type2 keyword,,[RFC8011] +job-state-reasons,unsupported-attributes-or-values,1setOf type2 keyword,,[PWG5100.16] +job-state-reasons,unsupported-compression,1setOf type2 keyword,,[RFC8011] +job-state-reasons,unsupported-document-format,1setOf type2 keyword,,[RFC8011] +job-state-reasons,waiting-for-user-action,1setOf type2 keyword,,[PWG5100.17] +job-state-reasons,warnings-detected,1setOf type2 keyword,,[PWG5100.7] +jpeg-features-supported,,1setOf type2 keyword,,[APPLE20151021] +jpeg-features-supported,arithmetic,1setOf type2 keyword,,[APPLE20151021] +jpeg-features-supported,cmyk,1setOf type2 keyword,,[APPLE20151021] +jpeg-features-supported,deep,1setOf type2 keyword,,[APPLE20151021] +jpeg-features-supported,hierarchical,1setOf type2 keyword,,[APPLE20151021] +jpeg-features-supported,icc,1setOf type2 keyword,,[APPLE20151021] +jpeg-features-supported,lossless,1setOf type2 keyword,,[APPLE20151021] +jpeg-features-supported,none,1setOf type2 keyword,,[APPLE20151021] +jpeg-features-supported,progressive,1setOf type2 keyword,,[APPLE20151021] +laminating-sides,,type1 keyword,,[PWG5100.1] +laminating-sides,back,type1 keyword,,[PWG5100.1] +laminating-sides,both,type1 keyword,,[PWG5100.1] +laminating-sides,front,type1 keyword,,[PWG5100.1] +laminating-sides-supported,,1setOf type1 keyword,,[PWG5100.1] +laminating-sides-supported,"<All ""laminating-sides"" value>",1setOf type1 keyword,,[PWG5100.1] +laminating-type,,type2 keyword | name(MAX),,[PWG5100.1] +laminating-type,archival,type2 keyword | name(MAX),,[PWG5100.1] +laminating-type,glossy,type2 keyword | name(MAX),,[PWG5100.1] +laminating-type,high-gloss,type2 keyword | name(MAX),,[PWG5100.1] +laminating-type,matte,type2 keyword | name(MAX),,[PWG5100.1] +laminating-type,semi-gloss,type2 keyword | name(MAX),,[PWG5100.1] +laminating-type,translucent,type2 keyword | name(MAX),,[PWG5100.1] +laminating-type-supported,,(1setOf type2 keyword | name(MAX)),,[PWG5100.1] +laminating-type-supported,"<Any ""laminating-type"" value>",(1setOf type2 keyword | name(MAX)),,[PWG5100.1] +material-amount-units,,type2 keyword,,[PWG5100.21] +material-amount-units,g,type2 keyword,,[PWG5100.21] +material-amount-units,kg,type2 keyword,,[PWG5100.21] +material-amount-units,l,type2 keyword,,[PWG5100.21] +material-amount-units,m,type2 keyword,,[PWG5100.21] +material-amount-units,ml,type2 keyword,,[PWG5100.21] +material-amount-units,mm,type2 keyword,,[PWG5100.21] +material-color,,type2 keyword,,[PWG5100.21] +material-color,"< any ""media"" color name >",type2 keyword,,[PWG5100.21] +material-color,"<Any ""media-color"" value>",type2 keyword,,[PWG5100.21] +material-purpose,,1setOf type2 keyword,,[PWG5100.21] +material-purpose,all,1setOf type2 keyword,,[PWG5100.21] +material-purpose,base,1setOf type2 keyword,,[PWG5100.21] +material-purpose,in-fill,1setOf type2 keyword,,[PWG5100.21] +material-purpose,shell,1setOf type2 keyword,,[PWG5100.21] +material-purpose,support,1setOf type2 keyword,,[PWG5100.21] +material-rate-units,,type2 keyword,,[PWG5100.21] +material-rate-units,mg_second,type2 keyword,,[PWG5100.21] +material-rate-units,ml_second,type2 keyword,,[PWG5100.21] +material-rate-units,mm_second,type2 keyword,,[PWG5100.21] +material-type,,type2 keyword,,[PWG5100.21] +material-type,abs,type2 keyword,,[PWG5100.21] +material-type,abs-carbon-fiber,type2 keyword,,[PWG5100.21] +material-type,abs-carbon-nanotube,type2 keyword,,[PWG5100.21] +material-type,chocolate,type2 keyword,,[PWG5100.21] +material-type,gold,type2 keyword,,[PWG5100.21] +material-type,nylon,type2 keyword,,[PWG5100.21] +material-type,pet,type2 keyword,,[PWG5100.21] +material-type,photopolymer,type2 keyword,,[PWG5100.21] +material-type,pla,type2 keyword,,[PWG5100.21] +material-type,pla-conductive,type2 keyword,,[PWG5100.21] +material-type,pla-dissolvable,type2 keyword,,[PWG5100.21] +material-type,pla-flexible,type2 keyword,,[PWG5100.21] +material-type,pla-magnetic,type2 keyword,,[PWG5100.21] +material-type,pla-steel,type2 keyword,,[PWG5100.21] +material-type,pla-stone,type2 keyword,,[PWG5100.21] +material-type,pla-wood,type2 keyword,,[PWG5100.21] +material-type,polycarbonate,type2 keyword,,[PWG5100.21] +material-type,pva-dissolvable,type2 keyword,,[PWG5100.21] +material-type,silver,type2 keyword,,[PWG5100.21] +material-type,titanium,type2 keyword,,[PWG5100.21] +material-type,wax,type2 keyword,,[PWG5100.21] +materials-col-supported,,1setOf type2 keyword,,[PWG5100.21] +materials-col-supported,< any materials-col member attribute name >,1setOf type2 keyword,,[PWG5100.21] +media,,type2 keyword | name(MAX),,[RFC8011] +media,a,type2 keyword | name(MAX),size name,[RFC2911] +media,a-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,a-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,a-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-a,type2 keyword | name(MAX),size name,[RFC2911] +media,arch-a-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-a-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-a-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-axsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-axsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-axsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-b,type2 keyword | name(MAX),size name,[RFC2911] +media,arch-b-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-b-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-b-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-bxsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-bxsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-bxsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-c,type2 keyword | name(MAX),size name,[RFC2911] +media,arch-c-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-c-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-c-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-cxsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-cxsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-cxsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-d,type2 keyword | name(MAX),size name,[RFC2911] +media,arch-d-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-d-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-d-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-dxsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-dxsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-dxsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-e,type2 keyword | name(MAX),size name,[RFC2911] +media,arch-e-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-e-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-e-white,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-exsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-exsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,arch-exsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,asme_f_28x40in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,auto-fixed-size-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,auto-fixed-size-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,auto-fixed-size-white,type2 keyword | name(MAX),media name,[RFC2911] +media,auto-synchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,auto-synchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,auto-synchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,auto-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,auto-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,auto-white,type2 keyword | name(MAX),media name,[RFC2911] +media,axsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,axsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,axsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,b,type2 keyword | name(MAX),size name,[RFC2911] +media,b-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,b-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,b-white,type2 keyword | name(MAX),media name,[RFC2911] +media,bottom,type2 keyword | name(MAX),input tray,[RFC2911] +media,bxsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,bxsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,bxsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,c,type2 keyword | name(MAX),size name,[RFC2911] +media,c-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,c-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,c-white,type2 keyword | name(MAX),media name,[RFC2911] +media,choice_iso_a4_210x297mm_na_letter_8.5x11in,type2 keyword | name(MAX),size name,[PWG5100.7] +media,cxsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,cxsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,cxsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,d,type2 keyword | name(MAX),size name,[RFC2911] +media,d-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,d-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,d-white,type2 keyword | name(MAX),media name,[RFC2911] +media,default,type2 keyword | name(MAX),media name,[RFC2911] +media,dxsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,dxsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,dxsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,e,type2 keyword | name(MAX),size name,[RFC2911] +media,e-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,e-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,e-white,type2 keyword | name(MAX),media name,[RFC2911] +media,envelope,type2 keyword | name(MAX),input tray,[RFC2911] +media,executive,type2 keyword | name(MAX),size name,[RFC2911] +media,executive-white,type2 keyword | name(MAX),media name,[RFC2911] +media,exsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,exsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,exsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,f,type2 keyword | name(MAX),size name,[PWG5101.1] +media,folio,type2 keyword | name(MAX),size name,[RFC2911] +media,folio-white,type2 keyword | name(MAX),media name,[RFC2911] +media,invoice,type2 keyword | name(MAX),size name,[RFC2911] +media,invoice-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a0,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a0-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a0-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a0-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a0xsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a0xsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a0xsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a1-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1x3-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1x3-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1x3-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1x4-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1x4-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1x4-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1xsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1xsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a1xsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a2-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2x3-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2x3-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2x3-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2x4-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2x4-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2x4-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2x5-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2x5-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2x5-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2xsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2xsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a2xsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a3-colored,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x3-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x3-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x3-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x4-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x4-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x4-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x5-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x5-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x5-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x6-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x6-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x6-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x7-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x7-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3x7-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3xsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3xsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a3xsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a4-colored,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x3-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x3-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x3-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x4-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x4-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x4-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x5-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x5-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x5-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x6-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x6-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x6-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x7-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x7-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x7-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x8-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x8-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x8-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x9-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x9-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4x9-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4xsynchro-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4xsynchro-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a4xsynchro-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a5,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a5-colored,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a5-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a5-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a5-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a6,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a6-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a7,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a7-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a8,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a8-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a9,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a9-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-a10,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-a10-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b0,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b0-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b1,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b1-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b2,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b2-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b3,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b3-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b4,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b4-colored,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b4-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,iso-b4-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b5,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b5-colored,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b5-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,iso-b5-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b6,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b6-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b7,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b7-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b8,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b8-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b9,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b9-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-b10,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-b10-white,type2 keyword | name(MAX),media name,[RFC2911] +media,iso-c3,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-c3-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,iso-c4,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-c4-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,iso-c5,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-c5-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,iso-c6,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-c6-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,iso-designated-long,type2 keyword | name(MAX),size name,[RFC2911] +media,iso-designated-long-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,iso_2a0_1189x1682mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a0_841x1189mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a1_594x841mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a1x3_841x1783mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a1x4_841x2378mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a2_420x594mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a2x3_594x1261mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a2x4_594x1682mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a2x5_594x2102mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a3-extra_322x445mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a3_297x420mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a0x3_1189x2523mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a3x3_420x891mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a3x4_420x1189mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a3x5_420x1486mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a3x6_420x1783mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a3x7_420x2080mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4-extra_235.5x322.3mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4-tab_225x297mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4_210x297mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4x3_297x630mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4x4_297x841mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4x5_297x1051mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4x6_297x1261mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4x7_297x1471mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4x8_297x1682mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a4x9_297x1892mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a5-extra_174x235mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a5_148x210mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a6_105x148mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a7_74x105mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a8_52x74mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a9_37x52mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_a10_26x37mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b0_1000x1414mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b1_707x1000mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b2_500x707mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b3_353x500mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b4_250x353mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b5-extra_201x276mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b5_176x250mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b6_125x176mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b6c4_125x324mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b7_88x125mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b8_62x88mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b9_44x62mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_b10_31x44mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c0_917x1297mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c1_648x917mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c2_458x648mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c3_324x458mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c4_229x324mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c5_162x229mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c6_114x162mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c6c5_114x229mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c7_81x114mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c7c6_81x162mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c8_57x81mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c9_40x57mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_c10_28x40mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_dl_110x220mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_id-1_53.98x85.6mm,type2 keyword | name(MAX),size name,[CANON20180329] +media,iso_id-3_88x125mm,type2 keyword | name(MAX),size name,[CANON20180329] +media,iso_ra0_860x1220mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_ra1_610x860mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_ra2_430x610mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_ra3_305x430mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_ra4_215x305mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_sra0_900x1280mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_sra1_640x900mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_sra2_450x640mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_sra3_320x450mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,iso_sra4_225x320mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis-b0,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b0-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b0-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b0-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b1,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b1-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b1-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b1-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b2,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b2-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b2-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b2-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b3,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b3-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b3-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b3-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b4,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b4-colored,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b4-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b4-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b4-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b5,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b5-colored,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b5-translucent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b5-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b5-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b6,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b6-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b7,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b7-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b8,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b8-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b9,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b9-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis-b10,type2 keyword | name(MAX),size name,[RFC2911] +media,jis-b10-white,type2 keyword | name(MAX),media name,[RFC2911] +media,jis_b0_1030x1456mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b1_728x1030mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b2_515x728mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b3_364x515mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b4_257x364mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b5_182x257mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b6_128x182mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b7_91x128mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b8_64x91mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b9_45x64mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_b10_32x45mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jis_exec_216x330mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_chou2_111.1x146mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_chou3_120x235mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_chou4_90x205mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_chou40_90x225mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_hagaki_100x148mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_kahu_240x322.1mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_kaku1_270x382mm,type2 keyword | name(MAX),size name,[APPLE20171002] +media,jpn_kaku2_240x332mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_kaku3_216x277mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_kaku4_197x267mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_kaku5_190x240mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_kaku7_142x205mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_kaku8_119x197mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_oufuku_148x200mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,jpn_you4_105x235mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,large-capacity,type2 keyword | name(MAX),input tray,[RFC2911] +media,ledger,type2 keyword | name(MAX),size name,[RFC2911] +media,ledger-white,type2 keyword | name(MAX),media name,[RFC2911] +media,main,type2 keyword | name(MAX),input tray,[RFC2911] +media,manual,type2 keyword | name(MAX),input tray,[RFC2911] +media,middle,type2 keyword | name(MAX),input tray,[RFC2911] +media,monarch,type2 keyword | name(MAX),size name,[RFC2911] +media,monarch-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na-5x7,type2 keyword | name(MAX),size name,[RFC2911] +media,na-6x9,type2 keyword | name(MAX),size name,[RFC2911] +media,na-6x9-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na-7x9,type2 keyword | name(MAX),size name,[RFC2911] +media,na-7x9-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na-8x10,type2 keyword | name(MAX),size name,[RFC2911] +media,na-9x11,type2 keyword | name(MAX),size name,[RFC2911] +media,na-9x11-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na-9x12,type2 keyword | name(MAX),size name,[RFC2911] +media,na-9x12-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na-10x13,type2 keyword | name(MAX),size name,[RFC2911] +media,na-10x13-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na-10x14,type2 keyword | name(MAX),size name,[RFC2911] +media,na-10x14-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na-10x15,type2 keyword | name(MAX),size name,[RFC2911] +media,na-10x15-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na-legal,type2 keyword | name(MAX),size name,[RFC2911] +media,na-legal-colored,type2 keyword | name(MAX),media name,[RFC2911] +media,na-legal-white,type2 keyword | name(MAX),media name,[RFC2911] +media,na-letter,type2 keyword | name(MAX),size name,[RFC2911] +media,na-letter-colored,type2 keyword | name(MAX),media name,[RFC2911] +media,na-letter-transparent,type2 keyword | name(MAX),media name,[RFC2911] +media,na-letter-white,type2 keyword | name(MAX),media name,[RFC2911] +media,na-number-9,type2 keyword | name(MAX),size name,[RFC2911] +media,na-number-9-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na-number-10,type2 keyword | name(MAX),size name,[RFC2911] +media,na-number-10-envelope,type2 keyword | name(MAX),envelope name,[RFC2911] +media,na_5x7_5x7in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_6x9_6x9in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_7x9_7x9in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_9x11_9x11in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_10x11_10x11in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_10x13_10x13in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_10x14_10x14in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_10x15_10x15in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_11x12_11x12in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_11x15_11x15in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_12x19_12x19in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_a2_4.375x5.75in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_arch-a_9x12in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_arch-b_12x18in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_arch-c_18x24in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_arch-d_24x36in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_arch-e2_26x38in,type2 keyword | name(MAX),size name,[IPPWG20160229-2] +media,na_arch-e3_27x39in,type2 keyword | name(MAX),size name,[IPPWG20160229-2] +media,na_arch-e_36x48in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_b-plus_12x19.17in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_c5_6.5x9.5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_c_17x22in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_d_22x34in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_e_34x44in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_edp_11x14in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_eur-edp_12x14in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_executive_7.25x10.5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_f_44x68in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_fanfold-eur_8.5x12in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_fanfold-us_11x14.875in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_foolscap_8.5x13in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_govt-legal_8x13in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_govt-letter_8x10in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_index-3x5_3x5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_index-4x6-ext_6x8in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_index-4x6_4x6in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_index-5x8_5x8in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_invoice_5.5x8.5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_ledger_11x17in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_legal-extra_9.5x15in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_legal_8.5x14in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_letter-extra_9.5x12in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_letter-plus_8.5x12.69in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_letter_8.5x11in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_monarch_3.875x7.5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_number-9_3.875x8.875in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_number-10_4.125x9.5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_number-11_4.5x10.375in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_number-12_4.75x11in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_number-14_5x11.5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_oficio_8.5x13.4in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_personal_3.625x6.5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_quarto_8.5x10.83in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_super-a_8.94x14in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_super-b_13x19in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,na_wide-format_30x42in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,oe_12x16_12x16in,type2 keyword | name(MAX),size name,[IPPWG20160229-2] +media,oe_14x17_14x17in,type2 keyword | name(MAX),size name,[IPPWG20160229-2] +media,oe_18x22_18x22in,type2 keyword | name(MAX),size name,[IPPWG20160229-2] +media,oe_a2plus_17x24in,type2 keyword | name(MAX),size name,[IPPWG20160229-2] +media,oe_business-card_2x3.5in,type2 keyword | name(MAX),size name,[CANON20180618] +media,oe_photo-10r_10x12in,type2 keyword | name(MAX),size name,[IPPWG20160229-2] +media,oe_photo-20r_20x24in,type2 keyword | name(MAX),size name,[IPPWG20160229-2] +media,oe_photo-l_3.5x5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,oe_photo-s10r_10x15in,type2 keyword | name(MAX),size name,[IPPWG20160229-2] +media,oe_square-photo_4x4in,type2 keyword | name(MAX),size name,[CANON20180618] +media,oe_square-photo_5x5in,type2 keyword | name(MAX),size name,[CANON20180618] +media,om_16k_184x260mm,type2 keyword | name(MAX),size name,[HP-MEDIA] +media,om_16k_195x270mm,type2 keyword | name(MAX),size name,[HP-MEDIA] +media,om_business-card_55x85mm,type2 keyword | name(MAX),size name,[CANON20180618] +media,om_business-card_55x91mm,type2 keyword | name(MAX),size name,[CANON20180618] +media,om_card_54x86mm,type2 keyword | name(MAX),size name,[CANON20180329] +media,om_dai-pa-kai_275x395mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_dsc-photo_89x119mm,type2 keyword | name(MAX),size name,[CANON20180329] +media,om_folio-sp_215x315mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_folio_210x330mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_invite_220x220mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_italian_110x230mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_juuro-ku-kai_198x275mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_large-photo_200x300,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_medium-photo_130x180mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_pa-kai_267x389mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_postfix_114x229mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_small-photo_100x150mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,om_square-photo_89x89mm,type2 keyword | name(MAX),size name,[CANON20180618] +media,om_wide-photo_100x200mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_1_102x165mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_2_102x176mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_3_125x176mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_4_110x208mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_5_110x220mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_6_120x320mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_7_160x230mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_8_120x309mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_10_324x458mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_16k_146x215mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,prc_32k_97x151mm,type2 keyword | name(MAX),size name,[PWG5101.1] +media,quarto,type2 keyword | name(MAX),size name,[RFC2911] +media,quarto-white,type2 keyword | name(MAX),media name,[RFC2911] +media,roc_8k_10.75x15.5in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,roc_16k_7.75x10.75in,type2 keyword | name(MAX),size name,[PWG5101.1] +media,side,type2 keyword | name(MAX),input tray,[RFC2911] +media,super-b,type2 keyword | name(MAX),size name,[PWG5101.1] +media,tabloid,type2 keyword | name(MAX),size name,[PWG5101.1] +media,top,type2 keyword | name(MAX),input tray,[RFC2911] +media-back-coating,,type2 keyword | name(MAX),,[PWG5100.3] +media-back-coating,glossy,type2 keyword | name(MAX),,[PWG5101.1] +media-back-coating,high-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-back-coating,matte,type2 keyword | name(MAX),,[PWG5101.1] +media-back-coating,none,type2 keyword | name(MAX),,[PWG5101.1] +media-back-coating,satin,type2 keyword | name(MAX),,[PWG5101.1] +media-back-coating,semi-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-back-coating-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.3] +media-back-coating-supported,"<Any ""media-back-coating"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.3] +media-color,,type2 keyword | name(MAX),,[PWG5100.7] +media-color,black,type2 keyword | name(MAX),,[PWG5101.1] +media-color,blue,type2 keyword | name(MAX),,[PWG5101.1] +media-color,brown,type2 keyword | name(MAX),,[PWG5101.1] +media-color,buff,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-black,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-blue,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-brown,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-buff,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-cyan,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-gold,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-goldenrod,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-gray,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-green,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-ivory,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-magenta,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-multi-color,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-mustard,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-orange,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-pink,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-red,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-silver,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-turquoise,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-violet,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-white,type2 keyword | name(MAX),,[PWG5101.1] +media-color,clear-yellow,type2 keyword | name(MAX),,[PWG5101.1] +media-color,cyan,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-blue,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-brown,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-buff,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-cyan,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-gold,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-goldenrod,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-gray,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-green,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-ivory,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-magenta,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-mustard,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-orange,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-pink,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-red,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-silver,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-turquoise,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-violet,type2 keyword | name(MAX),,[PWG5101.1] +media-color,dark-yellow,type2 keyword | name(MAX),,[PWG5101.1] +media-color,gold,type2 keyword | name(MAX),,[PWG5101.1] +media-color,goldenrod,type2 keyword | name(MAX),,[PWG5101.1] +media-color,gray,type2 keyword | name(MAX),,[PWG5101.1] +media-color,green,type2 keyword | name(MAX),,[PWG5101.1] +media-color,ivory,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-black,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-blue,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-brown,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-buff,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-cyan,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-gold,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-goldenrod,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-gray,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-green,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-ivory,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-magenta,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-mustard,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-orange,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-pink,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-red,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-silver,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-turquoise,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-violet,type2 keyword | name(MAX),,[PWG5101.1] +media-color,light-yellow,type2 keyword | name(MAX),,[PWG5101.1] +media-color,magenta,type2 keyword | name(MAX),,[PWG5101.1] +media-color,multi-color,type2 keyword | name(MAX),,[PWG5101.1] +media-color,mustard,type2 keyword | name(MAX),,[PWG5101.1] +media-color,no-color,type2 keyword | name(MAX),,[PWG5101.1] +media-color,orange,type2 keyword | name(MAX),,[PWG5101.1] +media-color,pink,type2 keyword | name(MAX),,[PWG5101.1] +media-color,red,type2 keyword | name(MAX),,[PWG5101.1] +media-color,silver,type2 keyword | name(MAX),,[PWG5101.1] +media-color,turquoise,type2 keyword | name(MAX),,[PWG5101.1] +media-color,violet,type2 keyword | name(MAX),,[PWG5101.1] +media-color,white,type2 keyword | name(MAX),,[PWG5101.1] +media-color,yellow,type2 keyword | name(MAX),,[PWG5101.1] +media-color-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.3] +media-color-supported,"<Any ""media-color"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.3] +media-default,,no-value | type2 keyword | name(MAX),,[RFC8011] +media-default,"<Any ""media"" value>",no-value | type2 keyword | name(MAX),,[RFC8011] +media-front-coating,,type2 keyword | name(MAX),,[PWG5100.7] +media-front-coating,"<Any ""media-back-coating"" value>",type2 keyword | name(MAX),,[PWG5100.7] +media-front-coating-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +media-front-coating-supported,"<Any ""media-back-coating"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +media-grain,,type2 keyword | name(MAX),,[PWG5100.7] +media-grain,x-direction,type2 keyword | name(MAX),,[PWG5100.7] +media-grain,y-direction,type2 keyword | name(MAX),,[PWG5100.7] +media-grain-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +media-grain-supported,"<Any ""media-grain"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +media-input-tray-check,,type2 keyword | name(MAX),,[PWG5100.3] +media-input-tray-check,"<Any ""media"" input tray value>",type2 keyword | name(MAX),,[PWG5100.3] +media-pre-printed,,type2 keyword | name(MAX),,[PWG5100.7] +media-pre-printed,blank,type2 keyword | name(MAX),,[PWG5100.7] +media-pre-printed,letter-head,type2 keyword | name(MAX),,[PWG5100.7] +media-pre-printed,pre-printed,type2 keyword | name(MAX),,[PWG5100.7] +media-pre-printed-supported,,type2 keyword | name(MAX),,[PWG5100.7] +media-pre-printed-supported,"<Any ""media-pre-printed"" value>",type2 keyword | name(MAX),,[PWG5100.7] +media-ready,,1setOf (type2 keyword | name(MAX)),,[RFC8011] +media-ready,"<Any ""media"" media or size value>",1setOf (type2 keyword | name(MAX)),,[RFC8011] +media-recycled,,type2 keyword | name(MAX),,[PWG5100.7] +media-recycled,none,type2 keyword | name(MAX),,[PWG5100.7] +media-recycled,standard,type2 keyword | name(MAX),,[PWG5100.7] +media-recycled-supported,,type2 keyword | name(MAX),,[PWG5100.7] +media-recycled-supported,"<Any ""media-recycled"" value>",type2 keyword | name(MAX),,[PWG5100.7] +media-source,,type2 keyword | name(MAX),,[PWG5100.7] +media-source,alternate,type2 keyword | name(MAX),,[PWG5100.7] +media-source,alternate-roll,type2 keyword | name(MAX),,[PWG5100.7] +media-source,auto,type2 keyword | name(MAX),,[PWG5100.7] +media-source,bottom,type2 keyword | name(MAX),,[PWG5100.7] +media-source,by-pass-tray,type2 keyword | name(MAX),,[PWG5100.7] +media-source,center,type2 keyword | name(MAX),,[PWG5100.7] +media-source,disc,type2 keyword | name(MAX),,[PWG5100.7] +media-source,envelope,type2 keyword | name(MAX),,[PWG5100.7] +media-source,hagaki,type2 keyword | name(MAX),,[PWG5100.7] +media-source,large-capacity,type2 keyword | name(MAX),,[PWG5100.7] +media-source,left,type2 keyword | name(MAX),,[PWG5100.7] +media-source,main,type2 keyword | name(MAX),,[PWG5100.7] +media-source,main-roll,type2 keyword | name(MAX),,[PWG5100.7] +media-source,manual,type2 keyword | name(MAX),,[PWG5100.7] +media-source,middle,type2 keyword | name(MAX),,[PWG5100.7] +media-source,photo,type2 keyword | name(MAX),,[PWG5100.7] +media-source,rear,type2 keyword | name(MAX),,[PWG5100.7] +media-source,right,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-1,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-2,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-3,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-4,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-5,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-6,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-7,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-8,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-9,type2 keyword | name(MAX),,[PWG5100.7] +media-source,roll-10,type2 keyword | name(MAX),,[PWG5100.7] +media-source,side,type2 keyword | name(MAX),,[PWG5100.7] +media-source,top,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-1,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-2,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-3,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-4,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-5,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-6,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-7,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-8,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-9,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-10,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-11,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-12,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-13,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-14,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-15,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-16,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-17,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-18,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-19,type2 keyword | name(MAX),,[PWG5100.7] +media-source,tray-20,type2 keyword | name(MAX),,[PWG5100.7] +media-source-feed-direction,,type2 keyword,,[PWG5100.7] +media-source-feed-direction,"<Any ""feed-orientation"" value>",type2 keyword,,[PWG5100.7] +media-source-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +media-source-supported,"<Any ""media-source"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +media-supported,,1setOf (type2 keyword | name(MAX)),,[RFC8011] +media-supported,"<Any ""media"" value>",1setOf (type2 keyword | name(MAX)),,[RFC8011] +media-tooth,,type2 keyword | name(MAX),,[PWG5100.7] +media-tooth,antique,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth,calendared,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth,coarse,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth,fine,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth,linen,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth,medium,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth,smooth,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth,stipple,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth,uncalendared,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth,vellum,type2 keyword | name(MAX),,[PWG5101.1] +media-tooth-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +media-tooth-supported,"<Any ""media-tooth"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +media-type,,type2 keyword | name(MAX),,[PWG5100.7] +media-type,aluminum,type2 keyword | name(MAX),,[PWG5101.1] +media-type,auto,type2 keyword | name(MAX),,[PWG5101.1] +media-type,back-print-film,type2 keyword | name(MAX),,[PWG5101.1] +media-type,cardboard,type2 keyword | name(MAX),,[PWG5101.1] +media-type,cardstock,type2 keyword | name(MAX),,[PWG5101.1] +media-type,cd,type2 keyword | name(MAX),,[PWG5101.1] +media-type,continuous,type2 keyword | name(MAX),,[PWG5101.1] +media-type,continuous-long,type2 keyword | name(MAX),,[PWG5101.1] +media-type,continuous-short,type2 keyword | name(MAX),,[PWG5101.1] +media-type,corrugated-board,type2 keyword | name(MAX),,[PWG5101.1] +media-type,disc,type2 keyword | name(MAX),,[PWG5101.1] +media-type,disc-glossy,type2 keyword | name(MAX),,[PWG5101.1] +media-type,disc-high-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,disc-matte,type2 keyword | name(MAX),,[PWG5101.1] +media-type,disc-satin,type2 keyword | name(MAX),,[PWG5101.1] +media-type,disc-semi-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,double-wall,type2 keyword | name(MAX),,[PWG5101.1] +media-type,dry-film,type2 keyword | name(MAX),,[PWG5101.1] +media-type,dvd,type2 keyword | name(MAX),,[PWG5101.1] +media-type,embossing-foil,type2 keyword | name(MAX),,[PWG5101.1] +media-type,end-board,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-archival,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-bond,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-coated,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-cotton,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-fine,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-heavyweight,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-inkjet,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-lightweight,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-plain,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-preprinted,type2 keyword | name(MAX),,[PWG5101.1] +media-type,envelope-window,type2 keyword | name(MAX),,[PWG5101.1] +media-type,fabric,type2 keyword | name(MAX),,[PWG5101.1] +media-type,fabric-archival,type2 keyword | name(MAX),,[PWG5101.1] +media-type,fabric-glossy,type2 keyword | name(MAX),,[PWG5101.1] +media-type,fabric-high-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,fabric-matte,type2 keyword | name(MAX),,[PWG5101.1] +media-type,fabric-semi-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,fabric-waterproof,type2 keyword | name(MAX),,[PWG5101.1] +media-type,film,type2 keyword | name(MAX),,[PWG5101.1] +media-type,flexo-base,type2 keyword | name(MAX),,[PWG5101.1] +media-type,flexo-photo-polymer,type2 keyword | name(MAX),,[PWG5101.1] +media-type,flute,type2 keyword | name(MAX),,[PWG5101.1] +media-type,foil,type2 keyword | name(MAX),,[PWG5101.1] +media-type,full-cut-tabs,type2 keyword | name(MAX),,[PWG5101.1] +media-type,glass,type2 keyword | name(MAX),,[PWG5101.1] +media-type,glass-colored,type2 keyword | name(MAX),,[PWG5101.1] +media-type,glass-opaque,type2 keyword | name(MAX),,[PWG5101.1] +media-type,glass-surfaced,type2 keyword | name(MAX),,[PWG5101.1] +media-type,glass-textured,type2 keyword | name(MAX),,[PWG5101.1] +media-type,gravure-cylinder,type2 keyword | name(MAX),,[PWG5101.1] +media-type,image-setter-paper,type2 keyword | name(MAX),,[PWG5101.1] +media-type,imaging-cylinder,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels-colored,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels-glossy,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels-high-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels-inkjet,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels-matte,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels-permanent,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels-satin,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels-security,type2 keyword | name(MAX),,[PWG5101.1] +media-type,labels-semi-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,laminating-foil,type2 keyword | name(MAX),,[PWG5101.1] +media-type,letterhead,type2 keyword | name(MAX),,[PWG5101.1] +media-type,metal,type2 keyword | name(MAX),,[PWG5101.1] +media-type,metal-glossy,type2 keyword | name(MAX),,[PWG5101.1] +media-type,metal-high-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,metal-matte,type2 keyword | name(MAX),,[PWG5101.1] +media-type,metal-satin,type2 keyword | name(MAX),,[PWG5101.1] +media-type,metal-semi-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,mounting-tape,type2 keyword | name(MAX),,[PWG5101.1] +media-type,multi-layer,type2 keyword | name(MAX),,[PWG5101.1] +media-type,multi-part-form,type2 keyword | name(MAX),,[PWG5101.1] +media-type,other,type2 keyword | name(MAX),,[PWG5101.1] +media-type,paper,type2 keyword | name(MAX),,[PWG5101.1] +media-type,photographic,type2 keyword | name(MAX),,[PWG5101.1] +media-type,photographic-archival,type2 keyword | name(MAX),,[PWG5101.1] +media-type,photographic-film,type2 keyword | name(MAX),,[PWG5101.1] +media-type,photographic-glossy,type2 keyword | name(MAX),,[PWG5101.1] +media-type,photographic-high-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,photographic-matte,type2 keyword | name(MAX),,[PWG5101.1] +media-type,photographic-satin,type2 keyword | name(MAX),,[PWG5101.1] +media-type,photographic-semi-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,plastic,type2 keyword | name(MAX),,[PWG5101.1] +media-type,plastic-archival,type2 keyword | name(MAX),,[PWG5101.1] +media-type,plastic-colored,type2 keyword | name(MAX),,[PWG5101.1] +media-type,plastic-glossy,type2 keyword | name(MAX),,[PWG5101.1] +media-type,plastic-high-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,plastic-matte,type2 keyword | name(MAX),,[PWG5101.1] +media-type,plastic-satin,type2 keyword | name(MAX),,[PWG5101.1] +media-type,plastic-semi-gloss,type2 keyword | name(MAX),,[PWG5101.1] +media-type,plate,type2 keyword | name(MAX),,[PWG5101.1] +media-type,polyester,type2 keyword | name(MAX),,[PWG5101.1] +media-type,pre-cut-tabs,type2 keyword | name(MAX),,[PWG5101.1] +media-type,roll,type2 keyword | name(MAX),,[PWG5101.1] +media-type,screen,type2 keyword | name(MAX),,[PWG5101.1] +media-type,screen-paged,type2 keyword | name(MAX),,[PWG5101.1] +media-type,self-adhesive,type2 keyword | name(MAX),,[PWG5101.1] +media-type,self-adhesive-film,type2 keyword | name(MAX),,[PWG5101.1] +media-type,shrink-foil,type2 keyword | name(MAX),,[PWG5101.1] +media-type,single-face,type2 keyword | name(MAX),,[PWG5101.1] +media-type,single-wall,type2 keyword | name(MAX),,[PWG5101.1] +media-type,sleeve,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-archival,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-coated,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-cotton,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-fine,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-heavyweight,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-heavyweight-coated,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-inkjet,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-letterhead,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-lightweight,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-preprinted,type2 keyword | name(MAX),,[PWG5101.1] +media-type,stationery-prepunched,type2 keyword | name(MAX),,[PWG5101.1] +media-type,tab-stock,type2 keyword | name(MAX),,[PWG5101.1] +media-type,tractor,type2 keyword | name(MAX),,[PWG5101.1] +media-type,transfer,type2 keyword | name(MAX),,[PWG5101.1] +media-type,transparency,type2 keyword | name(MAX),,[PWG5101.1] +media-type,triple-wall,type2 keyword | name(MAX),,[PWG5101.1] +media-type,wet-film,type2 keyword | name(MAX),,[PWG5101.1] +media-type-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +media-type-supported,"<Any ""media-type"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.7] +multiple-document-handling,,type2 keyword,,[RFC8011] +multiple-document-handling,separate-documents-collated-copies,type2 keyword,,[RFC8011] +multiple-document-handling,separate-documents-uncollated-copies,type2 keyword,,[RFC8011] +multiple-document-handling,single-document,type2 keyword,,[RFC8011] +multiple-document-handling,single-document-new-sheet,type2 keyword,,[RFC8011] +multiple-document-handling-default,,type2 keyword,,[RFC8011] +multiple-document-handling-default,"<Any ""multiple-document-handling"" value>",type2 keyword,,[RFC8011] +multiple-document-handling-supported,,1setOf (type2 keyword),,[RFC8011] +multiple-document-handling-supported,"<Any ""multiple-document-handling"" value>",1setOf (type2 keyword),,[RFC8011] +multiple-object-handling,,type2 keyword,,[PWG5100.21] +multiple-object-handling,auto,type2 keyword,,[PWG5100.21] +multiple-object-handling,best-fit,type2 keyword,,[PWG5100.21] +multiple-object-handling,best-quality,type2 keyword,,[PWG5100.21] +multiple-object-handling,best-speed,type2 keyword,,[PWG5100.21] +multiple-object-handling,one-at-a-time,type2 keyword,,[PWG5100.21] +multiple-object-handling-actual,,1setOf type2 keyword,,[PWG5100.21] +multiple-object-handling-actual,< any multiple-object-handling Job Template attribute value >,1setOf type2 keyword,,[PWG5100.21] +multiple-object-handling-default,,type2 keyword,,[PWG5100.21] +multiple-object-handling-default,< any multiple-object-handling Job Template attribute value >,type2 keyword,,[PWG5100.21] +multiple-object-handling-supported,,1setOf type2 keyword,,[PWG5100.21] +multiple-object-handling-supported,< any multiple-object-handling Job Template attribute value >,1setOf type2 keyword,,[PWG5100.21] +multiple-operation-time-out-action,,type2 keyword,,[PWG5100.13] +multiple-operation-time-out-action,abort-job,type2 keyword,,[PWG5100.13] +multiple-operation-time-out-action,hold-job,type2 keyword,,[PWG5100.13] +multiple-operation-time-out-action,process-job,type2 keyword,,[PWG5100.13] +notify-events,,1setOf type2 keyword,,[RFC3995] +notify-events,document-completed,1setOf type2 keyword,,[PWG5100.18] +notify-events,document-config-changed,1setOf type2 keyword,,[PWG5100.18] +notify-events,document-created,1setOf type2 keyword,,[PWG5100.18] +notify-events,document-fetchable,1setOf type2 keyword,,[PWG5100.18] +notify-events,document-state-changed,1setOf type2 keyword,,[PWG5100.18] +notify-events,document-stopped,1setOf type2 keyword,,[PWG5100.18] +notify-events,job-completed,1setOf type2 keyword,Job Events,[RFC3995] +notify-events,job-config-changed,1setOf type2 keyword,Job Events,[RFC3995] +notify-events,job-created,1setOf type2 keyword,Job Events,[RFC3995] +notify-events,job-fetchable,1setOf type2 keyword,,[PWG5100.18] +notify-events,job-progress,1setOf type2 keyword,Job Events,[RFC3995] +notify-events,job-state-changed,1setOf type2 keyword,Job Events,[RFC3995] +notify-events,job-stopped,1setOf type2 keyword,Job Events,[RFC3995] +notify-events,none,1setOf type2 keyword,No Events,[RFC3995] +notify-events,printer-config-changed,1setOf type2 keyword,Printer Events,[RFC3995] +notify-events,printer-created,1setOf type2 keyword,,[PWG5100.22] +notify-events,printer-deleted,1setOf type2 keyword,,[PWG5100.22] +notify-events,printer-finishings-changed,1setOf type2 keyword,Printer Events,[RFC3995] +notify-events,printer-media-changed,1setOf type2 keyword,Printer Events,[RFC3995] +notify-events,printer-queue-order-changed,1setOf type2 keyword,Printer Events,[RFC3995] +notify-events,printer-restarted,1setOf type2 keyword,Printer Events,[RFC3995] +notify-events,printer-shutdown,1setOf type2 keyword,Printer Events,[RFC3995] +notify-events,printer-state-changed,1setOf type2 keyword,Printer Events,[RFC3995] +notify-events,printer-stopped,1setOf type2 keyword,Printer Events,[RFC3995] +notify-events,resource-canceled,1setOf type2 keyword,,[PWG5100.22] +notify-events,resource-config-changed,1setOf type2 keyword,,[PWG5100.22] +notify-events,resource-created,1setOf type2 keyword,,[PWG5100.22] +notify-events,resource-installed,1setOf type2 keyword,,[PWG5100.22] +notify-events,resource-state-changed,1setOf type2 keyword,,[PWG5100.22] +notify-events,system-config-changed,1setOf type2 keyword,,[PWG5100.22] +notify-events,system-restarted,1setOf type2 keyword,,[PWG5100.22] +notify-events,system-shutdown,1setOf type2 keyword,,[PWG5100.22] +notify-events,system-state-changed,1setOf type2 keyword,,[PWG5100.22] +notify-events,system-stopped,1setOf type2 keyword,,[PWG5100.22] +notify-events-default,,1setOf type2 keyword,,[RFC3995] +notify-events-default,"<Any ""notify-events"" value>",1setOf type2 keyword,,[RFC3995] +notify-events-supported,,1setOf type2 keyword,,[RFC3995] +notify-events-supported,"<Any ""notify-events"" value>",1setOf type2 keyword,,[RFC3995] +notify-pull-method,,type2 keyword,,[RFC3995] +notify-pull-method,ippget,type2 keyword,,[RFC3996] +notify-pull-method-supported,,1setOf type2 keyword,,[RFC3995] +notify-pull-method-supported,"<Any ""notify-pull-method"" value>",1setOf type2 keyword,,[RFC3995] +notify-subscribed-event,,type2 keyword,,[RFC3995] +notify-subscribed-event,"<Any ""notify-events"" value>",type2 keyword,,[RFC3995] +output-bin,,type2 keyword,,[PWG5100.2] +output-bin,auto,type2 keyword,,[APPLE-OUTPUT-BIN] +output-bin,bottom,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,center,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,face-down,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,face-up,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,large-capacity,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,left,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-1,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-2,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-3,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-4,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-5,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-6,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-7,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-8,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-9,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,mailbox-10,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,middle,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,my-mailbox,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,rear,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,right,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,side,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-1,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-2,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-3,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-4,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-5,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-6,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-7,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-8,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-9,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,stacker-10,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,top,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-1,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-2,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-3,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-4,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-5,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-6,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-7,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-8,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-9,type2 keyword | name(MAX),,[PWG5100.2] +output-bin,tray-10,type2 keyword | name(MAX),,[PWG5100.2] +output-bin-default,,type2 keyword | name(MAX),,[PWG5100.2] +output-bin-default,"<Any ""output-bin"" value>",type2 keyword | name(MAX),,[PWG5100.2] +output-bin-supported,,1setof (type2 keyword | name(MAX)),,[PWG5100.2] +output-bin-supported,"<Any ""output-bin"" value>",1setof (type2 keyword | name(MAX)),,[PWG5100.2] +page-delivery,,type2 keyword,,[PWG5100.3] +page-delivery,reverse-order-face-down,type2 keyword,,[PWG5100.3] +page-delivery,reverse-order-face-up,type2 keyword,,[PWG5100.3] +page-delivery,same-order-face-down,type2 keyword,,[PWG5100.3] +page-delivery,same-order-face-up,type2 keyword,,[PWG5100.3] +page-delivery,system-specified,type2 keyword,,[PWG5100.3] +page-delivery-default,,type2 keyword,,[PWG5100.3] +page-delivery-default,"<Any ""page-delivery"" value>",type2 keyword,,[PWG5100.3] +page-delivery-supported,,1setOf type2 keyword,,[PWG5100.3] +page-delivery-supported,"<Any ""page-delivery"" value>",1setOf type2 keyword,,[PWG5100.3] +page-order-received,,type2 keyword,,[PWG5100.3] +page-order-received,1-to-n-order,type2 keyword,,[PWG5100.3] +page-order-received,n-to-1-order,type2 keyword,,[PWG5100.3] +page-order-received-default,,type2 keyword,,[PWG5100.3] +page-order-received-default,"<Any ""page-order-received"" value>",type2 keyword,,[PWG5100.3] +page-order-received-supported,,1setOf type2 keyword,,[PWG5100.3] +page-order-received-supported,"<Any ""page-order-received"" value>",1setOf type2 keyword,,[PWG5100.3] +pclm-raster-back-side,,keyword,,[HP20180907] +pclm-raster-back-side,flipped,keyword,,[HP20180907] +pclm-raster-back-side,normal,keyword,,[HP20180907] +pclm-raster-back-side,rotated,keyword,,[HP20180907] +pdf-features-supported,,1setOf type2 keyword,,[PWG5100.21] +pdf-features-supported,prc,1setOf type2 keyword,,[PWG5100.21] +pdf-features-supported,u3d,1setOf type2 keyword,,[PWG5100.21] +pdf-versions-supported,,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,adobe-1.3,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,adobe-1.4,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,adobe-1.5,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,adobe-1.6,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-15930-1_2001,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-15930-3_2002,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-15930-4_2003,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-15930-6_2003,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-15930-7_2010,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-15930-8_2010,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-16612-2_2010,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-19005-1_2005,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-19005-2_2011,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-19005-3_2012,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,iso-32000-1_2008,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,none,1setOf type2 keyword,,[PWG5100.16] +pdf-versions-supported,pwg-5102.3,1setOf type2 keyword,,[PWG5100.16] +pdl-init-file-supported,,1setOf type2 keyword,,[PWG5100.11] +pdl-init-file-supported,pdl-init-file-entry,1setOf type2 keyword,,[PWG5100.11] +pdl-init-file-supported,pdl-init-file-location,1setOf type2 keyword,,[PWG5100.11] +pdl-init-file-supported,pdl-init-file-name,1setOf type2 keyword,,[PWG5100.11] +pdl-override-supported,,type2 keyword,,[RFC8011] +pdl-override-supported,attempted,type2 keyword,,[RFC8011] +pdl-override-supported,guaranteed,type2 keyword,,[PWG5100.11] +pdl-override-supported,not-attempted,type2 keyword,,[RFC8011] +platform-shape,,type2 keyword,,[APPLE20170629] +platform-shape,ellipse,type2 keyword,,[APPLE20170629] +platform-shape,rectangle,type2 keyword,,[APPLE20170629] +presentation-direction-number-up,,type2 keyword,,[PWG5100.3] +presentation-direction-number-up,tobottom-toleft,type2 keyword,,[PWG5100.3] +presentation-direction-number-up,tobottom-toright,type2 keyword,,[PWG5100.3] +presentation-direction-number-up,toleft-tobottom,type2 keyword,,[PWG5100.3] +presentation-direction-number-up,toleft-totop,type2 keyword,,[PWG5100.3] +presentation-direction-number-up,toright-tobottom,type2 keyword,,[PWG5100.3] +presentation-direction-number-up,toright-totop,type2 keyword,,[PWG5100.3] +presentation-direction-number-up,totop-toleft,type2 keyword,,[PWG5100.3] +presentation-direction-number-up,totop-toright,type2 keyword,,[PWG5100.3] +presentation-direction-number-up-default,,type2 keyword,,[PWG5100.3] +presentation-direction-number-up-default,"<Any ""presentation-direction-number-up"" value>",type2 keyword,,[PWG5100.3] +presentation-direction-number-up-supported,,1setOf type2 keyword,,[PWG5100.3] +presentation-direction-number-up-supported,"<Any ""presentation-direction-number-up"" value>",1setOf type2 keyword,,[PWG5100.3] +print-base,,type2 keyword,,[PWG5100.21] +print-base,brim,type2 keyword,,[PWG5100.21] +print-base,none,type2 keyword,,[PWG5100.21] +print-base,raft,type2 keyword,,[PWG5100.21] +print-base,skirt,type2 keyword,,[PWG5100.21] +print-base,standard,type2 keyword,,[PWG5100.21] +print-base-actual,,1setOf type2 keyword,,[PWG5100.21] +print-base-actual,< any print-base Job Template attribute value >,1setOf type2 keyword,,[PWG5100.21] +print-base-default,,type2 keyword,,[PWG5100.21] +print-base-default,< any print-base Job Template attribute value >,type2 keyword,,[PWG5100.21] +print-base-supported,,1setOf type2 keyword,,[PWG5100.21] +print-base-supported,< any print-base Job Template attribute value >,1setOf type2 keyword,,[PWG5100.21] +print-color-mode,,type2 keyword,,[PWG5100.13] +print-color-mode,auto,type2 keyword,,[PWG5100.13] +print-color-mode,auto-monochrome,type2 keyword,,[APPLE20171101] +print-color-mode,bi-level,type2 keyword,,[PWG5100.13] +print-color-mode,color,type2 keyword,,[PWG5100.13] +print-color-mode,highlight,type2 keyword,,[PWG5100.13] +print-color-mode,monochrome,type2 keyword,,[PWG5100.13] +print-color-mode,process-bi-level,type2 keyword,,[PWG5100.13] +print-color-mode,process-monochrome,type2 keyword,,[PWG5100.13] +print-color-mode-default,,type2 keyword,,[PWG5100.13] +print-color-mode-default,"<Any ""print-color-mode"" value>",type2 keyword,,[PWG5100.13] +print-color-mode-supported,,1setOf type2 keyword,,[PWG5100.13] +print-color-mode-supported,"<Any ""print-color-mode"" value>",1setOf type2 keyword,,[PWG5100.13] +print-content-optimize,,type2 keyword,,[PWG5100.7] +print-content-optimize,auto,type2 keyword,,[PWG5100.13] +print-content-optimize,graphic,type2 keyword,,[PWG5100.7] +print-content-optimize,photo,type2 keyword,,[PWG5100.7] +print-content-optimize,text,type2 keyword,,[PWG5100.7] +print-content-optimize,text-and-graphic,type2 keyword,,[PWG5100.7] +print-content-optimize-actual,,1setOf type2 keyword,,[PWG5100.7] +print-content-optimize-actual,"<Any ""print-content-optimize"" value>",1setOf type2 keyword,,[PWG5100.7] +print-content-optimize-default,,type2 keyword,,[PWG5100.7] +print-content-optimize-default,"<Any ""print-content-optimize"" value>",type2 keyword,,[PWG5100.7] +print-content-optimize-supported,,1setOf type2 keyword,,[PWG5100.7] +print-content-optimize-supported,"<Any ""print-content-optimize"" value>",1setOf type2 keyword,,[PWG5100.7] +print-objects-supported,,1setOf type2 keyword,,[PWG5100.21] +print-objects-supported,< any print-objects member attribute name >,1setOf type2 keyword,,[PWG5100.21] +print-rendering-intent,,type2 keyword,,[PWG5100.13] +print-rendering-intent,absolute,type2 keyword,,[PWG5100.13] +print-rendering-intent,auto,type2 keyword,,[PWG5100.13] +print-rendering-intent,perceptual,type2 keyword,,[PWG5100.13] +print-rendering-intent,relative,type2 keyword,,[PWG5100.13] +print-rendering-intent,relative-bpc,type2 keyword,,[PWG5100.13] +print-rendering-intent,saturation,type2 keyword,,[PWG5100.13] +print-rendering-intent-default,,type2 keyword,,[PWG5100.13] +print-rendering-intent-default,"<Any ""print-rendering-intent"" value>",type2 keyword,,[PWG5100.13] +print-rendering-intent-supported,,1setOf type2 keyword,,[PWG5100.13] +print-rendering-intent-supported,"<Any ""print-rendering-intent"" value>",1setOf type2 keyword,,[PWG5100.13] +print-scaling,,type2 keyword,,[PWG5100.16] +print-scaling,auto,type2 keyword,,[PWG5100.16] +print-scaling,auto-fit,type2 keyword,,[PWG5100.16] +print-scaling,fill,type2 keyword,,[PWG5100.16] +print-scaling,fit,type2 keyword,,[PWG5100.16] +print-scaling,none,type2 keyword,,[PWG5100.16] +print-supports,,type2 keyword,,[PWG5100.21] +print-supports,material,type2 keyword,,[PWG5100.21] +print-supports,none,type2 keyword,,[PWG5100.21] +print-supports,standard,type2 keyword,,[PWG5100.21] +print-supports-actual,,1setOf type2 keyword,,[PWG5100.21] +print-supports-actual,< any print-supports Job Template attribute value >,1setOf type2 keyword,,[PWG5100.21] +print-supports-default,,type2 keyword,,[PWG5100.21] +print-supports-default,< any print-supports Job Template attribute value >,type2 keyword,,[PWG5100.21] +print-supports-supported,,1setOf type2 keyword,,[PWG5100.21] +print-supports-supported,< any print-supports Job Template attribute value >,1setOf type2 keyword,,[PWG5100.21] +printer-kind,,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-kind,disc,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-kind,document,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-kind,envelope,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-kind,label,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-kind,large-format,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-kind,photo,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-kind,postcard,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-kind,receipt,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-kind,roll,1setOf (type2 keyword | name(MAX)),,[PWG5100.16] +printer-service-type,,type2 keyword,,[PWG5100.22] +printer-service-type,copy,type2 keyword,,[PWG5100.22] +printer-service-type,faxin,type2 keyword,,[PWG5100.22] +printer-service-type,faxout,type2 keyword,,[PWG5100.22] +printer-service-type,print,type2 keyword,,[PWG5100.22] +printer-service-type,print3d,type2 keyword,,[PWG5100.22] +printer-service-type,scan,type2 keyword,,[PWG5100.22] +printer-service-type,transform,type2 keyword,,[PWG5100.22] +printer-state-reasons,,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,alert-removal-of-binary-change-entry,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,bander-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,binder-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,camera-failure,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,chamber-cooling,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,chamber-failure,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,chamber-heating,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,chamber-temperature-high,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,chamber-temperature-low,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,cleaner-life-almost-over,1setOf type2 keyword,,[PWG5100.13] +printer-state-reasons,cleaner-life-over,1setOf type2 keyword,,[PWG5100.13] +printer-state-reasons,configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,connecting-to-device,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,cover-open,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,deactivated,1setOf type2 keyword,,[RFC3998] +printer-state-reasons,deleted,1setOf type2 keyword,,[PWG5100.22] +printer-state-reasons,developer-empty,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,developer-low,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,die-cutter-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,die-cutter-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,door-open,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,extruder-cooling,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,extruder-failure,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,extruder-heating,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,extruder-jam,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,extruder-temperature-high,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,extruder-temperature-low,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,fan-failure,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,fax-modem-life-almost-over,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,fax-modem-life-over,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,fax-modem-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,fax-modem-turned-off,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,fax-modem-turned-on,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,folder-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,folder-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,fuser-over-temp,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,fuser-under-temp,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,hibernate,1setOf type2 keyword,,[PWG5106.4] +printer-state-reasons,hold-new-jobs,1setOf type2 keyword,,[RFC3998] +printer-state-reasons,identify-printer-requested,1setOf type2 keyword,,[PWG5100.18] +printer-state-reasons,imprinter-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,imprinter-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,input-cannot-feed-size-selected,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,input-manual-input-request,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,input-media-color-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,input-media-form-parts-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,input-media-size-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,input-media-tray-failure,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,input-media-tray-feed-error,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,input-media-tray-jam,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,input-media-type-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,input-media-weight-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,input-pick-roller-failure,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,input-pick-roller-life-over,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,input-pick-roller-life-warn,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,input-pick-roller-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,input-tray-elevation-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,input-tray-missing,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,input-tray-position-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,inserter-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,interlock-open,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,interpreter-cartridge-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,interpreter-cartridge-deleted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,interpreter-complex-page-encountered,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,interpreter-memory-decrease,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,interpreter-memory-increase,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,interpreter-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,interpreter-resource-deleted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,interpreter-resource-unavailable,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,lamp-at-eol,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,lamp-failure,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,lamp-near-eol,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,laser-at-eol,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,laser-failure,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,laser-near-eol,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,make-envelope-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,make-envelope-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-adjusting-print-quality,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-cleaner-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-developer-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-developer-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-developer-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-fuser-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-fuser-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-fuser-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-ink-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-ink-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-ink-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-opc-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-print-ribbon-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-print-ribbon-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-print-ribbon-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-supply-almost-empty,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-supply-empty,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,marker-supply-low,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,marker-supply-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-toner-cartridge-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-toner-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-waste-almost-full,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,marker-waste-full,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,marker-waste-ink-receptacle-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-waste-ink-receptacle-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-waste-ink-receptacle-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-waste-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,marker-waste-toner-receptacle-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-waste-toner-receptacle-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,marker-waste-toner-receptacle-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,material-empty,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,material-low,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,material-needed,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,media-drying,1setOf type2 keyword,,[HP20181213] +printer-state-reasons,media-empty,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,media-jam,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,media-low,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,media-needed,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,media-path-cannot-duplex-media-selected,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,media-path-failure,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-input-empty,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-input-feed-error,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-input-jam,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-input-request,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-jam,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-media-tray-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,media-path-media-tray-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,media-path-media-tray-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,media-path-output-feed-error,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-output-full,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-output-jam,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-pick-roller-failure,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-pick-roller-life-over,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-pick-roller-life-warn,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,media-path-pick-roller-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,motor-failure,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,moving-to-paused,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,none,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,opc-life-over,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,opc-near-eol,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,other,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,output-area-almost-full,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,output-area-full,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,output-mailbox-select-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,output-media-tray-failure,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,output-media-tray-feed-error,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,output-media-tray-jam,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,output-tray-missing,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,paused,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,perforater-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,perforater-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,platform-cooling,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,platform-failure,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,platform-heating,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,platform-temperature-high,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,platform-temperature-low,1setOf type2 keyword,,[PWG5100.21] +printer-state-reasons,power-down,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,power-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,printer-manual-reset,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,printer-nms-reset,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,printer-ready-to-print,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,puncher-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,resuming,1setOf type2 keyword,,[PWG5100.22] +printer-state-reasons,scan-media-path-failure,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-input-empty,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-input-feed-error,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-input-jam,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-input-request,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-jam,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-output-feed-error,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-output-full,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-output-jam,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-pick-roller-failure,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-pick-roller-life-over,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-pick-roller-life-warn,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-pick-roller-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-tray-almost-full,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-tray-full,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scan-media-path-tray-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scanner-light-failure,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scanner-light-life-almost-over,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scanner-light-life-over,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scanner-light-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scanner-sensor-failure,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scanner-sensor-life-almost-over,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scanner-sensor-life-over,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,scanner-sensor-missing,1setOf type2 keyword,,[PWG5107.3] +printer-state-reasons,separation-cutter-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,separation-cutter-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,sheet-rotator-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,shutdown,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,slitter-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,slitter-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,spool-area-full,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,stacker-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stacker-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,standby,1setOf type2 keyword,,[PWG5106.4] +printer-state-reasons,stapler-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stapler-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stitcher-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,stopped-partly,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,stopping,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,subunit-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-cooling-down,1setOf type2 keyword,,[HPINC20180215] +printer-state-reasons,subunit-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-timing-Failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-unrecoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,subunit-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,suspend,1setOf type2 keyword,,[PWG5106.4] +printer-state-reasons,testing,1setOf type2 keyword,,[PWG5100.22] +printer-state-reasons,timed-out,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,toner-empty,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,toner-low,1setOf type2 keyword,,[RFC8011] +printer-state-reasons,trimmer-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,trimmer-warming-up,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,unknown,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-almost-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-almost-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-at-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-configuration-change,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-cover-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-cover-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-empty,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-full,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-interlock-closed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-interlock-open,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-jam,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-life-almost-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-life-over,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-memory-exhausted,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-missing,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-motor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-near-limit,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-offline,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-opened,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-over-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-power-saver,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-recoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-recoverable-storage,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-resource-added,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-resource-removed,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-thermistor-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-timing-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-turned-off,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-turned-on,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-under-temperature,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-unrecoverable-failure,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-unrecoverable-storage-error,1setOf type2 keyword,,[PWG5100.9] +printer-state-reasons,wrapper-warming-up,1setOf type2 keyword,,[PWG5100.9] +punching-reference-edge,,type1 keyword,,[PWG5100.1] +punching-reference-edge,bottom,type1 keyword,,[PWG5100.1] +punching-reference-edge,left,type1 keyword,,[PWG5100.1] +punching-reference-edge,right,type1 keyword,,[PWG5100.1] +punching-reference-edge,top,type1 keyword,,[PWG5100.1] +punching-reference-edge-supported,,1setOf type1 keyword,,[PWG5100.1] +punching-reference-edge-supported,"<Any ""punching-reference-edge"" value>",1setOf type1 keyword,,[PWG5100.1] +pwg-raster-document-sheet-back,,type2 keyword,,[PWG5102.4] +pwg-raster-document-sheet-back,flipped,type2 keyword,,[PWG5102.4] +pwg-raster-document-sheet-back,manual-tumble,type2 keyword,,[PWG5102.4] +pwg-raster-document-sheet-back,normal,type2 keyword,,[PWG5102.4] +pwg-raster-document-sheet-back,rotated,type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,adobe-rgb_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,adobe-rgb_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,black_1,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,black_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,black_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,cmyk_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,cmyk_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device1_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device1_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device2_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device2_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device3_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device3_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device4_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device4_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device5_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device5_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device6_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device6_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device7_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device7_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device8_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device8_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device9_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device9_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device10_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device10_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device11_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device11_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device12_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device12_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device13_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device13_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device14_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device14_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device15_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,device15_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,rgb_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,rgb_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,sgray_1,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,sgray_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,sgray_16,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,srgb_8,1setOf type2 keyword,,[PWG5102.4] +pwg-raster-document-type-supported,srgb_16,1setOf type2 keyword,,[PWG5102.4] +requested-attributes,,1setOf type2 keyword,,[RFC8011] +requested-attributes,all,1setOf type2 keyword,,[RFC8011] +requested-attributes,document-description,1setOf type2 keyword,,[PWG5100.5] +requested-attributes,document-template,1setOf type2 keyword,,[PWG5100.5] +requested-attributes,job-actuals,1setOf type2 keyword,,[PWG5100.8] +requested-attributes,job-description,1setOf type2 keyword,,[RFC8011] +requested-attributes,job-template,1setOf type2 keyword,,[RFC8011] +requested-attributes,printer-description,1setOf type2 keyword,,[RFC8011] +requested-attributes,resource-description,1setOf type2 keyword,,[PWG5100.22] +requested-attributes,resource-status,1setOf type2 keyword,,[PWG5100.22] +requested-attributes,resource-template,1setOf type2 keyword,,[PWG5100.22] +requested-attributes,subscription-description,1setOf type2 keyword,,[RFC3995] +requested-attributes,subscription-template,1setOf type2 keyword,,[RFC3995] +requested-attributes,system-description,1setOf type2 keyword,,[PWG5100.22] +requested-attributes,system-status,1setOf type2 keyword,,[PWG5100.22] +resource-state-reasons,,1setOf type2 keyword,,[PWG5100.22] +resource-state-reasons,"< any ""job-state-reasons"" value >",1setOf type2 keyword,,[PWG5100.22] +resource-state-reasons,cancel-requested,1setOf type2 keyword,,[PWG5100.22] +resource-state-reasons,install-requested,1setOf type2 keyword,,[PWG5100.22] +resource-state-reasons,resource-incoming,1setOf type2 keyword,,[PWG5100.22] +resource-type,,type2 keyword,,[PWG5100.22] +resource-type,executable-firmware,type2 keyword,,[PWG5100.22] +resource-type,executable-software,type2 keyword,,[PWG5100.22] +resource-type,static-font,type2 keyword,,[PWG5100.22] +resource-type,static-form,type2 keyword,,[PWG5100.22] +resource-type,static-icc-profile,type2 keyword,,[PWG5100.22] +resource-type,static-image,type2 keyword,,[PWG5100.22] +resource-type,static-logo,type2 keyword,,[PWG5100.22] +resource-type,static-other,type2 keyword,,[PWG5100.22] +resource-type,static-strings,type2 keyword,,[PWG5100.22] +resource-type,template-document,type2 keyword,,[PWG5100.22] +resource-type,template-job,type2 keyword,,[PWG5100.22] +resource-type,template-printer,type2 keyword,,[PWG5100.22] +save-disposition,,type2 keyword,,[PWG5100.11] +save-disposition,none,type2 keyword,,[PWG5100.11] +save-disposition,print-save,type2 keyword,,[PWG5100.11] +save-disposition,save-only,type2 keyword,,[PWG5100.11] +save-disposition-supported,,1setOf type2 keyword,,[PWG5100.11] +save-disposition-supported,"<Any ""save-disposition"" value>",1setOf type2 keyword,,[PWG5100.11] +save-info-supported,,1setOf type2 keyword,,[PWG5100.11] +save-info-supported,save-document-format,1setOf type2 keyword,,[PWG5100.11] +save-info-supported,save-location,1setOf type2 keyword,,[PWG5100.11] +save-info-supported,save-name,1setOf type2 keyword,,[PWG5100.11] +separator-sheets-type,,type2 keyword | name(MAX),,[PWG5100.3] +separator-sheets-type,both-sheets,type2 keyword | name(MAX),,[PWG5100.3] +separator-sheets-type,end-sheet,type2 keyword | name(MAX),,[PWG5100.3] +separator-sheets-type,none,type2 keyword | name(MAX),,[PWG5100.3] +separator-sheets-type,slip-sheets,type2 keyword | name(MAX),,[PWG5100.3] +separator-sheets-type,start-sheet,type2 keyword | name(MAX),,[PWG5100.3] +separator-sheets-type-supported,,1setOf (type2 keyword | name(MAX)),,[PWG5100.3] +separator-sheets-type-supported,"<Any ""separator-sheets-type"" value>",1setOf (type2 keyword | name(MAX)),,[PWG5100.3] +sides,,type2 keyword,,[RFC8011] +sides,one-sided,type2 keyword,,[RFC8011] +sides,two-sided-long-edge,type2 keyword,,[RFC8011] +sides,two-sided-short-edge,type2 keyword,,[RFC8011] +sides-default,,type2 keyword,,[RFC8011] +sides-default,"<Any ""sides"" value>",type2 keyword,,[RFC8011] +sides-supported,,1setOf type2 keyword,,[RFC8011] +sides-supported,"<Any ""sides"" value>",1setOf type2 keyword,,[RFC8011] +stitching-method,,type2 keyword,,[PWG5100.1] +stitching-method,auto,type2 keyword,,[PWG5100.1] +stitching-method,crimp,type2 keyword,,[PWG5100.1] +stitching-method,wire,type2 keyword,,[PWG5100.1] +stitching-method-supported,,1setOf type2 keyword,,[PWG5100.1] +stitching-method-supported,"<Any ""stitching-method"" value>",1setOf type2 keyword,,[PWG5100.1] +stitching-reference-edge,,type2 keyword,,[PWG5100.3] +stitching-reference-edge,bottom,type2 keyword,,[PWG5100.3] +stitching-reference-edge,left,type2 keyword,,[PWG5100.3] +stitching-reference-edge,right,type2 keyword,,[PWG5100.3] +stitching-reference-edge,top,type2 keyword,,[PWG5100.3] +stitching-reference-edge-supported,,1setOf type2 keyword,,[PWG5100.3] +stitching-reference-edge-supported,"<Any ""stitching-reference-edge"" value>",1setOf type2 keyword,,[PWG5100.3] +stitching-supported,,1setOf type2 keyword,,[PWG5100.3] +stitching-supported,stitching-locations,1setOf type2 keyword,,[PWG5100.3] +stitching-supported,stitching-offset,1setOf type2 keyword,,[PWG5100.3] +stitching-supported,stitching-reference-edge,1setOf type2 keyword,,[PWG5100.3] +subscription-privacy-attributes,,1setOf type2 keyword,,[IPPPRIVACY10] +subscription-privacy-attributes,< any Subscription object attribute >,1setOf type2 keyword,,[IPPPRIVACY10] +subscription-privacy-attributes,all,1setOf type2 keyword,,[IPPPRIVACY10] +subscription-privacy-attributes,default,1setOf type2 keyword,,[IPPPRIVACY10] +subscription-privacy-attributes,none,1setOf type2 keyword,,[IPPPRIVACY10] +subscription-privacy-attributes,subscription-description,1setOf type2 keyword,,[IPPPRIVACY10] +subscription-privacy-attributes,subscription-template,1setOf type2 keyword,,[IPPPRIVACY10] +subscription-privacy-scope,,type2 keyword,,[IPPPRIVACY10] +subscription-privacy-scope,all,type2 keyword,,[IPPPRIVACY10] +subscription-privacy-scope,default,type2 keyword,,[IPPPRIVACY10] +subscription-privacy-scope,none,type2 keyword,,[IPPPRIVACY10] +subscription-privacy-scope,owner,type2 keyword,,[IPPPRIVACY10] +system-state-reasons,,1setOf type2 keyword,,[PWG5100.22] +system-state-reasons,"< any ""printer-state-reasons"" value >",1setOf type2 keyword,,[PWG5100.22] +system-time-source,,type2 keyword | name(MAX),,[PWG5100.22] +system-time-source,dhcp,type2 keyword | name(MAX),,[PWG5100.22] +system-time-source,ntp,type2 keyword | name(MAX),,[PWG5100.22] +system-time-source,onboard,type2 keyword | name(MAX),,[PWG5100.22] +system-time-source,sntp,type2 keyword | name(MAX),,[PWG5100.22] +timeout-predicate,,type2 keyword,,[PWG5100.22] +timeout-predicate,activity,type2 keyword,,[PWG5100.22] +timeout-predicate,inactivity,type2 keyword,,[PWG5100.22] +timeout-predicate,none,type2 keyword,,[PWG5100.22] +trimming-reference-edge,,type1 keyword,,[PWG5100.1] +trimming-reference-edge,bottom,type1 keyword,,[PWG5100.1] +trimming-reference-edge,left,type1 keyword,,[PWG5100.1] +trimming-reference-edge,right,type1 keyword,,[PWG5100.1] +trimming-reference-edge,top,type1 keyword,,[PWG5100.1] +trimming-reference-edge-supported,,1setOf type1 keyword,,[PWG5100.1] +trimming-reference-edge-supported,"<Any ""trimming-reference-edge"" value>",1setOf type1 keyword,,[PWG5100.1] +trimming-type,,type2 keyword | name(MAX),,[PWG5100.1] +trimming-type,draw-line,type2 keyword | name(MAX),,[IPPWG20160325] +trimming-type,full,type2 keyword | name(MAX),,[PWG5100.1] +trimming-type,partial,type2 keyword | name(MAX),,[PWG5100.1] +trimming-type,perforate,type2 keyword | name(MAX),,[PWG5100.1] +trimming-type,score,type2 keyword | name(MAX),,[PWG5100.1] +trimming-type,tab,type2 keyword | name(MAX),,[PWG5100.1] +trimming-type-supported,,1setOf type2 keyword,,[PWG5100.1] +trimming-type-supported,"<Any ""trimming-type value>",1setOf type2 keyword,,[PWG5100.1] +trimming-when,,type2 keyword,,[PWG5100.1] +trimming-when,after-documents,type2 keyword,,[PWG5100.1] +trimming-when,after-job,type2 keyword,,[PWG5100.1] +trimming-when,after-sets,type2 keyword,,[PWG5100.1] +trimming-when,after-sheets,type2 keyword,,[PWG5100.1] +trimming-when-supported,,1setOf type2 keyword,,[PWG5100.1] +trimming-when-supported,"<Any ""trimming-when"" value>",1setOf type2 keyword,,[PWG5100.1] +uri-authentication-supported,,1setOf type2 keyword,,[RFC8011] +uri-authentication-supported,basic,1setOf type2 keyword,,[RFC8011] +uri-authentication-supported,certificate,1setOf type2 keyword,,[RFC8011] +uri-authentication-supported,digest,1setOf type2 keyword,,[RFC8011] +uri-authentication-supported,negotiate,1setOf type2 keyword,,[PWG5100.13] +uri-authentication-supported,none,1setOf type2 keyword,,[RFC8011] +uri-authentication-supported,oauth,1setOf type2 keyword,,[PWG5100.18] +uri-authentication-supported,requesting-user-name,1setOf type2 keyword,,[RFC8011] +uri-security-supported,,1setOf type2 keyword,,[RFC8011] +uri-security-supported,none,1setOf type2 keyword,,[RFC8011] +uri-security-supported,ssl3,1setOf type2 keyword,,[RFC8011] +uri-security-supported,tls,1setOf type2 keyword,,[RFC8011] +which-jobs,,type2 keyword,,[RFC8011] +which-jobs,aborted,type2 keyword,,[PWG5100.11] +which-jobs,all,type2 keyword,,[PWG5100.11] +which-jobs,canceled,type2 keyword,,[PWG5100.11] +which-jobs,completed,type2 keyword,,[RFC8011] +which-jobs,fetchable,type2 keyword,,[PWG5100.18] +which-jobs,not-completed,type2 keyword,,[RFC8011] +which-jobs,pending,type2 keyword,,[PWG5100.11] +which-jobs,pending-held,type2 keyword,,[PWG5100.11] +which-jobs,processing,type2 keyword,,[PWG5100.11] +which-jobs,processing-stopped,type2 keyword,,[PWG5100.11] +which-jobs,proof-print,type2 keyword,,[PWG5100.11] +which-jobs,saved,type2 keyword,,[PWG5100.11] +which-jobs-supported,,1setOf type2 keyword,,[PWG5100.11] +which-jobs-supported,"<Any ""which-jobs"" value>",1setOf type2 keyword,,[PWG5100.11] +which-printers,,type2 keyword,,[PWG5100.22] +which-printers,all,type2 keyword,,[PWG5100.22] +which-printers,idle,type2 keyword,,[PWG5100.22] +which-printers,not-accepting,type2 keyword,,[PWG5100.22] +which-printers,processing,type2 keyword,,[PWG5100.22] +which-printers,shutdown,type2 keyword,,[PWG5100.22] +which-printers,stopped,type2 keyword,,[PWG5100.22] +which-printers,testing,type2 keyword,,[PWG5100.22] +x-image-position,,type2 keyword,,[PWG5100.3] +x-image-position,center,type2 keyword,,[PWG5100.3] +x-image-position,left,type2 keyword,,[PWG5100.3] +x-image-position,none,type2 keyword,,[PWG5100.3] +x-image-position,right,type2 keyword,,[PWG5100.3] +x-image-position-default,,type2 keyword,,[PWG5100.3] +x-image-position-default,"<Any ""x-image-position"" value>",type2 keyword,,[PWG5100.3] +x-image-position-supported,,1setOf type2 keyword,,[PWG5100.3] +x-image-position-supported,"<Any ""x-image-position"" value>",1setOf type2 keyword,,[PWG5100.3] +xri-authentication-supported,,1setOf type2 keyword,,[RFC3380] +xri-authentication-supported,basic,1setOf type2 keyword,,[RFC8011] +xri-authentication-supported,certificate,1setOf type2 keyword,,[RFC8011] +xri-authentication-supported,digest,1setOf type2 keyword,,[RFC8011] +xri-authentication-supported,negotiate,1setOf type2 keyword,,[PWG5100.13] +xri-authentication-supported,none,1setOf type2 keyword,,[RFC8011] +xri-authentication-supported,oauth,1setOf type2 keyword,,[PWG5100.18] +xri-authentication-supported,requesting-user-name,1setOf type2 keyword,,[RFC8011] +xri-security-supported,,1setOf type2 keyword,,[RFC3380] +xri-security-supported,none,1setOf type2 keyword,,[RFC8011] +xri-security-supported,ssl3,1setOf type2 keyword,,[RFC8011] +xri-security-supported,tls,1setOf type2 keyword,,[RFC8011] +y-image-position,,type2 keyword,,[PWG5100.3] +y-image-position,bottom,type2 keyword,,[PWG5100.3] +y-image-position,center,type2 keyword,,[PWG5100.3] +y-image-position,none,type2 keyword,,[PWG5100.3] +y-image-position,top,type2 keyword,,[PWG5100.3] +y-image-position-default,,type2 keyword,,[PWG5100.3] +y-image-position-default,"<Any ""y-image-position"" value>",type2 keyword,,[PWG5100.3] +y-image-position-supported,,1setOf type2 keyword,,[PWG5100.3] +y-image-position-supported,"<Any ""y-image-position"" value>",1setOf type2 keyword,,[PWG5100.3] diff --git a/chromium/printing/backend/tools/ipp-registrations-6.csv b/chromium/printing/backend/tools/ipp-registrations-6.csv new file mode 100644 index 00000000000..476a9b0026e --- /dev/null +++ b/chromium/printing/backend/tools/ipp-registrations-6.csv @@ -0,0 +1,306 @@ +Attribute,Value,Name,Syntax,Reference +document-state,,,type1 enum,[PWG5100.5] +document-state,3,pending,type1 enum,[PWG5100.5] +document-state,5,processing,type1 enum,[PWG5100.5] +document-state,6,processing-stopped,type1 enum,[PWG5100.18] +document-state,7,canceled,type1 enum,[PWG5100.5] +document-state,8,aborted,type1 enum,[PWG5100.5] +document-state,9,completed,type1 enum,[PWG5100.5] +end-power-state,,,type1 enum,[PWG5100.22] +end-power-state,"< any ""power-state"" value >",,type1 enum,[PWG5100.22] +fetch-status-code,,,type2 enum,[PWG5100.18] +fetch-status-code,"<All ""status-code"" value other than 'successful-ok'>",,type2 enum,[PWG5100.18] +finishings,,,1setOf type2 enum,[RFC8011] +finishings,3,none,1setOf type2 enum,[RFC8011] +finishings,4,staple,1setOf type2 enum,[RFC8011] +finishings,5,punch,1setOf type2 enum,[RFC8011] +finishings,6,cover,1setOf type2 enum,[RFC8011] +finishings,7,bind,1setOf type2 enum,[RFC8011] +finishings,8,saddle-stitch,1setOf type2 enum,[RFC8011] +finishings,9,edge-stitch,1setOf type2 enum,[RFC8011] +finishings,10,fold,1setOf type2 enum,[PWG5100.1] +finishings,11,trim,1setOf type2 enum,[PWG5100.1] +finishings,12,bale,1setOf type2 enum,[PWG5100.1] +finishings,13,booklet-maker,1setOf type2 enum,[PWG5100.1] +finishings,14,jog-offset,1setOf type2 enum,[PWG5100.1] +finishings,14,jog-offset(deprecated),1setOf type2 enum,[IPP-JOG-OFFSET] +finishings,15,coat,1setOf type2 enum,[PWG5100.1] +finishings,16,laminate,1setOf type2 enum,[PWG5100.1] +finishings,20,staple-top-left,1setOf type2 enum,[RFC8011] +finishings,21,staple-bottom-left,1setOf type2 enum,[RFC8011] +finishings,22,staple-top-right,1setOf type2 enum,[RFC8011] +finishings,23,staple-bottom-right,1setOf type2 enum,[RFC8011] +finishings,24,edge-stitch-left,1setOf type2 enum,[RFC8011] +finishings,25,edge-stitch-top,1setOf type2 enum,[RFC8011] +finishings,26,edge-stitch-right,1setOf type2 enum,[RFC8011] +finishings,27,edge-stitch-bottom,1setOf type2 enum,[RFC8011] +finishings,28,staple-dual-left,1setOf type2 enum,[RFC8011] +finishings,29,staple-dual-top,1setOf type2 enum,[RFC8011] +finishings,30,staple-dual-right,1setOf type2 enum,[RFC8011] +finishings,31,staple-dual-bottom,1setOf type2 enum,[RFC8011] +finishings,32,staple-triple-left,1setOf type2 enum,[PWG5100.1] +finishings,33,staple-triple-top,1setOf type2 enum,[PWG5100.1] +finishings,34,staple-triple-right,1setOf type2 enum,[PWG5100.1] +finishings,35,staple-triple-bottom,1setOf type2 enum,[PWG5100.1] +finishings,50,bind-left,1setOf type2 enum,[PWG5100.1] +finishings,51,bind-top,1setOf type2 enum,[PWG5100.1] +finishings,52,bind-right,1setOf type2 enum,[PWG5100.1] +finishings,53,bind-bottom,1setOf type2 enum,[PWG5100.1] +finishings,60,trim-after-pages,1setOf type2 enum,[PWG5100.13] +finishings,61,trim-after-documents,1setOf type2 enum,[PWG5100.13] +finishings,62,trim-after-copies,1setOf type2 enum,[PWG5100.13] +finishings,63,trim-after-job,1setOf type2 enum,[PWG5100.13] +finishings,70,punch-top-left,1setOf type2 enum,[PWG5100.1] +finishings,71,punch-bottom-left,1setOf type2 enum,[PWG5100.1] +finishings,72,punch-top-right,1setOf type2 enum,[PWG5100.1] +finishings,73,punch-bottom-right,1setOf type2 enum,[PWG5100.1] +finishings,74,punch-dual-left,1setOf type2 enum,[PWG5100.1] +finishings,75,punch-dual-top,1setOf type2 enum,[PWG5100.1] +finishings,76,punch-dual-right,1setOf type2 enum,[PWG5100.1] +finishings,77,punch-dual-bottom,1setOf type2 enum,[PWG5100.1] +finishings,78,punch-triple-left,1setOf type2 enum,[PWG5100.1] +finishings,79,punch-triple-top,1setOf type2 enum,[PWG5100.1] +finishings,80,punch-triple-right,1setOf type2 enum,[PWG5100.1] +finishings,81,punch-triple-bottom,1setOf type2 enum,[PWG5100.1] +finishings,82,punch-quad-left,1setOf type2 enum,[PWG5100.1] +finishings,83,punch-quad-top,1setOf type2 enum,[PWG5100.1] +finishings,84,punch-quad-right,1setOf type2 enum,[PWG5100.1] +finishings,85,punch-quad-bottom,1setOf type2 enum,[PWG5100.1] +finishings,86,punch-multiple-left,1setOf type2 enum,[CANON-PUNCHING] +finishings,87,punch-multiple-top,1setOf type2 enum,[CANON-PUNCHING] +finishings,88,punch-multiple-right,1setOf type2 enum,[CANON-PUNCHING] +finishings,89,punch-multiple-bottom,1setOf type2 enum,[CANON-PUNCHING] +finishings,90,fold-accordion,1setOf type2 enum,[PWG5100.1] +finishings,91,fold-double-gate,1setOf type2 enum,[PWG5100.1] +finishings,92,fold-gate,1setOf type2 enum,[PWG5100.1] +finishings,93,fold-half,1setOf type2 enum,[PWG5100.1] +finishings,94,fold-half-z,1setOf type2 enum,[PWG5100.1] +finishings,95,fold-left-gate,1setOf type2 enum,[PWG5100.1] +finishings,96,fold-letter,1setOf type2 enum,[PWG5100.1] +finishings,97,fold-parallel,1setOf type2 enum,[PWG5100.1] +finishings,98,fold-poster,1setOf type2 enum,[PWG5100.1] +finishings,99,fold-right-gate,1setOf type2 enum,[PWG5100.1] +finishings,100,fold-z,1setOf type2 enum,[PWG5100.1] +finishings,101,fold-engineering-z,1setOf type2 enum,[PWG5100.1] +finishings-default,,,1setOf type2 enum,[RFC8011] +finishings-default,"<Any ""finishings"" value>",,1setOf type2 enum,[RFC8011] +finishings-ready,,,1setOf type2 enum,[PWG5100.3] +finishings-ready,"<Any ""finishings"" value>",,1setOf type2 enum,[RFC8011] +finishings-supported,,,1setOf type2 enum,[RFC8011] +finishings-supported,"<Any ""finishings"" value>",,1setOf type2 enum,[RFC8011] +input-orientation-requested,,,type2 enum,[PWG5100.15] +input-orientation-requested,"<Any ""orientation-requested"" value>",,type2 enum,[PWG5100.15] +input-orientation-requested-supported,,,1setOf type2 enum,[PWG5100.15] +input-orientation-requested-supported,"<Any ""orientation-requested"" value>",,1setOf type2 enum,[PWG5100.15] +input-quality,,,type2 enum,[PWG5100.15] +input-quality,"<Any ""print-quality"" value>",,type2 enum,[PWG5100.15] +input-quality-supported,,,1setOf type2 enum,[PWG5100.15] +input-quality-supported,"<Any ""print-quality"" value>",,1setOf type2 enum,[PWG5100.15] +job-state,,,type1 enum,[RFC8011] +job-state,3,pending,type1 enum,[RFC8011] +job-state,4,pending-held,type1 enum,[RFC8011] +job-state,5,processing,type1 enum,[RFC8011] +job-state,6,processing-stopped,type1 enum,[RFC8011] +job-state,7,canceled,type1 enum,[RFC8011] +job-state,8,aborted,type1 enum,[RFC8011] +job-state,9,completed,type1 enum,[RFC8011] +media-source-feed-orientation,,,type2 enum,[PWG5100.13] +media-source-feed-orientation,"<Any ""orientation-requested"" value>",,type2 enum,[PWG5100.13] +operations-supported,,,1setOf type2 enum,[RFC8011] +operations-supported,0x0001,Reserved (not used),1setOf type2 enum,[RFC8011] +operations-supported,0x0002,Print-Job,1setOf type2 enum,[RFC8011] +operations-supported,0x0003,Print-URI,1setOf type2 enum,[RFC8011] +operations-supported,0x0004,Validate-Job,1setOf type2 enum,[RFC8011] +operations-supported,0x0005,Create-Job,1setOf type2 enum,[RFC8011] +operations-supported,0x0006,Send-Document,1setOf type2 enum,[RFC8011] +operations-supported,0x0007,Send-URI,1setOf type2 enum,[RFC8011] +operations-supported,0x0008,Cancel-Job,1setOf type2 enum,[RFC8011] +operations-supported,0x0009,Get-Job-Attributes,1setOf type2 enum,[RFC8011] +operations-supported,0x000A,Get-Jobs,1setOf type2 enum,[RFC8011] +operations-supported,0x000B,Get-Printer-Attributes,1setOf type2 enum,[RFC8011] +operations-supported,0x000C,Hold-Job,1setOf type2 enum,[RFC8011] +operations-supported,0x000D,Release-Job,1setOf type2 enum,[RFC8011] +operations-supported,0x000E,Restart-Job,1setOf type2 enum,[RFC8011] +operations-supported,0x000E,Restart-Job(deprecated),1setOf type2 enum,[APPLE20150505-2] +operations-supported,0x000F,Reserved (not used),1setOf type2 enum, +operations-supported,0x0010,Pause-Printer,1setOf type2 enum,[RFC8011] +operations-supported,0x0011,Resume-Printer,1setOf type2 enum,[RFC8011] +operations-supported,0x0012,Purge-Jobs,1setOf type2 enum,[RFC8011] +operations-supported,0x0012,Purge-Jobs(deprecated),1setOf type2 enum,[APPLE20150505-2] +operations-supported,0x0013,Set-Printer-Attributes,1setOf type2 enum,[RFC3380] +operations-supported,0x0014,Set-Job-Attributes,1setOf type2 enum,[RFC3380] +operations-supported,0x0015,Get-Printer-Supported-Values,1setOf type2 enum,[RFC3380] +operations-supported,0x0016,Create-Printer-Subscriptions,1setOf type2 enum,[RFC3995] +operations-supported,0x0017,Create-Job-Subscriptions,1setOf type2 enum,[RFC3995] +operations-supported,0x0018,Get-Subscription-Attributes,1setOf type2 enum,[RFC3995] +operations-supported,0x0019,Get-Subscriptions,1setOf type2 enum,[RFC3995] +operations-supported,0x001A,Renew-Subscription,1setOf type2 enum,[RFC3995] +operations-supported,0x001B,Cancel-Subscription,1setOf type2 enum,[RFC3995] +operations-supported,0x001C,Get-Notifications,1setOf type2 enum,[RFC3996] +operations-supported,0x001D,Reserved (ipp-indp-method),1setOf type2 enum, +operations-supported,0x001E,Get-Resource-Attributes,1setOf type2 enum, +operations-supported,0x001F,Reserved (ipp-get-resources),1setOf type2 enum, +operations-supported,0x0020,Get-Resources,1setOf type2 enum, +operations-supported,0x0021,Reserved (ipp-install),1setOf type2 enum, +operations-supported,0x0022,Enable-Printer,1setOf type2 enum,[RFC3998] +operations-supported,0x0023,Disable-Printer,1setOf type2 enum,[RFC3998] +operations-supported,0x0024,Pause-Printer-After-Current-Job,1setOf type2 enum,[RFC3998] +operations-supported,0x0025,Hold-New-Jobs,1setOf type2 enum,[RFC3998] +operations-supported,0x0026,Release-Held-New-Jobs,1setOf type2 enum,[RFC3998] +operations-supported,0x0027,Deactivate-Printer,1setOf type2 enum,[RFC3998] +operations-supported,0x0027,Deactivate-Printer(deprecated),1setOf type2 enum,[APPLE20150505-3] +operations-supported,0x0028,Activate-Printer,1setOf type2 enum,[RFC3998] +operations-supported,0x0028,Activate-Printer(deprecated),1setOf type2 enum,[APPLE20150505-3] +operations-supported,0x0029,Restart-Printer,1setOf type2 enum,[RFC3998] +operations-supported,0x002A,Shutdown-Printer,1setOf type2 enum,[RFC3998] +operations-supported,0x002B,Startup-Printer,1setOf type2 enum,[RFC3998] +operations-supported,0x002C,Reprocess-Job,1setOf type2 enum,[RFC3998] +operations-supported,0x002C,Reprocess-Job(deprecated),1setOf type2 enum,[APPLE20150505-2] +operations-supported,0x002D,Cancel-Current-Job,1setOf type2 enum,[RFC3998] +operations-supported,0x002E,Suspend-Current-Job,1setOf type2 enum,[RFC3998] +operations-supported,0x002F,Resume-Job,1setOf type2 enum,[RFC3998] +operations-supported,0x0030,Promote-Job,1setOf type2 enum,[RFC3998] +operations-supported,0x0031,Schedule-Job-After,1setOf type2 enum,[RFC3998] +operations-supported,0x0033,Cancel-Document,1setOf type2 enum,[PWG5100.5] +operations-supported,0x0034,Get-Document-Attributes,1setOf type2 enum,[PWG5100.5] +operations-supported,0x0035,Get-Documents,1setOf type2 enum,[PWG5100.5] +operations-supported,0x0036,Delete-Document(obsolete),1setOf type2 enum,[PWG5100.5] +operations-supported,0x0036,Delete-Document(deprecated),1setOf type2 enum,[APPLE20150505-2] +operations-supported,0x0037,Set-Document-Attributes,1setOf type2 enum,[PWG5100.5] +operations-supported,0x0038,Cancel-Jobs,1setOf type2 enum,[PWG5100.11] +operations-supported,0x0039,Cancel-My-Jobs,1setOf type2 enum,[PWG5100.11] +operations-supported,0x003A,Close-Job,1setOf type2 enum,[PWG5100.11] +operations-supported,0x003B,Resubmit-Job,1setOf type2 enum,[PWG5100.11] +operations-supported,0x003C,Identify-Printer,1setOf type2 enum,[PWG5100.13] +operations-supported,0x003D,Validate-Document,1setOf type2 enum,[PWG5100.13] +operations-supported,0x003E,Add-Document-Images,1setOf type2 enum,[PWG5100.15] +operations-supported,0x003F,Acknowledge-Document,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0040,Acknowledge-Identify-Printer,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0041,Acknowledge-Job,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0042,Fetch-Document,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0043,Fetch-Job,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0044,Get-Output-Device-Attributes,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0045,Update-Active-Jobs,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0046,Deregister-Output-Device,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0047,Update-Document-Status,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0048,Update-Job-Status,1setOf type2 enum,[PWG5100.18] +operations-supported,0x0049,Update-Output-Device-Attributes,1setOf type2 enum,[PWG5100.18] +operations-supported,0x004A,Get-Next-Document-Data,1setOf type2 enum,[PWG5100.17] +operations-supported,0x004B,Allocate-Printer-Resources,1setOf type2 enum,[PWG5100.22] +operations-supported,0x004C,Create-Printer,1setOf type2 enum,[PWG5100.22] +operations-supported,0x004D,Deallocate-Printer-Resources,1setOf type2 enum,[PWG5100.22] +operations-supported,0x004E,Delete-Printer,1setOf type2 enum,[PWG5100.22] +operations-supported,0x004F,Get-Printers,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0050,Shutdown-One-Printer,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0051,Startup-One-Printer,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0052,Cancel-Resource,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0053,Create-Resource,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0054,Install-Resource,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0055,Send-Resource-Data,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0056,Set-Resource-Attributes,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0057,Create-Resource-Subscriptions,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0058,Create-System-Subscriptions,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0059,Disable-All-Printers,1setOf type2 enum,[PWG5100.22] +operations-supported,0x005A,Enable-All-Printers,1setOf type2 enum,[PWG5100.22] +operations-supported,0x005B,Get-System-Attributes,1setOf type2 enum,[PWG5100.22] +operations-supported,0x005C,Get-System-Supported-Values,1setOf type2 enum,[PWG5100.22] +operations-supported,0x005D,Pause-All-Printers,1setOf type2 enum,[PWG5100.22] +operations-supported,0x005E,Pause-All-Printers-After-Current-Job,1setOf type2 enum,[PWG5100.22] +operations-supported,0x005F,Register-Output-Device,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0060,Restart-System,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0061,Resume-All-Printers,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0062,Set-System-Attributes,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0063,Shutdown-All-Printers,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0064,Startup-All-Printers,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0065,Get-Printer-Resources,1setOf type2 enum,[PWG5100.22] +operations-supported,0x0066,Get-User-Printer-Attributes,1setOf type2 enum,[IPPGUPA] +operations-supported,0x0067,Restart-One-Printer,1setOf type2 enum,[PWG5100.22] +orientation-requested,,,type2 enum,[RFC8011] +orientation-requested,3,portrait,type2 enum,[RFC8011] +orientation-requested,4,landscape,type2 enum,[RFC8011] +orientation-requested,5,reverse-landscape,type2 enum,[RFC8011] +orientation-requested,6,reverse-portrait,type2 enum,[RFC8011] +orientation-requested,7,none,type2 enum,[PWG5100.13] +orientation-requested-default,,,no-value | type2 enum,[RFC8011] +orientation-requested-default,"<Any ""orientation-requested"" value>",,no-value | type2 enum,[RFC8011] +orientation-requested-supported,,,1setOf type2 enum,[RFC8011] +orientation-requested-supported,"<Any ""orientation-requested"" value>",,1setOf type2 enum,[RFC8011] +output-device-job-states,,,1setOf type1 enum,[PWG5100.18] +output-device-job-states,"<Any ""job-state"" enum value >",,1setOf type1 enum,[PWG5100.18] +power-state,,,type1 enum,[PWG5100.22] +power-state,20,on,type1 enum,[PWG5100.22] +power-state,21,on-vendor1,type1 enum,[PWG5100.22] +power-state,22,on-vendor2,type1 enum,[PWG5100.22] +power-state,23,on-vendor3,type1 enum,[PWG5100.22] +power-state,24,on-vendor4,type1 enum,[PWG5100.22] +power-state,25,on-vendor5,type1 enum,[PWG5100.22] +power-state,30,standby,type1 enum,[PWG5100.22] +power-state,31,standby-vendor1,type1 enum,[PWG5100.22] +power-state,32,standby-vendor2,type1 enum,[PWG5100.22] +power-state,33,standby-vendor3,type1 enum,[PWG5100.22] +power-state,34,standby-vendor4,type1 enum,[PWG5100.22] +power-state,35,standby-vendor5,type1 enum,[PWG5100.22] +power-state,40,suspend,type1 enum,[PWG5100.22] +power-state,41,suspend-vendor1,type1 enum,[PWG5100.22] +power-state,42,suspend-vendor2,type1 enum,[PWG5100.22] +power-state,43,suspend-vendor3,type1 enum,[PWG5100.22] +power-state,44,suspend-vendor4,type1 enum,[PWG5100.22] +power-state,45,suspend-vendor5,type1 enum,[PWG5100.22] +power-state,50,reset-soft,type1 enum,[PWG5100.22] +power-state,60,off-hard,type1 enum,[PWG5100.22] +power-state,70,hibernate,type1 enum,[PWG5100.22] +power-state,71,hibernate-vendor1,type1 enum,[PWG5100.22] +power-state,72,hibernate-vendor2,type1 enum,[PWG5100.22] +power-state,73,hibernate-vendor3,type1 enum,[PWG5100.22] +power-state,74,hibernate-vendor4,type1 enum,[PWG5100.22] +power-state,75,hibernate-vendor5,type1 enum,[PWG5100.22] +power-state,80,off-soft,type1 enum,[PWG5100.22] +power-state,81,off-soft-vendor1,type1 enum,[PWG5100.22] +power-state,82,off-soft-vendor2,type1 enum,[PWG5100.22] +power-state,83,off-soft-vendor3,type1 enum,[PWG5100.22] +power-state,84,off-soft-vendor4,type1 enum,[PWG5100.22] +power-state,85,off-soft-vendor5,type1 enum,[PWG5100.22] +power-state,90,reset-hard,type1 enum,[PWG5100.22] +power-state,100,reset-mbr,type1 enum,[PWG5100.22] +power-state,110,reset-nmi,type1 enum,[PWG5100.22] +power-state,120,off-soft-graceful,type1 enum,[PWG5100.22] +power-state,130,off-hard-graceful,type1 enum,[PWG5100.22] +power-state,140,reset-mbr-graceful,type1 enum,[PWG5100.22] +power-state,150,reset-soft-graceful,type1 enum,[PWG5100.22] +power-state,160,reset-hard-graceful,type1 enum,[PWG5100.22] +power-state,170,reset-init,type1 enum,[PWG5100.22] +power-state,180,not-applicable,type1 enum,[PWG5100.22] +power-state,190,no-change,type1 enum,[PWG5100.22] +print-quality,,,type2 enum,[RFC8011] +print-quality,3,draft,type2 enum,[RFC8011] +print-quality,4,normal,type2 enum,[RFC8011] +print-quality,5,high,type2 enum,[RFC8011] +print-quality-default,,,type2 enum,[RFC8011] +print-quality-default,"<Any ""print-quality"" value>",,type2 enum,[RFC8011] +print-quality-supported,,,1setOf type2 enum,[RFC8011] +print-quality-supported,"<Any ""print-quality"" value>",,1setOf type2 enum,[RFC8011] +printer-state,,,type1 enum,[RFC8011] +printer-state,3,idle,type1 enum,[RFC8011] +printer-state,4,processing,type1 enum,[RFC8011] +printer-state,5,stopped,type1 enum,[RFC8011] +request-power-state,,,type1 enum,[PWG5100.22] +request-power-state,"< any ""power-state"" value >",,type1 enum,[PWG5100.22] +resource-state,,,type1 enum,[PWG5100.22] +resource-state,3,pending,type1 enum,[PWG5100.22] +resource-state,4,available,type1 enum,[PWG5100.22] +resource-state,5,installed,type1 enum,[PWG5100.22] +resource-state,6,canceled,type1 enum,[PWG5100.22] +resource-state,7,aborted,type1 enum,[PWG5100.22] +start-power-state,,,type1 enum,[PWG5100.22] +start-power-state,"< any ""power-state"" value >",,type1 enum,[PWG5100.22] +system-state,,,type1 enum,[PWG5100.22] +system-state,3,idle,type1 enum,[PWG5100.22] +system-state,4,processing,type1 enum,[PWG5100.22] +system-state,5,stopped,type1 enum,[PWG5100.22] +transmission-status,,,type2 enum,[PWG5100.15] +transmission-status,3,pending,type2 enum,[PWG5100.15] +transmission-status,4,pending-retry,type2 enum,[PWG5100.15] +transmission-status,5,processing,type2 enum,[PWG5100.15] +transmission-status,7,canceled,type2 enum,[PWG5100.15] +transmission-status,8,aborted,type2 enum,[PWG5100.15] +transmission-status,9,completed,type2 enum,[PWG5100.15] diff --git a/chromium/printing/backend/win_helper.cc b/chromium/printing/backend/win_helper.cc index a293745d6f2..2bd0480ee66 100644 --- a/chromium/printing/backend/win_helper.cc +++ b/chromium/printing/backend/win_helper.cc @@ -12,7 +12,6 @@ #include "base/debug/alias.h" #include "base/file_version_info.h" -#include "base/file_version_info_win.h" #include "base/files/file_path.h" #include "base/logging.h" #include "base/memory/free_deleter.h" @@ -129,19 +128,6 @@ const char kXpsTicketTemplate[] = const char kXpsTicketColor[] = "Color"; const char kXpsTicketMonochrome[] = "Monochrome"; -bool IsOpenXpsCapableImpl() { - std::unique_ptr<FileVersionInfoWin> file_version_info = - FileVersionInfoWin::CreateFileVersionInfoWin( - base::FilePath(FILE_PATH_LITERAL("xpsprint.dll"))); - if (!file_version_info) - return false; // Cannot support OpenXPS without system support. - - // Need at least version 6.2.9200.16492 to support OpenXPS, per: - // https://support.microsoft.com/en-us/help/2670838/platform-update-for-windows-7-sp1-and-windows-server-2008-r2-sp1 - const base::Version kOpenXpsMinVersion("6.2.9200.16492"); - return file_version_info->GetFileVersion() >= kOpenXpsMinVersion; -} - } // namespace namespace printing { @@ -166,14 +152,6 @@ bool ScopedPrinterHandle::OpenPrinterWithName(const wchar_t* printer) { return IsValid(); } -// static -bool XPSModule::IsOpenXpsCapable() { - // TODO(awscreen): Can be removed once Chrome drops support for Windows 7, - // since everything from Windows 8 onward is all OpenXPS. - static const bool capable = IsOpenXpsCapableImpl(); - return capable; -} - bool XPSModule::Init() { static bool initialized = InitImpl(); return initialized; diff --git a/chromium/printing/backend/win_helper.h b/chromium/printing/backend/win_helper.h index 384f9f4df7a..8fee5d5b5f4 100644 --- a/chromium/printing/backend/win_helper.h +++ b/chromium/printing/backend/win_helper.h @@ -76,9 +76,6 @@ using ScopedPrinterChangeHandle = // route instead). class PRINTING_EXPORT XPSModule { public: - // Returns true if OpenXPS printing is supported. - static bool IsOpenXpsCapable(); - // All the other methods can ONLY be called after a successful call to Init. // Init can be called many times and by multiple threads. static bool Init(); diff --git a/chromium/printing/buildflags/BUILD.gn b/chromium/printing/buildflags/BUILD.gn index 770117aec00..b7cc4b888c0 100644 --- a/chromium/printing/buildflags/BUILD.gn +++ b/chromium/printing/buildflags/BUILD.gn @@ -15,5 +15,6 @@ buildflag_header("buildflags") { flags = [ "ENABLE_PRINTING=$enable_basic_printing", "ENABLE_PRINT_PREVIEW=$enable_print_preview", + "ENABLE_TAGGED_PDF=$enable_tagged_pdf", ] } diff --git a/chromium/printing/buildflags/buildflags.gni b/chromium/printing/buildflags/buildflags.gni index 2c44969626a..ed471184135 100644 --- a/chromium/printing/buildflags/buildflags.gni +++ b/chromium/printing/buildflags/buildflags.gni @@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/chromecast_build.gni") +import("//build/config/chromeos/args.gni") import("//build/config/features.gni") import("//build/config/sanitizers/sanitizers.gni") @@ -16,10 +17,14 @@ declare_args() { # enable_basic_printing within the same declare_args() block. enable_print_preview = !is_android && !is_chromecast && !is_ios && !is_fuchsia + # Enable exporting to tagged PDF. + enable_tagged_pdf = !is_android && !is_chromecast && !is_ios && !is_fuchsia + if (use_fuzzing_engine && is_linux) { # For fuzzing, just restrict to chromeos and linux. use_cups = true } else { - use_cups = (is_desktop_linux || is_mac) && !is_chromecast && !is_fuchsia + use_cups = (is_chromeos_device || is_desktop_linux || is_mac) && + !is_chromecast && !is_fuchsia } } diff --git a/chromium/printing/common/BUILD.gn b/chromium/printing/common/BUILD.gn index 4143ca728c7..46d7ad33037 100644 --- a/chromium/printing/common/BUILD.gn +++ b/chromium/printing/common/BUILD.gn @@ -6,14 +6,13 @@ source_set("common") { sources = [ "metafile_utils.cc", "metafile_utils.h", - "printing_features.cc", - "printing_features.h", ] deps = [ "//base", - "//printing:printing_export", + "//printing/buildflags", "//skia", + "//ui/accessibility", ] defines = [ "PRINTING_IMPLEMENTATION" ] diff --git a/chromium/printing/common/metafile_utils.cc b/chromium/printing/common/metafile_utils.cc index eae01fb862e..9dd15e58827 100644 --- a/chromium/printing/common/metafile_utils.cc +++ b/chromium/printing/common/metafile_utils.cc @@ -5,15 +5,35 @@ #include "printing/common/metafile_utils.h" #include "base/time/time.h" -#include "printing/common/printing_features.h" +#include "printing/buildflags/buildflags.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkPicture.h" #include "third_party/skia/include/core/SkPictureRecorder.h" #include "third_party/skia/include/core/SkTime.h" #include "third_party/skia/include/docs/SkPDFDocument.h" +#include "ui/accessibility/ax_node.h" +#include "ui/accessibility/ax_node_data.h" +#include "ui/accessibility/ax_role_properties.h" +#include "ui/accessibility/ax_tree.h" +#include "ui/accessibility/ax_tree_update.h" namespace { +#if BUILDFLAG(ENABLE_TAGGED_PDF) +// Standard attribute owners from PDF 32000-1:2008 spec, section 14.8.5.2 +// (Attribute owners are kind of like "categories" for structure node +// attributes.) +const char kPDFTableAttributeOwner[] = "Table"; + +// Table Attributes from PDF 32000-1:2008 spec, section 14.8.5.7 +const char kPDFTableCellColSpanAttribute[] = "ColSpan"; +const char kPDFTableCellHeadersAttribute[] = "Headers"; +const char kPDFTableCellRowSpanAttribute[] = "RowSpan"; +const char kPDFTableHeaderScopeAttribute[] = "Scope"; +const char kPDFTableHeaderScopeColumn[] = "Column"; +const char kPDFTableHeaderScopeRow[] = "Row"; +#endif // BUILDFLAG(ENABLE_TAGGED_PDF) + SkTime::DateTime TimeToSkTime(base::Time time) { base::Time::Exploded exploded; time.UTCExplode(&exploded); @@ -38,11 +58,140 @@ sk_sp<SkPicture> GetEmptyPicture() { return rec.finishRecordingAsPicture(); } +// Convert an AXNode into a SkPDF::StructureElementNode in order to make a +// tagged (accessible) PDF. Returns true on success and false if we don't +// have enough data to build a valid tree. +bool RecursiveBuildStructureTree(const ui::AXNode* ax_node, + SkPDF::StructureElementNode* tag) { +#if BUILDFLAG(ENABLE_TAGGED_PDF) + bool valid = false; + + tag->fNodeId = ax_node->GetIntAttribute(ax::mojom::IntAttribute::kDOMNodeId); + switch (ax_node->data().role) { + case ax::mojom::Role::kRootWebArea: + tag->fType = SkPDF::DocumentStructureType::kDocument; + break; + case ax::mojom::Role::kParagraph: + tag->fType = SkPDF::DocumentStructureType::kP; + break; + case ax::mojom::Role::kGenericContainer: + tag->fType = SkPDF::DocumentStructureType::kDiv; + break; + case ax::mojom::Role::kHeading: + // TODO(dmazzoni): heading levels. https://crbug.com/1039816 + tag->fType = SkPDF::DocumentStructureType::kH; + break; + case ax::mojom::Role::kList: + tag->fType = SkPDF::DocumentStructureType::kL; + break; + case ax::mojom::Role::kListMarker: + tag->fType = SkPDF::DocumentStructureType::kLbl; + break; + case ax::mojom::Role::kListItem: + tag->fType = SkPDF::DocumentStructureType::kLI; + break; + case ax::mojom::Role::kTable: + tag->fType = SkPDF::DocumentStructureType::kTable; + break; + case ax::mojom::Role::kRow: + tag->fType = SkPDF::DocumentStructureType::kTR; + break; + case ax::mojom::Role::kColumnHeader: + tag->fType = SkPDF::DocumentStructureType::kTH; + tag->fAttributes.appendString(kPDFTableAttributeOwner, + kPDFTableHeaderScopeAttribute, + kPDFTableHeaderScopeColumn); + break; + case ax::mojom::Role::kRowHeader: + tag->fType = SkPDF::DocumentStructureType::kTH; + tag->fAttributes.appendString(kPDFTableAttributeOwner, + kPDFTableHeaderScopeAttribute, + kPDFTableHeaderScopeRow); + break; + case ax::mojom::Role::kCell: { + tag->fType = SkPDF::DocumentStructureType::kTD; + + // Append an attribute consisting of the string IDs of all of the + // header cells that correspond to this table cell. + std::vector<ui::AXNode*> header_nodes; + ax_node->GetTableCellColHeaders(&header_nodes); + ax_node->GetTableCellRowHeaders(&header_nodes); + std::vector<SkString> header_id_strs; + header_id_strs.reserve(header_nodes.size()); + for (ui::AXNode* header_node : header_nodes) { + int node_id = + header_node->GetIntAttribute(ax::mojom::IntAttribute::kDOMNodeId); + header_id_strs.push_back( + SkString(base::NumberToString(node_id).c_str())); + } + tag->fAttributes.appendStringArray(kPDFTableAttributeOwner, + kPDFTableCellHeadersAttribute, + header_id_strs); + break; + } + case ax::mojom::Role::kFigure: + case ax::mojom::Role::kImage: { + tag->fType = SkPDF::DocumentStructureType::kFigure; + std::string alt = + ax_node->GetStringAttribute(ax::mojom::StringAttribute::kName); + tag->fAlt = SkString(alt.c_str()); + break; + } + case ax::mojom::Role::kStaticText: + // Currently we're only marking text content, so we can't generate + // a nonempty structure tree unless we have at least one kStaticText + // node in the tree. + tag->fType = SkPDF::DocumentStructureType::kNonStruct; + valid = true; + break; + default: + tag->fType = SkPDF::DocumentStructureType::kNonStruct; + } + + if (ui::IsCellOrTableHeader(ax_node->data().role)) { + base::Optional<int> row_span = ax_node->GetTableCellRowSpan(); + if (row_span.has_value()) { + tag->fAttributes.appendInt(kPDFTableAttributeOwner, + kPDFTableCellRowSpanAttribute, + row_span.value()); + } + base::Optional<int> col_span = ax_node->GetTableCellColSpan(); + if (col_span.has_value()) { + tag->fAttributes.appendInt(kPDFTableAttributeOwner, + kPDFTableCellColSpanAttribute, + col_span.value()); + } + } + + std::string lang = ax_node->GetLanguage(); + std::string parent_lang = + ax_node->parent() ? ax_node->parent()->GetLanguage() : ""; + if (!lang.empty() && lang != parent_lang) + tag->fLang = lang.c_str(); + + size_t children_count = ax_node->GetUnignoredChildCount(); + tag->fChildVector.resize(children_count); + for (size_t i = 0; i < children_count; i++) { + tag->fChildVector[i] = std::make_unique<SkPDF::StructureElementNode>(); + bool success = RecursiveBuildStructureTree( + ax_node->GetUnignoredChildAtIndex(i), tag->fChildVector[i].get()); + + if (success) + valid = true; + } + + return valid; +#else // BUILDFLAG(ENABLE_TAGGED_PDF) + return false; +#endif +} + } // namespace namespace printing { sk_sp<SkDocument> MakePdfDocument(const std::string& creator, + const ui::AXTreeUpdate& accessibility_tree, SkWStream* stream) { SkPDF::Metadata metadata; SkTime::DateTime now = TimeToSkTime(base::Time::Now()); @@ -52,10 +201,14 @@ sk_sp<SkDocument> MakePdfDocument(const std::string& creator, ? SkString("Chromium") : SkString(creator.c_str(), creator.size()); metadata.fRasterDPI = 300.0f; - metadata.fSubsetter = - base::FeatureList::IsEnabled(printing::features::kHarfBuzzPDFSubsetter) - ? SkPDF::Metadata::kHarfbuzz_Subsetter - : SkPDF::Metadata::kSfntly_Subsetter; + + SkPDF::StructureElementNode tag_root = {}; + if (!accessibility_tree.nodes.empty()) { + ui::AXTree tree(accessibility_tree); + if (RecursiveBuildStructureTree(tree.root(), &tag_root)) + metadata.fStructureElementTreeRoot = &tag_root; + } + return SkPDF::MakeDocument(stream, metadata); } diff --git a/chromium/printing/common/metafile_utils.h b/chromium/printing/common/metafile_utils.h index efda8507bd9..5796754fdd5 100644 --- a/chromium/printing/common/metafile_utils.h +++ b/chromium/printing/common/metafile_utils.h @@ -14,6 +14,7 @@ #include "third_party/skia/include/core/SkRefCnt.h" #include "third_party/skia/include/core/SkSerialProcs.h" #include "third_party/skia/include/core/SkStream.h" +#include "ui/accessibility/ax_tree_update_forward.h" namespace printing { @@ -34,6 +35,7 @@ using DeserializationContext = base::flat_map<uint32_t, sk_sp<SkPicture>>; using SerializationContext = ContentToProxyIdMap; sk_sp<SkDocument> MakePdfDocument(const std::string& creator, + const ui::AXTreeUpdate& accessibility_tree, SkWStream* stream); SkSerialProcs SerializationProcs(SerializationContext* ctx); diff --git a/chromium/printing/common/printing_features.cc b/chromium/printing/common/printing_features.cc deleted file mode 100644 index e6e71f040ba..00000000000 --- a/chromium/printing/common/printing_features.cc +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "printing/common/printing_features.h" - -namespace printing { -namespace features { - -const base::Feature kHarfBuzzPDFSubsetter{"HarfBuzzPDFSubsetter", - base::FEATURE_ENABLED_BY_DEFAULT}; - -#if defined(OS_WIN) -// Use XPS for printing instead of GDI. -const base::Feature kUseXpsForPrinting{"UseXpsForPrinting", - base::FEATURE_DISABLED_BY_DEFAULT}; -#endif - -} // namespace features -} // namespace printing diff --git a/chromium/printing/common/printing_features.h b/chromium/printing/common/printing_features.h deleted file mode 100644 index b05ea5eb73c..00000000000 --- a/chromium/printing/common/printing_features.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PRINTING_COMMON_PRINTING_FEATURES_H_ -#define PRINTING_COMMON_PRINTING_FEATURES_H_ - -#include "base/feature_list.h" -#include "build/build_config.h" -#include "printing/printing_export.h" - -namespace printing { -namespace features { - -PRINTING_EXPORT extern const base::Feature kHarfBuzzPDFSubsetter; - -#if defined(OS_WIN) -PRINTING_EXPORT extern const base::Feature kUseXpsForPrinting; -#endif - -} // namespace features -} // namespace printing - -#endif // PRINTING_COMMON_PRINTING_FEATURES_H_ diff --git a/chromium/printing/emf_win.cc b/chromium/printing/emf_win.cc index 92b032e715a..b2e1ce5a144 100644 --- a/chromium/printing/emf_win.cc +++ b/chromium/printing/emf_win.cc @@ -75,13 +75,12 @@ bool Emf::Init() { return !!hdc_; } -bool Emf::InitFromData(const void* src_buffer, size_t src_buffer_size) { +bool Emf::InitFromData(base::span<const uint8_t> data) { DCHECK(!emf_ && !hdc_); - if (!base::IsValueInRangeForNumericType<UINT>(src_buffer_size)) + if (!base::IsValueInRangeForNumericType<UINT>(data.size())) return false; - emf_ = SetEnhMetaFileBits(static_cast<UINT>(src_buffer_size), - reinterpret_cast<const BYTE*>(src_buffer)); + emf_ = SetEnhMetaFileBits(static_cast<UINT>(data.size()), data.data()); return !!emf_; } @@ -342,7 +341,7 @@ bool Emf::Record::SafePlayback(Emf::EnumerationContext* context) const { void Emf::StartPage(const gfx::Size& /*page_size*/, const gfx::Rect& /*content_area*/, - const float& /*scale_factor*/) {} + float /*scale_factor*/) {} bool Emf::FinishPage() { return true; diff --git a/chromium/printing/emf_win.h b/chromium/printing/emf_win.h index 5245b4d36e3..d7cc329e457 100644 --- a/chromium/printing/emf_win.h +++ b/chromium/printing/emf_win.h @@ -52,7 +52,7 @@ class PRINTING_EXPORT Emf : public Metafile { // Metafile methods. bool Init() override; - bool InitFromData(const void* src_buffer, size_t src_buffer_size) override; + bool InitFromData(base::span<const uint8_t> data) override; // Inserts a custom GDICOMMENT records indicating StartPage/EndPage calls // (since StartPage and EndPage do not work in a metafile DC). Only valid @@ -60,7 +60,7 @@ class PRINTING_EXPORT Emf : public Metafile { // ignored. void StartPage(const gfx::Size& page_size, const gfx::Rect& content_area, - const float& scale_factor) override; + float scale_factor) override; bool FinishPage() override; bool FinishDocument() override; diff --git a/chromium/printing/emf_win_unittest.cc b/chromium/printing/emf_win_unittest.cc index 9be7d0e1f9a..6b1afc27bee 100644 --- a/chromium/printing/emf_win_unittest.cc +++ b/chromium/printing/emf_win_unittest.cc @@ -53,7 +53,6 @@ const uint32_t EMF_HEADER_SIZE = 128; TEST(EmfTest, DC) { // Simplest use case. - uint32_t size; std::vector<char> data; { Emf emf; @@ -62,15 +61,16 @@ TEST(EmfTest, DC) { // An empty EMF is invalid, so we put at least a rectangle in it. ::Rectangle(emf.context(), 10, 10, 190, 190); EXPECT_TRUE(emf.FinishDocument()); - size = emf.GetDataSize(); + uint32_t size = emf.GetDataSize(); EXPECT_GT(size, EMF_HEADER_SIZE); EXPECT_TRUE(emf.GetDataAsVector(&data)); - EXPECT_EQ(data.size(), size); + ASSERT_EQ(data.size(), size); } // Playback the data. Emf emf; - EXPECT_TRUE(emf.InitFromData(&data.front(), size)); + // TODO(thestig): Make |data| uint8_t and avoid the base::as_bytes() call. + EXPECT_TRUE(emf.InitFromData(base::as_bytes(base::make_span(data)))); HDC hdc = CreateCompatibleDC(nullptr); EXPECT_TRUE(hdc); RECT output_rect = {0, 0, 10, 10}; @@ -98,6 +98,7 @@ TEST_F(EmfPrintingTest, Enumerate) { emf_file = emf_file.Append(FILE_PATH_LITERAL("printing")) .Append(FILE_PATH_LITERAL("test")) .Append(FILE_PATH_LITERAL("data")) + .Append(FILE_PATH_LITERAL("emf")) .Append(FILE_PATH_LITERAL("test4.emf")); // Load any EMF with an image. @@ -106,7 +107,7 @@ TEST_F(EmfPrintingTest, Enumerate) { ASSERT_TRUE(emf_data.size()); Emf emf; - EXPECT_TRUE(emf.InitFromData(&emf_data[0], emf_data.size())); + EXPECT_TRUE(emf.InitFromData(base::as_bytes(base::make_span(emf_data)))); // This will print to file. The reason is that when running inside a // unit_test, PrintingContext automatically dumps its files to the @@ -137,7 +138,6 @@ TEST_F(EmfPrintingTest, PageBreak) { CreateDC(L"WINSPOOL", L"UnitTest Printer", nullptr, nullptr)); if (!dc.Get()) return; - uint32_t size; std::vector<char> data; { Emf emf; @@ -152,9 +152,9 @@ TEST_F(EmfPrintingTest, PageBreak) { } EXPECT_EQ(3U, emf.GetPageCount()); EXPECT_TRUE(emf.FinishDocument()); - size = emf.GetDataSize(); + uint32_t size = emf.GetDataSize(); EXPECT_TRUE(emf.GetDataAsVector(&data)); - EXPECT_EQ(data.size(), size); + ASSERT_EQ(data.size(), size); } // Playback the data. @@ -163,7 +163,8 @@ TEST_F(EmfPrintingTest, PageBreak) { di.lpszDocName = L"Test Job"; int job_id = ::StartDoc(dc.Get(), &di); Emf emf; - EXPECT_TRUE(emf.InitFromData(&data.front(), size)); + // TODO(thestig): Make |data| uint8_t and avoid the base::as_bytes() call. + EXPECT_TRUE(emf.InitFromData(base::as_bytes(base::make_span(data)))); EXPECT_TRUE(emf.SafePlayback(dc.Get())); ::EndDoc(dc.Get()); // Since presumably the printer is not real, let us just delete the job from diff --git a/chromium/printing/metafile.cc b/chromium/printing/metafile.cc index 89200b2d1b7..effeb2fc62d 100644 --- a/chromium/printing/metafile.cc +++ b/chromium/printing/metafile.cc @@ -29,6 +29,7 @@ bool Metafile::GetDataAsVector(std::vector<char>* buffer) const { base::checked_cast<uint32_t>(buffer->size())); } +#if !defined(OS_ANDROID) bool Metafile::SaveTo(base::File* file) const { if (!file->IsValid()) return false; @@ -44,5 +45,6 @@ bool Metafile::SaveTo(base::File* file) const { } return true; } +#endif // !defined(OS_ANDROID) } // namespace printing diff --git a/chromium/printing/metafile.h b/chromium/printing/metafile.h index a5fe9a91f74..bf823caecc2 100644 --- a/chromium/printing/metafile.h +++ b/chromium/printing/metafile.h @@ -9,6 +9,7 @@ #include <vector> +#include "base/containers/span.h" #include "base/macros.h" #include "build/build_config.h" #include "printing/native_drawing_context.h" @@ -37,32 +38,29 @@ namespace printing { class PRINTING_EXPORT MetafilePlayer { public: #if defined(OS_MACOSX) - // |shrink_to_fit| specifies whether the output should be shrunk to fit a - // destination page if the source PDF is bigger than the destination page in - // any dimension. If this is false, parts of the source PDF page that lie - // outside the bounds will be clipped. - // |stretch_to_fit| specifies whether the output should be stretched to fit - // the destination page if the source page size is smaller in all dimensions. - // |center_horizontally| specifies whether the output (after any scaling is - // done) should be centered horizontally within the destination page. - // |center_vertically| specifies whether the output (after any scaling is - // done) should be centered vertically within the destination page. - // Note that all scaling preserves the original aspect ratio of the page. - // |autorotate| specifies whether the source PDF should be autorotated to fit - // on the destination page. struct MacRenderPageParams { - MacRenderPageParams() - : shrink_to_fit(false), - stretch_to_fit(false), - center_horizontally(false), - center_vertically(false), - autorotate(false) {} - - bool shrink_to_fit; - bool stretch_to_fit; - bool center_horizontally; - bool center_vertically; - bool autorotate; + // Whether the output should be shrunk to fit a destination page if the + // source PDF is bigger than the destination page in any dimension. If this + // is false, parts of the source PDF page that lie outside the bounds will + // be clipped. + bool shrink_to_fit = false; + + // Whether the output should be stretched to fit the destination page if the + // source page size is smaller in all dimensions. + bool stretch_to_fit = false; + + // Whether the output (after any scaling is done) should be centered + // horizontally within the destination page. + bool center_horizontally = false; + + // Whether the output (after any scaling is done) should be centered + // vertically within the destination page. Note that all scaling preserves + // the original aspect ratio of the page. + bool center_vertically = false; + + // Whether the source PDF should be autorotated to fit on the destination + // page. + bool autorotate = false; }; #endif // defined(OS_MACOSX) MetafilePlayer(); @@ -81,7 +79,7 @@ class PRINTING_EXPORT MetafilePlayer { // |params| to determine scaling, translation, and rotation. virtual bool RenderPage(unsigned int page_number, printing::NativeDrawingContext context, - const CGRect rect, + const CGRect& rect, const MacRenderPageParams& params) const = 0; #endif // if defined(OS_WIN) @@ -89,9 +87,17 @@ class PRINTING_EXPORT MetafilePlayer { // called after the metafile is closed. Returns true if writing succeeded. virtual bool GetDataAsVector(std::vector<char>* buffer) const = 0; +#if defined(OS_ANDROID) + // Similar to bool SaveTo(base::File* file) const, but write the data to the + // file descriptor directly. This is because Android doesn't allow file + // ownership exchange. This function should ONLY be called after the metafile + // is closed. Returns true if writing succeeded. + virtual bool SaveToFileDescriptor(int fd) const = 0; +#else // Saves the underlying data to the given file. This function should ONLY be // called after the metafile is closed. Returns true if writing succeeded. virtual bool SaveTo(base::File* file) const = 0; +#endif // defined(OS_ANDROID) private: DISALLOW_COPY_AND_ASSIGN(MetafilePlayer); @@ -109,17 +115,16 @@ class PRINTING_EXPORT Metafile : public MetafilePlayer { // rendering resources. virtual bool Init() = 0; - // Initializes the metafile with the data in |src_buffer|. Returns true - // on success. + // Initializes the metafile with |data|. Returns true on success. // Note: It should only be called from within the browser process. - virtual bool InitFromData(const void* src_buffer, size_t src_buffer_size) = 0; + virtual bool InitFromData(base::span<const uint8_t> data) = 0; // Prepares a context for rendering a new page with the given |page_size|, // |content_area| and a |scale_factor| to use for the drawing. The units are // in points (=1/72 in). virtual void StartPage(const gfx::Size& page_size, const gfx::Rect& content_area, - const float& scale_factor) = 0; + float scale_factor) = 0; // Closes the current page and destroys the context used in rendering that // page. The results of current page will be appended into the underlying @@ -159,7 +164,9 @@ class PRINTING_EXPORT Metafile : public MetafilePlayer { // MetfilePlayer bool GetDataAsVector(std::vector<char>* buffer) const override; +#if !defined(OS_ANDROID) bool SaveTo(base::File* file) const override; +#endif // !defined(OS_ANDROID) private: DISALLOW_COPY_AND_ASSIGN(Metafile); diff --git a/chromium/printing/metafile_skia.cc b/chromium/printing/metafile_skia.cc index e14acb47f11..7baa9816e63 100644 --- a/chromium/printing/metafile_skia.cc +++ b/chromium/printing/metafile_skia.cc @@ -36,6 +36,10 @@ #include "base/file_descriptor_posix.h" #endif +#if defined(OS_ANDROID) +#include "base/files/file_util.h" +#endif // defined(OS_ANDROID) + namespace { bool WriteAssetToBuffer(const SkStreamAsset* asset, void* buffer, size_t size) { @@ -104,16 +108,15 @@ bool MetafileSkia::Init() { // TODO(halcanary): Create a Metafile class that only stores data. // Metafile::InitFromData is orthogonal to what the rest of // MetafileSkia does. -bool MetafileSkia::InitFromData(const void* src_buffer, - size_t src_buffer_size) { +bool MetafileSkia::InitFromData(base::span<const uint8_t> data) { data_->data_stream = std::make_unique<SkMemoryStream>( - src_buffer, src_buffer_size, true /* copy_data? */); + data.data(), data.size(), /*copy_data=*/true); return true; } void MetafileSkia::StartPage(const gfx::Size& page_size, const gfx::Rect& content_area, - const float& scale_factor) { + float scale_factor) { DCHECK_GT(page_size.width(), 0); DCHECK_GT(page_size.height(), 0); DCHECK_GT(scale_factor, 0.0f); @@ -144,7 +147,7 @@ void MetafileSkia::StartPage(const gfx::Size& page_size, cc::PaintCanvas* MetafileSkia::GetVectorCanvasForNewPage( const gfx::Size& page_size, const gfx::Rect& content_area, - const float& scale_factor) { + float scale_factor) { StartPage(page_size, content_area, scale_factor); return data_->recorder.getRecordingCanvas(); } @@ -178,7 +181,7 @@ bool MetafileSkia::FinishDocument() { cc::PlaybackParams::CustomDataRasterCallback custom_callback; switch (data_->type) { case SkiaDocumentType::PDF: - doc = MakePdfDocument(printing::GetAgent(), &stream); + doc = MakePdfDocument(printing::GetAgent(), accessibility_tree_, &stream); break; case SkiaDocumentType::MSKP: SkSerialProcs procs = SerializationProcs(&data_->subframe_content_info); @@ -276,7 +279,7 @@ http://codereview.chromium.org/7200040/diff/1/webkit/plugins/ppapi/ppapi_plugin_ */ bool MetafileSkia::RenderPage(unsigned int page_number, CGContextRef context, - const CGRect rect, + const CGRect& rect, const MacRenderPageParams& params) const { DCHECK_GT(GetDataSize(), 0U); if (data_->pdf_cg.GetDataSize() == 0) { @@ -285,12 +288,35 @@ bool MetafileSkia::RenderPage(unsigned int page_number, size_t length = data_->data_stream->getLength(); std::vector<uint8_t> buffer(length); (void)WriteAssetToBuffer(data_->data_stream.get(), &buffer[0], length); - data_->pdf_cg.InitFromData(&buffer[0], length); + data_->pdf_cg.InitFromData(buffer); } return data_->pdf_cg.RenderPage(page_number, context, rect, params); } #endif +#if defined(OS_ANDROID) +bool MetafileSkia::SaveToFileDescriptor(int fd) const { + if (GetDataSize() == 0u) + return false; + + std::unique_ptr<SkStreamAsset> asset(data_->data_stream->duplicate()); + + static constexpr size_t kMaximumBufferSize = 1024 * 1024; + std::vector<uint8_t> buffer(std::min(kMaximumBufferSize, asset->getLength())); + do { + size_t read_size = asset->read(&buffer[0], buffer.size()); + if (read_size == 0u) + break; + DCHECK_GE(buffer.size(), read_size); + if (!base::WriteFileDescriptor( + fd, reinterpret_cast<const char*>(buffer.data()), read_size)) { + return false; + } + } while (!asset->isAtEnd()); + + return true; +} +#else bool MetafileSkia::SaveTo(base::File* file) const { if (GetDataSize() == 0U) return false; @@ -313,6 +339,7 @@ bool MetafileSkia::SaveTo(base::File* file) const { return true; } +#endif // defined(OS_ANDROID) std::unique_ptr<MetafileSkia> MetafileSkia::GetMetafileForCurrentPage( SkiaDocumentType type) { diff --git a/chromium/printing/metafile_skia.h b/chromium/printing/metafile_skia.h index 26b9049163f..eeff98abfb1 100644 --- a/chromium/printing/metafile_skia.h +++ b/chromium/printing/metafile_skia.h @@ -16,6 +16,7 @@ #include "printing/common/metafile_utils.h" #include "printing/metafile.h" #include "skia/ext/platform_canvas.h" +#include "ui/accessibility/ax_tree_update.h" #if defined(OS_WIN) #include <windows.h> @@ -37,11 +38,11 @@ class PRINTING_EXPORT MetafileSkia : public Metafile { // Metafile methods. bool Init() override; - bool InitFromData(const void* src_buffer, size_t src_buffer_size) override; + bool InitFromData(base::span<const uint8_t> data) override; void StartPage(const gfx::Size& page_size, const gfx::Rect& content_area, - const float& scale_factor) override; + float scale_factor) override; bool FinishPage() override; bool FinishDocument() override; @@ -60,11 +61,15 @@ class PRINTING_EXPORT MetafileSkia : public Metafile { #elif defined(OS_MACOSX) bool RenderPage(unsigned int page_number, printing::NativeDrawingContext context, - const CGRect rect, + const CGRect& rect, const MacRenderPageParams& params) const override; #endif +#if defined(OS_ANDROID) + bool SaveToFileDescriptor(int fd) const override; +#else bool SaveTo(base::File* file) const override; +#endif // defined(OS_ANDROID) // Unlike FinishPage() or FinishDocument(), this is for out-of-process // subframe printing. It will just serialize the content into SkPicture @@ -83,7 +88,7 @@ class PRINTING_EXPORT MetafileSkia : public Metafile { // until FinishPage() or FinishDocument() is called. cc::PaintCanvas* GetVectorCanvasForNewPage(const gfx::Size& page_size, const gfx::Rect& content_area, - const float& scale_factor); + float scale_factor); // This is used for painting content of out-of-process subframes. // For such a subframe, since the content is in another process, we create a @@ -95,6 +100,11 @@ class PRINTING_EXPORT MetafileSkia : public Metafile { int GetDocumentCookie() const; const ContentToProxyIdMap& GetSubframeContentInfo() const; + const ui::AXTreeUpdate& accessibility_tree() const { + return accessibility_tree_; + } + ui::AXTreeUpdate& accessibility_tree() { return accessibility_tree_; } + private: FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, TestFrameContent); @@ -111,6 +121,8 @@ class PRINTING_EXPORT MetafileSkia : public Metafile { std::unique_ptr<MetafileSkiaData> data_; + ui::AXTreeUpdate accessibility_tree_; + DISALLOW_COPY_AND_ASSIGN(MetafileSkia); }; diff --git a/chromium/printing/pdf_metafile_cg_mac.cc b/chromium/printing/pdf_metafile_cg_mac.cc index d9d62135139..53420abcf5a 100644 --- a/chromium/printing/pdf_metafile_cg_mac.cc +++ b/chromium/printing/pdf_metafile_cg_mac.cc @@ -22,7 +22,7 @@ using base::ScopedCFTypeRef; namespace { // Rotate a page by |num_rotations| * 90 degrees, counter-clockwise. -void RotatePage(CGContextRef context, const CGRect rect, int num_rotations) { +void RotatePage(CGContextRef context, const CGRect& rect, int num_rotations) { switch (num_rotations) { case 0: break; @@ -58,9 +58,9 @@ void RotatePage(CGContextRef context, const CGRect rect, int num_rotations) { namespace printing { -PdfMetafileCg::PdfMetafileCg() : page_is_open_(false) {} +PdfMetafileCg::PdfMetafileCg() = default; -PdfMetafileCg::~PdfMetafileCg() {} +PdfMetafileCg::~PdfMetafileCg() = default; bool PdfMetafileCg::Init() { // Ensure that Init hasn't already been called. @@ -88,35 +88,33 @@ bool PdfMetafileCg::Init() { return true; } -bool PdfMetafileCg::InitFromData(const void* src_buffer, - size_t src_buffer_size) { +bool PdfMetafileCg::InitFromData(base::span<const uint8_t> data) { DCHECK(!context_.get()); DCHECK(!pdf_data_.get()); - if (!src_buffer || !src_buffer_size) + if (data.empty()) return false; - if (!base::IsValueInRangeForNumericType<CFIndex>(src_buffer_size)) + if (!base::IsValueInRangeForNumericType<CFIndex>(data.size())) return false; - pdf_data_.reset(CFDataCreateMutable(kCFAllocatorDefault, src_buffer_size)); - CFDataAppendBytes(pdf_data_, static_cast<const UInt8*>(src_buffer), - src_buffer_size); + pdf_data_.reset(CFDataCreateMutable(kCFAllocatorDefault, data.size())); + CFDataAppendBytes(pdf_data_, data.data(), data.size()); return true; } void PdfMetafileCg::StartPage(const gfx::Size& page_size, const gfx::Rect& content_area, - const float& scale_factor) { + float scale_factor) { DCHECK(context_.get()); DCHECK(!page_is_open_); - double height = page_size.height(); - double width = page_size.width(); + page_is_open_ = true; + float height = page_size.height(); + float width = page_size.width(); CGRect bounds = CGRectMake(0, 0, width, height); CGContextBeginPage(context_, &bounds); - page_is_open_ = true; CGContextSaveGState(context_); // Move to the context origin. @@ -159,7 +157,7 @@ bool PdfMetafileCg::FinishDocument() { bool PdfMetafileCg::RenderPage(unsigned int page_number, CGContextRef context, - const CGRect rect, + const CGRect& rect, const MacRenderPageParams& params) const { CGPDFDocumentRef pdf_doc = GetPDFDocument(); if (!pdf_doc) { @@ -256,7 +254,7 @@ gfx::Rect PdfMetafileCg::GetPageBounds(unsigned int page_number) const { LOG(ERROR) << "Unable to create PDF document from data"; return gfx::Rect(); } - if (page_number > GetPageCount()) { + if (page_number == 0 || page_number > GetPageCount()) { LOG(ERROR) << "Invalid page number: " << page_number; return gfx::Rect(); } diff --git a/chromium/printing/pdf_metafile_cg_mac.h b/chromium/printing/pdf_metafile_cg_mac.h index a49a3895564..6a516694a15 100644 --- a/chromium/printing/pdf_metafile_cg_mac.h +++ b/chromium/printing/pdf_metafile_cg_mac.h @@ -10,28 +10,24 @@ #include <stdint.h> #include "base/mac/scoped_cftyperef.h" -#include "base/macros.h" #include "printing/metafile.h" -namespace gfx { -class Rect; -class Size; -} - namespace printing { // This class creates a graphics context that renders into a PDF data stream. class PRINTING_EXPORT PdfMetafileCg : public Metafile { public: PdfMetafileCg(); + PdfMetafileCg(const PdfMetafileCg&) = delete; + PdfMetafileCg& operator=(const PdfMetafileCg&) = delete; ~PdfMetafileCg() override; // Metafile methods. bool Init() override; - bool InitFromData(const void* src_buffer, size_t src_buffer_size) override; + bool InitFromData(base::span<const uint8_t> data) override; void StartPage(const gfx::Size& page_size, const gfx::Rect& content_area, - const float& scale_factor) override; + float scale_factor) override; bool FinishPage() override; bool FinishDocument() override; @@ -47,7 +43,7 @@ class PRINTING_EXPORT PdfMetafileCg : public Metafile { bool RenderPage(unsigned int page_number, printing::NativeDrawingContext context, - const CGRect rect, + const CGRect& rect, const MacRenderPageParams& params) const override; private: @@ -64,9 +60,7 @@ class PRINTING_EXPORT PdfMetafileCg : public Metafile { mutable base::ScopedCFTypeRef<CGPDFDocumentRef> pdf_doc_; // Whether or not a page is currently open. - bool page_is_open_; - - DISALLOW_COPY_AND_ASSIGN(PdfMetafileCg); + bool page_is_open_ = false; }; } // namespace printing diff --git a/chromium/printing/pdf_metafile_cg_mac_unittest.cc b/chromium/printing/pdf_metafile_cg_mac_unittest.cc index 4b9b38ce792..62720a2c230 100644 --- a/chromium/printing/pdf_metafile_cg_mac_unittest.cc +++ b/chromium/printing/pdf_metafile_cg_mac_unittest.cc @@ -7,36 +7,149 @@ #import <ApplicationServices/ApplicationServices.h> #include <stdint.h> +#include <memory> #include <string> #include <vector> +#include "base/files/file_util.h" +#include "base/hash/sha1.h" +#include "base/path_service.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/codec/png_codec.h" #include "ui/gfx/geometry/rect.h" namespace printing { +namespace { + +base::FilePath GetPdfTestData(const base::FilePath::StringType& filename) { + base::FilePath root_path; + if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &root_path)) + return base::FilePath(); + return root_path.Append("pdf").Append("test").Append("data").Append(filename); +} + +base::FilePath GetPrintingTestData(const base::FilePath::StringType& filename) { + base::FilePath root_path; + if (!base::PathService::Get(base::DIR_SOURCE_ROOT, &root_path)) + return base::FilePath(); + return root_path.Append("printing") + .Append("test") + .Append("data") + .Append("pdf_cg") + .Append(filename); +} + +std::unique_ptr<PdfMetafileCg> GetPdfMetafile( + const base::FilePath::StringType& pdf_filename) { + // Get test data. + base::FilePath pdf_file = GetPdfTestData(pdf_filename); + if (pdf_file.empty()) + return nullptr; + + std::string pdf_data; + if (!base::ReadFileToString(pdf_file, &pdf_data)) + return nullptr; + + // Initialize and check metafile. + auto pdf_cg = std::make_unique<PdfMetafileCg>(); + if (!pdf_cg->InitFromData(base::as_bytes(base::make_span(pdf_data)))) + return nullptr; + return pdf_cg; +} + +void RenderedPdfSha1(const base::FilePath::StringType& pdf_filename, + size_t page_number, + const gfx::Rect& expected_page_bounds, + const gfx::Size& dest_size, + base::SHA1Digest* rendered_hash) { + // Initialize and verify the metafile. + std::unique_ptr<PdfMetafileCg> pdf_cg = GetPdfMetafile(pdf_filename); + ASSERT_TRUE(pdf_cg); + ASSERT_LE(page_number, pdf_cg->GetPageCount()); + const gfx::Rect bounds = pdf_cg->GetPageBounds(page_number); + ASSERT_EQ(expected_page_bounds, bounds); + + // Set up rendering context. + constexpr size_t kBitsPerComponent = 8; + constexpr size_t kBytesPerPixel = 4; + const size_t kStride = dest_size.width() * kBytesPerPixel; + std::vector<uint8_t> rendered_bitmap(dest_size.height() * kStride); + base::ScopedCFTypeRef<CGColorSpaceRef> color_space( + CGColorSpaceCreateDeviceRGB()); + base::ScopedCFTypeRef<CGContextRef> context(CGBitmapContextCreate( + rendered_bitmap.data(), dest_size.width(), dest_size.height(), + kBitsPerComponent, kStride, color_space, + kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little)); + + // Render using metafile and calculate the output hash. + Metafile::MacRenderPageParams params; + params.autorotate = true; + ASSERT_TRUE(pdf_cg->RenderPage(page_number, context, + gfx::Rect(dest_size).ToCGRect(), params)); + *rendered_hash = base::SHA1HashSpan(rendered_bitmap); +} + +void ExpectedPngSha1(const base::FilePath::StringType& expected_png_filename, + const gfx::Size& expected_png_size, + base::SHA1Digest* expected_hash) { + base::FilePath expected_png_file = GetPrintingTestData(expected_png_filename); + ASSERT_FALSE(expected_png_file.empty()); + std::string expected_png_data; + ASSERT_TRUE(base::ReadFileToString(expected_png_file, &expected_png_data)); + + // Decode expected PNG and calculate the output hash. + std::vector<uint8_t> expected_png_bitmap; + int png_width; + int png_height; + ASSERT_TRUE(gfx::PNGCodec::Decode( + reinterpret_cast<const uint8_t*>(expected_png_data.data()), + expected_png_data.size(), gfx::PNGCodec::FORMAT_BGRA, + &expected_png_bitmap, &png_width, &png_height)); + ASSERT_EQ(expected_png_size.width(), png_width); + ASSERT_EQ(expected_png_size.height(), png_height); + *expected_hash = base::SHA1HashSpan(expected_png_bitmap); +} + +void TestRenderPage(const base::FilePath::StringType& pdf_filename, + size_t page_number, + const gfx::Rect& expected_page_bounds, + const base::FilePath::StringType& expected_png_filename, + const gfx::Size& dest_size) { + base::SHA1Digest rendered_hash; + RenderedPdfSha1(pdf_filename, page_number, expected_page_bounds, dest_size, + &rendered_hash); + base::SHA1Digest expected_hash; + ExpectedPngSha1(expected_png_filename, dest_size, &expected_hash); + + // Make sure the hashes match. + EXPECT_EQ(expected_hash, rendered_hash); +} + +} // namespace + TEST(PdfMetafileCgTest, Pdf) { // Test in-renderer constructor. PdfMetafileCg pdf; EXPECT_TRUE(pdf.Init()); - EXPECT_TRUE(pdf.context() != NULL); + EXPECT_TRUE(pdf.context()); // Render page 1. - gfx::Rect rect_1(10, 10, 520, 700); - gfx::Size size_1(540, 720); - pdf.StartPage(size_1, rect_1, 1.25); + constexpr gfx::Rect kRect1(10, 10, 520, 700); + constexpr gfx::Size kSize1(540, 720); + pdf.StartPage(kSize1, kRect1, 1.25); pdf.FinishPage(); // Render page 2. - gfx::Rect rect_2(10, 10, 520, 700); - gfx::Size size_2(720, 540); - pdf.StartPage(size_2, rect_2, 2.0); + constexpr gfx::Rect kRect2(10, 10, 520, 700); + constexpr gfx::Size kSize2(720, 540); + pdf.StartPage(kSize2, kRect2, 2.0); pdf.FinishPage(); pdf.FinishDocument(); // Check data size. - uint32_t size = pdf.GetDataSize(); + const uint32_t size = pdf.GetDataSize(); EXPECT_GT(size, 0U); // Get resulting data. @@ -45,7 +158,8 @@ TEST(PdfMetafileCgTest, Pdf) { // Test browser-side constructor. PdfMetafileCg pdf2; - EXPECT_TRUE(pdf2.InitFromData(&buffer.front(), size)); + // TODO(thestig): Make |buffer| uint8_t and avoid the base::as_bytes() call. + EXPECT_TRUE(pdf2.InitFromData(base::as_bytes(base::make_span(buffer)))); // Get the first 4 characters from pdf2. std::vector<char> buffer2(4, 0); @@ -65,4 +179,44 @@ TEST(PdfMetafileCgTest, Pdf) { EXPECT_EQ(540, page_size.height()); } +TEST(PdfMetafileCgTest, GetPageBounds) { + // Get test data. + base::FilePath pdf_file = GetPdfTestData("rectangles_multi_pages.pdf"); + ASSERT_FALSE(pdf_file.empty()); + std::string pdf_data; + ASSERT_TRUE(base::ReadFileToString(pdf_file, &pdf_data)); + + // Initialize and check metafile. + PdfMetafileCg pdf_cg; + ASSERT_TRUE(pdf_cg.InitFromData(base::as_bytes(base::make_span(pdf_data)))); + ASSERT_EQ(5u, pdf_cg.GetPageCount()); + + // Since the input into GetPageBounds() is a 1-indexed page number, 0 and 6 + // are out of bounds. + gfx::Rect bounds; + for (size_t i : {0, 6}) { + bounds = pdf_cg.GetPageBounds(i); + EXPECT_EQ(0, bounds.x()); + EXPECT_EQ(0, bounds.y()); + EXPECT_EQ(0, bounds.width()); + EXPECT_EQ(0, bounds.height()); + } + + // Whereas 1-5 are in bounds. + for (size_t i = 1; i < 6; ++i) { + bounds = pdf_cg.GetPageBounds(i); + EXPECT_EQ(0, bounds.x()); + EXPECT_EQ(0, bounds.y()); + EXPECT_EQ(200, bounds.width()); + EXPECT_EQ(250, bounds.height()); + } +} + +TEST(PdfMetafileCgTest, RenderPageBasic) { + constexpr gfx::Rect kPageBounds(200, 300); + constexpr gfx::Size kDestinationSize(200, 300); + TestRenderPage("rectangles.pdf", /*page_number=*/1, kPageBounds, + "rectangles_cg_expected.pdf.0.png", kDestinationSize); +} + } // namespace printing diff --git a/chromium/printing/print_job_constants.cc b/chromium/printing/print_job_constants.cc index acbaa8fae6c..2ee8c9d641b 100644 --- a/chromium/printing/print_job_constants.cc +++ b/chromium/printing/print_job_constants.cc @@ -227,6 +227,10 @@ const char kNormalGray[] = "Normal.Gray"; const char kRGB[] = "RGB"; const char kRGBA[] = "RGBA"; const char kRGB16[] = "RGB16"; +const char kSharpCMColor[] = "CMColor"; +const char kSharpCMBW[] = "CMBW"; +const char kXeroxAutomatic[] = "Automatic"; +const char kXeroxBW[] = "BW"; #endif } // namespace printing diff --git a/chromium/printing/print_job_constants.h b/chromium/printing/print_job_constants.h index bd3ce833f59..b05aa93fe3c 100644 --- a/chromium/printing/print_job_constants.h +++ b/chromium/printing/print_job_constants.h @@ -99,6 +99,10 @@ PRINTING_EXPORT extern const char kNormalGray[]; PRINTING_EXPORT extern const char kRGB[]; PRINTING_EXPORT extern const char kRGBA[]; PRINTING_EXPORT extern const char kRGB16[]; +PRINTING_EXPORT extern const char kSharpCMColor[]; +PRINTING_EXPORT extern const char kSharpCMBW[]; +PRINTING_EXPORT extern const char kXeroxAutomatic[]; +PRINTING_EXPORT extern const char kXeroxBW[]; #endif // Print job duplex mode values. @@ -142,6 +146,13 @@ enum ColorModel { BROTHER_CUPS_MONO, // Used in Brother color laser printer PPDs. BROTHER_BRSCRIPT3_COLOR, // Used in Brother BRScript3 color printer PPDs. BROTHER_BRSCRIPT3_BLACK, // Used in Brother BRScript3 color printer PPDs. + EPSON_INK_COLOR, // Used in Epson printer PPDs. + EPSON_INK_MONO, // Used in Epson printer PPDs. + SHARP_ARCMODE_CMCOLOR, // Used in Sharp printer PPDs. + SHARP_ARCMODE_CMBW, // Used in Sharp printer PPDs. + XEROX_XRXCOLOR_AUTOMATIC, // Used in Xerox printer PPDs. + XEROX_XRXCOLOR_BW, // Used in Xerox printer PPDs. + COLOR_MODEL_LAST = XEROX_XRXCOLOR_BW }; // What kind of margins to use. diff --git a/chromium/printing/print_settings.cc b/chromium/printing/print_settings.cc index 7d51258365d..e6ab5c006d6 100644 --- a/chromium/printing/print_settings.cc +++ b/chromium/printing/print_settings.cc @@ -31,15 +31,21 @@ void GetColorModelForMode(int color_mode, constexpr char kCUPSColorModel[] = "ColorModel"; constexpr char kCUPSPrintoutMode[] = "PrintoutMode"; constexpr char kCUPSProcessColorModel[] = "ProcessColorModel"; + constexpr char kCUPSInk[] = "Ink"; constexpr char kCUPSBrotherMonoColor[] = "BRMonoColor"; constexpr char kCUPSBrotherPrintQuality[] = "BRPrintQuality"; + constexpr char kCUPSSharpARCMode[] = "ARCMode"; + constexpr char kCUPSXeroxXRXColor[] = "XRXColor"; #else constexpr char kCUPSColorMode[] = "cups-ColorMode"; constexpr char kCUPSColorModel[] = "cups-ColorModel"; constexpr char kCUPSPrintoutMode[] = "cups-PrintoutMode"; constexpr char kCUPSProcessColorModel[] = "cups-ProcessColorModel"; + constexpr char kCUPSInk[] = "cups-Ink"; constexpr char kCUPSBrotherMonoColor[] = "cups-BRMonoColor"; constexpr char kCUPSBrotherPrintQuality[] = "cups-BRPrintQuality"; + constexpr char kCUPSSharpARCMode[] = "cups-ARCMode"; + constexpr char kCUPSXeroxXRXColor[] = "cups-XRXColor"; #endif // defined(OS_MACOSX) color_setting_name->assign(kCUPSColorModel); @@ -129,6 +135,30 @@ void GetColorModelForMode(int color_mode, color_setting_name->assign(kCUPSBrotherPrintQuality); color_value->assign(kBlack); break; + case EPSON_INK_COLOR: + color_setting_name->assign(kCUPSInk); + color_value->assign(kColor); + break; + case EPSON_INK_MONO: + color_setting_name->assign(kCUPSInk); + color_value->assign(kMono); + break; + case SHARP_ARCMODE_CMCOLOR: + color_setting_name->assign(kCUPSSharpARCMode); + color_value->assign(kSharpCMColor); + break; + case SHARP_ARCMODE_CMBW: + color_setting_name->assign(kCUPSSharpARCMode); + color_value->assign(kSharpCMBW); + break; + case XEROX_XRXCOLOR_AUTOMATIC: + color_setting_name->assign(kCUPSXeroxXRXColor); + color_value->assign(kXeroxAutomatic); + break; + case XEROX_XRXCOLOR_BW: + color_setting_name->assign(kCUPSXeroxXRXColor); + color_value->assign(kXeroxBW); + break; default: color_value->assign(kGrayscale); break; @@ -136,14 +166,52 @@ void GetColorModelForMode(int color_mode, } #endif // defined(USE_CUPS) -bool IsColorModelSelected(int color_mode) { - return (color_mode != GRAY && color_mode != BLACK && - color_mode != PRINTOUTMODE_NORMAL_GRAY && - color_mode != COLORMODE_MONOCHROME && - color_mode != PROCESSCOLORMODEL_GREYSCALE && - color_mode != BROTHER_CUPS_MONO && - color_mode != BROTHER_BRSCRIPT3_BLACK && - color_mode != HP_COLOR_BLACK); +base::Optional<bool> IsColorModelSelected(int color_mode) { + if (color_mode <= UNKNOWN_COLOR_MODEL || color_mode > COLOR_MODEL_LAST) { + NOTREACHED(); + return base::nullopt; + } + + ColorModel color_model = static_cast<ColorModel>(color_mode); + switch (color_model) { + case COLOR: + case CMYK: + case CMY: + case KCMY: + case CMY_K: + case RGB: + case RGB16: + case RGBA: + case COLORMODE_COLOR: + case HP_COLOR_COLOR: + case PRINTOUTMODE_NORMAL: + case PROCESSCOLORMODEL_CMYK: + case PROCESSCOLORMODEL_RGB: + case BROTHER_CUPS_COLOR: + case BROTHER_BRSCRIPT3_COLOR: + case EPSON_INK_COLOR: + case SHARP_ARCMODE_CMCOLOR: + case XEROX_XRXCOLOR_AUTOMATIC: + return true; + case GRAY: + case BLACK: + case GRAYSCALE: + case COLORMODE_MONOCHROME: + case HP_COLOR_BLACK: + case PRINTOUTMODE_NORMAL_GRAY: + case PROCESSCOLORMODEL_GREYSCALE: + case BROTHER_CUPS_MONO: + case BROTHER_BRSCRIPT3_BLACK: + case EPSON_INK_MONO: + case SHARP_ARCMODE_CMBW: + case XEROX_XRXCOLOR_BW: + return false; + case UNKNOWN_COLOR_MODEL: + // The default case is excluded from this switch statement to ensure that + // all ColorModel values are determinantly handled. + NOTREACHED(); + return base::nullopt; + } } // Global SequenceNumber used for generating unique cookie values. diff --git a/chromium/printing/print_settings.h b/chromium/printing/print_settings.h index de450432949..43b9b460cc0 100644 --- a/chromium/printing/print_settings.h +++ b/chromium/printing/print_settings.h @@ -9,6 +9,7 @@ #include <string> #include "base/macros.h" +#include "base/optional.h" #include "base/strings/string16.h" #include "printing/page_range.h" #include "printing/page_setup.h" @@ -25,8 +26,9 @@ namespace printing { -// Returns true if |color_mode| is color and not B&W. -PRINTING_EXPORT bool IsColorModelSelected(int color_mode); +// Returns true if |color_mode| is color and not B&W. Must be called with a +// |color_mode| from printing::ColorModel, excluding UNKNOWN_COLOR_MODEL. +PRINTING_EXPORT base::Optional<bool> IsColorModelSelected(int color_mode); #if defined(USE_CUPS) // Get the color model setting name and value for the |color_mode|. diff --git a/chromium/printing/printed_document.cc b/chromium/printing/printed_document.cc index 3d974c5e418..af32ba52128 100644 --- a/chromium/printing/printed_document.cc +++ b/chromium/printing/printed_document.cc @@ -23,6 +23,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" +#include "base/task/thread_pool.h" #include "base/time/time.h" #include "base/values.h" #include "printing/metafile.h" @@ -58,7 +59,8 @@ void DebugDumpPageTask(const base::string16& doc_name, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); page->metafile()->SaveTo(&file); } -#else +#endif // defined(OS_WIN) + void DebugDumpTask(const base::string16& doc_name, const MetafilePlayer* metafile) { DCHECK(PrintedDocument::HasDebugDumpPath()); @@ -70,9 +72,12 @@ void DebugDumpTask(const base::string16& doc_name, base::FilePath path = PrintedDocument::CreateDebugDumpPath(name, kExtension); base::File file(path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); +#if defined(OS_ANDROID) + metafile->SaveToFileDescriptor(file.GetPlatformFile()); +#else metafile->SaveTo(&file); +#endif // defined(OS_ANDROID) } -#endif void DebugDumpDataTask(const base::string16& doc_name, const base::FilePath::StringType& extension, @@ -94,9 +99,8 @@ void DebugDumpSettings(const base::string16& doc_name, job_settings, base::JSONWriter::OPTIONS_PRETTY_PRINT, &settings_str); scoped_refptr<base::RefCountedMemory> data = base::RefCountedString::TakeString(&settings_str); - base::PostTask( - FROM_HERE, - {base::ThreadPool(), base::TaskPriority::BEST_EFFORT, base::MayBlock()}, + base::ThreadPool::PostTask( + FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()}, base::BindOnce(&DebugDumpDataTask, doc_name, FILE_PATH_LITERAL(".json"), base::RetainedRef(data))); } @@ -139,9 +143,8 @@ void PrintedDocument::SetPage(int page_number, } if (HasDebugDumpPath()) { - base::PostTask( - FROM_HERE, - {base::ThreadPool(), base::TaskPriority::BEST_EFFORT, base::MayBlock()}, + base::ThreadPool::PostTask( + FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()}, base::BindOnce(&DebugDumpPageTask, name(), base::RetainedRef(page))); } } @@ -157,7 +160,15 @@ scoped_refptr<PrintedPage> PrintedDocument::GetPage(int page_number) { return page; } -#else +void PrintedDocument::DropPage(const PrintedPage* page) { + base::AutoLock lock(lock_); + PrintedPages::const_iterator it = + mutable_.pages_.find(page->page_number() - 1); + DCHECK_EQ(page, it->second.get()); + mutable_.pages_.erase(it); +} +#endif // defined(OS_WIN) + void PrintedDocument::SetDocument(std::unique_ptr<MetafilePlayer> metafile, const gfx::Size& page_size, const gfx::Rect& page_content_rect) { @@ -171,9 +182,8 @@ void PrintedDocument::SetDocument(std::unique_ptr<MetafilePlayer> metafile, } if (HasDebugDumpPath()) { - base::PostTask( - FROM_HERE, - {base::ThreadPool(), base::TaskPriority::BEST_EFFORT, base::MayBlock()}, + base::ThreadPool::PostTask( + FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()}, base::BindOnce(&DebugDumpTask, name(), mutable_.metafile_.get())); } } @@ -182,8 +192,6 @@ const MetafilePlayer* PrintedDocument::GetMetafile() { return mutable_.metafile_.get(); } -#endif - bool PrintedDocument::IsComplete() const { base::AutoLock lock(lock_); if (!mutable_.page_count_) @@ -271,9 +279,8 @@ void PrintedDocument::DebugDumpData( const base::RefCountedMemory* data, const base::FilePath::StringType& extension) { DCHECK(HasDebugDumpPath()); - base::PostTask( - FROM_HERE, - {base::ThreadPool(), base::TaskPriority::BEST_EFFORT, base::MayBlock()}, + base::ThreadPool::PostTask( + FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()}, base::BindOnce(&DebugDumpDataTask, name(), extension, base::RetainedRef(data))); } diff --git a/chromium/printing/printed_document.h b/chromium/printing/printed_document.h index 8d143269286..2810e26481a 100644 --- a/chromium/printing/printed_document.h +++ b/chromium/printing/printed_document.h @@ -46,6 +46,7 @@ class PRINTING_EXPORT PrintedDocument // Indicates that the PDF has been generated and the document is waiting for // conversion for printing. This is needed on Windows so that the print job // is not cancelled if the web contents dies before PDF conversion finishes. + // This is applicable when using the GDI print API. void SetConvertingPdf(); // Sets a page's data. 0-based. Note: locks for a short amount of time. @@ -59,7 +60,12 @@ class PRINTING_EXPORT PrintedDocument // requests to have this page be rendered and returns NULL. // Note: locks for a short amount of time. scoped_refptr<PrintedPage> GetPage(int page_number); -#else + + // Drop the specified page's reference for the particular page number. + // Note: locks for a short amount of time. + void DropPage(const PrintedPage* page); +#endif // defined(OS_WIN) + // Sets the document data. Note: locks for a short amount of time. void SetDocument(std::unique_ptr<MetafilePlayer> metafile, const gfx::Size& page_size, @@ -68,18 +74,18 @@ class PRINTING_EXPORT PrintedDocument // Retrieves the metafile with the data to print. Lock must be held when // calling this function const MetafilePlayer* GetMetafile(); -#endif // Draws the page in the context. // Note: locks for a short amount of time in debug only. #if defined(OS_WIN) + // This is applicable when using the Windows GDI print API. void RenderPrintedPage(const PrintedPage& page, printing::NativeDrawingContext context) const; -#elif defined(OS_POSIX) +#endif + // Draws the document in the context. Returns true on success and false on // failure. Fails if context->NewPage() or context->PageDone() fails. bool RenderPrintedDocument(PrintingContext* context); -#endif // Returns true if all the necessary pages for the settings are already // rendered. @@ -154,16 +160,20 @@ class PRINTING_EXPORT PrintedDocument // The total number of pages in the document. int page_count_ = 0; + std::unique_ptr<MetafilePlayer> metafile_; + #if defined(OS_WIN) // Contains the pages' representation. This is a collection of PrintedPage. // Warning: Lock must be held when accessing this member. + // This is applicable when using the Windows GDI print API which has the + // extra conversion step from PDF to EMF prior to sending to device. + // The metafile_ field is not used in this scenario. PrintedPages pages_; // Whether the PDF is being converted for printing. bool converting_pdf_ = false; -#else - std::unique_ptr<MetafilePlayer> metafile_; #endif + #if defined(OS_MACOSX) gfx::Size page_size_; gfx::Rect page_content_rect_; diff --git a/chromium/printing/printed_document_android.cc b/chromium/printing/printed_document_android.cc index bf502183fce..40106345db6 100644 --- a/chromium/printing/printed_document_android.cc +++ b/chromium/printing/printed_document_android.cc @@ -10,14 +10,11 @@ namespace printing { bool PrintedDocument::RenderPrintedDocument(PrintingContext* context) { - DCHECK(context); - if (context->NewPage() != PrintingContext::OK) return false; { base::AutoLock lock(lock_); const MetafilePlayer* metafile = GetMetafile(); - DCHECK(metafile); static_cast<PrintingContextAndroid*>(context)->PrintDocument(*metafile); } return context->PageDone() == PrintingContext::OK; diff --git a/chromium/printing/printed_document_linux.cc b/chromium/printing/printed_document_linux.cc index 87bc30e7d0f..a3098fe1c61 100644 --- a/chromium/printing/printed_document_linux.cc +++ b/chromium/printing/printed_document_linux.cc @@ -15,14 +15,11 @@ namespace printing { bool PrintedDocument::RenderPrintedDocument(PrintingContext* context) { - DCHECK(context); - if (context->NewPage() != PrintingContext::OK) return false; { base::AutoLock lock(lock_); const MetafilePlayer* metafile = GetMetafile(); - DCHECK(metafile); static_cast<PrintingContextLinux*>(context)->PrintDocument(*metafile); } return context->PageDone() == PrintingContext::OK; diff --git a/chromium/printing/printed_document_win.cc b/chromium/printing/printed_document_win.cc index fae513ed5d1..cdeac32407f 100644 --- a/chromium/printing/printed_document_win.cc +++ b/chromium/printing/printed_document_win.cc @@ -5,8 +5,10 @@ #include "printing/printed_document.h" #include "base/logging.h" +#include "printing/metafile_skia.h" #include "printing/page_number.h" #include "printing/printed_page_win.h" +#include "printing/printing_context_win.h" #include "printing/units.h" #include "skia/ext/skia_utils_win.h" @@ -77,4 +79,18 @@ void PrintedDocument::RenderPrintedPage( DCHECK_NE(res, 0); } +bool PrintedDocument::RenderPrintedDocument(PrintingContext* context) { + if (context->NewPage() != PrintingContext::OK) + return false; + + base::string16 device_name = immutable_.settings_->device_name(); + { + base::AutoLock lock(lock_); + const MetafilePlayer* metafile = GetMetafile(); + static_cast<PrintingContextWin*>(context)->PrintDocument( + device_name, *(static_cast<const MetafileSkia*>(metafile))); + } + return context->PageDone() == PrintingContext::OK; +} + } // namespace printing diff --git a/chromium/printing/printer_query_result_chromeos.h b/chromium/printing/printer_query_result.h index 8f926a8da13..8dfe86ada75 100644 --- a/chromium/printing/printer_query_result_chromeos.h +++ b/chromium/printing/printer_query_result.h @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef PRINTING_PRINTER_QUERY_RESULT_CHROMEOS_H_ -#define PRINTING_PRINTER_QUERY_RESULT_CHROMEOS_H_ +#ifndef PRINTING_PRINTER_QUERY_RESULT_H_ +#define PRINTING_PRINTER_QUERY_RESULT_H_ #include "printing/printing_export.h" @@ -18,4 +18,4 @@ enum PRINTING_EXPORT PrinterQueryResult { } // namespace printing -#endif // PRINTING_PRINTER_QUERY_RESULT_CHROMEOS_H_ +#endif // PRINTING_PRINTER_QUERY_RESULT_H_ diff --git a/chromium/printing/printer_status.cc b/chromium/printing/printer_status.cc new file mode 100644 index 00000000000..cb5d3717158 --- /dev/null +++ b/chromium/printing/printer_status.cc @@ -0,0 +1,15 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "printing/printer_status.h" + +namespace printing { + +PrinterStatus::PrinterStatus() = default; + +PrinterStatus::PrinterStatus(const PrinterStatus& other) = default; + +PrinterStatus::~PrinterStatus() = default; + +} // namespace printing diff --git a/chromium/printing/printer_status.h b/chromium/printing/printer_status.h new file mode 100644 index 00000000000..929300b0fbc --- /dev/null +++ b/chromium/printing/printer_status.h @@ -0,0 +1,80 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PRINTING_PRINTER_STATUS_H_ +#define PRINTING_PRINTER_STATUS_H_ + +#include <cups/cups.h> + +#include <string> +#include <vector> + +#include "printing/printing_export.h" + +namespace printing { + +// Represents the status of a printer containing the properties printer-state, +// printer-state-reasons, and printer-state-message. +struct PRINTING_EXPORT PrinterStatus { + struct PrinterReason { + // Standardized reasons from RFC2911. + enum Reason { + UNKNOWN_REASON, + NONE, + MEDIA_NEEDED, + MEDIA_JAM, + MOVING_TO_PAUSED, + PAUSED, + SHUTDOWN, + CONNECTING_TO_DEVICE, + TIMED_OUT, + STOPPING, + STOPPED_PARTLY, + TONER_LOW, + TONER_EMPTY, + SPOOL_AREA_FULL, + COVER_OPEN, + INTERLOCK_OPEN, + DOOR_OPEN, + INPUT_TRAY_MISSING, + MEDIA_LOW, + MEDIA_EMPTY, + OUTPUT_TRAY_MISSING, + OUTPUT_AREA_ALMOST_FULL, + OUTPUT_AREA_FULL, + MARKER_SUPPLY_LOW, + MARKER_SUPPLY_EMPTY, + MARKER_WASTE_ALMOST_FULL, + MARKER_WASTE_FULL, + FUSER_OVER_TEMP, + FUSER_UNDER_TEMP, + OPC_NEAR_EOL, + OPC_LIFE_OVER, + DEVELOPER_LOW, + DEVELOPER_EMPTY, + INTERPRETER_RESOURCE_UNAVAILABLE + }; + + // Severity of the state-reason. + enum Severity { UNKNOWN_SEVERITY, REPORT, WARNING, ERROR }; + + Reason reason; + Severity severity; + }; + + PrinterStatus(); + PrinterStatus(const PrinterStatus& other); + ~PrinterStatus(); + + // printer-state + ipp_pstate_t state; + // printer-state-reasons + std::vector<PrinterReason> reasons; + // printer-state-message + std::string message; +}; + +} // namespace printing + +#endif // PRINTING_PRINTER_STATUS_H_ diff --git a/chromium/printing/printing_context_android.cc b/chromium/printing/printing_context_android.cc index 6bad14cd792..961bb37b28d 100644 --- a/chromium/printing/printing_context_android.cc +++ b/chromium/printing/printing_context_android.cc @@ -159,9 +159,7 @@ void PrintingContextAndroid::ShowSystemDialogDone( void PrintingContextAndroid::PrintDocument(const MetafilePlayer& metafile) { DCHECK(is_file_descriptor_valid()); - base::File file(fd_); - metafile.SaveTo(&file); - file.TakePlatformFile(); + metafile.SaveToFileDescriptor(fd_); } PrintingContext::Result PrintingContextAndroid::UseDefaultSettings() { diff --git a/chromium/printing/printing_context_chromeos.cc b/chromium/printing/printing_context_chromeos.cc index f7b1680ef21..23e29002884 100644 --- a/chromium/printing/printing_context_chromeos.cc +++ b/chromium/printing/printing_context_chromeos.cc @@ -23,12 +23,12 @@ #include "base/strings/utf_string_conversions.h" #include "printing/backend/cups_connection.h" #include "printing/backend/cups_ipp_constants.h" -#include "printing/backend/cups_ipp_util.h" +#include "printing/backend/cups_ipp_helper.h" #include "printing/backend/cups_printer.h" #include "printing/metafile.h" #include "printing/print_job_constants.h" #include "printing/print_settings.h" -#include "printing/printing_features_chromeos.h" +#include "printing/printing_features.h" #include "printing/units.h" namespace printing { @@ -154,7 +154,8 @@ std::vector<ScopedCupsOption> SettingsToCupsOptions( options.push_back(ConstructOption(kIppPinEncryption, kPinEncryptionNone)); } - if (base::FeatureList::IsEnabled(printing::kAdvancedPpdAttributes)) { + if (base::FeatureList::IsEnabled( + printing::features::kAdvancedPpdAttributes)) { size_t regular_attr_count = options.size(); std::map<std::string, std::vector<std::string>> multival; for (const auto& setting : settings.advanced_settings()) { @@ -188,8 +189,44 @@ std::vector<ScopedCupsOption> SettingsToCupsOptions( return options; } +// Given an integral |value| expressed in PWG units (1/100 mm), returns +// the same value expressed in device units. +int PwgUnitsToDeviceUnits(int value, float micrometers_per_device_unit) { + return ConvertUnitDouble(value, micrometers_per_device_unit, 10); +} + +// Given a |media_size|, the specification of the media's |margins|, and +// the number of micrometers per device unit, returns the rectangle +// bounding the apparent printable area of said media. +gfx::Rect RepresentPrintableArea(const gfx::Size& media_size, + const CupsPrinter::CupsMediaMargins& margins, + float micrometers_per_device_unit) { + // These values express inward encroachment by margins, away from the + // edges of the |media_size|. + int left_bound = + PwgUnitsToDeviceUnits(margins.left, micrometers_per_device_unit); + int bottom_bound = + PwgUnitsToDeviceUnits(margins.bottom, micrometers_per_device_unit); + int right_bound = + PwgUnitsToDeviceUnits(margins.right, micrometers_per_device_unit); + int top_bound = + PwgUnitsToDeviceUnits(margins.top, micrometers_per_device_unit); + + // These values express the bounding box of the printable area on the + // page. + int printable_width = media_size.width() - (left_bound + right_bound); + int printable_height = media_size.height() - (top_bound + bottom_bound); + + if (printable_width > 0 && printable_height > 0) { + return {left_bound, bottom_bound, printable_width, printable_height}; + } + + return {0, 0, media_size.width(), media_size.height()}; +} + void SetPrintableArea(PrintSettings* settings, const PrintSettings::RequestedMedia& media, + const CupsPrinter::CupsMediaMargins& margins, bool flip) { if (!media.size_microns.IsEmpty()) { float device_microns_per_device_unit = @@ -198,7 +235,8 @@ void SetPrintableArea(PrintSettings* settings, gfx::Size(media.size_microns.width() / device_microns_per_device_unit, media.size_microns.height() / device_microns_per_device_unit); - gfx::Rect paper_rect(0, 0, paper_size.width(), paper_size.height()); + gfx::Rect paper_rect = RepresentPrintableArea( + paper_size, margins, device_microns_per_device_unit); settings->SetPrinterPrintableArea(paper_size, paper_rect, flip); } } @@ -294,7 +332,9 @@ PrintingContext::Result PrintingContextChromeos::UseDefaultSettings() { media.size_microns = paper.size_um; settings_->set_requested_media(media); - SetPrintableArea(settings_.get(), media, true /* flip landscape */); + CupsPrinter::CupsMediaMargins margins = + printer_->GetMediaMarginsByName(paper.vendor_id); + SetPrintableArea(settings_.get(), media, margins, true /* flip landscape */); return OK; } @@ -344,8 +384,8 @@ PrintingContext::Result PrintingContextChromeos::UpdatePrinterSettings( // compute paper size PrintSettings::RequestedMedia media = settings_->requested_media(); + DCHECK(printer_); if (media.IsDefault()) { - DCHECK(printer_); PrinterSemanticCapsAndDefaults::Paper paper = DefaultPaper(*printer_); media.vendor_id = paper.vendor_id; @@ -353,9 +393,20 @@ PrintingContext::Result PrintingContextChromeos::UpdatePrinterSettings( settings_->set_requested_media(media); } - SetPrintableArea(settings_.get(), media, true); + CupsPrinter::CupsMediaMargins margins = + printer_->GetMediaMarginsByName(media.vendor_id); + SetPrintableArea(settings_.get(), media, margins, true); cups_options_ = SettingsToCupsOptions(*settings_); send_user_info_ = settings_->send_user_info(); + if (send_user_info_) { + DCHECK(printer_); + std::string uri_string = printer_->GetUri(); + const base::StringPiece uri(uri_string); + if (!uri.starts_with("ipps:") && !uri.starts_with("https:") && + !uri.starts_with("usb:") && !uri.starts_with("ippusb:")) { + return OnError(); + } + } username_ = send_user_info_ ? settings_->username() : std::string(); return OK; diff --git a/chromium/printing/printing_context_win.cc b/chromium/printing/printing_context_win.cc index 735890c0d81..9ab4d306573 100644 --- a/chromium/printing/printing_context_win.cc +++ b/chromium/printing/printing_context_win.cc @@ -20,9 +20,11 @@ #include "printing/backend/print_backend.h" #include "printing/backend/win_helper.h" #include "printing/buildflags/buildflags.h" +#include "printing/metafile_skia.h" #include "printing/print_settings_initializer_win.h" #include "printing/printed_document.h" #include "printing/printing_context_system_dialog_win.h" +#include "printing/printing_features.h" #include "printing/printing_utils.h" #include "printing/units.h" #include "skia/ext/skia_utils_win.h" @@ -58,6 +60,12 @@ PrintingContextWin::~PrintingContextWin() { ReleaseContext(); } +void PrintingContextWin::PrintDocument(const base::string16& device_name, + const MetafileSkia& metafile) { + // TODO(crbug.com/1008222) + NOTIMPLEMENTED(); +} + void PrintingContextWin::AskUserForSettings(int max_pages, bool has_selection, bool is_scripted, @@ -229,6 +237,15 @@ PrintingContext::Result PrintingContextWin::UpdatePrinterSettings( } // Set printer then refresh printer settings. scoped_dev_mode = CreateDevMode(printer.Get(), scoped_dev_mode.get()); + if (!scoped_dev_mode) + return OnError(); + + // Since CreateDevMode() doesn't honor color settings through the GDI call + // to DocumentProperties(), ensure the requested values persist here. + scoped_dev_mode->dmFields |= DM_COLOR; + scoped_dev_mode->dmColor = + settings_->color() != GRAY ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME; + return InitializeSettings(settings_->device_name(), scoped_dev_mode.get()); } @@ -260,6 +277,11 @@ PrintingContext::Result PrintingContextWin::NewDocument( in_print_job_ = true; + if (base::FeatureList::IsEnabled(printing::features::kUseXpsForPrinting)) + return OK; // This is all the new document context needed when using XPS. + + // Need more context setup when using GDI. + // Register the application's AbortProc function with GDI. if (SP_ERROR == SetAbortProc(context_, &AbortProc)) return OnError(); diff --git a/chromium/printing/printing_context_win.h b/chromium/printing/printing_context_win.h index 672307c7164..2f0ef1ad699 100644 --- a/chromium/printing/printing_context_win.h +++ b/chromium/printing/printing_context_win.h @@ -14,6 +14,7 @@ namespace printing { +class MetafileSkia; class PrintSettings; class PRINTING_EXPORT PrintingContextWin : public PrintingContext { @@ -21,6 +22,10 @@ class PRINTING_EXPORT PrintingContextWin : public PrintingContext { explicit PrintingContextWin(Delegate* delegate); ~PrintingContextWin() override; + // Prints the document contained in |metafile|. + void PrintDocument(const base::string16& device_name, + const MetafileSkia& metafile); + // Initializes with predefined settings. Result InitWithSettingsForTest(std::unique_ptr<PrintSettings> settings); diff --git a/chromium/printing/printing_features.cc b/chromium/printing/printing_features.cc new file mode 100644 index 00000000000..d2892a29229 --- /dev/null +++ b/chromium/printing/printing_features.cc @@ -0,0 +1,52 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "printing/printing_features.h" + +namespace printing { +namespace features { + +#if defined(OS_CHROMEOS) +// Enables Advanced PPD Attributes. +const base::Feature kAdvancedPpdAttributes{"AdvancedPpdAttributes", + base::FEATURE_ENABLED_BY_DEFAULT}; +#endif // defined(OS_CHROMEOS) + +#if defined(OS_MACOSX) +// Use the CUPS IPP printing backend instead of the original CUPS backend that +// calls the deprecated PPD API. +const base::Feature kCupsIppPrintingBackend{"CupsIppPrintingBackend", + base::FEATURE_DISABLED_BY_DEFAULT}; +#endif // defined(OS_MACOSX) + +#if defined(OS_WIN) +// Use XPS for printing instead of GDI. +const base::Feature kUseXpsForPrinting{"UseXpsForPrinting", + base::FEATURE_DISABLED_BY_DEFAULT}; + +// Use XPS for printing instead of GDI for printing PDF documents. This is +// independent of |kUseXpsForPrinting|; can use XPS for PDFs even if still using +// GDI for modifiable content. +const base::Feature kUseXpsForPrintingFromPdf{ + "UseXpsForPrintingFromPdf", base::FEATURE_DISABLED_BY_DEFAULT}; + +bool IsXpsPrintCapabilityRequired() { + return base::FeatureList::IsEnabled(features::kUseXpsForPrinting) || + base::FeatureList::IsEnabled(features::kUseXpsForPrintingFromPdf); +} + +bool ShouldPrintUsingXps(bool source_is_pdf) { + return base::FeatureList::IsEnabled(source_is_pdf + ? features::kUseXpsForPrintingFromPdf + : features::kUseXpsForPrinting); +} +#endif // defined(OS_WIN) + +// When enabled, PrintRenderFrameHelper uses a frame-associated +// URLLoaderFactory rather than renderer-associated one. +const base::Feature kUseFrameAssociatedLoaderFactory{ + "UseFrameAssociatedLoaderFactory", base::FEATURE_ENABLED_BY_DEFAULT}; + +} // namespace features +} // namespace printing diff --git a/chromium/printing/printing_features.h b/chromium/printing/printing_features.h new file mode 100644 index 00000000000..50feb3fea28 --- /dev/null +++ b/chromium/printing/printing_features.h @@ -0,0 +1,44 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PRINTING_PRINTING_FEATURES_H_ +#define PRINTING_PRINTING_FEATURES_H_ + +#include "base/feature_list.h" +#include "build/build_config.h" +#include "printing/printing_export.h" + +namespace printing { +namespace features { + +// The following features are declared alphabetically. The features should be +// documented with descriptions of their behaviors in the .cc file. + +#if defined(OS_CHROMEOS) +PRINTING_EXPORT extern const base::Feature kAdvancedPpdAttributes; +#endif // defined(OS_CHROMEOS) + +#if defined(OS_MACOSX) +PRINTING_EXPORT extern const base::Feature kCupsIppPrintingBackend; +#endif // defined(OS_MACOSX) + +#if defined(OS_WIN) +PRINTING_EXPORT extern const base::Feature kUseXpsForPrinting; +PRINTING_EXPORT extern const base::Feature kUseXpsForPrintingFromPdf; + +// Helper function to determine if there is any print path which could require +// the use of XPS print capabilities. +PRINTING_EXPORT bool IsXpsPrintCapabilityRequired(); + +// Helper function to determine if printing of a document from a particular +// source should be done using XPS printing API instead of with GDI. +PRINTING_EXPORT bool ShouldPrintUsingXps(bool source_is_pdf); +#endif // defined(OS_WIN) + +PRINTING_EXPORT extern const base::Feature kUseFrameAssociatedLoaderFactory; + +} // namespace features +} // namespace printing + +#endif // PRINTING_PRINTING_FEATURES_H_ diff --git a/chromium/printing/printing_features_chromeos.cc b/chromium/printing/printing_features_chromeos.cc deleted file mode 100644 index b2826d6b49b..00000000000 --- a/chromium/printing/printing_features_chromeos.cc +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "printing/printing_features_chromeos.h" - -namespace printing { - -// Enables Advanced PPD Attributes. -const base::Feature kAdvancedPpdAttributes{"AdvancedPpdAttributes", - base::FEATURE_DISABLED_BY_DEFAULT}; - -} // namespace printing diff --git a/chromium/printing/printing_features_chromeos.h b/chromium/printing/printing_features_chromeos.h deleted file mode 100644 index 59b1f0729d3..00000000000 --- a/chromium/printing/printing_features_chromeos.h +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PRINTING_PRINTING_FEATURES_CHROMEOS_H_ -#define PRINTING_PRINTING_FEATURES_CHROMEOS_H_ - -#include "base/feature_list.h" -#include "printing/printing_export.h" - -namespace printing { - -// All features in alphabetical order. The features should be documented -// alongside the definition of their values in the .cc file. -PRINTING_EXPORT extern const base::Feature kAdvancedPpdAttributes; - -} // namespace printing - -#endif // PRINTING_PRINTING_FEATURES_CHROMEOS_H_ diff --git a/chromium/printing/printing_utils.cc b/chromium/printing/printing_utils.cc index 353a0aab1e9..50a13da7f3b 100644 --- a/chromium/printing/printing_utils.cc +++ b/chromium/printing/printing_utils.cc @@ -4,21 +4,26 @@ #include "printing/printing_utils.h" -#include <stddef.h> +#include <unicode/ulocdata.h> #include <algorithm> +#include <cmath> +#include <string> #include "base/logging.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "printing/units.h" #include "third_party/icu/source/common/unicode/uchar.h" +#include "ui/gfx/geometry/size.h" #include "ui/gfx/text_elider.h" namespace printing { namespace { -const size_t kMaxDocumentTitleLength = 80; +constexpr size_t kMaxDocumentTitleLength = 80; +constexpr gfx::Size kIsoA4Microns = gfx::Size(210000, 297000); } // namespace @@ -28,8 +33,15 @@ base::string16 SimplifyDocumentTitleWithLength(const base::string16& title, no_controls.erase( std::remove_if(no_controls.begin(), no_controls.end(), &u_iscntrl), no_controls.end()); - base::ReplaceChars(no_controls, base::ASCIIToUTF16("\\"), - base::ASCIIToUTF16("_"), &no_controls); + + static constexpr const char* kCharsToReplace[] = { + "\\", "/", "<", ">", ":", "\"", "'", "|", "?", "*", "~", + }; + for (const char* c : kCharsToReplace) { + base::ReplaceChars(no_controls, base::ASCIIToUTF16(c), + base::ASCIIToUTF16("_"), &no_controls); + } + base::string16 result; gfx::ElideString(no_controls, length, &result); return result; @@ -63,4 +75,35 @@ base::string16 FormatDocumentTitleWithOwner(const base::string16& owner, kMaxDocumentTitleLength); } +gfx::Size GetDefaultPaperSizeFromLocaleMicrons(base::StringPiece locale) { + if (locale.empty()) + return kIsoA4Microns; + + int32_t width = 0; + int32_t height = 0; + UErrorCode error = U_ZERO_ERROR; + ulocdata_getPaperSize(locale.as_string().c_str(), &height, &width, &error); + if (error > U_ZERO_ERROR) { + // If the call failed, assume Letter paper size. + LOG(WARNING) << "ulocdata_getPaperSize failed, using ISO A4 Paper, error: " + << error; + + return kIsoA4Microns; + } + // Convert millis to microns + return gfx::Size(width * 1000, height * 1000); +} + +bool SizesEqualWithinEpsilon(const gfx::Size& lhs, + const gfx::Size& rhs, + int epsilon) { + DCHECK_GE(epsilon, 0); + + if (lhs.IsEmpty() && rhs.IsEmpty()) + return true; + + return std::abs(lhs.width() - rhs.width()) <= epsilon && + std::abs(lhs.height() - rhs.height()) <= epsilon; +} + } // namespace printing diff --git a/chromium/printing/printing_utils.h b/chromium/printing/printing_utils.h index b0e1f921335..332b5833c35 100644 --- a/chromium/printing/printing_utils.h +++ b/chromium/printing/printing_utils.h @@ -8,8 +8,13 @@ #include <stddef.h> #include "base/strings/string16.h" +#include "base/strings/string_piece.h" #include "printing/printing_export.h" +namespace gfx { +class Size; +} + namespace printing { // Simplify title to resolve issue with some drivers. @@ -29,6 +34,17 @@ PRINTING_EXPORT base::string16 FormatDocumentTitleWithOwnerAndLength( const base::string16& title, size_t length); +// Returns the paper size (microns) most common in the locale to the nearest +// millimeter. Defaults to ISO A4 for an empty or invalid locale. +PRINTING_EXPORT gfx::Size GetDefaultPaperSizeFromLocaleMicrons( + base::StringPiece locale); + +// Returns true if both dimensions of the sizes have a delta less than or equal +// to the epsilon value. +PRINTING_EXPORT bool SizesEqualWithinEpsilon(const gfx::Size& lhs, + const gfx::Size& rhs, + int epsilon); + } // namespace printing #endif // PRINTING_PRINTING_UTILS_H_ diff --git a/chromium/printing/printing_utils_unittest.cc b/chromium/printing/printing_utils_unittest.cc index 4a0442760d7..5d48a076312 100644 --- a/chromium/printing/printing_utils_unittest.cc +++ b/chromium/printing/printing_utils_unittest.cc @@ -2,17 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "printing/printing_utils.h" + #include <stddef.h> +#include <limits> +#include <string> + #include "base/strings/utf_string_conversions.h" -#include "printing/printing_utils.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/size.h" namespace printing { namespace { -const size_t kTestLength = 8; +constexpr size_t kTestLength = 8; +constexpr gfx::Size kIsoA4Microns(210000, 297000); +constexpr gfx::Size kNaLetterMicrons(216000, 279000); std::string Simplify(const std::string& title) { return base::UTF16ToUTF8( @@ -31,7 +38,10 @@ TEST(PrintingUtilsTest, SimplifyDocumentTitle) { EXPECT_EQ("abcdefgh", Simplify("abcdefgh")); EXPECT_EQ("abc...ij", Simplify("abcdefghij")); EXPECT_EQ("Controls", Simplify("C\ron\nt\15rols")); - EXPECT_EQ("C:_foo_", Simplify("C:\\foo\\")); + EXPECT_EQ("C__foo_", Simplify("C:\\foo\\")); + EXPECT_EQ("C__foo_", Simplify("C:/foo/")); + EXPECT_EQ("a_b_c", Simplify("a<b\"c")); + EXPECT_EQ("d_e_f_", Simplify("d*e?f~")); EXPECT_EQ("", Simplify("\n\r\n\r\t\r")); } @@ -46,4 +56,47 @@ TEST(PrintingUtilsTest, FormatDocumentTitleWithOwner) { EXPECT_EQ("ab...j: ", Format("abcdefghij", "0123456789")); } +TEST(PrintingUtilsTest, GetDefaultPaperSizeFromLocaleMicrons) { + // Valid locales + EXPECT_EQ(kNaLetterMicrons, GetDefaultPaperSizeFromLocaleMicrons("en-US")); + EXPECT_EQ(kNaLetterMicrons, GetDefaultPaperSizeFromLocaleMicrons("en_US")); + EXPECT_EQ(kNaLetterMicrons, GetDefaultPaperSizeFromLocaleMicrons("fr-CA")); + EXPECT_EQ(kNaLetterMicrons, GetDefaultPaperSizeFromLocaleMicrons("es-CL")); + EXPECT_EQ(kIsoA4Microns, GetDefaultPaperSizeFromLocaleMicrons("en_UK")); + EXPECT_EQ(kIsoA4Microns, GetDefaultPaperSizeFromLocaleMicrons("fa-IR")); + + // Empty locale + EXPECT_EQ(kIsoA4Microns, GetDefaultPaperSizeFromLocaleMicrons("")); + + // Non-existing locale + EXPECT_EQ(kIsoA4Microns, + GetDefaultPaperSizeFromLocaleMicrons("locale-does-not-exist")); +} + +TEST(PrintingUtilsTest, SizesEqualWithinEpsilon) { + constexpr int kMaxInt = std::numeric_limits<int>::max(); + + // Large sizes + EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(kMaxInt, kMaxInt), + gfx::Size(kMaxInt - 1, kMaxInt - 1), 1)); + EXPECT_FALSE(SizesEqualWithinEpsilon(gfx::Size(kMaxInt, kMaxInt), + gfx::Size(kMaxInt - 1, kMaxInt - 2), 1)); + EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(kMaxInt, kMaxInt), + gfx::Size(0, 0), kMaxInt)); + EXPECT_FALSE(SizesEqualWithinEpsilon(gfx::Size(kMaxInt, kMaxInt), + gfx::Size(0, 0), kMaxInt - 1)); + + // Empty sizes + EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(0, 0), gfx::Size(0, 0), 0)); + EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(1, 0), gfx::Size(0, 2), 0)); + EXPECT_TRUE(SizesEqualWithinEpsilon(gfx::Size(1, -2), gfx::Size(-1, 2), 0)); + + // Common paper sizes + EXPECT_FALSE(SizesEqualWithinEpsilon(kNaLetterMicrons, kIsoA4Microns, 1000)); + EXPECT_TRUE(SizesEqualWithinEpsilon(kNaLetterMicrons, + gfx::Size(215900, 279400), 500)); + EXPECT_TRUE( + SizesEqualWithinEpsilon(kIsoA4Microns, gfx::Size(210500, 296500), 500)); +} + } // namespace printing diff --git a/chromium/printing/units.h b/chromium/printing/units.h index 7b83577a8f7..6dcc2062d52 100644 --- a/chromium/printing/units.h +++ b/chromium/printing/units.h @@ -18,30 +18,30 @@ constexpr int kMilsPerInch = 1000; // Length of an inch in CSS's 1pt unit. // http://dev.w3.org/csswg/css3-values/#absolute-length-units-cm-mm.-in-pt-pc -const int kPointsPerInch = 72; +constexpr int kPointsPerInch = 72; // Length of an inch in CSS's 1px unit. // http://dev.w3.org/csswg/css3-values/#the-px-unit -const int kPixelsPerInch = 96; +constexpr int kPixelsPerInch = 96; // Dpi used to save to PDF or Cloud Print. -const int kDefaultPdfDpi = 300; +constexpr int kDefaultPdfDpi = 300; // LETTER: 8.5 x 11 inches -const float kLetterWidthInch = 8.5f; -const float kLetterHeightInch = 11.0f; +constexpr float kLetterWidthInch = 8.5f; +constexpr float kLetterHeightInch = 11.0f; // LEGAL: 8.5 x 14 inches -const float kLegalWidthInch = 8.5f; -const float kLegalHeightInch = 14.0f; +constexpr float kLegalWidthInch = 8.5f; +constexpr float kLegalHeightInch = 14.0f; // A4: 8.27 x 11.69 inches -const float kA4WidthInch = 8.27f; -const float kA4HeightInch = 11.69f; +constexpr float kA4WidthInch = 8.27f; +constexpr float kA4HeightInch = 11.69f; // A3: 11.69 x 16.54 inches -const float kA3WidthInch = 11.69f; -const float kA3HeightInch = 16.54f; +constexpr float kA3WidthInch = 11.69f; +constexpr float kA3HeightInch = 16.54f; // Converts from one unit system to another using integer arithmetics. PRINTING_EXPORT int ConvertUnit(double value, int old_unit, int new_unit); |