Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Side by Side Diff: printing/backend/win_helper.cc

Issue 11530005: Wrapers for PRINTER_INFO_* and DRIVER_INFO_*. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698