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/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
13 #include "printing/backend/print_backend.h" | 14 #include "printing/backend/print_backend.h" |
14 #include "printing/backend/print_backend_consts.h" | 15 #include "printing/backend/print_backend_consts.h" |
15 | 16 |
16 namespace { | 17 namespace { |
17 typedef HRESULT (WINAPI *PTOpenProviderProc)(PCWSTR printer_name, | 18 typedef HRESULT (WINAPI* PTOpenProviderProc)(PCWSTR printer_name, |
18 DWORD version, | 19 DWORD version, |
19 HPTPROVIDER *provider); | 20 HPTPROVIDER* provider); |
20 typedef HRESULT (WINAPI *PTGetPrintCapabilitiesProc)(HPTPROVIDER provider, | 21 typedef HRESULT (WINAPI* PTGetPrintCapabilitiesProc)(HPTPROVIDER provider, |
21 IStream *print_ticket, | 22 IStream* print_ticket, |
22 IStream *capabilities, | 23 IStream* capabilities, |
23 BSTR* error_message); | 24 BSTR* error_message); |
24 typedef HRESULT (WINAPI *PTConvertDevModeToPrintTicketProc)( | 25 typedef HRESULT (WINAPI* PTConvertDevModeToPrintTicketProc)( |
25 HPTPROVIDER provider, | 26 HPTPROVIDER provider, |
26 ULONG devmode_size_in_bytes, | 27 ULONG devmode_size_in_bytes, |
27 PDEVMODE devmode, | 28 PDEVMODE devmode, |
28 EPrintTicketScope scope, | 29 EPrintTicketScope scope, |
29 IStream* print_ticket); | 30 IStream* print_ticket); |
30 typedef HRESULT (WINAPI *PTConvertPrintTicketToDevModeProc)( | 31 typedef HRESULT (WINAPI* PTConvertPrintTicketToDevModeProc)( |
31 HPTPROVIDER provider, | 32 HPTPROVIDER provider, |
32 IStream* print_ticket, | 33 IStream* print_ticket, |
33 EDefaultDevmodeType base_devmode_type, | 34 EDefaultDevmodeType base_devmode_type, |
34 EPrintTicketScope scope, | 35 EPrintTicketScope scope, |
35 ULONG* devmode_byte_count, | 36 ULONG* devmode_byte_count, |
36 PDEVMODE *devmode, | 37 PDEVMODE* devmode, |
37 BSTR* error_message); | 38 BSTR* error_message); |
38 typedef HRESULT (WINAPI *PTMergeAndValidatePrintTicketProc)( | 39 typedef HRESULT (WINAPI* PTMergeAndValidatePrintTicketProc)( |
39 HPTPROVIDER provider, | 40 HPTPROVIDER provider, |
40 IStream* base_ticket, | 41 IStream* base_ticket, |
41 IStream* delta_ticket, | 42 IStream* delta_ticket, |
42 EPrintTicketScope scope, | 43 EPrintTicketScope scope, |
43 IStream* result_ticket, | 44 IStream* result_ticket, |
44 BSTR* error_message); | 45 BSTR* error_message); |
45 typedef HRESULT (WINAPI *PTReleaseMemoryProc)(PVOID buffer); | 46 typedef HRESULT (WINAPI* PTReleaseMemoryProc)(PVOID buffer); |
46 typedef HRESULT (WINAPI *PTCloseProviderProc)(HPTPROVIDER provider); | 47 typedef HRESULT (WINAPI* PTCloseProviderProc)(HPTPROVIDER provider); |
47 typedef HRESULT (WINAPI *StartXpsPrintJobProc)( | 48 typedef HRESULT (WINAPI* StartXpsPrintJobProc)( |
48 const LPCWSTR printer_name, | 49 const LPCWSTR printer_name, |
49 const LPCWSTR job_name, | 50 const LPCWSTR job_name, |
50 const LPCWSTR output_file_name, | 51 const LPCWSTR output_file_name, |
51 HANDLE progress_event, | 52 HANDLE progress_event, |
52 HANDLE completion_event, | 53 HANDLE completion_event, |
53 UINT8 *printable_pages_on, | 54 UINT8* printable_pages_on, |
54 UINT32 printable_pages_on_count, | 55 UINT32 printable_pages_on_count, |
55 IXpsPrintJob **xps_print_job, | 56 IXpsPrintJob** xps_print_job, |
56 IXpsPrintJobStream **document_stream, | 57 IXpsPrintJobStream** document_stream, |
57 IXpsPrintJobStream **print_ticket_stream); | 58 IXpsPrintJobStream** print_ticket_stream); |
58 | 59 |
59 PTOpenProviderProc g_open_provider_proc = NULL; | 60 PTOpenProviderProc g_open_provider_proc = NULL; |
60 PTGetPrintCapabilitiesProc g_get_print_capabilities_proc = NULL; | 61 PTGetPrintCapabilitiesProc g_get_print_capabilities_proc = NULL; |
61 PTConvertDevModeToPrintTicketProc g_convert_devmode_to_print_ticket_proc = NULL; | 62 PTConvertDevModeToPrintTicketProc g_convert_devmode_to_print_ticket_proc = NULL; |
62 PTConvertPrintTicketToDevModeProc g_convert_print_ticket_to_devmode_proc = NULL; | 63 PTConvertPrintTicketToDevModeProc g_convert_print_ticket_to_devmode_proc = NULL; |
63 PTMergeAndValidatePrintTicketProc g_merge_and_validate_print_ticket_proc = NULL; | 64 PTMergeAndValidatePrintTicketProc g_merge_and_validate_print_ticket_proc = NULL; |
64 PTReleaseMemoryProc g_release_memory_proc = NULL; | 65 PTReleaseMemoryProc g_release_memory_proc = NULL; |
65 PTCloseProviderProc g_close_provider_proc = NULL; | 66 PTCloseProviderProc g_close_provider_proc = NULL; |
66 StartXpsPrintJobProc g_start_xps_print_job_proc = NULL; | 67 StartXpsPrintJobProc g_start_xps_print_job_proc = NULL; |
67 | 68 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 buffer->reset(new BYTE[bytes_needed]); | 101 buffer->reset(new BYTE[bytes_needed]); |
101 if (!buffer->get()) | 102 if (!buffer->get()) |
102 return NULL; | 103 return NULL; |
103 if (!::GetPrinterDriver(printer, NULL, kLevel, buffer->get(), bytes_needed, | 104 if (!::GetPrinterDriver(printer, NULL, kLevel, buffer->get(), bytes_needed, |
104 &bytes_needed)) { | 105 &bytes_needed)) { |
105 return NULL; | 106 return NULL; |
106 } | 107 } |
107 return reinterpret_cast<const DRIVER_INFO_6*>(buffer->get()); | 108 return reinterpret_cast<const DRIVER_INFO_6*>(buffer->get()); |
108 } | 109 } |
109 | 110 |
110 } | 111 } // namespace |
111 | 112 |
112 namespace printing { | 113 namespace printing { |
113 | 114 |
114 bool XPSModule::Init() { | 115 bool XPSModule::Init() { |
115 static bool initialized = InitImpl(); | 116 static bool initialized = InitImpl(); |
116 return initialized; | 117 return initialized; |
117 } | 118 } |
118 | 119 |
119 bool XPSModule::InitImpl() { | 120 bool XPSModule::InitImpl() { |
120 HMODULE prntvpt_module = LoadLibrary(L"prntvpt.dll"); | 121 HMODULE prntvpt_module = LoadLibrary(L"prntvpt.dll"); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 GetProcAddress(prntvpt_module, "PTCloseProvider")); | 166 GetProcAddress(prntvpt_module, "PTCloseProvider")); |
166 if (!g_close_provider_proc) { | 167 if (!g_close_provider_proc) { |
167 NOTREACHED(); | 168 NOTREACHED(); |
168 return false; | 169 return false; |
169 } | 170 } |
170 return true; | 171 return true; |
171 } | 172 } |
172 | 173 |
173 HRESULT XPSModule::OpenProvider(const string16& printer_name, | 174 HRESULT XPSModule::OpenProvider(const string16& printer_name, |
174 DWORD version, | 175 DWORD version, |
175 HPTPROVIDER *provider) { | 176 HPTPROVIDER* provider) { |
176 return g_open_provider_proc(printer_name.c_str(), version, provider); | 177 return g_open_provider_proc(printer_name.c_str(), version, provider); |
177 } | 178 } |
178 | 179 |
179 HRESULT XPSModule::GetPrintCapabilities(HPTPROVIDER provider, | 180 HRESULT XPSModule::GetPrintCapabilities(HPTPROVIDER provider, |
180 IStream *print_ticket, | 181 IStream* print_ticket, |
181 IStream *capabilities, | 182 IStream* capabilities, |
182 BSTR* error_message) { | 183 BSTR* error_message) { |
183 return g_get_print_capabilities_proc(provider, | 184 return g_get_print_capabilities_proc(provider, |
184 print_ticket, | 185 print_ticket, |
185 capabilities, | 186 capabilities, |
186 error_message); | 187 error_message); |
187 } | 188 } |
188 | 189 |
189 HRESULT XPSModule::ConvertDevModeToPrintTicket(HPTPROVIDER provider, | 190 HRESULT XPSModule::ConvertDevModeToPrintTicket(HPTPROVIDER provider, |
190 ULONG devmode_size_in_bytes, | 191 ULONG devmode_size_in_bytes, |
191 PDEVMODE devmode, | 192 PDEVMODE devmode, |
192 EPrintTicketScope scope, | 193 EPrintTicketScope scope, |
193 IStream* print_ticket) { | 194 IStream* print_ticket) { |
194 return g_convert_devmode_to_print_ticket_proc(provider, | 195 return g_convert_devmode_to_print_ticket_proc(provider, |
195 devmode_size_in_bytes, | 196 devmode_size_in_bytes, |
196 devmode, | 197 devmode, |
197 scope, | 198 scope, |
198 print_ticket); | 199 print_ticket); |
199 } | 200 } |
200 | 201 |
201 HRESULT XPSModule::ConvertPrintTicketToDevMode( | 202 HRESULT XPSModule::ConvertPrintTicketToDevMode( |
202 HPTPROVIDER provider, | 203 HPTPROVIDER provider, |
203 IStream* print_ticket, | 204 IStream* print_ticket, |
204 EDefaultDevmodeType base_devmode_type, | 205 EDefaultDevmodeType base_devmode_type, |
205 EPrintTicketScope scope, | 206 EPrintTicketScope scope, |
206 ULONG* devmode_byte_count, | 207 ULONG* devmode_byte_count, |
207 PDEVMODE *devmode, | 208 PDEVMODE* devmode, |
208 BSTR* error_message) { | 209 BSTR* error_message) { |
209 return g_convert_print_ticket_to_devmode_proc(provider, | 210 return g_convert_print_ticket_to_devmode_proc(provider, |
210 print_ticket, | 211 print_ticket, |
211 base_devmode_type, | 212 base_devmode_type, |
212 scope, | 213 scope, |
213 devmode_byte_count, | 214 devmode_byte_count, |
214 devmode, | 215 devmode, |
215 error_message); | 216 error_message); |
216 } | 217 } |
217 | 218 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 } | 287 } |
287 return true; | 288 return true; |
288 } | 289 } |
289 | 290 |
290 HRESULT XPSPrintModule::StartXpsPrintJob( | 291 HRESULT XPSPrintModule::StartXpsPrintJob( |
291 const LPCWSTR printer_name, | 292 const LPCWSTR printer_name, |
292 const LPCWSTR job_name, | 293 const LPCWSTR job_name, |
293 const LPCWSTR output_file_name, | 294 const LPCWSTR output_file_name, |
294 HANDLE progress_event, | 295 HANDLE progress_event, |
295 HANDLE completion_event, | 296 HANDLE completion_event, |
296 UINT8 *printable_pages_on, | 297 UINT8* printable_pages_on, |
297 UINT32 printable_pages_on_count, | 298 UINT32 printable_pages_on_count, |
298 IXpsPrintJob **xps_print_job, | 299 IXpsPrintJob** xps_print_job, |
299 IXpsPrintJobStream **document_stream, | 300 IXpsPrintJobStream** document_stream, |
300 IXpsPrintJobStream **print_ticket_stream) { | 301 IXpsPrintJobStream** print_ticket_stream) { |
301 return g_start_xps_print_job_proc(printer_name, | 302 return g_start_xps_print_job_proc(printer_name, |
302 job_name, | 303 job_name, |
303 output_file_name, | 304 output_file_name, |
304 progress_event, | 305 progress_event, |
305 completion_event, | 306 completion_event, |
306 printable_pages_on, | 307 printable_pages_on, |
307 printable_pages_on_count, | 308 printable_pages_on_count, |
308 xps_print_job, | 309 xps_print_job, |
309 document_stream, | 310 document_stream, |
310 print_ticket_stream); | 311 print_ticket_stream); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 for (size_t i = 0; i < arraysize(info); ++i) { | 370 for (size_t i = 0; i < arraysize(info); ++i) { |
370 std::replace(info[i].begin(), info[i].end(), ';', ','); | 371 std::replace(info[i].begin(), info[i].end(), ';', ','); |
371 driver_info.append(info[i]); | 372 driver_info.append(info[i]); |
372 if (i < arraysize(info) - 1) | 373 if (i < arraysize(info) - 1) |
373 driver_info.append(";"); | 374 driver_info.append(";"); |
374 } | 375 } |
375 return driver_info; | 376 return driver_info; |
376 } | 377 } |
377 | 378 |
378 } // namespace printing | 379 } // namespace printing |
OLD | NEW |