Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Side by Side Diff: chrome/common/cloud_print/cloud_print_cdd_conversion.cc

Issue 313723002: Convert local printer capabilites to CDD format to unify with cloud printers and PDF printer. This … (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix clang reported errors. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/service/cloud_print/cdd_conversion_win.h" 5 #include "chrome/common/cloud_print/cloud_print_cdd_conversion.h"
6 6
7 #include "components/cloud_devices/common/printer_description.h" 7 #include "components/cloud_devices/common/printer_description.h"
8 #include "printing/backend/print_backend.h" 8 #include "printing/backend/print_backend.h"
9 #include "printing/backend/win_helper.h"
10 9
11 namespace cloud_print { 10 namespace cloud_print {
12 11
13 bool IsValidCjt(const std::string& print_ticket_data) { 12 scoped_ptr<base::DictionaryValue> PrinterSemanticCapsAndDefaultsToCdd(
14 cloud_devices::CloudDeviceDescription description;
15 return description.InitFromString(print_ticket_data);
16 }
17
18 scoped_ptr<DEVMODE, base::FreeDeleter> CjtToDevMode(
19 const base::string16& printer_name,
20 const std::string& print_ticket) {
21 scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode;
22
23 cloud_devices::CloudDeviceDescription description;
24 if (!description.InitFromString(print_ticket))
25 return dev_mode.Pass();
26
27 using namespace cloud_devices::printer;
28 printing::ScopedPrinterHandle printer;
29 if (!printer.OpenPrinter(printer_name.c_str()))
30 return dev_mode.Pass();
31
32 {
33 ColorTicketItem color;
34 if (color.LoadFrom(description)) {
35 bool is_color = color.value().type == STANDARD_COLOR;
36 dev_mode = CreateDevModeWithColor(printer, printer_name, is_color);
37 } else {
38 dev_mode = printing::CreateDevMode(printer, NULL);
39 }
40 }
41
42 if (!dev_mode)
43 return dev_mode.Pass();
44
45 ColorTicketItem color;
46 DuplexTicketItem duplex;
47 OrientationTicketItem orientation;
48 MarginsTicketItem margins;
49 DpiTicketItem dpi;
50 FitToPageTicketItem fit_to_page;
51 MediaTicketItem media;
52 CopiesTicketItem copies;
53 PageRangeTicketItem page_range;
54 CollateTicketItem collate;
55 ReverseTicketItem reverse;
56
57 if (orientation.LoadFrom(description)) {
58 dev_mode->dmFields |= DM_ORIENTATION;
59 if (orientation.value() == LANDSCAPE) {
60 dev_mode->dmOrientation = DMORIENT_LANDSCAPE;
61 } else {
62 dev_mode->dmOrientation = DMORIENT_PORTRAIT;
63 }
64 }
65
66 if (color.LoadFrom(description)) {
67 dev_mode->dmFields |= DM_COLOR;
68 if (color.value().type == STANDARD_MONOCHROME) {
69 dev_mode->dmColor = DMCOLOR_MONOCHROME;
70 } else if (color.value().type == STANDARD_COLOR) {
71 dev_mode->dmColor = DMCOLOR_COLOR;
72 } else {
73 NOTREACHED();
74 }
75 }
76
77 if (duplex.LoadFrom(description)) {
78 dev_mode->dmFields |= DM_DUPLEX;
79 if (duplex.value() == NO_DUPLEX) {
80 dev_mode->dmDuplex = DMDUP_SIMPLEX;
81 } else if (duplex.value() == LONG_EDGE) {
82 dev_mode->dmDuplex = DMDUP_VERTICAL;
83 } else if (duplex.value() == SHORT_EDGE) {
84 dev_mode->dmDuplex = DMDUP_HORIZONTAL;
85 } else {
86 NOTREACHED();
87 }
88 }
89
90 if (copies.LoadFrom(description)) {
91 dev_mode->dmFields |= DM_COPIES;
92 dev_mode->dmCopies = copies.value();
93 }
94
95 if (dpi.LoadFrom(description)) {
96 if (dpi.value().horizontal > 0) {
97 dev_mode->dmFields |= DM_PRINTQUALITY;
98 dev_mode->dmPrintQuality = dpi.value().horizontal;
99 }
100 if (dpi.value().vertical > 0) {
101 dev_mode->dmFields |= DM_YRESOLUTION;
102 dev_mode->dmYResolution = dpi.value().vertical;
103 }
104 }
105
106 if (collate.LoadFrom(description)) {
107 dev_mode->dmFields |= DM_COLLATE;
108 dev_mode->dmCollate = (collate.value() ? DMCOLLATE_TRUE : DMCOLLATE_FALSE);
109 }
110
111 if (media.LoadFrom(description)) {
112 static const size_t kFromUm = 100; // Windows uses 0.1mm.
113 int width = media.value().width_um / kFromUm;
114 int height = media.value().height_um / kFromUm;
115 if (width > 0) {
116 dev_mode->dmFields |= DM_PAPERWIDTH;
117 dev_mode->dmPaperWidth = width;
118 }
119 if (height > 0) {
120 dev_mode->dmFields |= DM_PAPERLENGTH;
121 dev_mode->dmPaperLength = height;
122 }
123 }
124
125 return printing::CreateDevMode(printer, dev_mode.get());
126 }
127
128 std::string CapabilitiesToCdd(
129 const printing::PrinterSemanticCapsAndDefaults& semantic_info) { 13 const printing::PrinterSemanticCapsAndDefaults& semantic_info) {
130 using namespace cloud_devices::printer; 14 using namespace cloud_devices::printer;
131 cloud_devices::CloudDeviceDescription description; 15 cloud_devices::CloudDeviceDescription description;
132 16
133 ContentTypesCapability content_types; 17 ContentTypesCapability content_types;
134 content_types.AddOption("application/pdf"); 18 content_types.AddOption("application/pdf");
135 content_types.SaveTo(&description); 19 content_types.SaveTo(&description);
136 20
137 ColorCapability color; 21 if (semantic_info.collate_capable) {
138 if (semantic_info.color_default || semantic_info.color_changeable) { 22 CollateCapability collate;
139 color.AddDefaultOption(Color(STANDARD_COLOR), semantic_info.color_default); 23 collate.set_default_value(semantic_info.collate_default);
24 collate.SaveTo(&description);
140 } 25 }
141 26
142 if (!semantic_info.color_default || semantic_info.color_changeable) { 27 if (semantic_info.copies_capable) {
143 color.AddDefaultOption(Color(STANDARD_MONOCHROME), 28 CopiesCapability copies;
144 !semantic_info.color_default); 29 copies.SaveTo(&description);
145 } 30 }
146 color.SaveTo(&description);
147 31
148 if (semantic_info.duplex_capable) { 32 if (semantic_info.duplex_capable) {
149 DuplexCapability duplex; 33 DuplexCapability duplex;
150 duplex.AddDefaultOption( 34 duplex.AddDefaultOption(
151 NO_DUPLEX, semantic_info.duplex_default == printing::SIMPLEX); 35 NO_DUPLEX, semantic_info.duplex_default == printing::SIMPLEX);
152 duplex.AddDefaultOption( 36 duplex.AddDefaultOption(
153 LONG_EDGE, semantic_info.duplex_default == printing::LONG_EDGE); 37 LONG_EDGE, semantic_info.duplex_default == printing::LONG_EDGE);
154 duplex.AddDefaultOption( 38 duplex.AddDefaultOption(
155 SHORT_EDGE, semantic_info.duplex_default == printing::SHORT_EDGE); 39 SHORT_EDGE, semantic_info.duplex_default == printing::SHORT_EDGE);
156 duplex.SaveTo(&description); 40 duplex.SaveTo(&description);
157 } 41 }
158 42
43 ColorCapability color;
44 if (semantic_info.color_default || semantic_info.color_changeable) {
45 color.AddDefaultOption(Color(STANDARD_COLOR), semantic_info.color_default);
46 }
47 if (!semantic_info.color_default || semantic_info.color_changeable) {
48 color.AddDefaultOption(Color(STANDARD_MONOCHROME),
49 !semantic_info.color_default);
50 }
51 color.SaveTo(&description);
52
53 #if defined(OS_WIN)
159 if (!semantic_info.papers.empty()) { 54 if (!semantic_info.papers.empty()) {
160 Media default_media(semantic_info.default_paper.name, 55 Media default_media(semantic_info.default_paper.name,
161 semantic_info.default_paper.size_um.width(), 56 semantic_info.default_paper.size_um.width(),
162 semantic_info.default_paper.size_um.height()); 57 semantic_info.default_paper.size_um.height());
163 default_media.MatchBySize(); 58 default_media.MatchBySize();
164 59
165 MediaCapability media; 60 MediaCapability media;
166 bool is_default_set = false; 61 bool is_default_set = false;
167 for (size_t i = 0; i < semantic_info.papers.size(); ++i) { 62 for (size_t i = 0; i < semantic_info.papers.size(); ++i) {
168 gfx::Size paper_size = semantic_info.papers[i].size_um; 63 gfx::Size paper_size = semantic_info.papers[i].size_um;
(...skipping 12 matching lines...) Expand all
181 if (!is_default_set && default_media.IsValid()) 76 if (!is_default_set && default_media.IsValid())
182 media.AddDefaultOption(default_media, true); 77 media.AddDefaultOption(default_media, true);
183 78
184 if (media.IsValid()) { 79 if (media.IsValid()) {
185 media.SaveTo(&description); 80 media.SaveTo(&description);
186 } else { 81 } else {
187 NOTREACHED(); 82 NOTREACHED();
188 } 83 }
189 } 84 }
190 85
191 if (semantic_info.collate_capable) {
192 CollateCapability collate;
193 collate.set_default_value(semantic_info.collate_default);
194 collate.SaveTo(&description);
195 }
196
197 if (semantic_info.copies_capable) {
198 CopiesCapability copies;
199 copies.SaveTo(&description);
200 }
201
202 if (!semantic_info.dpis.empty()) { 86 if (!semantic_info.dpis.empty()) {
203 DpiCapability dpi; 87 DpiCapability dpi;
204 Dpi default_dpi(semantic_info.default_dpi.width(), 88 Dpi default_dpi(semantic_info.default_dpi.width(),
205 semantic_info.default_dpi.height()); 89 semantic_info.default_dpi.height());
206 bool is_default_set = false; 90 bool is_default_set = false;
207 for (size_t i = 0; i < semantic_info.dpis.size(); ++i) { 91 for (size_t i = 0; i < semantic_info.dpis.size(); ++i) {
208 Dpi new_dpi(semantic_info.dpis[i].width(), 92 Dpi new_dpi(semantic_info.dpis[i].width(),
209 semantic_info.dpis[i].height()); 93 semantic_info.dpis[i].height());
210 if (new_dpi.IsValid() && !dpi.Contains(new_dpi)) { 94 if (new_dpi.IsValid() && !dpi.Contains(new_dpi)) {
211 if (!default_dpi.IsValid()) 95 if (!default_dpi.IsValid())
212 default_dpi = new_dpi; 96 default_dpi = new_dpi;
213 dpi.AddDefaultOption(new_dpi, new_dpi == default_dpi); 97 dpi.AddDefaultOption(new_dpi, new_dpi == default_dpi);
214 is_default_set = is_default_set || (new_dpi == default_dpi); 98 is_default_set = is_default_set || (new_dpi == default_dpi);
215 } 99 }
216 } 100 }
217 if (!is_default_set && default_dpi.IsValid()) 101 if (!is_default_set && default_dpi.IsValid())
218 dpi.AddDefaultOption(default_dpi, true); 102 dpi.AddDefaultOption(default_dpi, true);
219 if (dpi.IsValid()) { 103 if (dpi.IsValid()) {
220 dpi.SaveTo(&description); 104 dpi.SaveTo(&description);
221 } else { 105 } else {
222 NOTREACHED(); 106 NOTREACHED();
223 } 107 }
224 } 108 }
109 #endif
225 110
226 OrientationCapability orientation; 111 OrientationCapability orientation;
227 orientation.AddDefaultOption(PORTRAIT, true); 112 orientation.AddDefaultOption(PORTRAIT, true);
228 orientation.AddOption(LANDSCAPE); 113 orientation.AddOption(LANDSCAPE);
229 orientation.AddOption(AUTO_ORIENTATION); 114 orientation.AddOption(AUTO_ORIENTATION);
230 orientation.SaveTo(&description); 115 orientation.SaveTo(&description);
231 116
232 return description.ToString(); 117 return scoped_ptr<base::DictionaryValue>(description.root().DeepCopy());
233 } 118 }
234 119
235 } // namespace cloud_print 120 } // namespace cloud_print
OLDNEW
« no previous file with comments | « chrome/common/cloud_print/cloud_print_cdd_conversion.h ('k') | chrome/service/cloud_print/cdd_conversion_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698