| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "printing/backend/cups_helper.h" | 5 #include "printing/backend/cups_helper.h" |
| 6 | 6 |
| 7 #include <cups/ppd.h> | 7 #include <cups/ppd.h> |
| 8 | 8 |
| 9 #include "base/base_paths.h" | 9 #include "base/base_paths.h" |
| 10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 const char kPrintoutMode[] = "PrintoutMode"; | 31 const char kPrintoutMode[] = "PrintoutMode"; |
| 32 const char kDraftGray[] = "Draft.Gray"; | 32 const char kDraftGray[] = "Draft.Gray"; |
| 33 const char kHighGray[] = "High.Gray"; | 33 const char kHighGray[] = "High.Gray"; |
| 34 | 34 |
| 35 const char kDuplex[] = "Duplex"; | 35 const char kDuplex[] = "Duplex"; |
| 36 const char kDuplexNone[] = "None"; | 36 const char kDuplexNone[] = "None"; |
| 37 const char kPageSize[] = "PageSize"; | 37 const char kPageSize[] = "PageSize"; |
| 38 | 38 |
| 39 const double kMicronsPerPoint = 10.0f * kHundrethsMMPerInch / kPointsPerInch; | 39 const double kMicronsPerPoint = 10.0f * kHundrethsMMPerInch / kPointsPerInch; |
| 40 | 40 |
| 41 #if !defined(OS_MACOSX) | |
| 42 void ParseLpOptions(const base::FilePath& filepath, | 41 void ParseLpOptions(const base::FilePath& filepath, |
| 43 const std::string& printer_name, | 42 const std::string& printer_name, |
| 44 int* num_options, cups_option_t** options) { | 43 int* num_options, cups_option_t** options) { |
| 45 std::string content; | 44 std::string content; |
| 46 if (!base::ReadFileToString(filepath, &content)) | 45 if (!base::ReadFileToString(filepath, &content)) |
| 47 return; | 46 return; |
| 48 | 47 |
| 49 const char kDest[] = "dest"; | 48 const char kDest[] = "dest"; |
| 50 const char kDefault[] = "default"; | 49 const char kDefault[] = "default"; |
| 51 const size_t kDestLen = sizeof(kDest) - 1; | 50 const size_t kDestLen = sizeof(kDest) - 1; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 if (line.empty()) | 90 if (line.empty()) |
| 92 continue; | 91 continue; |
| 93 // Parse the selected printer custom options. | 92 // Parse the selected printer custom options. |
| 94 *num_options = cupsParseOptions(line.c_str(), 0, options); | 93 *num_options = cupsParseOptions(line.c_str(), 0, options); |
| 95 } | 94 } |
| 96 } | 95 } |
| 97 | 96 |
| 98 void MarkLpOptions(const std::string& printer_name, ppd_file_t** ppd) { | 97 void MarkLpOptions(const std::string& printer_name, ppd_file_t** ppd) { |
| 99 cups_option_t* options = NULL; | 98 cups_option_t* options = NULL; |
| 100 int num_options = 0; | 99 int num_options = 0; |
| 101 ppdMarkDefaults(*ppd); | |
| 102 | 100 |
| 103 const char kSystemLpOptionPath[] = "/etc/cups/lpoptions"; | 101 const char kSystemLpOptionPath[] = "/etc/cups/lpoptions"; |
| 104 const char kUserLpOptionPath[] = ".cups/lpoptions"; | 102 const char kUserLpOptionPath[] = ".cups/lpoptions"; |
| 105 | 103 |
| 106 std::vector<base::FilePath> file_locations; | 104 std::vector<base::FilePath> file_locations; |
| 107 file_locations.push_back(base::FilePath(kSystemLpOptionPath)); | 105 file_locations.push_back(base::FilePath(kSystemLpOptionPath)); |
| 108 base::FilePath homedir; | 106 base::FilePath homedir; |
| 109 PathService::Get(base::DIR_HOME, &homedir); | 107 PathService::Get(base::DIR_HOME, &homedir); |
| 110 file_locations.push_back(base::FilePath(homedir.Append(kUserLpOptionPath))); | 108 file_locations.push_back(base::FilePath(homedir.Append(kUserLpOptionPath))); |
| 111 | 109 |
| 112 for (std::vector<base::FilePath>::const_iterator it = file_locations.begin(); | 110 for (std::vector<base::FilePath>::const_iterator it = file_locations.begin(); |
| 113 it != file_locations.end(); ++it) { | 111 it != file_locations.end(); ++it) { |
| 114 num_options = 0; | 112 num_options = 0; |
| 115 options = NULL; | 113 options = NULL; |
| 116 ParseLpOptions(*it, printer_name, &num_options, &options); | 114 ParseLpOptions(*it, printer_name, &num_options, &options); |
| 117 if (num_options > 0 && options) { | 115 if (num_options > 0 && options) { |
| 118 cupsMarkOptions(*ppd, num_options, options); | 116 cupsMarkOptions(*ppd, num_options, options); |
| 119 cupsFreeOptions(num_options, options); | 117 cupsFreeOptions(num_options, options); |
| 120 } | 118 } |
| 121 } | 119 } |
| 122 } | 120 } |
| 123 #endif // !defined(OS_MACOSX) | |
| 124 | 121 |
| 125 bool GetBasicColorModelSettings(ppd_file_t* ppd, | 122 bool GetBasicColorModelSettings(ppd_file_t* ppd, |
| 126 ColorModel* color_model_for_black, | 123 ColorModel* color_model_for_black, |
| 127 ColorModel* color_model_for_color, | 124 ColorModel* color_model_for_color, |
| 128 bool* color_is_default) { | 125 bool* color_is_default) { |
| 129 ppd_option_t* color_model = ppdFindOption(ppd, kColorModel); | 126 ppd_option_t* color_model = ppdFindOption(ppd, kColorModel); |
| 130 if (!color_model) | 127 if (!color_model) |
| 131 return false; | 128 return false; |
| 132 | 129 |
| 133 if (ppdFindChoice(color_model, printing::kBlack)) | 130 if (ppdFindChoice(color_model, printing::kBlack)) |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 } | 359 } |
| 363 | 360 |
| 364 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str()); | 361 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str()); |
| 365 if (!ppd) { | 362 if (!ppd) { |
| 366 int line = 0; | 363 int line = 0; |
| 367 ppd_status_t ppd_status = ppdLastError(&line); | 364 ppd_status_t ppd_status = ppdLastError(&line); |
| 368 LOG(ERROR) << "Failed to open PDD file: error " << ppd_status << " at line " | 365 LOG(ERROR) << "Failed to open PDD file: error " << ppd_status << " at line " |
| 369 << line << ", " << ppdErrorString(ppd_status); | 366 << line << ", " << ppdErrorString(ppd_status); |
| 370 return false; | 367 return false; |
| 371 } | 368 } |
| 369 ppdMarkDefaults(ppd); |
| 370 MarkLpOptions(printer_name, &ppd); |
| 372 | 371 |
| 373 printing::PrinterSemanticCapsAndDefaults caps; | 372 printing::PrinterSemanticCapsAndDefaults caps; |
| 374 #if !defined(OS_MACOSX) | |
| 375 MarkLpOptions(printer_name, &ppd); | |
| 376 #endif | |
| 377 caps.collate_capable = true; | 373 caps.collate_capable = true; |
| 378 caps.collate_default = true; | 374 caps.collate_default = true; |
| 379 caps.copies_capable = true; | 375 caps.copies_capable = true; |
| 380 | 376 |
| 381 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex); | 377 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex); |
| 382 if (!duplex_choice) { | 378 if (!duplex_choice) { |
| 383 ppd_option_t* option = ppdFindOption(ppd, kDuplex); | 379 ppd_option_t* option = ppdFindOption(ppd, kDuplex); |
| 384 if (option) | 380 if (option) |
| 385 duplex_choice = ppdFindChoice(option, option->defchoice); | 381 duplex_choice = ppdFindChoice(option, option->defchoice); |
| 386 } | 382 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 } | 431 } |
| 436 | 432 |
| 437 ppdClose(ppd); | 433 ppdClose(ppd); |
| 438 base::DeleteFile(ppd_file_path, false); | 434 base::DeleteFile(ppd_file_path, false); |
| 439 | 435 |
| 440 *printer_info = caps; | 436 *printer_info = caps; |
| 441 return true; | 437 return true; |
| 442 } | 438 } |
| 443 | 439 |
| 444 } // namespace printing | 440 } // namespace printing |
| OLD | NEW |