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 3 // found in the LICENSE file. 4 5 #ifndef PRINTING_BACKEND_WIN_HELPER_H_ 6 #define PRINTING_BACKEND_WIN_HELPER_H_ 7 8 #include <objidl.h> 9 #include <prntvpt.h> 10 #include <winspool.h> 11 #include <xpsprint.h> 12 13 #include <string> 14 15 #include "base/memory/scoped_ptr.h" 16 #include "base/strings/string16.h" 17 #include "base/win/scoped_handle.h" 18 #include "printing/printing_export.h" 19 20 // These are helper functions for dealing with Windows Printing. 21 namespace printing { 22 23 struct PRINTING_EXPORT PrinterBasicInfo; 24 25 class PrinterHandleTraits { 26 public: 27 typedef HANDLE Handle; 28 CloseHandle(HANDLE handle)29 static bool CloseHandle(HANDLE handle) { 30 return ::ClosePrinter(handle) != FALSE; 31 } 32 IsHandleValid(HANDLE handle)33 static bool IsHandleValid(HANDLE handle) { 34 return handle != NULL; 35 } 36 NullHandle()37 static HANDLE NullHandle() { 38 return NULL; 39 } 40 41 private: 42 DISALLOW_IMPLICIT_CONSTRUCTORS(PrinterHandleTraits); 43 }; 44 45 class ScopedPrinterHandle 46 : public base::win::GenericScopedHandle<PrinterHandleTraits, 47 base::win::VerifierTraits> { 48 public: OpenPrinter(const wchar_t * printer)49 bool OpenPrinter(const wchar_t* printer) { 50 HANDLE temp_handle; 51 // ::OpenPrinter may return error but assign some value into handle. 52 if (::OpenPrinter(const_cast<LPTSTR>(printer), &temp_handle, NULL)) { 53 Set(temp_handle); 54 } 55 return IsValid(); 56 } 57 58 private: 59 typedef base::win::GenericScopedHandle<PrinterHandleTraits, 60 base::win::VerifierTraits> Base; 61 }; 62 63 class PrinterChangeHandleTraits { 64 public: 65 typedef HANDLE Handle; 66 CloseHandle(HANDLE handle)67 static bool CloseHandle(HANDLE handle) { 68 ::FindClosePrinterChangeNotification(handle); 69 return true; 70 } 71 IsHandleValid(HANDLE handle)72 static bool IsHandleValid(HANDLE handle) { 73 return handle != NULL; 74 } 75 NullHandle()76 static HANDLE NullHandle() { 77 return NULL; 78 } 79 80 private: 81 DISALLOW_IMPLICIT_CONSTRUCTORS(PrinterChangeHandleTraits); 82 }; 83 84 typedef base::win::GenericScopedHandle<PrinterChangeHandleTraits, 85 base::win::DummyVerifierTraits> 86 ScopedPrinterChangeHandle; 87 88 // Wrapper class to wrap the XPS APIs (PTxxx APIs). This is needed because these 89 // APIs are not available by default on XP. We could delayload prntvpt.dll but 90 // this would mean having to add that to every binary that links with 91 // printing.lib (which is a LOT of binaries). So choosing the GetProcAddress 92 // route instead). 93 class PRINTING_EXPORT XPSModule { 94 public: 95 // All the other methods can ONLY be called after a successful call to Init. 96 // Init can be called many times and by multiple threads. 97 static bool Init(); 98 static HRESULT OpenProvider(const base::string16& printer_name, 99 DWORD version, 100 HPTPROVIDER* provider); 101 static HRESULT GetPrintCapabilities(HPTPROVIDER provider, 102 IStream* print_ticket, 103 IStream* capabilities, 104 BSTR* error_message); 105 static HRESULT ConvertDevModeToPrintTicket(HPTPROVIDER provider, 106 ULONG devmode_size_in_bytes, 107 PDEVMODE devmode, 108 EPrintTicketScope scope, 109 IStream* print_ticket); 110 static HRESULT ConvertPrintTicketToDevMode( 111 HPTPROVIDER provider, 112 IStream* print_ticket, 113 EDefaultDevmodeType base_devmode_type, 114 EPrintTicketScope scope, 115 ULONG* devmode_byte_count, 116 PDEVMODE* devmode, 117 BSTR* error_message); 118 static HRESULT MergeAndValidatePrintTicket(HPTPROVIDER provider, 119 IStream* base_ticket, 120 IStream* delta_ticket, 121 EPrintTicketScope scope, 122 IStream* result_ticket, 123 BSTR* error_message); 124 static HRESULT ReleaseMemory(PVOID buffer); 125 static HRESULT CloseProvider(HPTPROVIDER provider); 126 127 private: XPSModule()128 XPSModule() { } 129 static bool InitImpl(); 130 }; 131 132 // See comments in cc file explaining why we need this. 133 class PRINTING_EXPORT ScopedXPSInitializer { 134 public: 135 ScopedXPSInitializer(); 136 ~ScopedXPSInitializer(); 137 initialized()138 bool initialized() const { return initialized_; } 139 140 private: 141 bool initialized_; 142 }; 143 144 // Wrapper class to wrap the XPS Print APIs (these are different from the PTxxx 145 // which deal with the XML Print Schema). This is needed because these 146 // APIs are only available on Windows 7 and higher. 147 class PRINTING_EXPORT XPSPrintModule { 148 public: 149 // All the other methods can ONLY be called after a successful call to Init. 150 // Init can be called many times and by multiple threads. 151 static bool Init(); 152 static HRESULT StartXpsPrintJob( 153 const LPCWSTR printer_name, 154 const LPCWSTR job_name, 155 const LPCWSTR output_file_name, 156 HANDLE progress_event, 157 HANDLE completion_event, 158 UINT8* printable_pages_on, 159 UINT32 printable_pages_on_count, 160 IXpsPrintJob **xps_print_job, 161 IXpsPrintJobStream **document_stream, 162 IXpsPrintJobStream **print_ticket_stream); 163 private: XPSPrintModule()164 XPSPrintModule() { } 165 static bool InitImpl(); 166 }; 167 168 PRINTING_EXPORT bool InitBasicPrinterInfo(HANDLE printer, 169 PrinterBasicInfo* printer_info); 170 171 PRINTING_EXPORT std::string GetDriverInfo(HANDLE printer); 172 173 PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( 174 const base::string16& printer_name, 175 const std::string& print_ticket); 176 177 // Creates default DEVMODE and sets color option. Some devices need special 178 // workaround for color. 179 PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( 180 HANDLE printer, 181 const base::string16& printer_name, 182 bool color); 183 184 // Creates new DEVMODE. If |in| is not NULL copy settings from there. 185 PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevMode( 186 HANDLE printer, 187 DEVMODE* in); 188 189 } // namespace printing 190 191 #endif // PRINTING_BACKEND_WIN_HELPER_H_ 192