summaryrefslogtreecommitdiffstats
path: root/printing/backend
diff options
context:
space:
mode:
authorvitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-12 07:25:41 +0000
committervitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-12 07:25:41 +0000
commitd8d17eb0918779607b83afda9c9e3657c78093a4 (patch)
tree60528bd69eff21539516582c0bcbf5d1a52f9e5d /printing/backend
parentefdd1617a387f369cdd42515d99a2e6c21fedc48 (diff)
downloadchromium_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.cc105
-rw-r--r--printing/backend/printing_info_win.cc66
-rw-r--r--printing/backend/printing_info_win.h91
-rw-r--r--printing/backend/win_helper.cc89
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());