summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/service/cloud_print/cdd_conversion_win.cc26
-rw-r--r--chrome/service/cloud_print/cdd_conversion_win.h5
-rw-r--r--chrome/service/cloud_print/print_system_win.cc2
-rw-r--r--printing/backend/print_backend_win.cc21
-rw-r--r--printing/backend/win_helper.cc53
-rw-r--r--printing/backend/win_helper.h11
-rw-r--r--printing/printing_context_win.cc8
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();