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" |
| 11 #include "base/numerics/safe_conversions.h" |
11 #include "base/strings/string_piece.h" | 12 #include "base/strings/string_piece.h" |
12 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
13 #include "base/win/scoped_bstr.h" | 14 #include "base/win/scoped_bstr.h" |
14 #include "base/win/scoped_comptr.h" | 15 #include "base/win/scoped_comptr.h" |
15 #include "base/win/scoped_hglobal.h" | 16 #include "base/win/scoped_hglobal.h" |
16 #include "printing/backend/print_backend_consts.h" | 17 #include "printing/backend/print_backend_consts.h" |
17 #include "printing/backend/printing_info_win.h" | 18 #include "printing/backend/printing_info_win.h" |
18 #include "printing/backend/win_helper.h" | 19 #include "printing/backend/win_helper.h" |
19 | 20 |
20 namespace printing { | 21 namespace printing { |
(...skipping 14 matching lines...) Expand all Loading... |
35 } | 36 } |
36 | 37 |
37 template <class T> | 38 template <class T> |
38 void GetDeviceCapabilityArray(const wchar_t* printer, | 39 void GetDeviceCapabilityArray(const wchar_t* printer, |
39 const wchar_t* port, | 40 const wchar_t* port, |
40 WORD id, | 41 WORD id, |
41 std::vector<T>* result) { | 42 std::vector<T>* result) { |
42 int count = DeviceCapabilities(printer, port, id, NULL, NULL); | 43 int count = DeviceCapabilities(printer, port, id, NULL, NULL); |
43 if (count <= 0) | 44 if (count <= 0) |
44 return; | 45 return; |
45 result->resize(count); | 46 std::vector<T> tmp; |
46 CHECK_EQ(count, | 47 tmp.resize(count * 2); |
47 DeviceCapabilities(printer, port, id, | 48 count = DeviceCapabilities(printer, port, id, |
48 reinterpret_cast<LPTSTR>(result->data()), NULL)); | 49 reinterpret_cast<LPTSTR>(tmp.data()), NULL); |
| 50 if (count <= 0) |
| 51 return; |
| 52 CHECK_LE(count, base::checked_cast<int>(tmp.size())); |
| 53 tmp.resize(count); |
| 54 result->swap(tmp); |
49 } | 55 } |
50 | 56 |
51 void LoadPaper(const wchar_t* printer, | 57 void LoadPaper(const wchar_t* printer, |
52 const wchar_t* port, | 58 const wchar_t* port, |
53 const DEVMODE* devmode, | 59 const DEVMODE* devmode, |
54 PrinterSemanticCapsAndDefaults* caps) { | 60 PrinterSemanticCapsAndDefaults* caps) { |
55 static const size_t kToUm = 100; // Windows uses 0.1mm. | 61 static const size_t kToUm = 100; // Windows uses 0.1mm. |
56 static const size_t kMaxPaperName = 64; | 62 static const size_t kMaxPaperName = 64; |
57 | 63 |
58 struct PaperName { | 64 struct PaperName { |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 ScopedPrinterHandle printer_handle; | 360 ScopedPrinterHandle printer_handle; |
355 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name)); | 361 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name)); |
356 } | 362 } |
357 | 363 |
358 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( | 364 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( |
359 const base::DictionaryValue* print_backend_settings) { | 365 const base::DictionaryValue* print_backend_settings) { |
360 return new PrintBackendWin; | 366 return new PrintBackendWin; |
361 } | 367 } |
362 | 368 |
363 } // namespace printing | 369 } // namespace printing |
OLD | NEW |