diff options
-rw-r--r-- | chrome/service/cloud_print/cdd_conversion_win.cc | 26 | ||||
-rw-r--r-- | chrome/service/cloud_print/cdd_conversion_win.h | 5 | ||||
-rw-r--r-- | chrome/service/cloud_print/print_system_win.cc | 2 | ||||
-rw-r--r-- | printing/backend/print_backend_win.cc | 21 | ||||
-rw-r--r-- | printing/backend/win_helper.cc | 53 | ||||
-rw-r--r-- | printing/backend/win_helper.h | 11 | ||||
-rw-r--r-- | printing/printing_context_win.cc | 8 |
7 files changed, 66 insertions, 60 deletions
diff --git a/chrome/service/cloud_print/cdd_conversion_win.cc b/chrome/service/cloud_print/cdd_conversion_win.cc index f71ed64..93fd836 100644 --- a/chrome/service/cloud_print/cdd_conversion_win.cc +++ b/chrome/service/cloud_print/cdd_conversion_win.cc @@ -15,32 +15,32 @@ bool IsValidCjt(const std::string& print_ticket_data) { return description.InitFromString(print_ticket_data); } -scoped_ptr<DEVMODE[]> CjtToDevMode(const base::string16& printer_name, - const std::string& print_ticket) { - using namespace cloud_devices::printer; +scoped_ptr<DEVMODE, base::FreeDeleter> CjtToDevMode( + const base::string16& printer_name, + const std::string& print_ticket) { + scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode; + cloud_devices::CloudDeviceDescription description; if (!description.InitFromString(print_ticket)) - return scoped_ptr<DEVMODE[]>(); + return dev_mode.Pass(); + using namespace cloud_devices::printer; printing::ScopedPrinterHandle printer; if (!printer.OpenPrinter(printer_name.c_str())) - return scoped_ptr<DEVMODE[]>(); + return dev_mode.Pass(); - scoped_ptr<DEVMODE[]> scoped_dev_mode; { ColorTicketItem color; if (color.LoadFrom(description)) { bool is_color = color.value().type == STANDARD_COLOR; - scoped_dev_mode = CreateDevModeWithColor(printer, printer_name, is_color); + dev_mode = CreateDevModeWithColor(printer, printer_name, is_color); } else { - scoped_dev_mode = printing::CreateDevMode(printer, NULL); + dev_mode = printing::CreateDevMode(printer, NULL); } } - if (!scoped_dev_mode) - return scoped_ptr<DEVMODE[]>(); - - DEVMODE* dev_mode = scoped_dev_mode.get(); + if (!dev_mode) + return dev_mode.Pass(); ColorTicketItem color; DuplexTicketItem duplex; @@ -122,7 +122,7 @@ scoped_ptr<DEVMODE[]> CjtToDevMode(const base::string16& printer_name, } } - return printing::CreateDevMode(printer, dev_mode); + return printing::CreateDevMode(printer, dev_mode.get()); } std::string CapabilitiesToCdd( diff --git a/chrome/service/cloud_print/cdd_conversion_win.h b/chrome/service/cloud_print/cdd_conversion_win.h index cd751c4..8f50fc9 100644 --- a/chrome/service/cloud_print/cdd_conversion_win.h +++ b/chrome/service/cloud_print/cdd_conversion_win.h @@ -19,8 +19,9 @@ namespace cloud_print { bool IsValidCjt(const std::string& print_ticket); -scoped_ptr<DEVMODE[]> CjtToDevMode(const base::string16& printer_name, - const std::string& print_ticket); +scoped_ptr<DEVMODE, base::FreeDeleter> CjtToDevMode( + const base::string16& printer_name, + const std::string& print_ticket); std::string CapabilitiesToCdd( const printing::PrinterSemanticCapsAndDefaults& semantic_info); diff --git a/chrome/service/cloud_print/print_system_win.cc b/chrome/service/cloud_print/print_system_win.cc index fc1ab97..98a4e97 100644 --- a/chrome/service/cloud_print/print_system_win.cc +++ b/chrome/service/cloud_print/print_system_win.cc @@ -270,7 +270,7 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { last_page_printed_ = -1; // We only support PDF and XPS documents for now. if (print_data_mime_type == kContentTypePDF) { - scoped_ptr<DEVMODE[]> dev_mode; + scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode; if (print_ticket_mime_type == kContentTypeJSON) { dev_mode = CjtToDevMode(printer_wide, print_ticket); } else { diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc index 06bd5c9..75c562a 100644 --- a/printing/backend/print_backend_win.cc +++ b/printing/backend/print_backend_win.cc @@ -233,13 +233,14 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( PrinterSemanticCapsAndDefaults caps; - scoped_ptr<DEVMODE[]> user_settings = CreateDevMode(printer_handle, NULL); + scoped_ptr<DEVMODE, base::FreeDeleter> user_settings = + CreateDevMode(printer_handle, NULL); if (user_settings) { - if (user_settings.get()->dmFields & DM_COLOR) - caps.color_default = (user_settings.get()->dmColor == DMCOLOR_COLOR); + if (user_settings->dmFields & DM_COLOR) + caps.color_default = (user_settings->dmColor == DMCOLOR_COLOR); - if (user_settings.get()->dmFields & DM_DUPLEX) { - switch (user_settings.get()->dmDuplex) { + if (user_settings->dmFields & DM_DUPLEX) { + switch (user_settings->dmDuplex) { case DMDUP_SIMPLEX: caps.duplex_default = SIMPLEX; break; @@ -254,8 +255,8 @@ bool PrintBackendWin::GetPrinterSemanticCapsAndDefaults( } } - if (user_settings.get()->dmFields & DM_COLLATE) - caps.collate_default = (user_settings.get()->dmCollate == DMCOLLATE_TRUE); + if (user_settings->dmFields & DM_COLLATE) + caps.collate_default = (user_settings->dmCollate == DMCOLLATE_TRUE); } else { LOG(WARNING) << "Fallback to color/simplex mode."; caps.color_default = caps.color_changeable; @@ -320,7 +321,8 @@ bool PrintBackendWin::GetPrinterCapsAndDefaults( } ScopedPrinterHandle printer_handle; if (printer_handle.OpenPrinter(printer_name_wide.c_str())) { - scoped_ptr<DEVMODE[]> devmode_out(CreateDevMode(printer_handle, NULL)); + scoped_ptr<DEVMODE, base::FreeDeleter> devmode_out( + CreateDevMode(printer_handle, NULL)); if (!devmode_out) return false; base::win::ScopedComPtr<IStream> printer_defaults_stream; @@ -328,8 +330,7 @@ bool PrintBackendWin::GetPrinterCapsAndDefaults( printer_defaults_stream.Receive()); DCHECK(SUCCEEDED(hr)); if (printer_defaults_stream) { - DWORD dm_size = devmode_out.get()->dmSize + - devmode_out.get()->dmDriverExtra; + DWORD dm_size = devmode_out->dmSize + devmode_out->dmDriverExtra; hr = XPSModule::ConvertDevModeToPrintTicket(provider, dm_size, devmode_out.get(), kPTJobScope, printer_defaults_stream); DCHECK(SUCCEEDED(hr)); diff --git a/printing/backend/win_helper.cc b/printing/backend/win_helper.cc index 3405114..075913e 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(); } diff --git a/printing/backend/win_helper.h b/printing/backend/win_helper.h index 9b998d7..18d0355 100644 --- a/printing/backend/win_helper.h +++ b/printing/backend/win_helper.h @@ -6,8 +6,8 @@ #define PRINTING_BACKEND_WIN_HELPER_H_ #include <objidl.h> -#include <winspool.h> #include <prntvpt.h> +#include <winspool.h> #include <xpsprint.h> #include <string> @@ -170,20 +170,21 @@ PRINTING_EXPORT bool InitBasicPrinterInfo(HANDLE printer, PRINTING_EXPORT std::string GetDriverInfo(HANDLE printer); -PRINTING_EXPORT scoped_ptr<DEVMODE[]> XpsTicketToDevMode( +PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> XpsTicketToDevMode( const base::string16& printer_name, const std::string& print_ticket); // Creates default DEVMODE and sets color option. Some devices need special // workaround for color. -PRINTING_EXPORT scoped_ptr<DEVMODE[]> CreateDevModeWithColor( +PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor( HANDLE printer, const base::string16& printer_name, bool color); // Creates new DEVMODE. If |in| is not NULL copy settings from there. -PRINTING_EXPORT scoped_ptr<DEVMODE[]> CreateDevMode(HANDLE printer, - DEVMODE* in); +PRINTING_EXPORT scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevMode( + HANDLE printer, + DEVMODE* in); } // namespace printing diff --git a/printing/printing_context_win.cc b/printing/printing_context_win.cc index 78dd47f..547bf83 100644 --- a/printing/printing_context_win.cc +++ b/printing/printing_context_win.cc @@ -284,7 +284,8 @@ PrintingContext::Result PrintingContextWin::UseDefaultSettings() { ScopedPrinterHandle printer; if (!printer.OpenPrinter(info_2->pPrinterName)) continue; - scoped_ptr<DEVMODE[]> dev_mode = CreateDevMode(printer, NULL); + scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = + CreateDevMode(printer, NULL); if (!dev_mode || !AllocateContext(info_2->pPrinterName, dev_mode.get(), &context_)) { continue; @@ -345,7 +346,7 @@ PrintingContext::Result PrintingContextWin::UpdatePrinterSettings( // Make printer changes local to Chrome. // See MSDN documentation regarding DocumentProperties. - scoped_ptr<DEVMODE[]> scoped_dev_mode = + scoped_ptr<DEVMODE, base::FreeDeleter> scoped_dev_mode = CreateDevModeWithColor(printer, settings_.device_name(), settings_.color() != GRAY); if (!scoped_dev_mode) @@ -590,7 +591,8 @@ bool PrintingContextWin::GetPrinterSettings(HANDLE printer, const std::wstring& device_name) { DCHECK(!in_print_job_); - scoped_ptr<DEVMODE[]> dev_mode = CreateDevMode(printer, NULL); + scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode = + CreateDevMode(printer, NULL); if (!dev_mode || !AllocateContext(device_name, dev_mode.get(), &context_)) { ResetSettings(); |