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/printing_context_win.h" | 5 #include "printing/printing_context_win.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 PrintingContext::Result PrintingContextWin::UseDefaultSettings() { | 52 PrintingContext::Result PrintingContextWin::UseDefaultSettings() { |
53 DCHECK(!in_print_job_); | 53 DCHECK(!in_print_job_); |
54 | 54 |
55 scoped_refptr<PrintBackend> backend = PrintBackend::CreateInstance(NULL); | 55 scoped_refptr<PrintBackend> backend = PrintBackend::CreateInstance(NULL); |
56 base::string16 default_printer = | 56 base::string16 default_printer = |
57 base::UTF8ToWide(backend->GetDefaultPrinterName()); | 57 base::UTF8ToWide(backend->GetDefaultPrinterName()); |
58 if (!default_printer.empty()) { | 58 if (!default_printer.empty()) { |
59 ScopedPrinterHandle printer; | 59 ScopedPrinterHandle printer; |
60 if (printer.OpenPrinter(default_printer.c_str())) { | 60 if (printer.OpenPrinter(default_printer.c_str())) { |
61 scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = | 61 scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = |
62 CreateDevMode(printer, NULL); | 62 CreateDevMode(printer.Get(), NULL); |
63 if (InitializeSettings(default_printer, dev_mode.get()) == OK) | 63 if (InitializeSettings(default_printer, dev_mode.get()) == OK) |
64 return OK; | 64 return OK; |
65 } | 65 } |
66 } | 66 } |
67 | 67 |
68 ReleaseContext(); | 68 ReleaseContext(); |
69 | 69 |
70 // No default printer configured, do we have any printers at all? | 70 // No default printer configured, do we have any printers at all? |
71 DWORD bytes_needed = 0; | 71 DWORD bytes_needed = 0; |
72 DWORD count_returned = 0; | 72 DWORD count_returned = 0; |
73 (void)::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, | 73 (void)::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, |
74 NULL, 2, NULL, 0, &bytes_needed, &count_returned); | 74 NULL, 2, NULL, 0, &bytes_needed, &count_returned); |
75 if (bytes_needed) { | 75 if (bytes_needed) { |
76 DCHECK_GE(bytes_needed, count_returned * sizeof(PRINTER_INFO_2)); | 76 DCHECK_GE(bytes_needed, count_returned * sizeof(PRINTER_INFO_2)); |
77 scoped_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); | 77 scoped_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); |
78 BOOL ret = ::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, | 78 BOOL ret = ::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, |
79 NULL, 2, printer_info_buffer.get(), | 79 NULL, 2, printer_info_buffer.get(), |
80 bytes_needed, &bytes_needed, | 80 bytes_needed, &bytes_needed, |
81 &count_returned); | 81 &count_returned); |
82 if (ret && count_returned) { // have printers | 82 if (ret && count_returned) { // have printers |
83 // Open the first successfully found printer. | 83 // Open the first successfully found printer. |
84 const PRINTER_INFO_2* info_2 = | 84 const PRINTER_INFO_2* info_2 = |
85 reinterpret_cast<PRINTER_INFO_2*>(printer_info_buffer.get()); | 85 reinterpret_cast<PRINTER_INFO_2*>(printer_info_buffer.get()); |
86 const PRINTER_INFO_2* info_2_end = info_2 + count_returned; | 86 const PRINTER_INFO_2* info_2_end = info_2 + count_returned; |
87 for (; info_2 < info_2_end; ++info_2) { | 87 for (; info_2 < info_2_end; ++info_2) { |
88 ScopedPrinterHandle printer; | 88 ScopedPrinterHandle printer; |
89 if (!printer.OpenPrinter(info_2->pPrinterName)) | 89 if (!printer.OpenPrinter(info_2->pPrinterName)) |
90 continue; | 90 continue; |
91 scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = | 91 scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = |
92 CreateDevMode(printer, NULL); | 92 CreateDevMode(printer.Get(), NULL); |
93 if (InitializeSettings(info_2->pPrinterName, dev_mode.get()) == OK) | 93 if (InitializeSettings(info_2->pPrinterName, dev_mode.get()) == OK) |
94 return OK; | 94 return OK; |
95 } | 95 } |
96 if (context_) | 96 if (context_) |
97 return OK; | 97 return OK; |
98 } | 98 } |
99 } | 99 } |
100 | 100 |
101 return OnError(); | 101 return OnError(); |
102 } | 102 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 DCHECK(!in_print_job_); | 137 DCHECK(!in_print_job_); |
138 DCHECK(!external_preview) << "Not implemented"; | 138 DCHECK(!external_preview) << "Not implemented"; |
139 | 139 |
140 ScopedPrinterHandle printer; | 140 ScopedPrinterHandle printer; |
141 if (!printer.OpenPrinter(settings_.device_name().c_str())) | 141 if (!printer.OpenPrinter(settings_.device_name().c_str())) |
142 return OnError(); | 142 return OnError(); |
143 | 143 |
144 // Make printer changes local to Chrome. | 144 // Make printer changes local to Chrome. |
145 // See MSDN documentation regarding DocumentProperties. | 145 // See MSDN documentation regarding DocumentProperties. |
146 scoped_ptr<DEVMODE, base::FreeDeleter> scoped_dev_mode = | 146 scoped_ptr<DEVMODE, base::FreeDeleter> scoped_dev_mode = |
147 CreateDevModeWithColor(printer, settings_.device_name(), | 147 CreateDevModeWithColor(printer.Get(), settings_.device_name(), |
148 settings_.color() != GRAY); | 148 settings_.color() != GRAY); |
149 if (!scoped_dev_mode) | 149 if (!scoped_dev_mode) |
150 return OnError(); | 150 return OnError(); |
151 | 151 |
152 { | 152 { |
153 DEVMODE* dev_mode = scoped_dev_mode.get(); | 153 DEVMODE* dev_mode = scoped_dev_mode.get(); |
154 dev_mode->dmCopies = std::max(settings_.copies(), 1); | 154 dev_mode->dmCopies = std::max(settings_.copies(), 1); |
155 if (dev_mode->dmCopies > 1) { // do not change unless multiple copies | 155 if (dev_mode->dmCopies > 1) { // do not change unless multiple copies |
156 dev_mode->dmFields |= DM_COPIES; | 156 dev_mode->dmFields |= DM_COPIES; |
157 dev_mode->dmCollate = settings_.collate() ? DMCOLLATE_TRUE : | 157 dev_mode->dmCollate = settings_.collate() ? DMCOLLATE_TRUE : |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 dev_mode->dmFields |= DM_PAPERWIDTH; | 192 dev_mode->dmFields |= DM_PAPERWIDTH; |
193 dev_mode->dmPaperWidth = width; | 193 dev_mode->dmPaperWidth = width; |
194 dev_mode->dmFields |= DM_PAPERLENGTH; | 194 dev_mode->dmFields |= DM_PAPERLENGTH; |
195 dev_mode->dmPaperLength = height; | 195 dev_mode->dmPaperLength = height; |
196 } | 196 } |
197 } | 197 } |
198 | 198 |
199 // Update data using DocumentProperties. | 199 // Update data using DocumentProperties. |
200 if (show_system_dialog) { | 200 if (show_system_dialog) { |
201 scoped_dev_mode = ShowPrintDialog( | 201 scoped_dev_mode = ShowPrintDialog( |
202 printer, delegate_->GetParentView(), scoped_dev_mode.get()); | 202 printer.Get(), delegate_->GetParentView(), scoped_dev_mode.get()); |
203 } else { | 203 } else { |
204 scoped_dev_mode = CreateDevMode(printer, scoped_dev_mode.get()); | 204 scoped_dev_mode = CreateDevMode(printer.Get(), scoped_dev_mode.get()); |
205 } | 205 } |
206 // Set printer then refresh printer settings. | 206 // Set printer then refresh printer settings. |
207 return InitializeSettings(settings_.device_name(), scoped_dev_mode.get()); | 207 return InitializeSettings(settings_.device_name(), scoped_dev_mode.get()); |
208 } | 208 } |
209 | 209 |
210 PrintingContext::Result PrintingContextWin::InitWithSettings( | 210 PrintingContext::Result PrintingContextWin::InitWithSettings( |
211 const PrintSettings& settings) { | 211 const PrintSettings& settings) { |
212 DCHECK(!in_print_job_); | 212 DCHECK(!in_print_job_); |
213 | 213 |
214 settings_ = settings; | 214 settings_ = settings; |
215 | 215 |
216 // TODO(maruel): settings_.ToDEVMODE() | 216 // TODO(maruel): settings_.ToDEVMODE() |
217 ScopedPrinterHandle printer; | 217 ScopedPrinterHandle printer; |
218 if (!printer.OpenPrinter(settings_.device_name().c_str())) | 218 if (!printer.OpenPrinter(settings_.device_name().c_str())) |
219 return FAILED; | 219 return FAILED; |
220 | 220 |
221 scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = | 221 scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = |
222 CreateDevMode(printer, NULL); | 222 CreateDevMode(printer.Get(), NULL); |
223 | 223 |
224 return InitializeSettings(settings_.device_name(), dev_mode.get()); | 224 return InitializeSettings(settings_.device_name(), dev_mode.get()); |
225 } | 225 } |
226 | 226 |
227 PrintingContext::Result PrintingContextWin::NewDocument( | 227 PrintingContext::Result PrintingContextWin::NewDocument( |
228 const base::string16& document_name) { | 228 const base::string16& document_name) { |
229 DCHECK(!in_print_job_); | 229 DCHECK(!in_print_job_); |
230 if (!context_) | 230 if (!context_) |
231 return OnError(); | 231 return OnError(); |
232 | 232 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 | 389 |
390 if (canceled) { | 390 if (canceled) { |
391 result.reset(); | 391 result.reset(); |
392 abort_printing_ = true; | 392 abort_printing_ = true; |
393 } | 393 } |
394 | 394 |
395 return result.Pass(); | 395 return result.Pass(); |
396 } | 396 } |
397 | 397 |
398 } // namespace printing | 398 } // namespace printing |
OLD | NEW |