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 <winspool.h> | 8 #include <winspool.h> |
9 | 9 |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 | 226 |
227 PrinterInfo5 info_5; | 227 PrinterInfo5 info_5; |
228 if (!info_5.Init(printer_handle)) | 228 if (!info_5.Init(printer_handle)) |
229 return false; | 229 return false; |
230 const wchar_t* name = info_5.get()->pPrinterName; | 230 const wchar_t* name = info_5.get()->pPrinterName; |
231 const wchar_t* port = info_5.get()->pPortName; | 231 const wchar_t* port = info_5.get()->pPortName; |
232 DCHECK_EQ(name, base::UTF8ToUTF16(printer_name)); | 232 DCHECK_EQ(name, base::UTF8ToUTF16(printer_name)); |
233 | 233 |
234 PrinterSemanticCapsAndDefaults caps; | 234 PrinterSemanticCapsAndDefaults caps; |
235 | 235 |
236 scoped_ptr<DEVMODE[]> user_settings = CreateDevMode(printer_handle, NULL); | 236 scoped_ptr<DEVMODE, base::FreeDeleter> user_settings = |
| 237 CreateDevMode(printer_handle, NULL); |
237 if (user_settings) { | 238 if (user_settings) { |
238 if (user_settings.get()->dmFields & DM_COLOR) | 239 if (user_settings->dmFields & DM_COLOR) |
239 caps.color_default = (user_settings.get()->dmColor == DMCOLOR_COLOR); | 240 caps.color_default = (user_settings->dmColor == DMCOLOR_COLOR); |
240 | 241 |
241 if (user_settings.get()->dmFields & DM_DUPLEX) { | 242 if (user_settings->dmFields & DM_DUPLEX) { |
242 switch (user_settings.get()->dmDuplex) { | 243 switch (user_settings->dmDuplex) { |
243 case DMDUP_SIMPLEX: | 244 case DMDUP_SIMPLEX: |
244 caps.duplex_default = SIMPLEX; | 245 caps.duplex_default = SIMPLEX; |
245 break; | 246 break; |
246 case DMDUP_VERTICAL: | 247 case DMDUP_VERTICAL: |
247 caps.duplex_default = LONG_EDGE; | 248 caps.duplex_default = LONG_EDGE; |
248 break; | 249 break; |
249 case DMDUP_HORIZONTAL: | 250 case DMDUP_HORIZONTAL: |
250 caps.duplex_default = SHORT_EDGE; | 251 caps.duplex_default = SHORT_EDGE; |
251 break; | 252 break; |
252 default: | 253 default: |
253 NOTREACHED(); | 254 NOTREACHED(); |
254 } | 255 } |
255 } | 256 } |
256 | 257 |
257 if (user_settings.get()->dmFields & DM_COLLATE) | 258 if (user_settings->dmFields & DM_COLLATE) |
258 caps.collate_default = (user_settings.get()->dmCollate == DMCOLLATE_TRUE); | 259 caps.collate_default = (user_settings->dmCollate == DMCOLLATE_TRUE); |
259 } else { | 260 } else { |
260 LOG(WARNING) << "Fallback to color/simplex mode."; | 261 LOG(WARNING) << "Fallback to color/simplex mode."; |
261 caps.color_default = caps.color_changeable; | 262 caps.color_default = caps.color_changeable; |
262 caps.duplex_default = SIMPLEX; | 263 caps.duplex_default = SIMPLEX; |
263 } | 264 } |
264 | 265 |
265 // Get printer capabilities. For more info see here: | 266 // Get printer capabilities. For more info see here: |
266 // http://msdn.microsoft.com/en-us/library/windows/desktop/dd183552(v=vs.85).a
spx | 267 // http://msdn.microsoft.com/en-us/library/windows/desktop/dd183552(v=vs.85).a
spx |
267 caps.color_changeable = | 268 caps.color_changeable = |
268 (DeviceCapabilities(name, port, DC_COLORDEVICE, NULL, NULL) == 1); | 269 (DeviceCapabilities(name, port, DC_COLORDEVICE, NULL, NULL) == 1); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 if (FAILED(hr)) { | 314 if (FAILED(hr)) { |
314 return false; | 315 return false; |
315 } | 316 } |
316 hr = StreamOnHGlobalToString(print_capabilities_stream.get(), | 317 hr = StreamOnHGlobalToString(print_capabilities_stream.get(), |
317 &printer_info->printer_capabilities); | 318 &printer_info->printer_capabilities); |
318 DCHECK(SUCCEEDED(hr)); | 319 DCHECK(SUCCEEDED(hr)); |
319 printer_info->caps_mime_type = "text/xml"; | 320 printer_info->caps_mime_type = "text/xml"; |
320 } | 321 } |
321 ScopedPrinterHandle printer_handle; | 322 ScopedPrinterHandle printer_handle; |
322 if (printer_handle.OpenPrinter(printer_name_wide.c_str())) { | 323 if (printer_handle.OpenPrinter(printer_name_wide.c_str())) { |
323 scoped_ptr<DEVMODE[]> devmode_out(CreateDevMode(printer_handle, NULL)); | 324 scoped_ptr<DEVMODE, base::FreeDeleter> devmode_out( |
| 325 CreateDevMode(printer_handle, NULL)); |
324 if (!devmode_out) | 326 if (!devmode_out) |
325 return false; | 327 return false; |
326 base::win::ScopedComPtr<IStream> printer_defaults_stream; | 328 base::win::ScopedComPtr<IStream> printer_defaults_stream; |
327 hr = CreateStreamOnHGlobal(NULL, TRUE, | 329 hr = CreateStreamOnHGlobal(NULL, TRUE, |
328 printer_defaults_stream.Receive()); | 330 printer_defaults_stream.Receive()); |
329 DCHECK(SUCCEEDED(hr)); | 331 DCHECK(SUCCEEDED(hr)); |
330 if (printer_defaults_stream) { | 332 if (printer_defaults_stream) { |
331 DWORD dm_size = devmode_out.get()->dmSize + | 333 DWORD dm_size = devmode_out->dmSize + devmode_out->dmDriverExtra; |
332 devmode_out.get()->dmDriverExtra; | |
333 hr = XPSModule::ConvertDevModeToPrintTicket(provider, dm_size, | 334 hr = XPSModule::ConvertDevModeToPrintTicket(provider, dm_size, |
334 devmode_out.get(), kPTJobScope, printer_defaults_stream); | 335 devmode_out.get(), kPTJobScope, printer_defaults_stream); |
335 DCHECK(SUCCEEDED(hr)); | 336 DCHECK(SUCCEEDED(hr)); |
336 if (SUCCEEDED(hr)) { | 337 if (SUCCEEDED(hr)) { |
337 hr = StreamOnHGlobalToString(printer_defaults_stream.get(), | 338 hr = StreamOnHGlobalToString(printer_defaults_stream.get(), |
338 &printer_info->printer_defaults); | 339 &printer_info->printer_defaults); |
339 DCHECK(SUCCEEDED(hr)); | 340 DCHECK(SUCCEEDED(hr)); |
340 printer_info->defaults_mime_type = "text/xml"; | 341 printer_info->defaults_mime_type = "text/xml"; |
341 } | 342 } |
342 } | 343 } |
(...skipping 17 matching lines...) Expand all Loading... |
360 ScopedPrinterHandle printer_handle; | 361 ScopedPrinterHandle printer_handle; |
361 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()); | 362 return printer_handle.OpenPrinter(base::UTF8ToWide(printer_name).c_str()); |
362 } | 363 } |
363 | 364 |
364 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( | 365 scoped_refptr<PrintBackend> PrintBackend::CreateInstance( |
365 const base::DictionaryValue* print_backend_settings) { | 366 const base::DictionaryValue* print_backend_settings) { |
366 return new PrintBackendWin; | 367 return new PrintBackendWin; |
367 } | 368 } |
368 | 369 |
369 } // namespace printing | 370 } // namespace printing |
OLD | NEW |