15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/cloud_devices/common/printer_description.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <algorithm>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/json/json_reader.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/json/json_writer.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/values.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/cloud_devices/common/cloud_device_description_consts.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/cloud_devices/common/description_items_inl.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace cloud_devices {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace printer {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int32 kMaxPageNumber = 1000000;
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSectionPrint[] = "print";
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kSectionPrinter[] = "printer";
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kCustomName[] = "custom_display_name";
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kKeyContentType[] = "content_type";
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kKeyName[] = "name";
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kKeyType[] = "type";
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kKeyVendorId[] = "vendor_id";
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// extern is required to be used in templates.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionCollate[] = "collate";
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionColor[] = "color";
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionContentType[] = "supported_content_type";
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionCopies[] = "copies";
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionDpi[] = "dpi";
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionDuplex[] = "duplex";
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionFitToPage[] = "fit_to_page";
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionMargins[] = "margins";
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionMediaSize[] = "media_size";
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionPageOrientation[] = "page_orientation";
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionPageRange[] = "page_range";
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)extern const char kOptionReverse[] = "reverse_order";
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochextern const char kOptionPwgRasterConfig[] = "pwg_raster_config";
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kMargineBottom[] = "bottom_microns";
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kMargineLeft[] = "left_microns";
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kMargineRight[] = "right_microns";
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kMargineTop[] = "top_microns";
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kDpiHorizontal[] = "horizontal_dpi";
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kDpiVertical[] = "vertical_dpi";
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kMediaWidth[] = "width_microns";
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kMediaHeight[] = "height_microns";
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kMediaIsContinuous[] = "is_continuous_feed";
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kPageRangeInterval[] = "interval";
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kPageRangeEnd[] = "end";
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kPageRangeStart[] = "start";
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kPwgRasterDocumentSheetBack[] = "document_sheet_back";
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kPwgRasterReverseOrderStreaming[] = "reverse_order_streaming";
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kPwgRasterRotateAllPages[] = "rotate_all_pages";
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeColorColor[] = "STANDARD_COLOR";
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeColorMonochrome[] = "STANDARD_MONOCHROME";
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeColorCustomColor[] = "CUSTOM_COLOR";
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeColorCustomMonochrome[] = "CUSTOM_MONOCHROME";
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeColorAuto[] = "AUTO";
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeDuplexLongEdge[] = "LONG_EDGE";
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeDuplexNoDuplex[] = "NO_DUPLEX";
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeDuplexShortEdge[] = "SHORT_EDGE";
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeFitToPageFillPage[] = "FILL_PAGE";
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeFitToPageFitToPage[] = "FIT_TO_PAGE";
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeFitToPageGrowToPage[] = "GROW_TO_PAGE";
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeFitToPageNoFitting[] = "NO_FITTING";
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeFitToPageShrinkToPage[] = "SHRINK_TO_PAGE";
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeMarginsBorderless[] = "BORDERLESS";
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeMarginsCustom[] = "CUSTOM";
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeMarginsStandard[] = "STANDARD";
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeOrientationAuto[] = "AUTO";
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeOrientationLandscape[] = "LANDSCAPE";
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kTypeOrientationPortrait[] = "PORTRAIT";
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTypeDocumentSheetBackNormal[] = "NORMAL";
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTypeDocumentSheetBackRotated[] = "ROTATED";
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTypeDocumentSheetBackManualTumble[] = "MANUAL_TUMBLE";
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTypeDocumentSheetBackFlipped[] = "FLIPPED";
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const struct ColorNames {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ColorType id;
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const char* const json_name;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} kColorNames[] = {
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {STANDARD_COLOR, kTypeColorColor},
1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {STANDARD_MONOCHROME, kTypeColorMonochrome},
1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {CUSTOM_COLOR, kTypeColorCustomColor},
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {CUSTOM_MONOCHROME, kTypeColorCustomMonochrome},
1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {AUTO_COLOR, kTypeColorAuto},
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const struct DuplexNames {
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DuplexType id;
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const char* const json_name;
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} kDuplexNames[] = {
1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {NO_DUPLEX, kTypeDuplexNoDuplex},
1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {LONG_EDGE, kTypeDuplexLongEdge},
1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {SHORT_EDGE, kTypeDuplexShortEdge},
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const struct OrientationNames {
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OrientationType id;
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const char* const json_name;
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} kOrientationNames[] = {
1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {PORTRAIT, kTypeOrientationPortrait},
1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {LANDSCAPE, kTypeOrientationLandscape},
1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {AUTO_ORIENTATION, kTypeOrientationAuto},
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const struct MarginsNames {
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MarginsType id;
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const char* const json_name;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} kMarginsNames[] = {
1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {NO_MARGINS, kTypeMarginsBorderless},
1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {STANDARD_MARGINS, kTypeMarginsStandard},
1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {CUSTOM_MARGINS, kTypeMarginsCustom},
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const struct FitToPageNames {
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FitToPageType id;
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const char* const json_name;
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} kFitToPageNames[] = {
1390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {NO_FITTING, kTypeFitToPageNoFitting},
1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {FIT_TO_PAGE, kTypeFitToPageFitToPage},
1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {GROW_TO_PAGE, kTypeFitToPageGrowToPage},
1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {SHRINK_TO_PAGE, kTypeFitToPageShrinkToPage},
1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {FILL_PAGE, kTypeFitToPageFillPage},
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst struct DocumentSheetBackNames {
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DocumentSheetBack id;
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const char* const json_name;
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} kDocumentSheetBackNames[] = {
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      {NORMAL, kTypeDocumentSheetBackNormal},
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      {ROTATED, kTypeDocumentSheetBackRotated},
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      {MANUAL_TUMBLE, kTypeDocumentSheetBackManualTumble},
153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      {FLIPPED, kTypeDocumentSheetBackFlipped}};
154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int32 kInchToUm = 25400;
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int32 kMmToUm = 1000;
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int32 kSizeTrasholdUm = 1000;
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MAP_CLOUD_PRINT_MEDIA_TYPE(type, width, height, unit_um) \
1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {                                                              \
1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    type, #type, static_cast<int>(width* unit_um + 0.5),         \
1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        static_cast<int>(height* unit_um + 0.5)                  \
1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const struct MediaDefinition {
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaType id;
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const char* const json_name;
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int width_um;
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int height_um;
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} kMediaDefinitions[] = {
1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {CUSTOM_MEDIA, "CUSTOM", 0, 0},
1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_INDEX_3X5, 3, 5, kInchToUm),
1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_PERSONAL, 3.625f, 6.5f, kInchToUm),
1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_MONARCH, 3.875f, 7.5f, kInchToUm),
1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_NUMBER_9, 3.875f, 8.875f, kInchToUm),
1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_INDEX_4X6, 4, 6, kInchToUm),
1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_NUMBER_10, 4.125f, 9.5f, kInchToUm),
1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_A2, 4.375f, 5.75f, kInchToUm),
1790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_NUMBER_11, 4.5f, 10.375f, kInchToUm),
1800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_NUMBER_12, 4.75f, 11, kInchToUm),
1810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_5X7, 5, 7, kInchToUm),
1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_INDEX_5X8, 5, 8, kInchToUm),
1830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_NUMBER_14, 5, 11.5f, kInchToUm),
1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_INVOICE, 5.5f, 8.5f, kInchToUm),
1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_INDEX_4X6_EXT, 6, 8, kInchToUm),
1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_6X9, 6, 9, kInchToUm),
1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_C5, 6.5f, 9.5f, kInchToUm),
1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_7X9, 7, 9, kInchToUm),
1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_EXECUTIVE, 7.25f, 10.5f, kInchToUm),
1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_GOVT_LETTER, 8, 10, kInchToUm),
1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_GOVT_LEGAL, 8, 13, kInchToUm),
1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_QUARTO, 8.5f, 10.83f, kInchToUm),
1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_LETTER, 8.5f, 11, kInchToUm),
1940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_FANFOLD_EUR, 8.5f, 12, kInchToUm),
1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_LETTER_PLUS, 8.5f, 12.69f, kInchToUm),
1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_FOOLSCAP, 8.5f, 13, kInchToUm),
1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_LEGAL, 8.5f, 14, kInchToUm),
1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_SUPER_A, 8.94f, 14, kInchToUm),
1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_9X11, 9, 11, kInchToUm),
2000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_ARCH_A, 9, 12, kInchToUm),
2010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_LETTER_EXTRA, 9.5f, 12, kInchToUm),
2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_LEGAL_EXTRA, 9.5f, 15, kInchToUm),
2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_10X11, 10, 11, kInchToUm),
2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_10X13, 10, 13, kInchToUm),
2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_10X14, 10, 14, kInchToUm),
2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_10X15, 10, 15, kInchToUm),
2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_11X12, 11, 12, kInchToUm),
2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_EDP, 11, 14, kInchToUm),
2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_FANFOLD_US, 11, 14.875f, kInchToUm),
2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_11X15, 11, 15, kInchToUm),
2110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_LEDGER, 11, 17, kInchToUm),
2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_EUR_EDP, 12, 14, kInchToUm),
2130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_ARCH_B, 12, 18, kInchToUm),
2140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_12X19, 12, 19, kInchToUm),
2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_B_PLUS, 12, 19.17f, kInchToUm),
2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_SUPER_B, 13, 19, kInchToUm),
2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_C, 17, 22, kInchToUm),
2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_ARCH_C, 18, 24, kInchToUm),
2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_D, 22, 34, kInchToUm),
2200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_ARCH_D, 24, 36, kInchToUm),
2210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_ASME_F, 28, 40, kInchToUm),
2220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_WIDE_FORMAT, 30, 42, kInchToUm),
2230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_E, 34, 44, kInchToUm),
2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_ARCH_E, 36, 48, kInchToUm),
2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(NA_F, 44, 68, kInchToUm),
2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ROC_16K, 7.75f, 10.75f, kInchToUm),
2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ROC_8K, 10.75f, 15.5f, kInchToUm),
2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_32K, 97, 151, kMmToUm),
2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_1, 102, 165, kMmToUm),
2300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_2, 102, 176, kMmToUm),
2310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_4, 110, 208, kMmToUm),
2320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_5, 110, 220, kMmToUm),
2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_8, 120, 309, kMmToUm),
2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_6, 120, 230, kMmToUm),
2350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_3, 125, 176, kMmToUm),
2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_16K, 146, 215, kMmToUm),
2370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_7, 160, 230, kMmToUm),
2380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_JUURO_KU_KAI, 198, 275, kMmToUm),
2390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_PA_KAI, 267, 389, kMmToUm),
2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_DAI_PA_KAI, 275, 395, kMmToUm),
2410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(PRC_10, 324, 458, kMmToUm),
2420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A10, 26, 37, kMmToUm),
2430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A9, 37, 52, kMmToUm),
2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A8, 52, 74, kMmToUm),
2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A7, 74, 105, kMmToUm),
2460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A6, 105, 148, kMmToUm),
2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A5, 148, 210, kMmToUm),
2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A5_EXTRA, 174, 235, kMmToUm),
2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4, 210, 297, kMmToUm),
2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4_TAB, 225, 297, kMmToUm),
2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4_EXTRA, 235, 322, kMmToUm),
2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A3, 297, 420, kMmToUm),
2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4X3, 297, 630, kMmToUm),
2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4X4, 297, 841, kMmToUm),
2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4X5, 297, 1051, kMmToUm),
2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4X6, 297, 1261, kMmToUm),
2570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4X7, 297, 1471, kMmToUm),
2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4X8, 297, 1682, kMmToUm),
2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A4X9, 297, 1892, kMmToUm),
2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A3_EXTRA, 322, 445, kMmToUm),
2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A2, 420, 594, kMmToUm),
2620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A3X3, 420, 891, kMmToUm),
2630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A3X4, 420, 1189, kMmToUm),
2640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A3X5, 420, 1486, kMmToUm),
2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A3X6, 420, 1783, kMmToUm),
2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A3X7, 420, 2080, kMmToUm),
2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A1, 594, 841, kMmToUm),
2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A2X3, 594, 1261, kMmToUm),
2690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A2X4, 594, 1682, kMmToUm),
2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A2X5, 594, 2102, kMmToUm),
2710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A0, 841, 1189, kMmToUm),
2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A1X3, 841, 1783, kMmToUm),
2730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A1X4, 841, 2378, kMmToUm),
2740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_2A0, 1189, 1682, kMmToUm),
2750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_A0X3, 1189, 2523, kMmToUm),
2760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B10, 31, 44, kMmToUm),
2770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B9, 44, 62, kMmToUm),
2780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B8, 62, 88, kMmToUm),
2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B7, 88, 125, kMmToUm),
2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B6, 125, 176, kMmToUm),
2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B6C4, 125, 324, kMmToUm),
2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B5, 176, 250, kMmToUm),
2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B5_EXTRA, 201, 276, kMmToUm),
2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B4, 250, 353, kMmToUm),
2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B3, 353, 500, kMmToUm),
2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B2, 500, 707, kMmToUm),
2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B1, 707, 1000, kMmToUm),
2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_B0, 1000, 1414, kMmToUm),
2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C10, 28, 40, kMmToUm),
2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C9, 40, 57, kMmToUm),
2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C8, 57, 81, kMmToUm),
2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C7, 81, 114, kMmToUm),
2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C7C6, 81, 162, kMmToUm),
2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C6, 114, 162, kMmToUm),
2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C6C5, 114, 229, kMmToUm),
2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C5, 162, 229, kMmToUm),
2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C4, 229, 324, kMmToUm),
2980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C3, 324, 458, kMmToUm),
2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C2, 458, 648, kMmToUm),
3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C1, 648, 917, kMmToUm),
3010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_C0, 917, 1297, kMmToUm),
3020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_DL, 110, 220, kMmToUm),
3030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_RA2, 430, 610, kMmToUm),
3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_SRA2, 450, 640, kMmToUm),
3050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_RA1, 610, 860, kMmToUm),
3060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_SRA1, 640, 900, kMmToUm),
3070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_RA0, 860, 1220, kMmToUm),
3080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(ISO_SRA0, 900, 1280, kMmToUm),
3090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B10, 32, 45, kMmToUm),
3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B9, 45, 64, kMmToUm),
3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B8, 64, 91, kMmToUm),
3120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B7, 91, 128, kMmToUm),
3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B6, 128, 182, kMmToUm),
3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B5, 182, 257, kMmToUm),
3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B4, 257, 364, kMmToUm),
3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B3, 364, 515, kMmToUm),
3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B2, 515, 728, kMmToUm),
3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B1, 728, 1030, kMmToUm),
3190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_B0, 1030, 1456, kMmToUm),
3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JIS_EXEC, 216, 330, kMmToUm),
3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JPN_CHOU4, 90, 205, kMmToUm),
3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JPN_HAGAKI, 100, 148, kMmToUm),
3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JPN_YOU4, 105, 235, kMmToUm),
3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JPN_CHOU2, 111.1f, 146, kMmToUm),
3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JPN_CHOU3, 120, 235, kMmToUm),
3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JPN_OUFUKU, 148, 200, kMmToUm),
3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JPN_KAHU, 240, 322.1f, kMmToUm),
3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(JPN_KAKU2, 240, 332, kMmToUm),
3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_SMALL_PHOTO, 100, 150, kMmToUm),
3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_ITALIAN, 110, 230, kMmToUm),
3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_POSTFIX, 114, 229, kMmToUm),
3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_LARGE_PHOTO, 200, 300, kMmToUm),
3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_FOLIO, 210, 330, kMmToUm),
3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_FOLIO_SP, 215, 315, kMmToUm),
3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      MAP_CLOUD_PRINT_MEDIA_TYPE(OM_INVITE, 220, 220, kMmToUm)};
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef MAP_CLOUD_PRINT_MEDIA_TYPE
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const MediaDefinition& FindMediaByType(MediaType type) {
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kMediaDefinitions); ++i) {
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (kMediaDefinitions[i].id == type)
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return kMediaDefinitions[i];
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NOTREACHED();
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return kMediaDefinitions[0];
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const MediaDefinition* FindMediaBySize(int32 width_um, int32 height_um) {
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const MediaDefinition* result = NULL;
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kMediaDefinitions); ++i) {
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int32 diff = std::max(std::abs(width_um - kMediaDefinitions[i].width_um),
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          std::abs(height_um - kMediaDefinitions[i].height_um));
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (diff < kSizeTrasholdUm)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      result = &kMediaDefinitions[i];
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return result;
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochtemplate <class T, class IdType>
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string TypeToString(const T& names, IdType id) {
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(names); ++i) {
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (id == names[i].id)
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return names[i].json_name;
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NOTREACHED();
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return std::string();
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochtemplate <class T, class IdType>
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool TypeFromString(const T& names, const std::string& type, IdType* id) {
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(names); ++i) {
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (type == names[i].json_name) {
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      *id = names[i].id;
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return true;
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
381effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochPwgRasterConfig::PwgRasterConfig()
382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    : document_sheet_back(ROTATED),
383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      reverse_order_streaming(false),
3840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      rotate_all_pages(false) {
3850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3870529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochColor::Color() : type(AUTO_COLOR) {
3880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3900529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochColor::Color(ColorType type) : type(type) {
3910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Color::operator==(const Color& other) const {
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return type == other.type && vendor_id == other.vendor_id &&
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         custom_display_name == other.custom_display_name;
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Color::IsValid() const {
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (type != CUSTOM_COLOR && type != CUSTOM_MONOCHROME)
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return !vendor_id.empty() && !custom_display_name.empty();
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Margins::Margins()
4050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : type(STANDARD_MARGINS), top_um(0), right_um(0), bottom_um(0), left_um(0) {
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Margins::Margins(MarginsType type,
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 int32 top_um,
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 int32 right_um,
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 int32 bottom_um,
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 int32 left_um)
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(type),
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      top_um(top_um),
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      right_um(right_um),
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bottom_um(bottom_um),
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      left_um(left_um) {
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Margins::operator==(const Margins& other) const {
4210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return type == other.type && top_um == other.top_um &&
4220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch         right_um == other.right_um && bottom_um == other.bottom_um;
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4250529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochDpi::Dpi() : horizontal(0), vertical(0) {
4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Dpi::Dpi(int32 horizontal, int32 vertical)
4290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : horizontal(horizontal), vertical(vertical) {
4300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Dpi::IsValid() const {
4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return horizontal > 0 && vertical > 0;
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Dpi::operator==(const Dpi& other) const {
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return horizontal == other.horizontal && vertical == other.vertical;
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Media::Media()
4410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    : type(CUSTOM_MEDIA), width_um(0), height_um(0), is_continuous_feed(false) {
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)Media::Media(MediaType type)
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : type(type),
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      width_um(0),
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      height_um(0),
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      is_continuous_feed(false) {
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const MediaDefinition& media = FindMediaByType(type);
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  width_um = media.width_um;
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  height_um = media.height_um;
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  is_continuous_feed = width_um <= 0 || height_um <= 0;
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Media::Media(MediaType type, int32 width_um, int32 height_um)
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(type),
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      width_um(width_um),
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      height_um(height_um),
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_continuous_feed(width_um <= 0 || height_um <= 0) {
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4620529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochMedia::Media(const std::string& custom_display_name,
463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)             const std::string& vendor_id,
4640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch             int32 width_um,
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             int32 height_um)
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : type(CUSTOM_MEDIA),
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      width_um(width_um),
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      height_um(height_um),
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      is_continuous_feed(width_um <= 0 || height_um <= 0),
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      custom_display_name(custom_display_name),
471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      vendor_id(vendor_id) {
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Media::MatchBySize() {
475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const MediaDefinition* media = FindMediaBySize(width_um, height_um);
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!media)
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return false;
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  type = media->id;
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Media::IsValid() const {
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (is_continuous_feed) {
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (width_um <= 0 && height_um <= 0)
4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else {
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (width_um <= 0 || height_um <= 0)
4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return true;
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Media::operator==(const Media& other) const {
4940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return type == other.type && width_um == other.width_um &&
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         height_um == other.height_um &&
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)         is_continuous_feed == other.is_continuous_feed;
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4990529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochInterval::Interval() : start(0), end(0) {
5000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5020529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochInterval::Interval(int32 start, int32 end) : start(start), end(end) {
5030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5050529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochInterval::Interval(int32 start) : start(start), end(kMaxPageNumber) {
5060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Interval::operator==(const Interval& other) const {
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return start == other.start && end == other.end;
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochtemplate <const char* kName>
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ItemsTraits {
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static std::string GetCapabilityPath() {
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string result = kSectionPrinter;
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result += '.';
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result += kName;
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return result;
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static std::string GetTicketItemPath() {
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string result = kSectionPrint;
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result += '.';
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result += kName;
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return result;
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NoValueValidation {
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  template <class Option>
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool IsValid(const Option&) {
5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ContentTypeTraits : public NoValueValidation,
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          public ItemsTraits<kOptionContentType> {
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, ContentType* option) {
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dict.GetString(kKeyContentType, option);
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(ContentType option, base::DictionaryValue* dict) {
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetString(kKeyContentType, option);
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
550effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass PwgRasterConfigTraits : public NoValueValidation,
551effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              public ItemsTraits<kOptionPwgRasterConfig> {
552effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
553effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static bool Load(const base::DictionaryValue& dict, PwgRasterConfig* option) {
554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    std::string document_sheet_back;
555effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    PwgRasterConfig option_out;
556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (dict.GetString(kPwgRasterDocumentSheetBack, &document_sheet_back)) {
557effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (!TypeFromString(kDocumentSheetBackNames,
558effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          document_sheet_back,
559effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          &option_out.document_sheet_back)) {
560effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return false;
561effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      }
562effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
563effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
564effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    dict.GetBoolean(kPwgRasterReverseOrderStreaming,
565effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    &option_out.reverse_order_streaming);
566effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    dict.GetBoolean(kPwgRasterRotateAllPages, &option_out.rotate_all_pages);
567effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    *option = option_out;
568effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return true;
569effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
570effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
571effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  static void Save(const PwgRasterConfig& option, base::DictionaryValue* dict) {
572effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    dict->SetString(
573effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        kPwgRasterDocumentSheetBack,
574effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        TypeToString(kDocumentSheetBackNames, option.document_sheet_back));
575effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (option.reverse_order_streaming)
576effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      dict->SetBoolean(kPwgRasterReverseOrderStreaming,
577effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       option.reverse_order_streaming);
578effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
579effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (option.rotate_all_pages)
580effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      dict->SetBoolean(kPwgRasterRotateAllPages, option.rotate_all_pages);
581effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
582effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
583effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ColorTraits : public ItemsTraits<kOptionColor> {
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
5860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static bool IsValid(const Color& option) { return option.IsValid(); }
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, Color* option) {
5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string type_str;
5905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!dict.GetString(kKeyType, &type_str))
5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!TypeFromString(kColorNames, type_str, &option->type))
5935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict.GetString(kKeyVendorId, &option->vendor_id);
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict.GetString(kCustomName, &option->custom_display_name);
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(const Color& option, base::DictionaryValue* dict) {
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetString(kKeyType, TypeToString(kColorNames, option.type));
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!option.vendor_id.empty())
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyVendorId, option.vendor_id);
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!option.custom_display_name.empty())
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kCustomName, option.custom_display_name);
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DuplexTraits : public NoValueValidation,
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     public ItemsTraits<kOptionDuplex> {
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, DuplexType* option) {
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string type_str;
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dict.GetString(kKeyType, &type_str) &&
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           TypeFromString(kDuplexNames, type_str, option);
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(DuplexType option, base::DictionaryValue* dict) {
6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetString(kKeyType, TypeToString(kDuplexNames, option));
6195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class OrientationTraits : public NoValueValidation,
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          public ItemsTraits<kOptionPageOrientation> {
6245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, OrientationType* option) {
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string type_str;
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dict.GetString(kKeyType, &type_str) &&
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           TypeFromString(kOrientationNames, type_str, option);
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(OrientationType option, base::DictionaryValue* dict) {
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetString(kKeyType, TypeToString(kOrientationNames, option));
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CopiesTraits : public ItemsTraits<kOptionCopies> {
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
6380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static bool IsValid(int32 option) { return option >= 1; }
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, int32* option) {
6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dict.GetInteger(kOptionCopies, option);
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(int32 option, base::DictionaryValue* dict) {
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetInteger(kOptionCopies, option);
6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MarginsTraits : public NoValueValidation,
6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      public ItemsTraits<kOptionMargins> {
6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, Margins* option) {
6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string type_str;
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!dict.GetString(kKeyType, &type_str))
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!TypeFromString(kMarginsNames, type_str, &option->type))
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
6580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return dict.GetInteger(kMargineTop, &option->top_um) &&
6590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch           dict.GetInteger(kMargineRight, &option->right_um) &&
6600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch           dict.GetInteger(kMargineBottom, &option->bottom_um) &&
6610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch           dict.GetInteger(kMargineLeft, &option->left_um);
6625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(const Margins& option, base::DictionaryValue* dict) {
6655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetString(kKeyType, TypeToString(kMarginsNames, option.type));
6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetInteger(kMargineTop, option.top_um);
6675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetInteger(kMargineRight, option.right_um);
6685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetInteger(kMargineBottom, option.bottom_um);
6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetInteger(kMargineLeft, option.left_um);
6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DpiTraits : public ItemsTraits<kOptionDpi> {
6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
6750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static bool IsValid(const Dpi& option) { return option.IsValid(); }
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, Dpi* option) {
6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!dict.GetInteger(kDpiHorizontal, &option->horizontal) ||
6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        !dict.GetInteger(kDpiVertical, &option->vertical)) {
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(const Dpi& option, base::DictionaryValue* dict) {
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetInteger(kDpiHorizontal, option.horizontal);
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetInteger(kDpiVertical, option.vertical);
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FitToPageTraits : public NoValueValidation,
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        public ItemsTraits<kOptionFitToPage> {
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, FitToPageType* option) {
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string type_str;
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dict.GetString(kKeyType, &type_str) &&
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           TypeFromString(kFitToPageNames, type_str, option);
6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(FitToPageType option, base::DictionaryValue* dict) {
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetString(kKeyType, TypeToString(kFitToPageNames, option));
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PageRangeTraits : public ItemsTraits<kOptionPageRange> {
7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool IsValid(const PageRange& option) {
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (size_t i = 0; i < option.size(); ++i) {
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (option[i].start < 1 || option[i].end < 1) {
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return false;
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, PageRange* option) {
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue* list = NULL;
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!dict.GetList(kPageRangeInterval, &list))
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (size_t i = 0; i < list->GetSize(); ++i) {
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::DictionaryValue* interval = NULL;
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (!list->GetDictionary(i, &interval))
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return false;
7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Interval new_interval(1, kMaxPageNumber);
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      interval->GetInteger(kPageRangeStart, &new_interval.start);
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      interval->GetInteger(kPageRangeEnd, &new_interval.end);
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      option->push_back(new_interval);
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(const PageRange& option, base::DictionaryValue* dict) {
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!option.empty()) {
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ListValue* list = new base::ListValue;
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->Set(kPageRangeInterval, list);
7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      for (size_t i = 0; i < option.size(); ++i) {
7375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::DictionaryValue* interval = new base::DictionaryValue;
7385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        list->Append(interval);
7395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        interval->SetInteger(kPageRangeStart, option[i].start);
7405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if (option[i].end < kMaxPageNumber)
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          interval->SetInteger(kPageRangeEnd, option[i].end);
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MediaTraits : public ItemsTraits<kOptionMediaSize> {
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
7490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static bool IsValid(const Media& option) { return option.IsValid(); }
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, Media* option) {
7525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string type_str;
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (dict.GetString(kKeyName, &type_str)) {
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (!TypeFromString(kMediaDefinitions, type_str, &option->type))
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return false;
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict.GetInteger(kMediaWidth, &option->width_um);
7595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict.GetInteger(kMediaHeight, &option->height_um);
7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict.GetBoolean(kMediaIsContinuous, &option->is_continuous_feed);
7615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict.GetString(kCustomName, &option->custom_display_name);
762f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    dict.GetString(kKeyVendorId, &option->vendor_id);
7635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return true;
7645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(const Media& option, base::DictionaryValue* dict) {
7675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (option.type != CUSTOM_MEDIA)
7685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kKeyName, TypeToString(kMediaDefinitions, option.type));
7695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!option.custom_display_name.empty() || option.type == CUSTOM_MEDIA)
7705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetString(kCustomName, option.custom_display_name);
771f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!option.vendor_id.empty())
772f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      dict->SetString(kKeyVendorId, option.vendor_id);
7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (option.width_um > 0)
7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetInteger(kMediaWidth, option.width_um);
7755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (option.height_um > 0)
7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetInteger(kMediaHeight, option.height_um);
7775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (option.is_continuous_feed)
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      dict->SetBoolean(kMediaIsContinuous, true);
7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
7815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CollateTraits : public NoValueValidation,
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      public ItemsTraits<kOptionCollate> {
7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
7855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const bool kDefault = true;
7865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, bool* option) {
7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dict.GetBoolean(kOptionCollate, option);
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(bool option, base::DictionaryValue* dict) {
7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetBoolean(kOptionCollate, option);
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ReverseTraits : public NoValueValidation,
7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      public ItemsTraits<kOptionReverse> {
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const bool kDefault = false;
8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static bool Load(const base::DictionaryValue& dict, bool* option) {
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dict.GetBoolean(kOptionReverse, option);
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Save(bool option, base::DictionaryValue* dict) {
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict->SetBoolean(kOptionReverse, option);
8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace printer
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using namespace printer;
8135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class ListCapability<ContentType, ContentTypeTraits>;
815effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtemplate class ValueCapability<PwgRasterConfig, PwgRasterConfigTraits>;
8165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class SelectionCapability<Color, ColorTraits>;
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class SelectionCapability<DuplexType, DuplexTraits>;
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class SelectionCapability<OrientationType, OrientationTraits>;
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class SelectionCapability<Margins, MarginsTraits>;
8205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class SelectionCapability<Dpi, DpiTraits>;
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class SelectionCapability<FitToPageType, FitToPageTraits>;
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class SelectionCapability<Media, MediaTraits>;
8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class EmptyCapability<class CopiesTraits>;
8245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class EmptyCapability<class PageRangeTraits>;
8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class BooleanCapability<class CollateTraits>;
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class BooleanCapability<class ReverseTraits>;
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
828effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochtemplate class TicketItem<PwgRasterConfig, PwgRasterConfigTraits>;
8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<Color, ColorTraits>;
8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<DuplexType, DuplexTraits>;
8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<OrientationType, OrientationTraits>;
8325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<Margins, MarginsTraits>;
8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<Dpi, DpiTraits>;
8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<FitToPageType, FitToPageTraits>;
8355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<Media, MediaTraits>;
8365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<int32, CopiesTraits>;
8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<PageRange, PageRangeTraits>;
8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<bool, CollateTraits>;
8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template class TicketItem<bool, ReverseTraits>;
8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace cloud_devices
842