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. 4 5 #include "chrome/service/cloud_print/cdd_conversion_win.h" 6 7 #include "base/strings/string_number_conversions.h" 8 #include "components/cloud_devices/common/printer_description.h" 9 #include "printing/backend/win_helper.h" 10 11 namespace cloud_print { 12 13 bool IsValidCjt(const std::string& print_ticket_data) { 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 unsigned id = 0; 116 if (base::StringToUint(media.value().vendor_id, &id) && id) { 117 dev_mode->dmFields |= DM_PAPERSIZE; 118 dev_mode->dmPaperSize = static_cast<short>(id); 119 } else if (width > 0 && height > 0) { 120 dev_mode->dmFields |= DM_PAPERWIDTH; 121 dev_mode->dmPaperWidth = width; 122 dev_mode->dmFields |= DM_PAPERLENGTH; 123 dev_mode->dmPaperLength = height; 124 } 125 } 126 127 return printing::CreateDevMode(printer, dev_mode.get()); 128 } 129 130 } // namespace cloud_print 131