| Index: printing/backend/win_helper.cc
|
| diff --git a/printing/backend/win_helper.cc b/printing/backend/win_helper.cc
|
| index 071ef547e40007fefaa1c84f2369e07b706fe67b..fe4bacdffb94e70da908dcb0c943aa7f2dc9d638 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());
|
|
|