OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "printing/backend/print_backend.h" | 5 #include "printing/backend/print_backend.h" |
6 | 6 |
7 #include <objidl.h> | 7 #include <objidl.h> |
8 #include <winspool.h> | 8 #include <winspool.h> |
9 | 9 |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
52 const wchar_t* port, | 52 const wchar_t* port, |
53 const DEVMODE* devmode, | 53 const DEVMODE* devmode, |
54 PrinterSemanticCapsAndDefaults* caps) { | 54 PrinterSemanticCapsAndDefaults* caps) { |
55 static const size_t kToUm = 100; // Windows uses 0.1mm. | 55 static const size_t kToUm = 100; // Windows uses 0.1mm. |
56 static const size_t kMaxPaperName = 64; | 56 static const size_t kMaxPaperName = 64; |
57 | 57 |
58 struct PaperName { | 58 struct PaperName { |
59 wchar_t chars[kMaxPaperName]; | 59 wchar_t chars[kMaxPaperName]; |
60 }; | 60 }; |
61 | 61 |
62 DCHECK_EQ(sizeof(PaperName), sizeof(wchar_t) * kMaxPaperName); | |
Noam Samuel
2014/02/05 18:37:56
Very minor nit: This DCHECK seems superflous
| |
63 | |
62 // Paper | 64 // Paper |
63 std::vector<PaperName> names; | 65 std::vector<PaperName> names; |
64 GetDeviceCapabilityArray(printer, port, DC_PAPERNAMES, &names); | 66 GetDeviceCapabilityArray(printer, port, DC_PAPERNAMES, &names); |
65 | 67 |
66 std::vector<POINT> sizes; | 68 std::vector<POINT> sizes; |
67 GetDeviceCapabilityArray(printer, port, DC_PAPERSIZE, &sizes); | 69 GetDeviceCapabilityArray(printer, port, DC_PAPERSIZE, &sizes); |
68 | 70 |
69 std::vector<WORD> ids; | 71 std::vector<WORD> ids; |
70 GetDeviceCapabilityArray(printer, port, DC_PAPERS, &ids); | 72 GetDeviceCapabilityArray(printer, port, DC_PAPERS, &ids); |
71 | 73 |
72 DCHECK_EQ(ids.size(), sizes.size()); | 74 DCHECK_EQ(ids.size(), sizes.size()); |
73 DCHECK_EQ(names.size(), sizes.size()); | 75 DCHECK_EQ(names.size(), sizes.size()); |
74 | 76 |
75 if (ids.size() != sizes.size()) | 77 if (ids.size() != sizes.size()) |
76 ids.clear(); | 78 ids.clear(); |
77 if (names.size() != sizes.size()) | 79 if (names.size() != sizes.size()) |
78 names.clear(); | 80 names.clear(); |
79 | 81 |
80 for (size_t i = 0; i < sizes.size(); ++i) { | 82 for (size_t i = 0; i < sizes.size(); ++i) { |
81 PrinterSemanticCapsAndDefaults::Paper paper; | 83 PrinterSemanticCapsAndDefaults::Paper paper; |
82 paper.size_um.SetSize(sizes[i].x * kToUm, sizes[i].y * kToUm); | 84 paper.size_um.SetSize(sizes[i].x * kToUm, sizes[i].y * kToUm); |
83 if (!names.empty()) { | 85 if (!names.empty()) { |
84 paper.name.assign(&names[i].chars, &names[i].chars + kMaxPaperName); | 86 const wchar_t* name_start = names[i].chars; |
87 base::string16 tmp_name(name_start, kMaxPaperName); | |
85 // Trim trailing zeros. | 88 // Trim trailing zeros. |
86 paper.name = paper.name.c_str(); | 89 tmp_name = tmp_name.c_str(); |
90 paper.name = base::WideToUTF8(tmp_name); | |
87 } | 91 } |
88 caps->papers.push_back(paper); | 92 caps->papers.push_back(paper); |
89 } | 93 } |
90 | 94 |
91 if (devmode) { | 95 if (devmode) { |
92 short default_id = 0; | 96 short default_id = 0; |
93 gfx::Size default_size; | 97 gfx::Size default_size; |
94 | 98 |
95 if ((devmode->dmFields & DM_PAPERSIZE) == DM_PAPERSIZE) | 99 if ((devmode->dmFields & DM_PAPERSIZE) == DM_PAPERSIZE) |
96 default_id = devmode->dmPaperSize; | 100 default_id = devmode->dmPaperSize; |
97 if ((devmode->dmFields & DM_PAPERWIDTH) == DM_PAPERWIDTH) | 101 if ((devmode->dmFields & DM_PAPERWIDTH) == DM_PAPERWIDTH) |
98 default_size.set_width(devmode->dmPaperWidth * kToUm); | 102 default_size.set_width(devmode->dmPaperWidth * kToUm); |
99 if ((devmode->dmFields & DM_PAPERLENGTH) == DM_PAPERLENGTH) | 103 if ((devmode->dmFields & DM_PAPERLENGTH) == DM_PAPERLENGTH) |
100 default_size.set_height(devmode->dmPaperLength * kToUm); | 104 default_size.set_height(devmode->dmPaperLength * kToUm); |
101 | 105 |
102 if (default_size.IsEmpty()) { | 106 if (default_size.IsEmpty()) { |
103 for (size_t i = 0; i < ids.size(); ++i) { | 107 for (size_t i = 0; i < ids.size(); ++i) { |
104 if (ids[i] == default_id) { | 108 if (ids[i] == default_id) { |
105 PrinterSemanticCapsAndDefaults::Paper paper; | 109 PrinterSemanticCapsAndDefaults::Paper paper; |
106 paper.size_um.SetSize(sizes[i].x * kToUm, sizes[i].y * kToUm); | 110 paper.size_um.SetSize(sizes[i].x * kToUm, sizes[i].y * kToUm); |
107 if (!names.empty()) { | 111 if (!names.empty()) { |
108 paper.name.assign(&names[i].chars, &names[i].chars + kMaxPaperName); | 112 const wchar_t* name_start = names[i].chars; |
113 base::string16 tmp_name(name_start, kMaxPaperName); | |
109 // Trim trailing zeros. | 114 // Trim trailing zeros. |
110 paper.name = paper.name.c_str(); | 115 tmp_name = tmp_name.c_str(); |
116 paper.name = base::WideToUTF8(tmp_name); | |
111 } | 117 } |
112 caps->default_paper = paper; | 118 caps->default_paper = paper; |
113 break; | 119 break; |
114 } | 120 } |
115 } | 121 } |
116 } else { | 122 } else { |
117 caps->default_paper.size_um = default_size; | 123 caps->default_paper.size_um = default_size; |
118 } | 124 } |
119 } | 125 } |
120 } | 126 } |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
357 ScopedPrinterHandle printer_handle; | 363 ScopedPrinterHandle printer_handle; |
358 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()); | 364 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()); |
359 } | 365 } |
360 | 366 |
361 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( | 367 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( |
362 const base::DictionaryValue* print_backend_settings) { | 368 const base::DictionaryValue* print_backend_settings) { |
363 return new PrintBackendWin; | 369 return new PrintBackendWin; |
364 } | 370 } |
365 | 371 |
366 } // namespace printing | 372 } // namespace printing |
OLD | NEW |