Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / printing / backend / win_helper.cc
index a16228b..6aba7c6 100644 (file)
@@ -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,66 +420,71 @@ 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);
-  if (!default)
-    return default.Pass();
-
-  if ((default.get()->dmFields & DM_COLOR) &&
-      ((default.get()->dmColor == DMCOLOR_COLOR) == color)) {
-    return default.Pass();
+scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevModeWithColor(
+    HANDLE printer,
+    const base::string16& printer_name,
+    bool color) {
+  scoped_ptr<DEVMODE, base::FreeDeleter> default_ticket =
+      CreateDevMode(printer, NULL);
+  if (!default_ticket)
+    return default_ticket.Pass();
+
+  if ((default_ticket->dmFields & DM_COLOR) &&
+      ((default_ticket->dmColor == DMCOLOR_COLOR) == color)) {
+    return default_ticket.Pass();
   }
 
-  default.get()->dmFields |= DM_COLOR;
-  default.get()->dmColor = color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME;
+  default_ticket->dmFields |= DM_COLOR;
+  default_ticket->dmColor = color ? DMCOLOR_COLOR : DMCOLOR_MONOCHROME;
 
   DriverInfo6 info_6;
   if (!info_6.Init(printer))
-    return default.Pass();
+    return default_ticket.Pass();
 
   const DRIVER_INFO_6* p = info_6.get();
 
   // Only HP known to have issues.
   if (!p->pszMfgName || wcscmp(p->pszMfgName, L"HP") != 0)
-    return default.Pass();
+    return default_ticket.Pass();
 
   // Need XPS for this workaround.
   printing::ScopedXPSInitializer xps_initializer;
   if (!xps_initializer.initialized())
-    return default.Pass();
+    return default_ticket.Pass();
 
   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 default_ticket.Pass();
 
   return ticket.Pass();
 }
 
-PRINTING_EXPORT scoped_ptr<DEVMODE[]> CreateDevMode(HANDLE printer,
-                                                    DEVMODE* in) {
-  DWORD flags = in ? (DM_IN_BUFFER) : 0;
-  LONG buffer_size = DocumentProperties(NULL, printer, L"", NULL, in, flags);
-  if (buffer_size <= 0)
-    return scoped_ptr<DEVMODE[]>();
-  scoped_ptr<DEVMODE[]> out(
-      reinterpret_cast<DEVMODE*>(new uint8[buffer_size]));
-  flags |= DM_OUT_BUFFER;
-  if (DocumentProperties(NULL, printer, L"", out.get(), in, flags) != IDOK)
-    return scoped_ptr<DEVMODE[]>();
-  DCHECK_EQ(buffer_size, out.get()->dmSize + out.get()->dmDriverExtra);
+scoped_ptr<DEVMODE, base::FreeDeleter> CreateDevMode(HANDLE printer,
+                                                     DEVMODE* in) {
+  LONG buffer_size = DocumentProperties(
+      NULL, printer, const_cast<wchar_t*>(L""), NULL, NULL, 0);
+  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, const_cast<wchar_t*>(L""), out.get(), in, flags) !=
+      IDOK) {
+    return scoped_ptr<DEVMODE, base::FreeDeleter>();
+  }
+  CHECK_GE(buffer_size, out.get()->dmSize + out.get()->dmDriverExtra);
   return out.Pass();
 }