15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/backend/cups_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cups/ppd.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/base_paths.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/path_service.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/strings/string_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/backend/print_backend.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/backend/print_backend_consts.h"
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "printing/units.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace printing {
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This section contains helper code for PPD parsing for semantic capabilities.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kColorDevice[] = "ColorDevice";
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kColorModel[] = "ColorModel";
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kColorMode[] = "ColorMode";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProcessColorModel[] = "ProcessColorModel";
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrintoutMode[] = "PrintoutMode";
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDraftGray[] = "Draft.Gray";
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHighGray[] = "High.Gray";
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDuplex[] = "Duplex";
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDuplexNone[] = "None";
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kPageSize[] = "PageSize";
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const double kMicronsPerPoint = 10.0f * kHundrethsMMPerInch / kPointsPerInch;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ParseLpOptions(const base::FilePath& filepath,
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const std::string& printer_name,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    int* num_options, cups_option_t** options) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string content;
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!base::ReadFileToString(filepath, &content))
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kDest[] = "dest";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kDefault[] = "default";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kDestLen = sizeof(kDest) - 1;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kDefaultLen = sizeof(kDefault) - 1;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> lines;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SplitString(content, '\n', &lines);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < lines.size(); ++i) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string line = lines[i];
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (line.empty())
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base::strncasecmp (line.c_str(), kDefault, kDefaultLen) == 0 &&
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        isspace(line[kDefaultLen])) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      line = line.substr(kDefaultLen);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (base::strncasecmp (line.c_str(), kDest, kDestLen) == 0 &&
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               isspace(line[kDestLen])) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      line = line.substr(kDestLen);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::TrimWhitespaceASCII(line, base::TRIM_ALL, &line);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (line.empty())
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t space_found = line.find(' ');
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (space_found == std::string::npos)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string name = line.substr(0, space_found);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (name.empty())
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base::strncasecmp(printer_name.c_str(), name.c_str(),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          name.length()) != 0) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;  // This is not the required printer.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    line = line.substr(space_found + 1);
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Remove extra spaces.
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::TrimWhitespaceASCII(line, base::TRIM_ALL, &line);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (line.empty())
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Parse the selected printer custom options.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *num_options = cupsParseOptions(line.c_str(), 0, options);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MarkLpOptions(const std::string& printer_name, ppd_file_t** ppd) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cups_option_t* options = NULL;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_options = 0;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppdMarkDefaults(*ppd);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kSystemLpOptionPath[] = "/etc/cups/lpoptions";
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kUserLpOptionPath[] = ".cups/lpoptions";
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath> file_locations;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  file_locations.push_back(base::FilePath(kSystemLpOptionPath));
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath homedir;
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PathService::Get(base::DIR_HOME, &homedir);
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  file_locations.push_back(base::FilePath(homedir.Append(kUserLpOptionPath)));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (std::vector<base::FilePath>::const_iterator it = file_locations.begin();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != file_locations.end(); ++it) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_options = 0;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    options = NULL;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ParseLpOptions(*it, printer_name, &num_options, &options);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (num_options > 0 && options) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cupsMarkOptions(*ppd, num_options, options);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cupsFreeOptions(num_options, options);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetBasicColorModelSettings(ppd_file_t* ppd,
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                ColorModel* color_model_for_black,
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                ColorModel* color_model_for_color,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool* color_is_default) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_option_t* color_model = ppdFindOption(ppd, kColorModel);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!color_model)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppdFindChoice(color_model, printing::kBlack))
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_black = printing::BLACK;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_model, printing::kGray))
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_black = printing::GRAY;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_model, printing::kGrayscale))
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_black = printing::GRAYSCALE;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppdFindChoice(color_model, printing::kColor))
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::COLOR;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_model, printing::kCMYK))
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::CMYK;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_model, printing::kRGB))
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::RGB;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_model, printing::kRGBA))
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::RGBA;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_model, printing::kRGB16))
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::RGB16;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_model, printing::kCMY))
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::CMY;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_model, printing::kKCMY))
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::KCMY;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_model, printing::kCMY_K))
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::CMY_K;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_choice_t* marked_choice = ppdFindMarkedChoice(ppd, kColorModel);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!marked_choice)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    marked_choice = ppdFindChoice(color_model, color_model->defchoice);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (marked_choice) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_is_default =
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (base::strcasecmp(marked_choice->choice, printing::kBlack) != 0) &&
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (base::strcasecmp(marked_choice->choice, printing::kGray) != 0) &&
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (base::strcasecmp(marked_choice->choice, printing::kGrayscale) != 0);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetPrintOutModeColorSettings(ppd_file_t* ppd,
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  ColorModel* color_model_for_black,
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  ColorModel* color_model_for_color,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool* color_is_default) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_option_t* printout_mode = ppdFindOption(ppd, kPrintoutMode);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!printout_mode)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *color_model_for_color = printing::PRINTOUTMODE_NORMAL;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *color_model_for_black = printing::PRINTOUTMODE_NORMAL;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check to see if NORMAL_GRAY value is supported by PrintoutMode.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If NORMAL_GRAY is not supported, NORMAL value is used to
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // represent grayscale. If NORMAL_GRAY is supported, NORMAL is used to
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // represent color.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppdFindChoice(printout_mode, printing::kNormalGray))
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_black = printing::PRINTOUTMODE_NORMAL_GRAY;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the default marked choice to identify the default color setting
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_choice_t* printout_mode_choice = ppdFindMarkedChoice(ppd, kPrintoutMode);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!printout_mode_choice) {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      printout_mode_choice = ppdFindChoice(printout_mode,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           printout_mode->defchoice);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (printout_mode_choice) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((base::strcasecmp(printout_mode_choice->choice,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          printing::kNormalGray) == 0) ||
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (base::strcasecmp(printout_mode_choice->choice, kHighGray) == 0) ||
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (base::strcasecmp(printout_mode_choice->choice, kDraftGray) == 0)) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *color_model_for_black = printing::PRINTOUTMODE_NORMAL_GRAY;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *color_is_default = false;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetColorModeSettings(ppd_file_t* ppd,
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          ColorModel* color_model_for_black,
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          ColorModel* color_model_for_color,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          bool* color_is_default) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Samsung printers use "ColorMode" attribute in their ppds.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_option_t* color_mode_option = ppdFindOption(ppd, kColorMode);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!color_mode_option)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppdFindChoice(color_mode_option, printing::kColor))
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::COLORMODE_COLOR;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppdFindChoice(color_mode_option, printing::kMonochrome))
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_black = printing::COLORMODE_MONOCHROME;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kColorMode);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!mode_choice) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mode_choice = ppdFindChoice(color_mode_option,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                color_mode_option->defchoice);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mode_choice) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_is_default =
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (base::strcasecmp(mode_choice->choice, printing::kColor) == 0);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetHPColorSettings(ppd_file_t* ppd,
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        ColorModel* color_model_for_black,
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        ColorModel* color_model_for_color,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        bool* color_is_default) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HP printers use "Color/Color Model" attribute in their ppds.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_option_t* color_mode_option = ppdFindOption(ppd, printing::kColor);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!color_mode_option)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppdFindChoice(color_mode_option, printing::kColor))
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::HP_COLOR_COLOR;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppdFindChoice(color_mode_option, printing::kBlack))
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_black = printing::HP_COLOR_BLACK;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kColorMode);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!mode_choice) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mode_choice = ppdFindChoice(color_mode_option,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                color_mode_option->defchoice);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mode_choice) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_is_default =
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (base::strcasecmp(mode_choice->choice, printing::kColor) == 0);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetProcessColorModelSettings(ppd_file_t* ppd,
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  ColorModel* color_model_for_black,
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  ColorModel* color_model_for_color,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool* color_is_default) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Canon printers use "ProcessColorModel" attribute in their ppds.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_option_t* color_mode_option =  ppdFindOption(ppd, kProcessColorModel);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!color_mode_option)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppdFindChoice(color_mode_option, printing::kRGB))
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::PROCESSCOLORMODEL_RGB;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (ppdFindChoice(color_mode_option, printing::kCMYK))
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_color = printing::PROCESSCOLORMODEL_CMYK;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ppdFindChoice(color_mode_option, printing::kGreyscale))
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_model_for_black = printing::PROCESSCOLORMODEL_GREYSCALE;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_choice_t* mode_choice = ppdFindMarkedChoice(ppd, kProcessColorModel);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!mode_choice) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mode_choice = ppdFindChoice(color_mode_option,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                color_mode_option->defchoice);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mode_choice) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *color_is_default =
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (base::strcasecmp(mode_choice->choice, printing::kGreyscale) != 0);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetColorModelSettings(ppd_file_t* ppd,
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           ColorModel* cm_black,
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           ColorModel* cm_color,
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           bool* is_color) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_color_device = false;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_attr_t* attr = ppdFindAttr(ppd, kColorDevice, NULL);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (attr && attr->value)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_color_device = ppd->color_device;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *is_color = is_color_device;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (is_color_device &&
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetBasicColorModelSettings(ppd, cm_black, cm_color, is_color)) ||
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetPrintOutModeColorSettings(ppd, cm_black, cm_color, is_color) ||
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetColorModeSettings(ppd, cm_black, cm_color, is_color) ||
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetHPColorSettings(ppd, cm_black, cm_color, is_color) ||
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetProcessColorModelSettings(ppd, cm_black, cm_color, is_color);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default port for IPP print servers.
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDefaultIPPServerPort = 631;
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper wrapper around http_t structure, with connection and cleanup
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// functionality.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpConnectionCUPS::HttpConnectionCUPS(const GURL& print_server_url,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       http_encryption_t encryption)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : http_(NULL) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we have an empty url, use default print server.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (print_server_url.is_empty())
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int port = print_server_url.IntPort();
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (port == url::PORT_UNSPECIFIED)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    port = kDefaultIPPServerPort;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  http_ = httpConnectEncrypt(print_server_url.host().c_str(), port, encryption);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_ == NULL) {
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    LOG(ERROR) << "CP_CUPS: Failed connecting to print server: "
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               << print_server_url;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpConnectionCUPS::~HttpConnectionCUPS() {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (http_ != NULL)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    httpClose(http_);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HttpConnectionCUPS::SetBlocking(bool blocking) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  httpBlocking(http_, blocking ?  1 : 0);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)http_t* HttpConnectionCUPS::http() {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return http_;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool ParsePpdCapabilities(
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& printer_name,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& printer_capabilities,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrinterSemanticCapsAndDefaults* printer_info) {
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath ppd_file_path;
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!base::CreateTemporaryFile(&ppd_file_path))
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int data_size = printer_capabilities.length();
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (data_size != base::WriteFile(
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ppd_file_path,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       printer_capabilities.data(),
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       data_size)) {
3607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::DeleteFile(ppd_file_path, false);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str());
365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!ppd) {
366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    int line = 0;
367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ppd_status_t ppd_status = ppdLastError(&line);
368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LOG(ERROR) << "Failed to open PDD file: error " << ppd_status << " at line "
369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)               << line << ", " << ppdErrorString(ppd_status);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printing::PrinterSemanticCapsAndDefaults caps;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MarkLpOptions(printer_name, &ppd);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  caps.collate_capable = true;
37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  caps.collate_default = true;
37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  caps.copies_capable = true;
38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!duplex_choice) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppd_option_t* option = ppdFindOption(ppd, kDuplex);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (option)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      duplex_choice = ppdFindChoice(option, option->defchoice);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (duplex_choice) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    caps.duplex_capable = true;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base::strcasecmp(duplex_choice->choice, kDuplexNone) != 0)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      caps.duplex_default = printing::LONG_EDGE;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      caps.duplex_default = printing::SIMPLEX;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_color = false;
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ColorModel cm_color = UNKNOWN_COLOR_MODEL, cm_black = UNKNOWN_COLOR_MODEL;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GetColorModelSettings(ppd, &cm_black, &cm_color, &is_color)) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VLOG(1) << "Unknown printer color model";
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  caps.color_changeable = ((cm_color != UNKNOWN_COLOR_MODEL) &&
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           (cm_black != UNKNOWN_COLOR_MODEL) &&
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                           (cm_color != cm_black));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  caps.color_default = is_color;
4068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  caps.color_model = cm_color;
4078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  caps.bw_model = cm_black;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (ppd->num_sizes > 0 && ppd->sizes) {
410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    VLOG(1) << "Paper list size - " << ppd->num_sizes;
411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ppd_option_t* paper_option = ppdFindOption(ppd, kPageSize);
412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    for (int i = 0; i < ppd->num_sizes; ++i) {
413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      gfx::Size paper_size_microns(
414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          static_cast<int>(ppd->sizes[i].width * kMicronsPerPoint + 0.5),
415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          static_cast<int>(ppd->sizes[i].length * kMicronsPerPoint + 0.5));
416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      if (paper_size_microns.width() > 0 && paper_size_microns.height() > 0) {
417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        PrinterSemanticCapsAndDefaults::Paper paper;
418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        paper.size_um = paper_size_microns;
419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        paper.vendor_id = ppd->sizes[i].name;
420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        if (paper_option) {
421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          ppd_choice_t* paper_choice =
422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              ppdFindChoice(paper_option, ppd->sizes[i].name);
423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          // Human readable paper name should be UTF-8 encoded, but some PPDs
424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          // do not follow this standard.
425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          if (paper_choice && base::IsStringUTF8(paper_choice->text)) {
426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            paper.display_name = paper_choice->text;
427f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          }
428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        }
429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        caps.papers.push_back(paper);
430f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        if (i == 0 || ppd->sizes[i].marked) {
431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          caps.default_paper = paper;
432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        }
433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      }
434f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppdClose(ppd);
4387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DeleteFile(ppd_file_path, false);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *printer_info = caps;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace printing
445