1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/common/cloud_print/cloud_print_cdd_conversion.h"
7 #include "base/strings/string_number_conversions.h"
8 #include "components/cloud_devices/common/printer_description.h"
9 #include "printing/backend/print_backend.h"
11 namespace cloud_print
{
13 scoped_ptr
<base::DictionaryValue
> PrinterSemanticCapsAndDefaultsToCdd(
14 const printing::PrinterSemanticCapsAndDefaults
& semantic_info
) {
15 using namespace cloud_devices::printer
;
16 cloud_devices::CloudDeviceDescription description
;
18 ContentTypesCapability content_types
;
19 content_types
.AddOption("application/pdf");
20 content_types
.SaveTo(&description
);
22 if (semantic_info
.collate_capable
) {
23 CollateCapability collate
;
24 collate
.set_default_value(semantic_info
.collate_default
);
25 collate
.SaveTo(&description
);
28 if (semantic_info
.copies_capable
) {
29 CopiesCapability copies
;
30 copies
.SaveTo(&description
);
33 if (semantic_info
.duplex_capable
) {
34 DuplexCapability duplex
;
35 duplex
.AddDefaultOption(
36 NO_DUPLEX
, semantic_info
.duplex_default
== printing::SIMPLEX
);
37 duplex
.AddDefaultOption(
38 LONG_EDGE
, semantic_info
.duplex_default
== printing::LONG_EDGE
);
39 duplex
.AddDefaultOption(
40 SHORT_EDGE
, semantic_info
.duplex_default
== printing::SHORT_EDGE
);
41 duplex
.SaveTo(&description
);
44 ColorCapability color
;
45 if (semantic_info
.color_default
|| semantic_info
.color_changeable
) {
46 Color
standard_color(STANDARD_COLOR
);
47 standard_color
.vendor_id
= base::IntToString(semantic_info
.color_model
);
48 color
.AddDefaultOption(standard_color
, semantic_info
.color_default
);
50 if (!semantic_info
.color_default
|| semantic_info
.color_changeable
) {
51 Color
standard_monochrome(STANDARD_MONOCHROME
);
52 standard_monochrome
.vendor_id
= base::IntToString(semantic_info
.bw_model
);
53 color
.AddDefaultOption(standard_monochrome
, !semantic_info
.color_default
);
55 color
.SaveTo(&description
);
57 if (!semantic_info
.papers
.empty()) {
58 Media
default_media(semantic_info
.default_paper
.display_name
,
59 semantic_info
.default_paper
.vendor_id
,
60 semantic_info
.default_paper
.size_um
.width(),
61 semantic_info
.default_paper
.size_um
.height());
62 default_media
.MatchBySize();
64 MediaCapability media
;
65 bool is_default_set
= false;
66 for (size_t i
= 0; i
< semantic_info
.papers
.size(); ++i
) {
67 gfx::Size paper_size
= semantic_info
.papers
[i
].size_um
;
68 if (paper_size
.width() > paper_size
.height())
69 paper_size
.SetSize(paper_size
.height(), paper_size
.width());
70 Media
new_media(semantic_info
.papers
[i
].display_name
,
71 semantic_info
.papers
[i
].vendor_id
,
74 new_media
.MatchBySize();
75 if (new_media
.IsValid() && !media
.Contains(new_media
)) {
76 if (!default_media
.IsValid())
77 default_media
= new_media
;
78 media
.AddDefaultOption(new_media
, new_media
== default_media
);
79 is_default_set
= is_default_set
|| (new_media
== default_media
);
82 if (!is_default_set
&& default_media
.IsValid())
83 media
.AddDefaultOption(default_media
, true);
85 if (media
.IsValid()) {
86 media
.SaveTo(&description
);
92 if (!semantic_info
.dpis
.empty()) {
94 Dpi
default_dpi(semantic_info
.default_dpi
.width(),
95 semantic_info
.default_dpi
.height());
96 bool is_default_set
= false;
97 for (size_t i
= 0; i
< semantic_info
.dpis
.size(); ++i
) {
98 Dpi
new_dpi(semantic_info
.dpis
[i
].width(),
99 semantic_info
.dpis
[i
].height());
100 if (new_dpi
.IsValid() && !dpi
.Contains(new_dpi
)) {
101 if (!default_dpi
.IsValid())
102 default_dpi
= new_dpi
;
103 dpi
.AddDefaultOption(new_dpi
, new_dpi
== default_dpi
);
104 is_default_set
= is_default_set
|| (new_dpi
== default_dpi
);
107 if (!is_default_set
&& default_dpi
.IsValid())
108 dpi
.AddDefaultOption(default_dpi
, true);
110 dpi
.SaveTo(&description
);
116 OrientationCapability orientation
;
117 orientation
.AddDefaultOption(PORTRAIT
, true);
118 orientation
.AddOption(LANDSCAPE
);
119 orientation
.AddOption(AUTO_ORIENTATION
);
120 orientation
.SaveTo(&description
);
122 return scoped_ptr
<base::DictionaryValue
>(description
.root().DeepCopy());
125 } // namespace cloud_print