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/service/cloud_print/cdd_conversion_win.h"
7 #include "components/cloud_devices/printer_description.h"
8 #include "printing/backend/print_backend.h"
9 #include "printing/backend/win_helper.h"
11 namespace cloud_print {
13 bool IsValidCjt(const std::string& print_ticket_data) {
14 cloud_devices::CloudDeviceDescription description;
15 return description.InitFromString(print_ticket_data);
18 scoped_ptr<DEVMODE[]> CjtToDevMode(const base::string16& printer_name,
19 const std::string& print_ticket) {
20 using namespace cloud_devices::printer;
21 cloud_devices::CloudDeviceDescription description;
22 if (!description.InitFromString(print_ticket))
23 return scoped_ptr<DEVMODE[]>();
25 printing::ScopedPrinterHandle printer;
26 if (!printer.OpenPrinter(printer_name.c_str()))
27 return scoped_ptr<DEVMODE[]>();
29 scoped_ptr<DEVMODE[]> scoped_dev_mode;
31 ColorTicketItem color;
32 if (color.LoadFrom(description)) {
33 bool is_color = color.value().type == STANDARD_COLOR;
34 scoped_dev_mode = CreateDevModeWithColor(printer, printer_name, is_color);
36 scoped_dev_mode = printing::CreateDevMode(printer, NULL);
41 return scoped_ptr<DEVMODE[]>();
43 DEVMODE* dev_mode = scoped_dev_mode.get();
45 ColorTicketItem color;
46 DuplexTicketItem duplex;
47 OrientationTicketItem orientation;
48 MarginsTicketItem margins;
50 FitToPageTicketItem fit_to_page;
51 MediaTicketItem media;
52 CopiesTicketItem copies;
53 PageRangeTicketItem page_range;
54 CollateTicketItem collate;
55 ReverseTicketItem reverse;
57 if (orientation.LoadFrom(description)) {
58 dev_mode->dmFields |= DM_ORIENTATION;
59 if (orientation.value() == LANDSCAPE) {
60 dev_mode->dmOrientation = DMORIENT_LANDSCAPE;
62 dev_mode->dmOrientation = DMORIENT_PORTRAIT;
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;
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;
90 if (copies.LoadFrom(description)) {
91 dev_mode->dmFields |= DM_COPIES;
92 dev_mode->dmCopies = copies.value();
95 if (dpi.LoadFrom(description)) {
96 if (dpi.value().horizontal > 0) {
97 dev_mode->dmFields |= DM_PRINTQUALITY;
98 dev_mode->dmPrintQuality = dpi.value().horizontal;
100 if (dpi.value().vertical > 0) {
101 dev_mode->dmFields |= DM_YRESOLUTION;
102 dev_mode->dmYResolution = dpi.value().vertical;
106 if (collate.LoadFrom(description)) {
107 dev_mode->dmFields |= DM_COLLATE;
108 dev_mode->dmCollate = (collate.value() ? DMCOLLATE_TRUE : DMCOLLATE_FALSE);
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;
116 dev_mode->dmFields |= DM_PAPERWIDTH;
117 dev_mode->dmPaperWidth = width;
120 dev_mode->dmFields |= DM_PAPERLENGTH;
121 dev_mode->dmPaperLength = height;
125 return printing::CreateDevMode(printer, dev_mode);
128 std::string CapabilitiesToCdd(
129 const printing::PrinterSemanticCapsAndDefaults& semantic_info) {
130 using namespace cloud_devices::printer;
131 cloud_devices::CloudDeviceDescription description;
133 ContentTypesCapability content_types;
134 content_types.AddOption("application/pdf");
135 content_types.SaveTo(&description);
137 ColorCapability color;
138 if (semantic_info.color_default || semantic_info.color_changeable) {
139 color.AddDefaultOption(Color(STANDARD_COLOR), semantic_info.color_default);
142 if (!semantic_info.color_default || semantic_info.color_changeable) {
143 color.AddDefaultOption(Color(STANDARD_MONOCHROME),
144 !semantic_info.color_default);
146 color.SaveTo(&description);
148 if (semantic_info.duplex_capable) {
149 DuplexCapability duplex;
150 duplex.AddDefaultOption(
151 NO_DUPLEX, semantic_info.duplex_default == printing::SIMPLEX);
152 duplex.AddDefaultOption(
153 LONG_EDGE, semantic_info.duplex_default == printing::LONG_EDGE);
154 duplex.AddDefaultOption(
155 SHORT_EDGE, semantic_info.duplex_default == printing::SHORT_EDGE);
156 duplex.SaveTo(&description);
159 if (!semantic_info.papers.empty()) {
160 Media default_media(semantic_info.default_paper.name,
161 semantic_info.default_paper.size_um.width(),
162 semantic_info.default_paper.size_um.height());
163 default_media.MatchBySize();
165 MediaCapability media;
166 bool is_default_set = false;
167 for (size_t i = 0; i < semantic_info.papers.size(); ++i) {
168 gfx::Size paper_size = semantic_info.papers[i].size_um;
169 if (paper_size.width() > paper_size.height())
170 paper_size.SetSize(paper_size.height(), paper_size.width());
171 Media new_media(semantic_info.papers[i].name, paper_size.width(),
172 paper_size.height());
173 new_media.MatchBySize();
174 if (new_media.IsValid() && !media.Contains(new_media)) {
175 if (!default_media.IsValid())
176 default_media = new_media;
177 media.AddDefaultOption(new_media, new_media == default_media);
178 is_default_set = is_default_set || (new_media == default_media);
181 if (!is_default_set && default_media.IsValid())
182 media.AddDefaultOption(default_media, true);
184 if (media.IsValid()) {
185 media.SaveTo(&description);
191 if (semantic_info.collate_capable) {
192 CollateCapability collate;
193 collate.set_default_value(semantic_info.collate_default);
194 collate.SaveTo(&description);
197 if (semantic_info.copies_capable) {
198 CopiesCapability copies;
199 copies.SaveTo(&description);
202 if (!semantic_info.dpis.empty()) {
204 Dpi default_dpi(semantic_info.default_dpi.width(),
205 semantic_info.default_dpi.height());
206 bool is_default_set = false;
207 for (size_t i = 0; i < semantic_info.dpis.size(); ++i) {
208 Dpi new_dpi(semantic_info.dpis[i].width(),
209 semantic_info.dpis[i].height());
210 if (new_dpi.IsValid() && !dpi.Contains(new_dpi)) {
211 if (!default_dpi.IsValid())
212 default_dpi = new_dpi;
213 dpi.AddDefaultOption(new_dpi, new_dpi == default_dpi);
214 is_default_set = is_default_set || (new_dpi == default_dpi);
217 if (!is_default_set && default_dpi.IsValid())
218 dpi.AddDefaultOption(default_dpi, true);
220 dpi.SaveTo(&description);
226 OrientationCapability orientation;
227 orientation.AddDefaultOption(PORTRAIT, true);
228 orientation.AddOption(LANDSCAPE);
229 orientation.AddOption(AUTO_ORIENTATION);
230 orientation.SaveTo(&description);
232 return description.ToString();
235 } // namespace cloud_print