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