summaryrefslogtreecommitdiff
path: root/chromium/printing
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-07-16 11:45:35 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-07-17 08:59:23 +0000
commit552906b0f222c5d5dd11b9fd73829d510980461a (patch)
tree3a11e6ed0538a81dd83b20cf3a4783e297f26d91 /chromium/printing
parent1b05827804eaf047779b597718c03e7d38344261 (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/printing/BUILD.gn262
-rw-r--r--chromium/printing/DEPS1
-rw-r--r--chromium/printing/backend/cups_connection.cc13
-rw-r--r--chromium/printing/backend/cups_connection.h1
-rw-r--r--chromium/printing/backend/cups_helper.cc217
-rw-r--r--chromium/printing/backend/cups_helper.h6
-rw-r--r--chromium/printing/backend/cups_helper_unittest.cc565
-rw-r--r--chromium/printing/backend/cups_ipp_constants.cc6
-rw-r--r--chromium/printing/backend/cups_ipp_helper.cc (renamed from chromium/printing/backend/cups_ipp_util.cc)13
-rw-r--r--chromium/printing/backend/cups_ipp_helper.h (renamed from chromium/printing/backend/cups_ipp_util.h)6
-rw-r--r--chromium/printing/backend/cups_ipp_helper_unittest.cc (renamed from chromium/printing/backend/cups_ipp_util_unittest.cc)54
-rw-r--r--chromium/printing/backend/cups_ipp_utils.cc48
-rw-r--r--chromium/printing/backend/cups_ipp_utils.h26
-rw-r--r--chromium/printing/backend/cups_jobs.cc30
-rw-r--r--chromium/printing/backend/cups_jobs.h76
-rw-r--r--chromium/printing/backend/cups_printer.cc66
-rw-r--r--chromium/printing/backend/cups_printer.h24
-rw-r--r--chromium/printing/backend/print_backend.cc13
-rw-r--r--chromium/printing/backend/print_backend.h20
-rw-r--r--chromium/printing/backend/print_backend_chromeos.cc38
-rw-r--r--chromium/printing/backend/print_backend_consts.cc15
-rw-r--r--chromium/printing/backend/print_backend_consts.h9
-rw-r--r--chromium/printing/backend/print_backend_cups.cc73
-rw-r--r--chromium/printing/backend/print_backend_cups_ipp.cc9
-rw-r--r--chromium/printing/backend/print_backend_cups_ipp.h2
-rw-r--r--chromium/printing/backend/print_backend_cups_linux_unittest.cc34
-rw-r--r--chromium/printing/backend/print_backend_cups_mac_unittest.cc35
-rw-r--r--chromium/printing/backend/print_backend_cups_unittest.cc91
-rw-r--r--chromium/printing/backend/print_backend_dummy.cc3
-rw-r--r--chromium/printing/backend/print_backend_win.cc7
-rw-r--r--chromium/printing/backend/test_print_backend.cc2
-rw-r--r--chromium/printing/backend/test_print_backend.h5
-rw-r--r--chromium/printing/backend/tools/README.md14
-rw-r--r--chromium/printing/backend/tools/code_generator.gni26
-rwxr-xr-xchromium/printing/backend/tools/code_generator.py253
-rw-r--r--chromium/printing/backend/tools/ipp-registrations-4.csv2840
-rw-r--r--chromium/printing/backend/tools/ipp-registrations-6.csv306
-rw-r--r--chromium/printing/backend/win_helper.cc22
-rw-r--r--chromium/printing/backend/win_helper.h3
-rw-r--r--chromium/printing/buildflags/BUILD.gn1
-rw-r--r--chromium/printing/buildflags/buildflags.gni7
-rw-r--r--chromium/printing/common/BUILD.gn5
-rw-r--r--chromium/printing/common/metafile_utils.cc163
-rw-r--r--chromium/printing/common/metafile_utils.h2
-rw-r--r--chromium/printing/common/printing_features.cc20
-rw-r--r--chromium/printing/common/printing_features.h24
-rw-r--r--chromium/printing/emf_win.cc9
-rw-r--r--chromium/printing/emf_win.h4
-rw-r--r--chromium/printing/emf_win_unittest.cc19
-rw-r--r--chromium/printing/metafile.cc2
-rw-r--r--chromium/printing/metafile.h67
-rw-r--r--chromium/printing/metafile_skia.cc43
-rw-r--r--chromium/printing/metafile_skia.h20
-rw-r--r--chromium/printing/pdf_metafile_cg_mac.cc30
-rw-r--r--chromium/printing/pdf_metafile_cg_mac.h18
-rw-r--r--chromium/printing/pdf_metafile_cg_mac_unittest.cc172
-rw-r--r--chromium/printing/print_job_constants.cc4
-rw-r--r--chromium/printing/print_job_constants.h11
-rw-r--r--chromium/printing/print_settings.cc84
-rw-r--r--chromium/printing/print_settings.h6
-rw-r--r--chromium/printing/printed_document.cc41
-rw-r--r--chromium/printing/printed_document.h22
-rw-r--r--chromium/printing/printed_document_android.cc3
-rw-r--r--chromium/printing/printed_document_linux.cc3
-rw-r--r--chromium/printing/printed_document_win.cc16
-rw-r--r--chromium/printing/printer_query_result.h (renamed from chromium/printing/printer_query_result_chromeos.h)6
-rw-r--r--chromium/printing/printer_status.cc15
-rw-r--r--chromium/printing/printer_status.h80
-rw-r--r--chromium/printing/printing_context_android.cc4
-rw-r--r--chromium/printing/printing_context_chromeos.cc65
-rw-r--r--chromium/printing/printing_context_win.cc22
-rw-r--r--chromium/printing/printing_context_win.h5
-rw-r--r--chromium/printing/printing_features.cc52
-rw-r--r--chromium/printing/printing_features.h44
-rw-r--r--chromium/printing/printing_features_chromeos.cc13
-rw-r--r--chromium/printing/printing_features_chromeos.h19
-rw-r--r--chromium/printing/printing_utils.cc51
-rw-r--r--chromium/printing/printing_utils.h16
-rw-r--r--chromium/printing/printing_utils_unittest.cc59
-rw-r--r--chromium/printing/units.h22
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);