Chromium Code Reviews| 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 |