diff options
author | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-12 07:25:41 +0000 |
---|---|---|
committer | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-12 07:25:41 +0000 |
commit | d8d17eb0918779607b83afda9c9e3657c78093a4 (patch) | |
tree | 60528bd69eff21539516582c0bcbf5d1a52f9e5d /printing/backend | |
parent | efdd1617a387f369cdd42515d99a2e6c21fedc48 (diff) | |
download | chromium_src-d8d17eb0918779607b83afda9c9e3657c78093a4.zip chromium_src-d8d17eb0918779607b83afda9c9e3657c78093a4.tar.gz chromium_src-d8d17eb0918779607b83afda9c9e3657c78093a4.tar.bz2 |
Wrapers for PRINTER_INFO_* and DRIVER_INFO_*.
Review URL: https://chromiumcodereview.appspot.com/11530005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@172552 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing/backend')
-rw-r--r-- | printing/backend/print_backend_win.cc | 105 | ||||
-rw-r--r-- | printing/backend/printing_info_win.cc | 66 | ||||
-rw-r--r-- | printing/backend/printing_info_win.h | 91 | ||||
-rw-r--r-- | printing/backend/win_helper.cc | 89 |
4 files changed, 210 insertions, 141 deletions
diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc index cc6b223..e6b229a 100644 --- a/printing/backend/print_backend_win.cc +++ b/printing/backend/print_backend_win.cc @@ -14,34 +14,11 @@ #include "base/win/scoped_comptr.h" #include "base/win/scoped_hglobal.h" #include "printing/backend/print_backend_consts.h" +#include "printing/backend/printing_info_win.h" #include "printing/backend/win_helper.h" -namespace { - -// This class is designed to work with PRINTER_INFO_X structures -// and calls GetPrinter internally with correctly allocated buffer. -template <typename T> -class PrinterInfo { - public: - bool GetPrinterInfo(HANDLE printer, int level) { - DWORD buf_size = 0; - GetPrinter(printer, level, NULL, 0, &buf_size); - if (buf_size == 0) { - LOG(WARNING) << "Failed to GetPrinter, error = " << GetLastError(); - return false; - } - buffer_.reset(new uint8[buf_size]); - memset(buffer_.get(), 0, buf_size); - return !!GetPrinter(printer, level, buffer_.get(), buf_size, &buf_size); - } - const T* get() const { - return reinterpret_cast<T*>(buffer_.get()); - } - - private: - scoped_array<uint8> buffer_; -}; +namespace { HRESULT StreamOnHGlobalToString(IStream* stream, std::string* out) { DCHECK(stream); @@ -133,77 +110,47 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( return false; } - PrinterInfo<PRINTER_INFO_5> info_5; - if (!info_5.GetPrinterInfo(printer_handle, 5)) { - LOG(WARNING) << "Failed to get PRINTER_INFO_5, error = " << GetLastError(); + PrinterInfo5 info_5; + if (!info_5.Init(printer_handle)) { return false; } + DCHECK_EQ(info_5.get()->pPrinterName, UTF8ToUTF16(printer_name)); + + PrinterSemanticCapsAndDefaults caps; // Get printer capabilities. For more info see here: // http://msdn.microsoft.com/en-us/library/windows/desktop/dd183552(v=vs.85).aspx - bool color_supported = (DeviceCapabilities(info_5.get()->pPrinterName, + caps.color_capable = (::DeviceCapabilities(info_5.get()->pPrinterName, info_5.get()->pPortName, DC_COLORDEVICE, NULL, NULL) == 1); - bool duplex_supported = (DeviceCapabilities(info_5.get()->pPrinterName, + caps.duplex_capable = (::DeviceCapabilities(info_5.get()->pPrinterName, info_5.get()->pPortName, DC_DUPLEX, NULL, NULL) == 1); - DEVMODE* devmode = NULL; - // Retrieves user defaults. - PrinterInfo<PRINTER_INFO_9> info_9; - if (info_9.GetPrinterInfo(printer_handle, 9)) { - devmode = info_9.get()->pDevMode; - } else { - LOG(WARNING) << "Failed to get PRINTER_INFO_9, error = " << GetLastError(); - } - - // Retrieves admin defaults. - PrinterInfo<PRINTER_INFO_8> info_8; - if (!devmode) { - if (info_8.GetPrinterInfo(printer_handle, 8)) { - devmode = info_8.get()->pDevMode; - } else { - LOG(WARNING) << "Failed to get PRINTER_INFO_8, error = " << - GetLastError(); - } - } - - // Retrieves printer defaults. - PrinterInfo<PRINTER_INFO_2> info_2; - if (!devmode) { - if (info_2.GetPrinterInfo(printer_handle, 2)) { - devmode = info_2.get()->pDevMode; - } else { - LOG(WARNING) << "Failed to get PRINTER_INFO_2, error = " << - GetLastError(); - } - } + UserDefaultDevMode user_settings; - PrinterSemanticCapsAndDefaults caps; - caps.color_capable = color_supported; - caps.duplex_capable = duplex_supported; + if (user_settings.Init(printer_handle)) { + if ((user_settings.get()->dmFields & DM_COLOR) == DM_COLOR) + caps.color_default = (user_settings.get()->dmColor == DMCOLOR_COLOR); - if (devmode) { - if ((devmode->dmFields & DM_COLOR) == DM_COLOR) - caps.color_default = (devmode->dmColor == DMCOLOR_COLOR); - if ((devmode->dmFields & DM_DUPLEX) == DM_DUPLEX) { - switch (devmode->dmDuplex) { - case DMDUP_SIMPLEX: - caps.duplex_default = SIMPLEX; - break; - case DMDUP_VERTICAL: - caps.duplex_default = LONG_EDGE; - break; - case DMDUP_HORIZONTAL: - caps.duplex_default = SHORT_EDGE; - break; - default: - NOTREACHED(); + if ((user_settings.get()->dmFields & DM_DUPLEX) == DM_DUPLEX) { + switch (user_settings.get()->dmDuplex) { + case DMDUP_SIMPLEX: + caps.duplex_default = SIMPLEX; + break; + case DMDUP_VERTICAL: + caps.duplex_default = LONG_EDGE; + break; + case DMDUP_HORIZONTAL: + caps.duplex_default = SHORT_EDGE; + break; + default: + NOTREACHED(); } } } else { diff --git a/printing/backend/printing_info_win.cc b/printing/backend/printing_info_win.cc new file mode 100644 index 0000000..0ee0fcd --- /dev/null +++ b/printing/backend/printing_info_win.cc @@ -0,0 +1,66 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "printing/backend/printing_info_win.h" + +#include "base/logging.h" + +namespace printing { + +namespace internal { + +uint8* GetDriverInfo(HANDLE printer, int level) { + DWORD size = 0; + ::GetPrinterDriver(printer, NULL, level, NULL, 0, &size); + if (size == 0) { + return NULL; + } + scoped_array<uint8> buffer(new uint8[size]); + memset(buffer.get(), 0, size); + if (!::GetPrinterDriver(printer, NULL, level, buffer.get(), size, &size)) { + return NULL; + } + return buffer.release(); +} + +uint8* GetPrinterInfo(HANDLE printer, int level) { + DWORD size = 0; + ::GetPrinter(printer, level, NULL, 0, &size); + if (size == 0) { + LOG(WARNING) << "Failed to get size of PRINTER_INFO_" << level << + ", error = " << GetLastError(); + return NULL; + } + scoped_array<uint8> buffer(new uint8[size]); + memset(buffer.get(), 0, size); + if (!::GetPrinter(printer, level, buffer.get(), size, &size)) { + LOG(WARNING) << "Failed to get PRINTER_INFO_" << level << + ", error = " << GetLastError(); + return NULL; + } + return buffer.release(); +} + +} // 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 new file mode 100644 index 0000000..1e9afd9 --- /dev/null +++ b/printing/backend/printing_info_win.h @@ -0,0 +1,91 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef PRINTING_BACKEND_PRINTING_INFO_WIN_H_ +#define PRINTING_BACKEND_PRINTING_INFO_WIN_H_ + +#include <objidl.h> +#include <winspool.h> + +#include "base/memory/scoped_ptr.h" +#include "printing/printing_export.h" + +namespace printing { + +namespace internal { + +PRINTING_EXPORT uint8* GetDriverInfo(HANDLE printer, int level); +PRINTING_EXPORT uint8* GetPrinterInfo(HANDLE printer, int level); + +// This class is designed to work with PRINTER_INFO_X structures +// and calls GetPrinter internally with correctly allocated buffer. +template <typename PrinterInfoType, int level> +class PrinterInfo { + public: + bool Init(HANDLE printer) { + buffer_.reset(GetPrinterInfo(printer, level)); + return buffer_; + } + + const PrinterInfoType* get() const { + return reinterpret_cast<const PrinterInfoType*>(buffer_.get()); + } + + private: + scoped_array<uint8> buffer_; +}; + +// This class is designed to work with DRIVER_INFO_X structures +// and calls GetDriverInfo internally with correctly allocated buffer. +template <typename DriverInfoType, int level> +class DriverInfo { + public: + bool Init(HANDLE printer) { + buffer_.reset(GetDriverInfo(printer, level)); + return buffer_; + } + + const DriverInfoType* get() const { + return reinterpret_cast<const DriverInfoType*>(buffer_.get()); + } + + private: + scoped_array<uint8> buffer_; +}; + +} // namespace internal + +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 071ef54..fe4bacd 100644 --- a/printing/backend/win_helper.cc +++ b/printing/backend/win_helper.cc @@ -13,21 +13,26 @@ #include "base/utf_string_conversions.h" #include "printing/backend/print_backend.h" #include "printing/backend/print_backend_consts.h" +#include "printing/backend/printing_info_win.h" namespace { + typedef HRESULT (WINAPI* PTOpenProviderProc)(PCWSTR printer_name, DWORD version, HPTPROVIDER* provider); + typedef HRESULT (WINAPI* PTGetPrintCapabilitiesProc)(HPTPROVIDER provider, IStream* print_ticket, IStream* capabilities, BSTR* error_message); + typedef HRESULT (WINAPI* PTConvertDevModeToPrintTicketProc)( HPTPROVIDER provider, ULONG devmode_size_in_bytes, PDEVMODE devmode, EPrintTicketScope scope, IStream* print_ticket); + typedef HRESULT (WINAPI* PTConvertPrintTicketToDevModeProc)( HPTPROVIDER provider, IStream* print_ticket, @@ -36,6 +41,7 @@ typedef HRESULT (WINAPI* PTConvertPrintTicketToDevModeProc)( ULONG* devmode_byte_count, PDEVMODE* devmode, BSTR* error_message); + typedef HRESULT (WINAPI* PTMergeAndValidatePrintTicketProc)( HPTPROVIDER provider, IStream* base_ticket, @@ -43,8 +49,11 @@ typedef HRESULT (WINAPI* PTMergeAndValidatePrintTicketProc)( EPrintTicketScope scope, IStream* result_ticket, BSTR* error_message); + typedef HRESULT (WINAPI* PTReleaseMemoryProc)(PVOID buffer); + typedef HRESULT (WINAPI* PTCloseProviderProc)(HPTPROVIDER provider); + typedef HRESULT (WINAPI* StartXpsPrintJobProc)( const LPCWSTR printer_name, const LPCWSTR job_name, @@ -66,50 +75,9 @@ PTReleaseMemoryProc g_release_memory_proc = NULL; PTCloseProviderProc g_close_provider_proc = NULL; StartXpsPrintJobProc g_start_xps_print_job_proc = NULL; -// Returns pointer to structure allocated in |buffer|. So pointer is only valide -// until |buffer| is destroyed. -const PRINTER_INFO_2* GetPrinterInfo2(HANDLE printer, - scoped_array<BYTE>* buffer) { - DCHECK(printer); - DCHECK(buffer); - DWORD bytes_needed = 0; - const DWORD kLevel = 2; - ::GetPrinter(printer, kLevel, NULL, 0, &bytes_needed); - if (!bytes_needed) - return NULL; - buffer->reset(new BYTE[bytes_needed]); - if (!buffer->get()) - return NULL; - if (!::GetPrinter(printer, kLevel, buffer->get(), bytes_needed, - &bytes_needed)) { - return NULL; - } - return reinterpret_cast<const PRINTER_INFO_2*>(buffer->get()); -} - -// Returns pointer to structure allocated in |buffer|. So pointer is only valide -// until |buffer| is destroyed. -const DRIVER_INFO_6* GetDriverInfo6(HANDLE printer, - scoped_array<BYTE>* buffer) { - DCHECK(printer); - DCHECK(buffer); - DWORD bytes_needed = 0; - const DWORD kLevel = 6; - ::GetPrinterDriver(printer, NULL, kLevel, NULL, 0, &bytes_needed); - if (!bytes_needed) - return NULL; - buffer->reset(new BYTE[bytes_needed]); - if (!buffer->get()) - return NULL; - if (!::GetPrinterDriver(printer, NULL, kLevel, buffer->get(), bytes_needed, - &bytes_needed)) { - return NULL; - } - return reinterpret_cast<const DRIVER_INFO_6*>(buffer->get()); -} - } // namespace + namespace printing { bool XPSModule::Init() { @@ -317,22 +285,20 @@ bool InitBasicPrinterInfo(HANDLE printer, PrinterBasicInfo* printer_info) { if (!printer) return false; - scoped_array<BYTE> printer_info_buffer; - const PRINTER_INFO_2* info2 = GetPrinterInfo2(printer, &printer_info_buffer); - - if (!info2) + PrinterInfo2 info_2; + if (!info_2.Init(printer)) return false; - printer_info->printer_name = WideToUTF8(info2->pPrinterName); - if (info2->pComment) - printer_info->printer_description = - WideToUTF8(info2->pComment); - if (info2->pLocation) + + printer_info->printer_name = WideToUTF8(info_2.get()->pPrinterName); + if (info_2.get()->pComment) + printer_info->printer_description = WideToUTF8(info_2.get()->pComment); + if (info_2.get()->pLocation) printer_info->options[kLocationTagName] = - WideToUTF8(info2->pLocation); - if (info2->pDriverName) + WideToUTF8(info_2.get()->pLocation); + if (info_2.get()->pDriverName) printer_info->options[kDriverNameTagName] = - WideToUTF8(info2->pDriverName); - printer_info->printer_status = info2->Status; + WideToUTF8(info_2.get()->pDriverName); + printer_info->printer_status = info_2.get()->Status; std::string driver_info = GetDriverInfo(printer); if (!driver_info.empty()) @@ -347,19 +313,18 @@ std::string GetDriverInfo(HANDLE printer) { if (!printer) return driver_info; - scoped_array<BYTE> driver_info_buffer; - const DRIVER_INFO_6* driver = GetDriverInfo6(printer, &driver_info_buffer); - if (!driver) + DriverInfo6 info_6; + if (!info_6.Init(printer)) return driver_info; std::string info[4]; - if (driver->pName) - info[0] = WideToUTF8(driver->pName); + if (info_6.get()->pName) + info[0] = WideToUTF8(info_6.get()->pName); - if (driver->pDriverPath) { + if (info_6.get()->pDriverPath) { scoped_ptr<FileVersionInfo> version_info( FileVersionInfo::CreateFileVersionInfo( - FilePath(driver->pDriverPath))); + FilePath(info_6.get()->pDriverPath))); if (version_info.get()) { info[1] = WideToUTF8(version_info->file_version()); info[2] = WideToUTF8(version_info->product_name()); |