summaryrefslogtreecommitdiffstats
path: root/printing
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
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')
-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
-rw-r--r--printing/printing.gyp2
-rw-r--r--printing/printing_context_win.cc84
-rw-r--r--printing/printing_context_win.h4
-rw-r--r--printing/printing_context_win_unittest.cc27
8 files changed, 233 insertions, 235 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());
diff --git a/printing/printing.gyp b/printing/printing.gyp
index 90f51af..229f223 100644
--- a/printing/printing.gyp
+++ b/printing/printing.gyp
@@ -32,6 +32,8 @@
'backend/print_backend_consts.cc',
'backend/print_backend_consts.h',
'backend/print_backend_dummy.cc',
+ 'backend/printing_info_win.cc',
+ 'backend/printing_info_win.h',
'emf_win.cc',
'emf_win.h',
'image.cc',
diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc
index 8e0f0e1..96e3572 100644
--- a/printing/printing_context_win.cc
+++ b/printing/printing_context_win.cc
@@ -17,6 +17,7 @@
#include "base/values.h"
#include "base/win/metro.h"
#include "printing/backend/print_backend.h"
+#include "printing/backend/printing_info_win.h"
#include "printing/backend/win_helper.h"
#include "printing/print_job_constants.h"
#include "printing/print_settings_initializer_win.h"
@@ -44,59 +45,6 @@ const int kPDFA4Height = 11.69 * kPDFDpi;
const int kPDFA3Width = 11.69 * kPDFDpi;
const int kPDFA3Height = 16.54 * kPDFDpi;
-// Retrieves the printer's PRINTER_INFO_* structure.
-// Output |level| can be 9 (user-default), 8 (admin-default), or 2
-// (printer-default).
-// |devmode| is a pointer points to the start of DEVMODE structure in
-// |buffer|.
-bool GetPrinterInfo(HANDLE printer,
- const std::wstring &device_name,
- int* level,
- scoped_array<uint8>* buffer,
- DEVMODE** dev_mode) {
- DCHECK(buffer);
-
- // A PRINTER_INFO_9 structure specifying the per-user default printer
- // settings.
- printing::PrintingContextWin::GetPrinterHelper(printer, 9, buffer);
- if (buffer->get()) {
- PRINTER_INFO_9* info_9 = reinterpret_cast<PRINTER_INFO_9*>(buffer->get());
- if (info_9->pDevMode != NULL) {
- *level = 9;
- *dev_mode = info_9->pDevMode;
- return true;
- }
- buffer->reset();
- }
-
- // A PRINTER_INFO_8 structure specifying the global default printer settings.
- printing::PrintingContextWin::GetPrinterHelper(printer, 8, buffer);
- if (buffer->get()) {
- PRINTER_INFO_8* info_8 = reinterpret_cast<PRINTER_INFO_8*>(buffer->get());
- if (info_8->pDevMode != NULL) {
- *level = 8;
- *dev_mode = info_8->pDevMode;
- return true;
- }
- buffer->reset();
- }
-
- // A PRINTER_INFO_2 structure specifying the driver's default printer
- // settings.
- printing::PrintingContextWin::GetPrinterHelper(printer, 2, buffer);
- if (buffer->get()) {
- PRINTER_INFO_2* info_2 = reinterpret_cast<PRINTER_INFO_2*>(buffer->get());
- if (info_2->pDevMode != NULL) {
- *level = 2;
- *dev_mode = info_2->pDevMode;
- return true;
- }
- buffer->reset();
- }
-
- return false;
-}
-
} // anonymous namespace
namespace printing {
@@ -661,18 +609,16 @@ bool PrintingContextWin::InitializeSettings(const DEVMODE& dev_mode,
bool PrintingContextWin::GetPrinterSettings(HANDLE printer,
const std::wstring& device_name) {
DCHECK(!in_print_job_);
- scoped_array<uint8> buffer;
- int level = 0;
- DEVMODE* dev_mode = NULL;
- if (GetPrinterInfo(printer, device_name, &level, &buffer, &dev_mode) &&
- AllocateContext(device_name, dev_mode, &context_)) {
- return InitializeSettings(*dev_mode, device_name, NULL, 0, false);
+ UserDefaultDevMode user_settings;
+
+ if (!user_settings.Init(printer) ||
+ !AllocateContext(device_name, user_settings.get(), &context_)) {
+ ResetSettings();
+ return false;
}
- buffer.reset();
- ResetSettings();
- return false;
+ return InitializeSettings(*user_settings.get(), device_name, NULL, 0, false);
}
// static
@@ -813,18 +759,4 @@ PrintingContext::Result PrintingContextWin::ParseDialogResult(
return context_ ? OK : FAILED;
}
-// static
-void PrintingContextWin::GetPrinterHelper(HANDLE printer, int level,
- scoped_array<uint8>* buffer) {
- DWORD buf_size = 0;
- GetPrinter(printer, level, NULL, 0, &buf_size);
- if (buf_size) {
- buffer->reset(new uint8[buf_size]);
- memset(buffer->get(), 0, buf_size);
- if (!GetPrinter(printer, level, buffer->get(), buf_size, &buf_size)) {
- buffer->reset();
- }
- }
-}
-
} // namespace printing
diff --git a/printing/printing_context_win.h b/printing/printing_context_win.h
index b167a0a..a4773d0 100644
--- a/printing/printing_context_win.h
+++ b/printing/printing_context_win.h
@@ -53,10 +53,6 @@ class PRINTING_EXPORT PrintingContextWin : public PrintingContext {
const DEVMODE* dev_mode,
gfx::NativeDrawingContext* context);
- // Retrieves the content of a GetPrinter call.
- static void GetPrinterHelper(HANDLE printer, int level,
- scoped_array<uint8>* buffer);
-
private:
// Class that manages the PrintDlgEx() callbacks. This is meant to be a
// temporary object used during the Print... dialog display.
diff --git a/printing/printing_context_win_unittest.cc b/printing/printing_context_win_unittest.cc
index 5917b65..2251e64 100644
--- a/printing/printing_context_win_unittest.cc
+++ b/printing/printing_context_win_unittest.cc
@@ -10,6 +10,7 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/memory/scoped_ptr.h"
+#include "printing/backend/printing_info_win.h"
#include "printing/printing_test.h"
#include "printing/printing_context.h"
#include "printing/printing_context_win.h"
@@ -50,18 +51,15 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) {
return E_FAIL;
scoped_array<uint8> buffer;
- DEVMODE* dev_mode = NULL;
- PRINTER_INFO_2* info_2 = NULL;
+ const DEVMODE* dev_mode = NULL;
HRESULT result = S_OK;
lppd->hDC = NULL;
lppd->hDevMode = NULL;
lppd->hDevNames = NULL;
- printing::PrintingContextWin::GetPrinterHelper(printer, 2, &buffer);
- if (buffer.get()) {
- info_2 = reinterpret_cast<PRINTER_INFO_2*>(buffer.get());
- if (info_2->pDevMode != NULL)
- dev_mode = info_2->pDevMode;
+ printing::PrinterInfo2 info_2;
+ if (info_2.Init(printer)) {
+ dev_mode = info_2.get()->pDevMode;
}
if (!dev_mode) {
result = E_FAIL;
@@ -89,11 +87,12 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) {
GlobalUnlock(lppd->hDevMode);
dev_mode_ptr = NULL;
- size_t driver_size = 2 + sizeof(wchar_t) * lstrlen(info_2->pDriverName);
- size_t printer_size = 2 + sizeof(wchar_t) * lstrlen(info_2->pPrinterName);
- size_t port_size = 2 + sizeof(wchar_t) * lstrlen(info_2->pPortName);
+ size_t driver_size = 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pDriverName);
+ size_t printer_size = 2 + sizeof(wchar_t) *
+ lstrlen(info_2.get()->pPrinterName);
+ size_t port_size = 2 + sizeof(wchar_t) * lstrlen(info_2.get()->pPortName);
size_t dev_names_size = sizeof(DEVNAMES) + driver_size + printer_size +
- port_size;
+ port_size;
lppd->hDevNames = GlobalAlloc(GHND, dev_names_size);
if (!lppd->hDevNames) {
result = E_FAIL;
@@ -108,13 +107,13 @@ HRESULT WINAPI PrintDlgExMock(LPPRINTDLGEX lppd) {
dev_names->wDefault = 1;
dev_names->wDriverOffset = sizeof(DEVNAMES);
memcpy(reinterpret_cast<uint8*>(dev_names_ptr) + dev_names->wDriverOffset,
- info_2->pDriverName, driver_size);
+ info_2.get()->pDriverName, driver_size);
dev_names->wDeviceOffset = dev_names->wDriverOffset + driver_size;
memcpy(reinterpret_cast<uint8*>(dev_names_ptr) + dev_names->wDeviceOffset,
- info_2->pPrinterName, printer_size);
+ info_2.get()->pPrinterName, printer_size);
dev_names->wOutputOffset = dev_names->wDeviceOffset + printer_size;
memcpy(reinterpret_cast<uint8*>(dev_names_ptr) + dev_names->wOutputOffset,
- info_2->pPortName, port_size);
+ info_2.get()->pPortName, port_size);
GlobalUnlock(lppd->hDevNames);
dev_names_ptr = NULL;