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/print_backend.h" | 5 #include "printing/backend/print_backend.h" |
6 | 6 |
7 #include <objidl.h> | 7 #include <objidl.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <winspool.h> | 9 #include <winspool.h> |
10 | 10 |
| 11 #include <memory> |
| 12 |
11 #include "base/memory/free_deleter.h" | 13 #include "base/memory/free_deleter.h" |
12 #include "base/memory/scoped_ptr.h" | |
13 #include "base/numerics/safe_conversions.h" | 14 #include "base/numerics/safe_conversions.h" |
14 #include "base/strings/string_number_conversions.h" | 15 #include "base/strings/string_number_conversions.h" |
15 #include "base/strings/string_piece.h" | 16 #include "base/strings/string_piece.h" |
16 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
17 #include "base/win/scoped_bstr.h" | 18 #include "base/win/scoped_bstr.h" |
18 #include "base/win/scoped_comptr.h" | 19 #include "base/win/scoped_comptr.h" |
19 #include "base/win/scoped_hglobal.h" | 20 #include "base/win/scoped_hglobal.h" |
20 #include "printing/backend/print_backend_consts.h" | 21 #include "printing/backend/print_backend_consts.h" |
21 #include "printing/backend/printing_info_win.h" | 22 #include "printing/backend/printing_info_win.h" |
22 #include "printing/backend/win_helper.h" | 23 #include "printing/backend/win_helper.h" |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 | 178 |
178 bool PrintBackendWin::EnumeratePrinters(PrinterList* printer_list) { | 179 bool PrintBackendWin::EnumeratePrinters(PrinterList* printer_list) { |
179 DCHECK(printer_list); | 180 DCHECK(printer_list); |
180 DWORD bytes_needed = 0; | 181 DWORD bytes_needed = 0; |
181 DWORD count_returned = 0; | 182 DWORD count_returned = 0; |
182 const DWORD kLevel = 4; | 183 const DWORD kLevel = 4; |
183 BOOL ret = EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, | 184 BOOL ret = EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, |
184 kLevel, NULL, 0, &bytes_needed, &count_returned); | 185 kLevel, NULL, 0, &bytes_needed, &count_returned); |
185 if (!bytes_needed) | 186 if (!bytes_needed) |
186 return false; | 187 return false; |
187 scoped_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); | 188 std::unique_ptr<BYTE[]> printer_info_buffer(new BYTE[bytes_needed]); |
188 ret = EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, kLevel, | 189 ret = EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, kLevel, |
189 printer_info_buffer.get(), bytes_needed, &bytes_needed, | 190 printer_info_buffer.get(), bytes_needed, &bytes_needed, |
190 &count_returned); | 191 &count_returned); |
191 DCHECK(ret); | 192 DCHECK(ret); |
192 if (!ret) | 193 if (!ret) |
193 return false; | 194 return false; |
194 | 195 |
195 std::string default_printer = GetDefaultPrinterName(); | 196 std::string default_printer = GetDefaultPrinterName(); |
196 PRINTER_INFO_4* printer_info = | 197 PRINTER_INFO_4* printer_info = |
197 reinterpret_cast<PRINTER_INFO_4*>(printer_info_buffer.get()); | 198 reinterpret_cast<PRINTER_INFO_4*>(printer_info_buffer.get()); |
(...skipping 28 matching lines...) Expand all Loading... |
226 | 227 |
227 PrinterInfo5 info_5; | 228 PrinterInfo5 info_5; |
228 if (!info_5.Init(printer_handle.Get())) | 229 if (!info_5.Init(printer_handle.Get())) |
229 return false; | 230 return false; |
230 const wchar_t* name = info_5.get()->pPrinterName; | 231 const wchar_t* name = info_5.get()->pPrinterName; |
231 const wchar_t* port = info_5.get()->pPortName; | 232 const wchar_t* port = info_5.get()->pPortName; |
232 DCHECK_EQ(name, base::UTF8ToUTF16(printer_name)); | 233 DCHECK_EQ(name, base::UTF8ToUTF16(printer_name)); |
233 | 234 |
234 PrinterSemanticCapsAndDefaults caps; | 235 PrinterSemanticCapsAndDefaults caps; |
235 | 236 |
236 scoped_ptr<DEVMODE, base::FreeDeleter> user_settings = | 237 std::unique_ptr<DEVMODE, base::FreeDeleter> user_settings = |
237 CreateDevMode(printer_handle.Get(), NULL); | 238 CreateDevMode(printer_handle.Get(), NULL); |
238 if (user_settings) { | 239 if (user_settings) { |
239 if (user_settings->dmFields & DM_COLOR) | 240 if (user_settings->dmFields & DM_COLOR) |
240 caps.color_default = (user_settings->dmColor == DMCOLOR_COLOR); | 241 caps.color_default = (user_settings->dmColor == DMCOLOR_COLOR); |
241 | 242 |
242 if (user_settings->dmFields & DM_DUPLEX) { | 243 if (user_settings->dmFields & DM_DUPLEX) { |
243 switch (user_settings->dmDuplex) { | 244 switch (user_settings->dmDuplex) { |
244 case DMDUP_SIMPLEX: | 245 case DMDUP_SIMPLEX: |
245 caps.duplex_default = SIMPLEX; | 246 caps.duplex_default = SIMPLEX; |
246 break; | 247 break; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 if (FAILED(hr)) { | 315 if (FAILED(hr)) { |
315 return false; | 316 return false; |
316 } | 317 } |
317 hr = StreamOnHGlobalToString(print_capabilities_stream.get(), | 318 hr = StreamOnHGlobalToString(print_capabilities_stream.get(), |
318 &printer_info->printer_capabilities); | 319 &printer_info->printer_capabilities); |
319 DCHECK(SUCCEEDED(hr)); | 320 DCHECK(SUCCEEDED(hr)); |
320 printer_info->caps_mime_type = "text/xml"; | 321 printer_info->caps_mime_type = "text/xml"; |
321 } | 322 } |
322 ScopedPrinterHandle printer_handle; | 323 ScopedPrinterHandle printer_handle; |
323 if (printer_handle.OpenPrinter(printer_name_wide.c_str())) { | 324 if (printer_handle.OpenPrinter(printer_name_wide.c_str())) { |
324 scoped_ptr<DEVMODE, base::FreeDeleter> devmode_out( | 325 std::unique_ptr<DEVMODE, base::FreeDeleter> devmode_out( |
325 CreateDevMode(printer_handle.Get(), NULL)); | 326 CreateDevMode(printer_handle.Get(), NULL)); |
326 if (!devmode_out) | 327 if (!devmode_out) |
327 return false; | 328 return false; |
328 base::win::ScopedComPtr<IStream> printer_defaults_stream; | 329 base::win::ScopedComPtr<IStream> printer_defaults_stream; |
329 hr = CreateStreamOnHGlobal(NULL, TRUE, | 330 hr = CreateStreamOnHGlobal(NULL, TRUE, |
330 printer_defaults_stream.Receive()); | 331 printer_defaults_stream.Receive()); |
331 DCHECK(SUCCEEDED(hr)); | 332 DCHECK(SUCCEEDED(hr)); |
332 if (printer_defaults_stream.get()) { | 333 if (printer_defaults_stream.get()) { |
333 DWORD dm_size = devmode_out->dmSize + devmode_out->dmDriverExtra; | 334 DWORD dm_size = devmode_out->dmSize + devmode_out->dmDriverExtra; |
334 hr = XPSModule::ConvertDevModeToPrintTicket( | 335 hr = XPSModule::ConvertDevModeToPrintTicket( |
(...skipping 27 matching lines...) Expand all Loading... |
362 ScopedPrinterHandle printer_handle; | 363 ScopedPrinterHandle printer_handle; |
363 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()); | 364 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()); |
364 } | 365 } |
365 | 366 |
366 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( | 367 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( |
367 const base::DictionaryValue* print_backend_settings) { | 368 const base::DictionaryValue* print_backend_settings) { |
368 return new PrintBackendWin; | 369 return new PrintBackendWin; |
369 } | 370 } |
370 | 371 |
371 } // namespace printing | 372 } // namespace printing |
OLD | NEW |