1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/print_settings_conversion.h"
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <algorithm>
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <cmath>
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <string>
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/time/time.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/values.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/page_size_margins.h"
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/print_job_constants.h"
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/print_settings.h"
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/units.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace printing {
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace {
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GetCustomMarginsFromJobSettings(const base::DictionaryValue& settings,
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     PageSizeMargins* page_size_margins) {
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const base::DictionaryValue* custom_margins;
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!settings.GetDictionary(kSettingMarginsCustom, &custom_margins) ||
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !custom_margins->GetDouble(kSettingMarginTop,
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 &page_size_margins->margin_top) ||
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !custom_margins->GetDouble(kSettingMarginBottom,
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 &page_size_margins->margin_bottom) ||
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !custom_margins->GetDouble(kSettingMarginLeft,
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 &page_size_margins->margin_left) ||
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !custom_margins->GetDouble(kSettingMarginRight,
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                 &page_size_margins->margin_right)) {
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    NOTREACHED();
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SetMarginsToJobSettings(const std::string& json_path,
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             const PageMargins& margins,
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             base::DictionaryValue* job_settings) {
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue;
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->Set(json_path, dict);
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger(kSettingMarginTop, margins.top);
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger(kSettingMarginBottom, margins.bottom);
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger(kSettingMarginLeft, margins.left);
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger(kSettingMarginRight, margins.right);
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SetSizeToJobSettings(const std::string& json_path,
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          const gfx::Size& size,
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          base::DictionaryValue* job_settings) {
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue;
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->Set(json_path, dict);
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger("width", size.width());
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger("height", size.height());
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void SetRectToJobSettings(const std::string& json_path,
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          const gfx::Rect& rect,
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          base::DictionaryValue* job_settings) {
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue;
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->Set(json_path, dict);
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger("x", rect.x());
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger("y", rect.y());
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger("width", rect.width());
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  dict->SetInteger("height", rect.height());
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool PrintSettingsFromJobSettings(const base::DictionaryValue& job_settings,
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  PrintSettings* settings) {
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool display_header_footer = false;
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!job_settings.GetBoolean(kSettingHeaderFooterEnabled,
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               &display_header_footer)) {
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_display_header_footer(display_header_footer);
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (settings->display_header_footer()) {
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::string16 title;
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::string16 url;
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!job_settings.GetString(kSettingHeaderFooterTitle, &title) ||
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        !job_settings.GetString(kSettingHeaderFooterURL, &url)) {
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return false;
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    settings->set_title(title);
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    settings->set_url(url);
91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool backgrounds = false;
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool selection_only = false;
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!job_settings.GetBoolean(kSettingShouldPrintBackgrounds, &backgrounds) ||
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !job_settings.GetBoolean(kSettingShouldPrintSelectionOnly,
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               &selection_only)) {
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_should_print_backgrounds(backgrounds);
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_selection_only(selection_only);
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PrintSettings::RequestedMedia requested_media;
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const base::DictionaryValue* media_size_value = NULL;
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (job_settings.GetDictionary(kSettingMediaSize, &media_size_value)) {
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int width_microns = 0;
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int height_microns = 0;
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (media_size_value->GetInteger(kSettingMediaSizeWidthMicrons,
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     &width_microns) &&
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        media_size_value->GetInteger(kSettingMediaSizeHeightMicrons,
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     &height_microns)) {
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      requested_media.size_microns = gfx::Size(width_microns, height_microns);
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::string vendor_id;
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (media_size_value->GetString(kSettingMediaSizeVendorId, &vendor_id) &&
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        !vendor_id.empty()) {
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      requested_media.vendor_id = vendor_id;
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_requested_media(requested_media);
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int margin_type = DEFAULT_MARGINS;
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!job_settings.GetInteger(kSettingMarginsType, &margin_type) ||
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      (margin_type != DEFAULT_MARGINS &&
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       margin_type != NO_MARGINS &&
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       margin_type != CUSTOM_MARGINS &&
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       margin_type != PRINTABLE_AREA_MARGINS)) {
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    margin_type = DEFAULT_MARGINS;
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_margin_type(static_cast<MarginType>(margin_type));
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (margin_type == CUSTOM_MARGINS) {
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PageSizeMargins page_size_margins;
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GetCustomMarginsFromJobSettings(job_settings, &page_size_margins);
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PageMargins margins_in_points;
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    margins_in_points.Clear();
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    margins_in_points.top = page_size_margins.margin_top;
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    margins_in_points.bottom = page_size_margins.margin_bottom;
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    margins_in_points.left = page_size_margins.margin_left;
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    margins_in_points.right = page_size_margins.margin_right;
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    settings->SetCustomMargins(margins_in_points);
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  PageRanges new_ranges;
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const base::ListValue* page_range_array = NULL;
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (job_settings.GetList(kSettingPageRange, &page_range_array)) {
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    for (size_t index = 0; index < page_range_array->GetSize(); ++index) {
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const base::DictionaryValue* dict;
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (!page_range_array->GetDictionary(index, &dict))
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        continue;
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      PageRange range;
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (!dict->GetInteger(kSettingPageRangeFrom, &range.from) ||
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          !dict->GetInteger(kSettingPageRangeTo, &range.to)) {
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        continue;
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      }
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // Page numbers are 1-based in the dictionary.
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // Page numbers are 0-based for the printing context.
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      range.from--;
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      range.to--;
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new_ranges.push_back(range);
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_ranges(new_ranges);
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int color = 0;
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool landscape = false;
171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int duplex_mode = 0;
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::string16 device_name;
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool collate = false;
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int copies = 1;
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!job_settings.GetBoolean(kSettingCollate, &collate) ||
177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !job_settings.GetInteger(kSettingCopies, &copies) ||
178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !job_settings.GetInteger(kSettingColor, &color) ||
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !job_settings.GetInteger(kSettingDuplexMode, &duplex_mode) ||
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !job_settings.GetBoolean(kSettingLandscape, &landscape) ||
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !job_settings.GetString(kSettingDeviceName, &device_name)) {
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_collate(collate);
186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_copies(copies);
187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->SetOrientation(landscape);
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_device_name(device_name);
189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_duplex_mode(static_cast<DuplexMode>(duplex_mode));
190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  settings->set_color(static_cast<ColorModel>(color));
191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return true;
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void PrintSettingsToJobSettingsDebug(const PrintSettings& settings,
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                     base::DictionaryValue* job_settings) {
197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetBoolean(kSettingHeaderFooterEnabled,
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           settings.display_header_footer());
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetString(kSettingHeaderFooterTitle, settings.title());
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetString(kSettingHeaderFooterURL, settings.url());
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetBoolean(kSettingShouldPrintBackgrounds,
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           settings.should_print_backgrounds());
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetBoolean(kSettingShouldPrintSelectionOnly,
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           settings.selection_only());
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetInteger(kSettingMarginsType, settings.margin_type());
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!settings.ranges().empty()) {
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::ListValue* page_range_array = new base::ListValue;
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    job_settings->Set(kSettingPageRange, page_range_array);
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    for (size_t i = 0; i < settings.ranges().size(); ++i) {
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::DictionaryValue* dict = new base::DictionaryValue;
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      page_range_array->Append(dict);
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      dict->SetInteger(kSettingPageRangeFrom, settings.ranges()[i].from + 1);
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      dict->SetInteger(kSettingPageRangeTo, settings.ranges()[i].to + 1);
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetBoolean(kSettingCollate, settings.collate());
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetInteger(kSettingCopies, settings.copies());
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetInteger(kSettingColor, settings.color());
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetInteger(kSettingDuplexMode, settings.duplex_mode());
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetBoolean(kSettingLandscape, settings.landscape());
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->SetString(kSettingDeviceName, settings.device_name());
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Following values are not read form JSON by InitSettings, so do not have
225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // common public constants. So just serialize in "debug" section.
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::DictionaryValue* debug = new base::DictionaryValue;
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  job_settings->Set("debug", debug);
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  debug->SetDouble("minShrink", settings.min_shrink());
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  debug->SetDouble("maxShrink", settings.max_shrink());
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  debug->SetInteger("desiredDpi", settings.desired_dpi());
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  debug->SetInteger("dpi", settings.dpi());
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  debug->SetInteger("deviceUnitsPerInch", settings.device_units_per_inch());
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  debug->SetBoolean("support_alpha_blend", settings.should_print_backgrounds());
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  debug->SetString("media_vendor_od", settings.requested_media().vendor_id);
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetSizeToJobSettings(
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "media_size", settings.requested_media().size_microns, debug);
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetMarginsToJobSettings("requested_custom_margins_in_points",
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          settings.requested_custom_margins_in_points(),
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          debug);
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const PageSetup& page_setup = settings.page_setup_device_units();
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetMarginsToJobSettings(
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "effective_margins", page_setup.effective_margins(), debug);
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetSizeToJobSettings("physical_size", page_setup.physical_size(), debug);
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetRectToJobSettings("overlay_area", page_setup.overlay_area(), debug);
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetRectToJobSettings("content_area", page_setup.content_area(), debug);
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetRectToJobSettings("printable_area", page_setup.printable_area(), debug);
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace printing
250