diff options
Diffstat (limited to 'printing/printing_context_win.cc')
-rw-r--r-- | printing/printing_context_win.cc | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index fbadfe4..4ba013e 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc @@ -269,7 +269,7 @@ PrintingContext::Result PrintingContextWin::UseDefaultSettings() { (void)::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, 2, NULL, 0, &bytes_needed, &count_returned); if (bytes_needed) { - DCHECK(bytes_needed >= count_returned * sizeof(PRINTER_INFO_2)); + DCHECK_GE(bytes_needed, count_returned * sizeof(PRINTER_INFO_2)); scoped_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); BOOL ret = ::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, 2, printer_info_buffer.get(), @@ -277,17 +277,21 @@ PrintingContext::Result PrintingContextWin::UseDefaultSettings() { &count_returned); if (ret && count_returned) { // have printers // Open the first successfully found printer. - for (DWORD count = 0; count < count_returned; ++count) { - PRINTER_INFO_2* info_2 = reinterpret_cast<PRINTER_INFO_2*>( - printer_info_buffer.get() + count * sizeof(PRINTER_INFO_2)); - std::wstring printer_name = info_2->pPrinterName; - if (info_2->pDevMode == NULL || printer_name.length() == 0) + const PRINTER_INFO_2* info_2 = + reinterpret_cast<PRINTER_INFO_2*>(printer_info_buffer.get()); + const PRINTER_INFO_2* info_2_end = info_2 + count_returned; + for (; info_2 < info_2_end; ++info_2) { + ScopedPrinterHandle printer; + if (!printer.OpenPrinter(info_2->pPrinterName)) continue; - if (!AllocateContext(printer_name, info_2->pDevMode, &context_)) - break; - if (InitializeSettings(*info_2->pDevMode, printer_name, - NULL, 0, false)) { - break; + scoped_ptr<DEVMODE[]> dev_mode = CreateDevMode(printer, NULL); + if (!dev_mode || !AllocateContext(info_2->pPrinterName, dev_mode.get(), + &context_)) { + continue; + } + if (InitializeSettings(*dev_mode.get(), info_2->pPrinterName, NULL, 0, + false)) { + return OK; } ReleaseContext(); } @@ -336,15 +340,13 @@ PrintingContext::Result PrintingContextWin::UpdatePrinterSettings( DCHECK(!external_preview) << "Not implemented"; ScopedPrinterHandle printer; - LPWSTR device_name_wide = - const_cast<wchar_t*>(settings_.device_name().c_str()); - if (!printer.OpenPrinter(device_name_wide)) + if (!printer.OpenPrinter(settings_.device_name().c_str())) return OnError(); // Make printer changes local to Chrome. // See MSDN documentation regarding DocumentProperties. scoped_ptr<DEVMODE[]> scoped_dev_mode = - CreateDevModeWithColor(printer, device_name_wide, + CreateDevModeWithColor(printer, settings_.device_name(), settings_.color() != GRAY); if (!scoped_dev_mode) return OnError(); @@ -588,15 +590,14 @@ bool PrintingContextWin::GetPrinterSettings(HANDLE printer, const std::wstring& device_name) { DCHECK(!in_print_job_); - UserDefaultDevMode user_settings; + scoped_ptr<DEVMODE[]> dev_mode = CreateDevMode(printer, NULL); - if (!user_settings.Init(printer) || - !AllocateContext(device_name, user_settings.get(), &context_)) { + if (!dev_mode || !AllocateContext(device_name, dev_mode.get(), &context_)) { ResetSettings(); return false; } - return InitializeSettings(*user_settings.get(), device_name, NULL, 0, false); + return InitializeSettings(*dev_mode.get(), device_name, NULL, 0, false); } // static |