Index: printing/backend/cups_helper.cc |
diff --git a/printing/backend/cups_helper.cc b/printing/backend/cups_helper.cc |
index 981a539ae4461123a6f979a166746dce757760ef..b36722d8e79cac976f0fe756bdfd4c4949462508 100644 |
--- a/printing/backend/cups_helper.cc |
+++ b/printing/backend/cups_helper.cc |
@@ -16,6 +16,7 @@ |
#include "base/values.h" |
#include "printing/backend/print_backend.h" |
#include "printing/backend/print_backend_consts.h" |
+#include "printing/units.h" |
#include "url/gurl.h" |
namespace printing { |
@@ -33,6 +34,9 @@ const char kHighGray[] = "High.Gray"; |
const char kDuplex[] = "Duplex"; |
const char kDuplexNone[] = "None"; |
+const char kPageSize[] = "PageSize"; |
+ |
+const double kMicronsPerPoint = kHundrethsMMPerInch / kPointsPerInch * 10; |
#if !defined(OS_MACOSX) |
void ParseLpOptions(const base::FilePath& filepath, |
@@ -358,8 +362,13 @@ bool ParsePpdCapabilities( |
} |
ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str()); |
- if (!ppd) |
+ if (!ppd) { |
+ int line = 0; |
+ ppd_status_t ppd_status = ppdLastError(&line); |
+ LOG(ERROR) << "Failed to open PDD file: error " << ppd_status << " at line " |
+ << line << ", " << ppdErrorString(ppd_status); |
return false; |
+ } |
printing::PrinterSemanticCapsAndDefaults caps; |
#if !defined(OS_MACOSX) |
@@ -397,6 +406,34 @@ bool ParsePpdCapabilities( |
caps.color_model = cm_color; |
caps.bw_model = cm_black; |
+ if (ppd->num_sizes > 0 && ppd->sizes) { |
+ VLOG(1) << "Paper list size - " << ppd->num_sizes; |
+ ppd_option_t* paper_option = ppdFindOption(ppd, kPageSize); |
+ for (int i = 0; i < ppd->num_sizes; ++i) { |
+ gfx::Size paper_size_microns( |
+ static_cast<int>(ppd->sizes[i].width * kMicronsPerPoint + 0.5), |
+ static_cast<int>(ppd->sizes[i].length * kMicronsPerPoint + 0.5)); |
+ if (paper_size_microns.width() > 0 && paper_size_microns.height() > 0) { |
+ PrinterSemanticCapsAndDefaults::Paper paper; |
+ paper.size_um = paper_size_microns; |
+ paper.vendor_id = ppd->sizes[i].name; |
+ if (paper_option) { |
+ ppd_choice_t* paper_choice = |
+ ppdFindChoice(paper_option, ppd->sizes[i].name); |
+ // Human readable paper name should be UTF-8 encoded, but some PPDs |
+ // do not follow this standard. |
+ if (paper_choice && base::IsStringUTF8(paper_choice->text)) { |
+ paper.display_name = paper_choice->text; |
+ } |
+ } |
+ caps.papers.push_back(paper); |
+ if (i == 0 || ppd->sizes[i].marked) { |
+ caps.default_paper = paper; |
+ } |
+ } |
+ } |
+ } |
+ |
ppdClose(ppd); |
base::DeleteFile(ppd_file_path, false); |