| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "printing/backend/win_helper.h" | 5 #include "printing/backend/win_helper.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
| 10 #include "base/file_version_info.h" | 10 #include "base/file_version_info.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 14 #include "printing/backend/print_backend.h" | 14 #include "printing/backend/print_backend.h" |
| 15 #include "printing/backend/print_backend_consts.h" | 15 #include "printing/backend/print_backend_consts.h" |
| 16 #include "printing/backend/printing_info_win.h" |
| 16 | 17 |
| 17 namespace { | 18 namespace { |
| 19 |
| 18 typedef HRESULT (WINAPI* PTOpenProviderProc)(PCWSTR printer_name, | 20 typedef HRESULT (WINAPI* PTOpenProviderProc)(PCWSTR printer_name, |
| 19 DWORD version, | 21 DWORD version, |
| 20 HPTPROVIDER* provider); | 22 HPTPROVIDER* provider); |
| 23 |
| 21 typedef HRESULT (WINAPI* PTGetPrintCapabilitiesProc)(HPTPROVIDER provider, | 24 typedef HRESULT (WINAPI* PTGetPrintCapabilitiesProc)(HPTPROVIDER provider, |
| 22 IStream* print_ticket, | 25 IStream* print_ticket, |
| 23 IStream* capabilities, | 26 IStream* capabilities, |
| 24 BSTR* error_message); | 27 BSTR* error_message); |
| 28 |
| 25 typedef HRESULT (WINAPI* PTConvertDevModeToPrintTicketProc)( | 29 typedef HRESULT (WINAPI* PTConvertDevModeToPrintTicketProc)( |
| 26 HPTPROVIDER provider, | 30 HPTPROVIDER provider, |
| 27 ULONG devmode_size_in_bytes, | 31 ULONG devmode_size_in_bytes, |
| 28 PDEVMODE devmode, | 32 PDEVMODE devmode, |
| 29 EPrintTicketScope scope, | 33 EPrintTicketScope scope, |
| 30 IStream* print_ticket); | 34 IStream* print_ticket); |
| 35 |
| 31 typedef HRESULT (WINAPI* PTConvertPrintTicketToDevModeProc)( | 36 typedef HRESULT (WINAPI* PTConvertPrintTicketToDevModeProc)( |
| 32 HPTPROVIDER provider, | 37 HPTPROVIDER provider, |
| 33 IStream* print_ticket, | 38 IStream* print_ticket, |
| 34 EDefaultDevmodeType base_devmode_type, | 39 EDefaultDevmodeType base_devmode_type, |
| 35 EPrintTicketScope scope, | 40 EPrintTicketScope scope, |
| 36 ULONG* devmode_byte_count, | 41 ULONG* devmode_byte_count, |
| 37 PDEVMODE* devmode, | 42 PDEVMODE* devmode, |
| 38 BSTR* error_message); | 43 BSTR* error_message); |
| 44 |
| 39 typedef HRESULT (WINAPI* PTMergeAndValidatePrintTicketProc)( | 45 typedef HRESULT (WINAPI* PTMergeAndValidatePrintTicketProc)( |
| 40 HPTPROVIDER provider, | 46 HPTPROVIDER provider, |
| 41 IStream* base_ticket, | 47 IStream* base_ticket, |
| 42 IStream* delta_ticket, | 48 IStream* delta_ticket, |
| 43 EPrintTicketScope scope, | 49 EPrintTicketScope scope, |
| 44 IStream* result_ticket, | 50 IStream* result_ticket, |
| 45 BSTR* error_message); | 51 BSTR* error_message); |
| 52 |
| 46 typedef HRESULT (WINAPI* PTReleaseMemoryProc)(PVOID buffer); | 53 typedef HRESULT (WINAPI* PTReleaseMemoryProc)(PVOID buffer); |
| 54 |
| 47 typedef HRESULT (WINAPI* PTCloseProviderProc)(HPTPROVIDER provider); | 55 typedef HRESULT (WINAPI* PTCloseProviderProc)(HPTPROVIDER provider); |
| 56 |
| 48 typedef HRESULT (WINAPI* StartXpsPrintJobProc)( | 57 typedef HRESULT (WINAPI* StartXpsPrintJobProc)( |
| 49 const LPCWSTR printer_name, | 58 const LPCWSTR printer_name, |
| 50 const LPCWSTR job_name, | 59 const LPCWSTR job_name, |
| 51 const LPCWSTR output_file_name, | 60 const LPCWSTR output_file_name, |
| 52 HANDLE progress_event, | 61 HANDLE progress_event, |
| 53 HANDLE completion_event, | 62 HANDLE completion_event, |
| 54 UINT8* printable_pages_on, | 63 UINT8* printable_pages_on, |
| 55 UINT32 printable_pages_on_count, | 64 UINT32 printable_pages_on_count, |
| 56 IXpsPrintJob** xps_print_job, | 65 IXpsPrintJob** xps_print_job, |
| 57 IXpsPrintJobStream** document_stream, | 66 IXpsPrintJobStream** document_stream, |
| 58 IXpsPrintJobStream** print_ticket_stream); | 67 IXpsPrintJobStream** print_ticket_stream); |
| 59 | 68 |
| 60 PTOpenProviderProc g_open_provider_proc = NULL; | 69 PTOpenProviderProc g_open_provider_proc = NULL; |
| 61 PTGetPrintCapabilitiesProc g_get_print_capabilities_proc = NULL; | 70 PTGetPrintCapabilitiesProc g_get_print_capabilities_proc = NULL; |
| 62 PTConvertDevModeToPrintTicketProc g_convert_devmode_to_print_ticket_proc = NULL; | 71 PTConvertDevModeToPrintTicketProc g_convert_devmode_to_print_ticket_proc = NULL; |
| 63 PTConvertPrintTicketToDevModeProc g_convert_print_ticket_to_devmode_proc = NULL; | 72 PTConvertPrintTicketToDevModeProc g_convert_print_ticket_to_devmode_proc = NULL; |
| 64 PTMergeAndValidatePrintTicketProc g_merge_and_validate_print_ticket_proc = NULL; | 73 PTMergeAndValidatePrintTicketProc g_merge_and_validate_print_ticket_proc = NULL; |
| 65 PTReleaseMemoryProc g_release_memory_proc = NULL; | 74 PTReleaseMemoryProc g_release_memory_proc = NULL; |
| 66 PTCloseProviderProc g_close_provider_proc = NULL; | 75 PTCloseProviderProc g_close_provider_proc = NULL; |
| 67 StartXpsPrintJobProc g_start_xps_print_job_proc = NULL; | 76 StartXpsPrintJobProc g_start_xps_print_job_proc = NULL; |
| 68 | 77 |
| 69 // Returns pointer to structure allocated in |buffer|. So pointer is only valide | 78 } // namespace |
| 70 // until |buffer| is destroyed. | |
| 71 const PRINTER_INFO_2* GetPrinterInfo2(HANDLE printer, | |
| 72 scoped_array<BYTE>* buffer) { | |
| 73 DCHECK(printer); | |
| 74 DCHECK(buffer); | |
| 75 DWORD bytes_needed = 0; | |
| 76 const DWORD kLevel = 2; | |
| 77 ::GetPrinter(printer, kLevel, NULL, 0, &bytes_needed); | |
| 78 if (!bytes_needed) | |
| 79 return NULL; | |
| 80 buffer->reset(new BYTE[bytes_needed]); | |
| 81 if (!buffer->get()) | |
| 82 return NULL; | |
| 83 if (!::GetPrinter(printer, kLevel, buffer->get(), bytes_needed, | |
| 84 &bytes_needed)) { | |
| 85 return NULL; | |
| 86 } | |
| 87 return reinterpret_cast<const PRINTER_INFO_2*>(buffer->get()); | |
| 88 } | |
| 89 | 79 |
| 90 // Returns pointer to structure allocated in |buffer|. So pointer is only valide | |
| 91 // until |buffer| is destroyed. | |
| 92 const DRIVER_INFO_6* GetDriverInfo6(HANDLE printer, | |
| 93 scoped_array<BYTE>* buffer) { | |
| 94 DCHECK(printer); | |
| 95 DCHECK(buffer); | |
| 96 DWORD bytes_needed = 0; | |
| 97 const DWORD kLevel = 6; | |
| 98 ::GetPrinterDriver(printer, NULL, kLevel, NULL, 0, &bytes_needed); | |
| 99 if (!bytes_needed) | |
| 100 return NULL; | |
| 101 buffer->reset(new BYTE[bytes_needed]); | |
| 102 if (!buffer->get()) | |
| 103 return NULL; | |
| 104 if (!::GetPrinterDriver(printer, NULL, kLevel, buffer->get(), bytes_needed, | |
| 105 &bytes_needed)) { | |
| 106 return NULL; | |
| 107 } | |
| 108 return reinterpret_cast<const DRIVER_INFO_6*>(buffer->get()); | |
| 109 } | |
| 110 | |
| 111 } // namespace | |
| 112 | 80 |
| 113 namespace printing { | 81 namespace printing { |
| 114 | 82 |
| 115 bool XPSModule::Init() { | 83 bool XPSModule::Init() { |
| 116 static bool initialized = InitImpl(); | 84 static bool initialized = InitImpl(); |
| 117 return initialized; | 85 return initialized; |
| 118 } | 86 } |
| 119 | 87 |
| 120 bool XPSModule::InitImpl() { | 88 bool XPSModule::InitImpl() { |
| 121 HMODULE prntvpt_module = LoadLibrary(L"prntvpt.dll"); | 89 HMODULE prntvpt_module = LoadLibrary(L"prntvpt.dll"); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 document_stream, | 278 document_stream, |
| 311 print_ticket_stream); | 279 print_ticket_stream); |
| 312 } | 280 } |
| 313 | 281 |
| 314 bool InitBasicPrinterInfo(HANDLE printer, PrinterBasicInfo* printer_info) { | 282 bool InitBasicPrinterInfo(HANDLE printer, PrinterBasicInfo* printer_info) { |
| 315 DCHECK(printer); | 283 DCHECK(printer); |
| 316 DCHECK(printer_info); | 284 DCHECK(printer_info); |
| 317 if (!printer) | 285 if (!printer) |
| 318 return false; | 286 return false; |
| 319 | 287 |
| 320 scoped_array<BYTE> printer_info_buffer; | 288 PrinterInfo2 info_2; |
| 321 const PRINTER_INFO_2* info2 = GetPrinterInfo2(printer, &printer_info_buffer); | 289 if (!info_2.Init(printer)) |
| 290 return false; |
| 322 | 291 |
| 323 if (!info2) | 292 printer_info->printer_name = WideToUTF8(info_2.get()->pPrinterName); |
| 324 return false; | 293 if (info_2.get()->pComment) |
| 325 printer_info->printer_name = WideToUTF8(info2->pPrinterName); | 294 printer_info->printer_description = WideToUTF8(info_2.get()->pComment); |
| 326 if (info2->pComment) | 295 if (info_2.get()->pLocation) |
| 327 printer_info->printer_description = | |
| 328 WideToUTF8(info2->pComment); | |
| 329 if (info2->pLocation) | |
| 330 printer_info->options[kLocationTagName] = | 296 printer_info->options[kLocationTagName] = |
| 331 WideToUTF8(info2->pLocation); | 297 WideToUTF8(info_2.get()->pLocation); |
| 332 if (info2->pDriverName) | 298 if (info_2.get()->pDriverName) |
| 333 printer_info->options[kDriverNameTagName] = | 299 printer_info->options[kDriverNameTagName] = |
| 334 WideToUTF8(info2->pDriverName); | 300 WideToUTF8(info_2.get()->pDriverName); |
| 335 printer_info->printer_status = info2->Status; | 301 printer_info->printer_status = info_2.get()->Status; |
| 336 | 302 |
| 337 std::string driver_info = GetDriverInfo(printer); | 303 std::string driver_info = GetDriverInfo(printer); |
| 338 if (!driver_info.empty()) | 304 if (!driver_info.empty()) |
| 339 printer_info->options[kDriverInfoTagName] = driver_info; | 305 printer_info->options[kDriverInfoTagName] = driver_info; |
| 340 return true; | 306 return true; |
| 341 } | 307 } |
| 342 | 308 |
| 343 std::string GetDriverInfo(HANDLE printer) { | 309 std::string GetDriverInfo(HANDLE printer) { |
| 344 DCHECK(printer); | 310 DCHECK(printer); |
| 345 std::string driver_info; | 311 std::string driver_info; |
| 346 | 312 |
| 347 if (!printer) | 313 if (!printer) |
| 348 return driver_info; | 314 return driver_info; |
| 349 | 315 |
| 350 scoped_array<BYTE> driver_info_buffer; | 316 DriverInfo6 info_6; |
| 351 const DRIVER_INFO_6* driver = GetDriverInfo6(printer, &driver_info_buffer); | 317 if (!info_6.Init(printer)) |
| 352 if (!driver) | |
| 353 return driver_info; | 318 return driver_info; |
| 354 | 319 |
| 355 std::string info[4]; | 320 std::string info[4]; |
| 356 if (driver->pName) | 321 if (info_6.get()->pName) |
| 357 info[0] = WideToUTF8(driver->pName); | 322 info[0] = WideToUTF8(info_6.get()->pName); |
| 358 | 323 |
| 359 if (driver->pDriverPath) { | 324 if (info_6.get()->pDriverPath) { |
| 360 scoped_ptr<FileVersionInfo> version_info( | 325 scoped_ptr<FileVersionInfo> version_info( |
| 361 FileVersionInfo::CreateFileVersionInfo( | 326 FileVersionInfo::CreateFileVersionInfo( |
| 362 FilePath(driver->pDriverPath))); | 327 FilePath(info_6.get()->pDriverPath))); |
| 363 if (version_info.get()) { | 328 if (version_info.get()) { |
| 364 info[1] = WideToUTF8(version_info->file_version()); | 329 info[1] = WideToUTF8(version_info->file_version()); |
| 365 info[2] = WideToUTF8(version_info->product_name()); | 330 info[2] = WideToUTF8(version_info->product_name()); |
| 366 info[3] = WideToUTF8(version_info->product_version()); | 331 info[3] = WideToUTF8(version_info->product_version()); |
| 367 } | 332 } |
| 368 } | 333 } |
| 369 | 334 |
| 370 for (size_t i = 0; i < arraysize(info); ++i) { | 335 for (size_t i = 0; i < arraysize(info); ++i) { |
| 371 std::replace(info[i].begin(), info[i].end(), ';', ','); | 336 std::replace(info[i].begin(), info[i].end(), ';', ','); |
| 372 driver_info.append(info[i]); | 337 driver_info.append(info[i]); |
| 373 if (i < arraysize(info) - 1) | 338 if (i < arraysize(info) - 1) |
| 374 driver_info.append(";"); | 339 driver_info.append(";"); |
| 375 } | 340 } |
| 376 return driver_info; | 341 return driver_info; |
| 377 } | 342 } |
| 378 | 343 |
| 379 } // namespace printing | 344 } // namespace printing |
| OLD | NEW |