// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "printing/print_settings_initializer.h"
#include <algorithm>
#include <cmath>
#include <string>
#include "base/strings/string_number_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "base/values.h"
#include "printing/page_size_margins.h"
#include "printing/print_job_constants.h"
#include "printing/print_settings.h"
#include "printing/units.h"
namespace printing {
bool PrintSettingsInitializer::InitSettings(
const base::DictionaryValue& job_settings,
const PageRanges& ranges,
PrintSettings* settings) {
bool display_header_footer = false;
if (!job_settings.GetBoolean(kSettingHeaderFooterEnabled,
&display_header_footer)) {
return false;
}
settings->set_display_header_footer(display_header_footer);
if (settings->display_header_footer()) {
base::string16 title;
base::string16 url;
if (!job_settings.GetString(kSettingHeaderFooterTitle, &title) ||
!job_settings.GetString(kSettingHeaderFooterURL, &url)) {
return false;
}
settings->set_title(title);
settings->set_url(url);
}
bool backgrounds = false;
bool selection_only = false;
if (!job_settings.GetBoolean(kSettingShouldPrintBackgrounds, &backgrounds) ||
!job_settings.GetBoolean(kSettingShouldPrintSelectionOnly,
&selection_only)) {
return false;
}
settings->set_should_print_backgrounds(backgrounds);
settings->set_selection_only(selection_only);
int margin_type = DEFAULT_MARGINS;
if (!job_settings.GetInteger(kSettingMarginsType, &margin_type) ||
(margin_type != DEFAULT_MARGINS &&
margin_type != NO_MARGINS &&
margin_type != CUSTOM_MARGINS &&
margin_type != PRINTABLE_AREA_MARGINS)) {
margin_type = DEFAULT_MARGINS;
}
settings->set_margin_type(static_cast<MarginType>(margin_type));
if (margin_type == CUSTOM_MARGINS) {
PageSizeMargins page_size_margins;
GetCustomMarginsFromJobSettings(job_settings, &page_size_margins);
PageMargins margins_in_points;
margins_in_points.Clear();
margins_in_points.top = page_size_margins.margin_top;
margins_in_points.bottom = page_size_margins.margin_bottom;
margins_in_points.left = page_size_margins.margin_left;
margins_in_points.right = page_size_margins.margin_right;
settings->SetCustomMargins(margins_in_points);
}
settings->set_ranges(ranges);
int color = 0;
bool landscape = false;
int duplex_mode = 0;
base::string16 device_name;
bool collate = false;
int copies = 1;
if (!job_settings.GetBoolean(kSettingCollate, &collate) ||
!job_settings.GetInteger(kSettingCopies, &copies) ||
!job_settings.GetInteger(kSettingColor, &color) ||
!job_settings.GetInteger(kSettingDuplexMode, &duplex_mode) ||
!job_settings.GetBoolean(kSettingLandscape, &landscape) ||
!job_settings.GetString(kSettingDeviceName, &device_name)) {
return false;
}
settings->set_collate(collate);
settings->set_copies(copies);
settings->SetOrientation(landscape);
settings->set_device_name(device_name);
settings->set_duplex_mode(static_cast<DuplexMode>(duplex_mode));
settings->set_color(static_cast<ColorModel>(color));
return true;
}
} // namespace printing