| 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 |