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 | |
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')
-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 | ||||
-rw-r--r-- | printing/printing.gyp | 2 | ||||
-rw-r--r-- | printing/printing_context_win.cc | 84 | ||||
-rw-r--r-- | printing/printing_context_win.h | 4 | ||||
-rw-r--r-- | printing/printing_context_win_unittest.cc | 27 |
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; |