• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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