From 1b248882920e1649839f40df47cdd6b8e512e4b7 Mon Sep 17 00:00:00 2001 From: "vitalybuka@chromium.org" Date: Tue, 25 Feb 2014 04:39:14 +0000 Subject: Use DocumentProperties to get default DEVMODE instead of PRINTER_INFO_*. Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=252221 Review URL: https://codereview.chromium.org/168003002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@253076 0039d316-1c4b-4281-b951-d872f2087c98 --- printing/backend/print_backend_win.cc | 5 ++-- printing/backend/printing_info_win.cc | 19 --------------- printing/backend/printing_info_win.h | 25 -------------------- printing/printing_context_win.cc | 39 ++++++++++++++++--------------- printing/printing_context_win_unittest.cc | 38 ++++++++++++++++-------------- 5 files changed, 43 insertions(+), 83 deletions(-) (limited to 'printing') diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc index 7d4ebda..06bd5c9 100644 --- a/printing/backend/print_backend_win.cc +++ b/printing/backend/print_backend_win.cc @@ -232,8 +232,9 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( DCHECK_EQ(name, base::UTF8ToUTF16(printer_name)); PrinterSemanticCapsAndDefaults caps; - UserDefaultDevMode user_settings; - if (user_settings.Init(printer_handle)) { + + scoped_ptr user_settings = CreateDevMode(printer_handle, NULL); + if (user_settings) { if (user_settings.get()->dmFields & DM_COLOR) caps.color_default = (user_settings.get()->dmColor == DMCOLOR_COLOR); diff --git a/printing/backend/printing_info_win.cc b/printing/backend/printing_info_win.cc index 0e45094..e759639 100644 --- a/printing/backend/printing_info_win.cc +++ b/printing/backend/printing_info_win.cc @@ -44,23 +44,4 @@ uint8* GetPrinterInfo(HANDLE printer, int level) { } // namespace internal -UserDefaultDevMode::UserDefaultDevMode() : dev_mode_(NULL) { -} - -bool UserDefaultDevMode::Init(HANDLE printer) { - if (info_9_.Init(printer)) - dev_mode_ = info_9_.get()->pDevMode; - - if (!dev_mode_ && info_8_.Init(printer)) - dev_mode_ = info_8_.get()->pDevMode; - - if (!dev_mode_ && info_2_.Init(printer)) - dev_mode_ = info_2_.get()->pDevMode; - - return dev_mode_ != NULL; -} - -UserDefaultDevMode::~UserDefaultDevMode() { -} - } // namespace printing diff --git a/printing/backend/printing_info_win.h b/printing/backend/printing_info_win.h index 931ae6d..1134194 100644 --- a/printing/backend/printing_info_win.h +++ b/printing/backend/printing_info_win.h @@ -58,34 +58,9 @@ class DriverInfo { typedef internal::PrinterInfo PrinterInfo2; typedef internal::PrinterInfo PrinterInfo5; -typedef internal::PrinterInfo PrinterInfo8; -typedef internal::PrinterInfo PrinterInfo9; typedef internal::DriverInfo DriverInfo6; -// Retrieves DEVMODE from PRINTER_INFO_* structures. -// Requests in following order: -// 9 (user-default), -// 8 (admin-default), -// 2 (printer-default). -class PRINTING_EXPORT UserDefaultDevMode { - public: - UserDefaultDevMode(); - ~UserDefaultDevMode(); - - bool Init(HANDLE printer); - - const DEVMODE* get() const { - return dev_mode_; - } - - private: - PrinterInfo2 info_2_; - PrinterInfo8 info_8_; - PrinterInfo9 info_9_; - const DEVMODE* dev_mode_; -}; - } // namespace printing #endif // PRINTING_BACKEND_PRINTING_INFO_WIN_H_ 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 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_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_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 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(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 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 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 diff --git a/printing/printing_context_win_unittest.cc b/printing/printing_context_win_unittest.cc index 0590229..79e7637 100644 --- a/printing/printing_context_win_unittest.cc +++ b/printing/printing_context_win_unittest.cc @@ -12,24 +12,27 @@ #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" #include "printing/backend/printing_info_win.h" +#include "printing/backend/win_helper.h" #include "printing/printing_test.h" #include "printing/printing_context.h" #include "printing/printing_context_win.h" #include "printing/print_settings.h" #include "testing/gtest/include/gtest/gtest.h" +namespace printing { + // This test is automatically disabled if no printer is available. class PrintingContextTest : public PrintingTest { public: - void PrintSettingsCallback(printing::PrintingContext::Result result) { + void PrintSettingsCallback(PrintingContext::Result result) { result_ = result; } protected: - printing::PrintingContext::Result result() const { return result_; } + PrintingContext::Result result() const { return result_; } private: - printing::PrintingContext::Result result_; + PrintingContext::Result result_; }; // This is a fake PrintDlgEx implementation that sets the right fields in @@ -45,10 +48,9 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) { lppd->lpPageRanges[0].nFromPage = 1; lppd->lpPageRanges[0].nToPage = 5; - // Painful paperwork. - std::wstring printer_name = PrintingContextTest::GetDefaultPrinter(); - HANDLE printer; - if (!OpenPrinter(const_cast(printer_name.c_str()), &printer, NULL)) + base::string16 printer_name = PrintingContextTest::GetDefaultPrinter(); + ScopedPrinterHandle printer; + if (!printer.OpenPrinter(printer_name.c_str())) return E_FAIL; scoped_ptr buffer; @@ -58,7 +60,7 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) { lppd->hDevMode = NULL; lppd->hDevNames = NULL; - printing::PrinterInfo2 info_2; + PrinterInfo2 info_2; if (info_2.Init(printer)) { dev_mode = info_2.get()->pDevMode; } @@ -67,8 +69,8 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) { goto Cleanup; } - if (!printing::PrintingContextWin::AllocateContext(printer_name, dev_mode, - &lppd->hDC)) { + if (!PrintingContextWin::AllocateContext(printer_name, dev_mode, + &lppd->hDC)) { result = E_FAIL; goto Cleanup; } @@ -137,7 +139,6 @@ Cleanup: GlobalFree(lppd->hDevNames); } } - ClosePrinter(printer); return result; } @@ -145,12 +146,11 @@ TEST_F(PrintingContextTest, Base) { if (IsTestCaseDisabled()) return; - printing::PrintSettings settings; + PrintSettings settings; settings.set_device_name(GetDefaultPrinter()); // Initialize it. - scoped_ptr context( - printing::PrintingContext::Create(std::string())); - EXPECT_EQ(printing::PrintingContext::OK, context->InitWithSettings(settings)); + scoped_ptr context(PrintingContext::Create(std::string())); + EXPECT_EQ(PrintingContext::OK, context->InitWithSettings(settings)); // The print may lie to use and may not support world transformation. // Verify right now. @@ -165,12 +165,14 @@ TEST_F(PrintingContextTest, PrintAll) { return; std::string dummy_locale; - printing::PrintingContextWin context(dummy_locale); + PrintingContextWin context(dummy_locale); context.SetPrintDialog(&PrintDlgExMock); context.AskUserForSettings( NULL, 123, false, base::Bind(&PrintingContextTest::PrintSettingsCallback, base::Unretained(this))); - EXPECT_EQ(printing::PrintingContext::OK, result()); - printing::PrintSettings settings = context.settings(); + EXPECT_EQ(PrintingContext::OK, result()); + PrintSettings settings = context.settings(); EXPECT_EQ(settings.ranges().size(), 0); } + +} // namespace printing -- cgit v1.1