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/common/cloud_print/cloud_print_cdd_conversion.h" 6 7 #include "base/strings/string_number_conversions.h" 8 #include "components/cloud_devices/common/printer_description.h" 9 #include "printing/backend/print_backend.h" 10 11 namespace cloud_print { 12 13 scoped_ptr<base::DictionaryValue> PrinterSemanticCapsAndDefaultsToCdd( 14 const printing::PrinterSemanticCapsAndDefaults& semantic_info) { 15 using namespace cloud_devices::printer; 16 cloud_devices::CloudDeviceDescription description; 17 18 ContentTypesCapability content_types; 19 content_types.AddOption("application/pdf"); 20 content_types.SaveTo(&description); 21 22 if (semantic_info.collate_capable) { 23 CollateCapability collate; 24 collate.set_default_value(semantic_info.collate_default); 25 collate.SaveTo(&description); 26 } 27 28 if (semantic_info.copies_capable) { 29 CopiesCapability copies; 30 copies.SaveTo(&description); 31 } 32 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); 42 } 43 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); 49 } 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); 54 } 55 color.SaveTo(&description); 56 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(); 63 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, 72 paper_size.width(), 73 paper_size.height()); 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); 80 } 81 } 82 if (!is_default_set && default_media.IsValid()) 83 media.AddDefaultOption(default_media, true); 84 85 if (media.IsValid()) { 86 media.SaveTo(&description); 87 } else { 88 NOTREACHED(); 89 } 90 } 91 92 if (!semantic_info.dpis.empty()) { 93 DpiCapability dpi; 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); 105 } 106 } 107 if (!is_default_set && default_dpi.IsValid()) 108 dpi.AddDefaultOption(default_dpi, true); 109 if (dpi.IsValid()) { 110 dpi.SaveTo(&description); 111 } else { 112 NOTREACHED(); 113 } 114 } 115 116 OrientationCapability orientation; 117 orientation.AddDefaultOption(PORTRAIT, true); 118 orientation.AddOption(LANDSCAPE); 119 orientation.AddOption(AUTO_ORIENTATION); 120 orientation.SaveTo(&description); 121 122 return scoped_ptr<base::DictionaryValue>(description.root().DeepCopy()); 123 } 124 125 } // namespace cloud_print 126