diff options
author | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-21 21:54:32 +0000 |
---|---|---|
committer | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-21 21:54:32 +0000 |
commit | 37d638846ffe96d219f873fa0fcf64f5b699ea4c (patch) | |
tree | 24edf56847bdbe57f9b3dba9f69a64196c8b31d8 /printing | |
parent | 715aef65e07bb9e689a408590fbbba9b3b29ec78 (diff) | |
download | chromium_src-37d638846ffe96d219f873fa0fcf64f5b699ea4c.zip chromium_src-37d638846ffe96d219f873fa0fcf64f5b699ea4c.tar.gz chromium_src-37d638846ffe96d219f873fa0fcf64f5b699ea4c.tar.bz2 |
Revert 252221 "Use DocumentProperties to get default DEVMODE ins..."
> Use DocumentProperties to get default DEVMODE instead of PRINTER_INFO_*.
> Fixed ScopedPrinterHandle::OpenPrinter interface.
>
> Review URL: https://codereview.chromium.org/168003002
TBR=vitalybuka@chromium.org
BUG=345746
Review URL: https://codereview.chromium.org/175173005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@252658 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing')
-rw-r--r-- | printing/backend/print_backend_win.cc | 13 | ||||
-rw-r--r-- | printing/backend/printing_info_win.cc | 19 | ||||
-rw-r--r-- | printing/backend/printing_info_win.h | 25 | ||||
-rw-r--r-- | printing/backend/win_helper.cc | 2 | ||||
-rw-r--r-- | printing/backend/win_helper.h | 5 | ||||
-rw-r--r-- | printing/printing_context_win.cc | 41 | ||||
-rw-r--r-- | printing/printing_context_win_unittest.cc | 35 |
7 files changed, 89 insertions, 51 deletions
diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc index ec52c99..b23407c 100644 --- a/printing/backend/print_backend_win.cc +++ b/printing/backend/print_backend_win.cc @@ -213,7 +213,7 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( const std::string& printer_name, PrinterSemanticCapsAndDefaults* printer_info) { ScopedPrinterHandle printer_handle; - if (!printer_handle.OpenPrinter(base::UTF8ToWide(printer_name))) { + if (!printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str())) { LOG(WARNING) << "Failed to open printer, error = " << GetLastError(); return false; } @@ -226,9 +226,8 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( DCHECK_EQ(name, base::UTF8ToUTF16(printer_name)); PrinterSemanticCapsAndDefaults caps; - - scoped_ptr<DEVMODE[]> user_settings = CreateDevMode(printer_handle, NULL); - if (user_settings) { + UserDefaultDevMode user_settings; + if (user_settings.Init(printer_handle)) { if (user_settings.get()->dmFields & DM_COLOR) caps.color_default = (user_settings.get()->dmColor == DMCOLOR_COLOR); @@ -313,7 +312,7 @@ bool PrintBackendWin::GetPrinterCapsAndDefaults( printer_info->caps_mime_type = "text/xml"; } ScopedPrinterHandle printer_handle; - if (printer_handle.OpenPrinter(printer_name_wide)) { + if (printer_handle.OpenPrinter(printer_name_wide.c_str())) { scoped_ptr<DEVMODE[]> devmode_out(CreateDevMode(printer_handle, NULL)); if (!devmode_out) return false; @@ -344,7 +343,7 @@ bool PrintBackendWin::GetPrinterCapsAndDefaults( std::string PrintBackendWin::GetPrinterDriverInfo( const std::string& printer_name) { ScopedPrinterHandle printer; - if (!printer.OpenPrinter(base::UTF8ToWide(printer_name))) { + if (!printer.OpenPrinter(base::UTF8ToWide(printer_name).c_str())) { return std::string(); } return GetDriverInfo(printer); @@ -352,7 +351,7 @@ std::string PrintBackendWin::GetPrinterDriverInfo( bool PrintBackendWin::IsValidPrinter(const std::string& printer_name) { ScopedPrinterHandle printer_handle; - return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name)); + return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()); } scoped_refptr<PrintBackend> PrintBackend::CreateInstance( diff --git a/printing/backend/printing_info_win.cc b/printing/backend/printing_info_win.cc index e759639..0e45094 100644 --- a/printing/backend/printing_info_win.cc +++ b/printing/backend/printing_info_win.cc @@ -44,4 +44,23 @@ 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 1134194..931ae6d 100644 --- a/printing/backend/printing_info_win.h +++ b/printing/backend/printing_info_win.h @@ -58,9 +58,34 @@ class DriverInfo { typedef internal::PrinterInfo<PRINTER_INFO_2, 2> PrinterInfo2; typedef internal::PrinterInfo<PRINTER_INFO_5, 5> PrinterInfo5; +typedef internal::PrinterInfo<PRINTER_INFO_8, 8> PrinterInfo8; +typedef internal::PrinterInfo<PRINTER_INFO_9, 9> PrinterInfo9; typedef internal::DriverInfo<DRIVER_INFO_6, 6> 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/backend/win_helper.cc b/printing/backend/win_helper.cc index 53ccf58..a16228b 100644 --- a/printing/backend/win_helper.cc +++ b/printing/backend/win_helper.cc @@ -395,7 +395,7 @@ scoped_ptr<DEVMODE[]> XpsTicketToDevMode(const base::string16& printer_name, } printing::ScopedPrinterHandle printer; - if (!printer.OpenPrinter(printer_name)) + if (!printer.OpenPrinter(printer_name.c_str())) return scoped_dev_mode.Pass(); base::win::ScopedComPtr<IStream> pt_stream; diff --git a/printing/backend/win_helper.h b/printing/backend/win_helper.h index ef407b3..9b998d7 100644 --- a/printing/backend/win_helper.h +++ b/printing/backend/win_helper.h @@ -46,11 +46,10 @@ class ScopedPrinterHandle : public base::win::GenericScopedHandle<PrinterHandleTraits, base::win::VerifierTraits> { public: - bool OpenPrinter(const base::string16& printer) { + bool OpenPrinter(const wchar_t* printer) { HANDLE temp_handle; // ::OpenPrinter may return error but assign some value into handle. - if (::OpenPrinter(const_cast<wchar_t*>(printer.c_str()), &temp_handle, - NULL)) { + if (::OpenPrinter(const_cast<LPTSTR>(printer), &temp_handle, NULL)) { Set(temp_handle); } return IsValid(); diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index 2c4b290..fbadfe4 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_GE(bytes_needed, count_returned * sizeof(PRINTER_INFO_2)); + DCHECK(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,21 +277,17 @@ PrintingContext::Result PrintingContextWin::UseDefaultSettings() { &count_returned); if (ret && count_returned) { // have printers // Open the first successfully found printer. - 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)) + 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) continue; - 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; + if (!AllocateContext(printer_name, info_2->pDevMode, &context_)) + break; + if (InitializeSettings(*info_2->pDevMode, printer_name, + NULL, 0, false)) { + break; } ReleaseContext(); } @@ -340,13 +336,15 @@ PrintingContext::Result PrintingContextWin::UpdatePrinterSettings( DCHECK(!external_preview) << "Not implemented"; ScopedPrinterHandle printer; - if (!printer.OpenPrinter(settings_.device_name())) + LPWSTR device_name_wide = + const_cast<wchar_t*>(settings_.device_name().c_str()); + if (!printer.OpenPrinter(device_name_wide)) return OnError(); // Make printer changes local to Chrome. // See MSDN documentation regarding DocumentProperties. scoped_ptr<DEVMODE[]> scoped_dev_mode = - CreateDevModeWithColor(printer, settings_.device_name(), + CreateDevModeWithColor(printer, device_name_wide, settings_.color() != GRAY); if (!scoped_dev_mode) return OnError(); @@ -406,7 +404,7 @@ PrintingContext::Result PrintingContextWin::InitWithSettings( // TODO(maruel): settings_.ToDEVMODE() ScopedPrinterHandle printer; - if (!printer.OpenPrinter(settings_.device_name())) { + if (!printer.OpenPrinter(settings_.device_name().c_str())) { return FAILED; } @@ -590,14 +588,15 @@ bool PrintingContextWin::GetPrinterSettings(HANDLE printer, const std::wstring& device_name) { DCHECK(!in_print_job_); - scoped_ptr<DEVMODE[]> dev_mode = CreateDevMode(printer, NULL); + UserDefaultDevMode user_settings; - if (!dev_mode || !AllocateContext(device_name, dev_mode.get(), &context_)) { + if (!user_settings.Init(printer) || + !AllocateContext(device_name, user_settings.get(), &context_)) { ResetSettings(); return false; } - return InitializeSettings(*dev_mode.get(), device_name, NULL, 0, false); + return InitializeSettings(*user_settings.get(), device_name, NULL, 0, false); } // static diff --git a/printing/printing_context_win_unittest.cc b/printing/printing_context_win_unittest.cc index b28d996..0590229 100644 --- a/printing/printing_context_win_unittest.cc +++ b/printing/printing_context_win_unittest.cc @@ -12,27 +12,24 @@ #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<testing::Test> { public: - void PrintSettingsCallback(PrintingContext::Result result) { + void PrintSettingsCallback(printing::PrintingContext::Result result) { result_ = result; } protected: - PrintingContext::Result result() const { return result_; } + printing::PrintingContext::Result result() const { return result_; } private: - PrintingContext::Result result_; + printing::PrintingContext::Result result_; }; // This is a fake PrintDlgEx implementation that sets the right fields in @@ -49,9 +46,9 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) { lppd->lpPageRanges[0].nToPage = 5; // Painful paperwork. - base::string16 printer_name = PrintingContextTest::GetDefaultPrinter(); - ScopedPrinterHandle printer; - if (!printer.OpenPrinter(printer_name)) + std::wstring printer_name = PrintingContextTest::GetDefaultPrinter(); + HANDLE printer; + if (!OpenPrinter(const_cast<wchar_t*>(printer_name.c_str()), &printer, NULL)) return E_FAIL; scoped_ptr<uint8[]> buffer; @@ -61,7 +58,7 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) { lppd->hDevMode = NULL; lppd->hDevNames = NULL; - PrinterInfo2 info_2; + printing::PrinterInfo2 info_2; if (info_2.Init(printer)) { dev_mode = info_2.get()->pDevMode; } @@ -70,7 +67,7 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) { goto Cleanup; } - if (!PrintingContextWin::AllocateContext(printer_name, dev_mode, + if (!printing::PrintingContextWin::AllocateContext(printer_name, dev_mode, &lppd->hDC)) { result = E_FAIL; goto Cleanup; @@ -140,6 +137,7 @@ Cleanup: GlobalFree(lppd->hDevNames); } } + ClosePrinter(printer); return result; } @@ -147,11 +145,12 @@ TEST_F(PrintingContextTest, Base) { if (IsTestCaseDisabled()) return; - PrintSettings settings; + printing::PrintSettings settings; settings.set_device_name(GetDefaultPrinter()); // Initialize it. - scoped_ptr<PrintingContext> context(PrintingContext::Create(std::string())); - EXPECT_EQ(PrintingContext::OK, context->InitWithSettings(settings)); + scoped_ptr<printing::PrintingContext> context( + printing::PrintingContext::Create(std::string())); + EXPECT_EQ(printing::PrintingContext::OK, context->InitWithSettings(settings)); // The print may lie to use and may not support world transformation. // Verify right now. @@ -166,14 +165,12 @@ TEST_F(PrintingContextTest, PrintAll) { return; std::string dummy_locale; - PrintingContextWin context(dummy_locale); + printing::PrintingContextWin context(dummy_locale); context.SetPrintDialog(&PrintDlgExMock); context.AskUserForSettings( NULL, 123, false, base::Bind(&PrintingContextTest::PrintSettingsCallback, base::Unretained(this))); - EXPECT_EQ(PrintingContext::OK, result()); - PrintSettings settings = context.settings(); + EXPECT_EQ(printing::PrintingContext::OK, result()); + printing::PrintSettings settings = context.settings(); EXPECT_EQ(settings.ranges().size(), 0); } - -} // namespace printing |