Home | History | Annotate | Download | only in cloud_print
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/service/cloud_print/cdd_conversion_win.h"
      6 
      7 #include "base/strings/string_number_conversions.h"
      8 #include "components/cloud_devices/common/printer_description.h"
      9 #include "printing/backend/win_helper.h"
     10 
     11 namespace cloud_print {
     12 
     13 bool IsValidCjt(const std::string& print_ticket_data) {
     14   cloud_devices::CloudDeviceDescription description;
     15   return description.InitFromString(print_ticket_data);
     16 }
     17 
     18 scoped_ptr<DEVMODE, base::FreeDeleter> CjtToDevMode(
     19     const base::string16& printer_name,
     20     const std::string& print_ticket) {
     21   scoped_ptr<DEVMODE, base::FreeDeleter> dev_mode;
     22 
     23   cloud_devices::CloudDeviceDescription description;
     24   if (!description.InitFromString(print_ticket))
     25     return dev_mode.Pass();
     26 
     27   using namespace cloud_devices::printer;
     28   printing::ScopedPrinterHandle printer;
     29   if (!printer.OpenPrinter(printer_name.c_str()))
     30     return dev_mode.Pass();
     31 
     32   {
     33     ColorTicketItem color;
     34     if (color.LoadFrom(description)) {
     35       bool is_color = color.value().type == STANDARD_COLOR;
     36       dev_mode = CreateDevModeWithColor(printer, printer_name, is_color);
     37     } else {
     38       dev_mode = printing::CreateDevMode(printer, NULL);
     39     }
     40   }
     41 
     42   if (!dev_mode)
     43     return dev_mode.Pass();
     44 
     45   ColorTicketItem color;
     46   DuplexTicketItem duplex;
     47   OrientationTicketItem orientation;
     48   MarginsTicketItem margins;
     49   DpiTicketItem dpi;
     50   FitToPageTicketItem fit_to_page;
     51   MediaTicketItem media;
     52   CopiesTicketItem copies;
     53   PageRangeTicketItem page_range;
     54   CollateTicketItem collate;
     55   ReverseTicketItem reverse;
     56 
     57   if (orientation.LoadFrom(description)) {
     58     dev_mode->dmFields |= DM_ORIENTATION;
     59     if (orientation.value() == LANDSCAPE) {
     60       dev_mode->dmOrientation = DMORIENT_LANDSCAPE;
     61     } else {
     62       dev_mode->dmOrientation = DMORIENT_PORTRAIT;
     63     }
     64   }
     65 
     66   if (color.LoadFrom(description)) {
     67     dev_mode->dmFields |= DM_COLOR;
     68     if (color.value().type == STANDARD_MONOCHROME) {
     69       dev_mode->dmColor = DMCOLOR_MONOCHROME;
     70     } else if (color.value().type == STANDARD_COLOR) {
     71       dev_mode->dmColor = DMCOLOR_COLOR;
     72     } else {
     73       NOTREACHED();
     74     }
     75   }
     76 
     77   if (duplex.LoadFrom(description)) {
     78     dev_mode->dmFields |= DM_DUPLEX;
     79     if (duplex.value() == NO_DUPLEX) {
     80       dev_mode->dmDuplex = DMDUP_SIMPLEX;
     81     } else if (duplex.value() == LONG_EDGE) {
     82       dev_mode->dmDuplex = DMDUP_VERTICAL;
     83     } else if (duplex.value() == SHORT_EDGE) {
     84       dev_mode->dmDuplex = DMDUP_HORIZONTAL;
     85     } else {
     86       NOTREACHED();
     87     }
     88   }
     89 
     90   if (copies.LoadFrom(description)) {
     91     dev_mode->dmFields |= DM_COPIES;
     92     dev_mode->dmCopies = copies.value();
     93   }
     94 
     95   if (dpi.LoadFrom(description)) {
     96     if (dpi.value().horizontal > 0) {
     97       dev_mode->dmFields |= DM_PRINTQUALITY;
     98       dev_mode->dmPrintQuality = dpi.value().horizontal;
     99     }
    100     if (dpi.value().vertical > 0) {
    101       dev_mode->dmFields |= DM_YRESOLUTION;
    102       dev_mode->dmYResolution = dpi.value().vertical;
    103     }
    104   }
    105 
    106   if (collate.LoadFrom(description)) {
    107     dev_mode->dmFields |= DM_COLLATE;
    108     dev_mode->dmCollate = (collate.value() ? DMCOLLATE_TRUE : DMCOLLATE_FALSE);
    109   }
    110 
    111   if (media.LoadFrom(description)) {
    112     static const size_t kFromUm = 100;  // Windows uses 0.1mm.
    113     int width = media.value().width_um / kFromUm;
    114     int height = media.value().height_um / kFromUm;
    115     unsigned id = 0;
    116     if (base::StringToUint(media.value().vendor_id, &id) && id) {
    117       dev_mode->dmFields |= DM_PAPERSIZE;
    118       dev_mode->dmPaperSize = static_cast<short>(id);
    119     } else if (width > 0 && height > 0) {
    120       dev_mode->dmFields |= DM_PAPERWIDTH;
    121       dev_mode->dmPaperWidth = width;
    122       dev_mode->dmFields |= DM_PAPERLENGTH;
    123       dev_mode->dmPaperLength = height;
    124     }
    125   }
    126 
    127   return printing::CreateDevMode(printer, dev_mode.get());
    128 }
    129 
    130 }  // namespace cloud_print
    131