| 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/win_helper.h" | 5 #include "printing/backend/win_helper.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/file_version_info.h" | 9 #include "base/file_version_info.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 } | 425 } |
| 426 printing::XPSModule::CloseProvider(provider); | 426 printing::XPSModule::CloseProvider(provider); |
| 427 } | 427 } |
| 428 return dev_mode.Pass(); | 428 return dev_mode.Pass(); |
| 429 } | 429 } |
| 430 | 430 |
| 431 scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( | 431 scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( |
| 432 HANDLE printer, | 432 HANDLE printer, |
| 433 const base::string16& printer_name, | 433 const base::string16& printer_name, |
| 434 bool color) { | 434 bool color) { |
| 435 scoped_ptr<DEVMODE, base::FreeDeleter> default = CreateDevMode(printer, NULL); | 435 scoped_ptr<DEVMODE, base::FreeDeleter> default_ticket = |
| 436 if (!default) | 436 CreateDevMode(printer, NULL); |
| 437 return default.Pass(); | 437 if (!default_ticket) |
| 438 return default_ticket.Pass(); |
| 438 | 439 |
| 439 if ((default->dmFields & DM_COLOR) && | 440 if ((default_ticket->dmFields & DM_COLOR) && |
| 440 ((default->dmColor == DMCOLOR_COLOR) == color)) { | 441 ((default_ticket->dmColor == DMCOLOR_COLOR) == color)) { |
| 441 return default.Pass(); | 442 return default_ticket.Pass(); |
| 442 } | 443 } |
| 443 | 444 |
| 444 default->dmFields |= DM_COLOR; | 445 default_ticket->dmFields |= DM_COLOR; |
| 445 default->dmColor = color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME; | 446 default_ticket->dmColor = color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME; |
| 446 | 447 |
| 447 DriverInfo6 info_6; | 448 DriverInfo6 info_6; |
| 448 if (!info_6.Init(printer)) | 449 if (!info_6.Init(printer)) |
| 449 return default.Pass(); | 450 return default_ticket.Pass(); |
| 450 | 451 |
| 451 const DRIVER_INFO_6* p = info_6.get(); | 452 const DRIVER_INFO_6* p = info_6.get(); |
| 452 | 453 |
| 453 // Only HP known to have issues. | 454 // Only HP known to have issues. |
| 454 if (!p->pszMfgName || wcscmp(p->pszMfgName, L"HP") != 0) | 455 if (!p->pszMfgName || wcscmp(p->pszMfgName, L"HP") != 0) |
| 455 return default.Pass(); | 456 return default_ticket.Pass(); |
| 456 | 457 |
| 457 // Need XPS for this workaround. | 458 // Need XPS for this workaround. |
| 458 printing::ScopedXPSInitializer xps_initializer; | 459 printing::ScopedXPSInitializer xps_initializer; |
| 459 if (!xps_initializer.initialized()) | 460 if (!xps_initializer.initialized()) |
| 460 return default.Pass(); | 461 return default_ticket.Pass(); |
| 461 | 462 |
| 462 const char* xps_color = color ? kXpsTicketColor : kXpsTicketMonochrome; | 463 const char* xps_color = color ? kXpsTicketColor : kXpsTicketMonochrome; |
| 463 std::string xps_ticket = base::StringPrintf(kXpsTicketTemplate, xps_color); | 464 std::string xps_ticket = base::StringPrintf(kXpsTicketTemplate, xps_color); |
| 464 scoped_ptr<DEVMODE, base::FreeDeleter> ticket = | 465 scoped_ptr<DEVMODE, base::FreeDeleter> ticket = |
| 465 printing::XpsTicketToDevMode(printer_name, xps_ticket); | 466 printing::XpsTicketToDevMode(printer_name, xps_ticket); |
| 466 if (!ticket) | 467 if (!ticket) |
| 467 return default.Pass(); | 468 return default_ticket.Pass(); |
| 468 | 469 |
| 469 return ticket.Pass(); | 470 return ticket.Pass(); |
| 470 } | 471 } |
| 471 | 472 |
| 472 scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer, | 473 scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer, |
| 473 DEVMODE* in) { | 474 DEVMODE* in) { |
| 474 LONG buffer_size = DocumentProperties(NULL, printer, L"", NULL, NULL, 0); | 475 LONG buffer_size = DocumentProperties(NULL, printer, L"", NULL, NULL, 0); |
| 475 if (buffer_size < static_cast<int>(sizeof(DEVMODE))) | 476 if (buffer_size < static_cast<int>(sizeof(DEVMODE))) |
| 476 return scoped_ptr<DEVMODE, base::FreeDeleter>(); | 477 return scoped_ptr<DEVMODE, base::FreeDeleter>(); |
| 477 scoped_ptr<DEVMODE, base::FreeDeleter> out( | 478 scoped_ptr<DEVMODE, base::FreeDeleter> out( |
| 478 reinterpret_cast<DEVMODE*>(malloc(buffer_size))); | 479 reinterpret_cast<DEVMODE*>(malloc(buffer_size))); |
| 479 DWORD flags = (in ? (DM_IN_BUFFER) : 0) | DM_OUT_BUFFER; | 480 DWORD flags = (in ? (DM_IN_BUFFER) : 0) | DM_OUT_BUFFER; |
| 480 if (DocumentProperties(NULL, printer, L"", out.get(), in, flags) != IDOK) | 481 if (DocumentProperties(NULL, printer, L"", out.get(), in, flags) != IDOK) |
| 481 return scoped_ptr<DEVMODE, base::FreeDeleter>(); | 482 return scoped_ptr<DEVMODE, base::FreeDeleter>(); |
| 482 CHECK_GE(buffer_size, out.get()->dmSize + out.get()->dmDriverExtra); | 483 CHECK_GE(buffer_size, out.get()->dmSize + out.get()->dmDriverExtra); |
| 483 return out.Pass(); | 484 return out.Pass(); |
| 484 } | 485 } |
| 485 | 486 |
| 486 } // namespace printing | 487 } // namespace printing |
| OLD | NEW |