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 |