Index: printing/backend/win_helper.cc |
diff --git a/printing/backend/win_helper.cc b/printing/backend/win_helper.cc |
index 3405114029482dd1ed3e55c4637eb3327be815f1..075913eed3e3bc92f5ea90778d47fbb57581633a 100644 |
--- a/printing/backend/win_helper.cc |
+++ b/printing/backend/win_helper.cc |
@@ -385,23 +385,24 @@ std::string GetDriverInfo(HANDLE printer) { |
return driver_info; |
} |
-scoped_ptr<DEVMODE[]> XpsTicketToDevMode(const base::string16& printer_name, |
- const std::string& print_ticket) { |
- scoped_ptr<DEVMODE[]> scoped_dev_mode; |
+scoped_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( |
+ const base::string16& printer_name, |
+ const std::string& print_ticket) { |
+ scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode; |
printing::ScopedXPSInitializer xps_initializer; |
if (!xps_initializer.initialized()) { |
// TODO(sanjeevr): Handle legacy proxy case (with no prntvpt.dll) |
- return scoped_dev_mode.Pass(); |
+ return dev_mode.Pass(); |
} |
printing::ScopedPrinterHandle printer; |
if (!printer.OpenPrinter(printer_name.c_str())) |
- return scoped_dev_mode.Pass(); |
+ return dev_mode.Pass(); |
base::win::ScopedComPtr<IStream> pt_stream; |
HRESULT hr = StreamFromPrintTicket(print_ticket, pt_stream.Receive()); |
if (FAILED(hr)) |
- return scoped_dev_mode.Pass(); |
+ return dev_mode.Pass(); |
HPTPROVIDER provider = NULL; |
hr = printing::XPSModule::OpenProvider(printer_name, 1, &provider); |
@@ -419,28 +420,29 @@ scoped_ptr<DEVMODE[]> XpsTicketToDevMode(const base::string16& printer_name, |
if (SUCCEEDED(hr)) { |
// Correct DEVMODE using DocumentProperties. See documentation for |
// PTConvertPrintTicketToDevMode. |
- scoped_dev_mode = CreateDevMode(printer, dm); |
+ dev_mode = CreateDevMode(printer, dm); |
printing::XPSModule::ReleaseMemory(dm); |
} |
printing::XPSModule::CloseProvider(provider); |
} |
- return scoped_dev_mode.Pass(); |
+ return dev_mode.Pass(); |
} |
-scoped_ptr<DEVMODE[]> CreateDevModeWithColor(HANDLE printer, |
- const base::string16& printer_name, |
- bool color) { |
- scoped_ptr<DEVMODE[]> default = CreateDevMode(printer, NULL); |
+scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( |
+ HANDLE printer, |
+ const base::string16& printer_name, |
+ bool color) { |
+ scoped_ptr<DEVMODE, base::FreeDeleter> default = CreateDevMode(printer, NULL); |
if (!default) |
return default.Pass(); |
- if ((default.get()->dmFields & DM_COLOR) && |
- ((default.get()->dmColor == DMCOLOR_COLOR) == color)) { |
+ if ((default->dmFields & DM_COLOR) && |
+ ((default->dmColor == DMCOLOR_COLOR) == color)) { |
return default.Pass(); |
} |
- default.get()->dmFields |= DM_COLOR; |
- default.get()->dmColor = color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME; |
+ default->dmFields |= DM_COLOR; |
+ default->dmColor = color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME; |
DriverInfo6 info_6; |
if (!info_6.Init(printer)) |
@@ -459,25 +461,24 @@ scoped_ptr<DEVMODE[]> CreateDevModeWithColor(HANDLE printer, |
const char* xps_color = color ? kXpsTicketColor : kXpsTicketMonochrome; |
std::string xps_ticket = base::StringPrintf(kXpsTicketTemplate, xps_color); |
- scoped_ptr<DEVMODE[]> ticket = printing::XpsTicketToDevMode(printer_name, |
- xps_ticket); |
+ scoped_ptr<DEVMODE, base::FreeDeleter> ticket = |
+ printing::XpsTicketToDevMode(printer_name, xps_ticket); |
if (!ticket) |
return default.Pass(); |
return ticket.Pass(); |
} |
-PRINTING_EXPORT scoped_ptr<DEVMODE[]> CreateDevMode(HANDLE printer, |
- DEVMODE* in) { |
+scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer, |
+ DEVMODE* in) { |
LONG buffer_size = DocumentProperties(NULL, printer, L"", NULL, NULL, 0); |
- if (buffer_size <= 0) |
- return scoped_ptr<DEVMODE[]>(); |
- CHECK_GE(buffer_size, static_cast<int>(sizeof(DEVMODE))); |
- scoped_ptr<DEVMODE[]> out( |
- reinterpret_cast<DEVMODE*>(new uint8[buffer_size])); |
+ if (buffer_size < static_cast<int>(sizeof(DEVMODE))) |
+ return scoped_ptr<DEVMODE, base::FreeDeleter>(); |
+ scoped_ptr<DEVMODE, base::FreeDeleter> out( |
+ reinterpret_cast<DEVMODE*>(malloc(buffer_size))); |
DWORD flags = (in ? (DM_IN_BUFFER) : 0) | DM_OUT_BUFFER; |
if (DocumentProperties(NULL, printer, L"", out.get(), in, flags) != IDOK) |
- return scoped_ptr<DEVMODE[]>(); |
+ return scoped_ptr<DEVMODE, base::FreeDeleter>(); |
CHECK_GE(buffer_size, out.get()->dmSize + out.get()->dmDriverExtra); |
return out.Pass(); |
} |