diff options
author | alekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-13 22:00:57 +0000 |
---|---|---|
committer | alekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-13 22:00:57 +0000 |
commit | 117eb82d7a3b62cb363fb8e64dc9aa3a7ef7e028 (patch) | |
tree | 996988f3b9d32f0c8db3453dfcb9a62c1d8d6fc6 /printing | |
parent | 3a8b058d8c2eb1a6345196fdf8158593a3bcfeef (diff) | |
download | chromium_src-117eb82d7a3b62cb363fb8e64dc9aa3a7ef7e028.zip chromium_src-117eb82d7a3b62cb363fb8e64dc9aa3a7ef7e028.tar.gz chromium_src-117eb82d7a3b62cb363fb8e64dc9aa3a7ef7e028.tar.bz2 |
Add paper size reporting for CUPS printers (to let user to select one in the Print Preview).
BUG=239879
Review URL: https://codereview.chromium.org/334763002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@277098 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing')
-rw-r--r-- | printing/backend/cups_helper.cc | 39 | ||||
-rw-r--r-- | printing/backend/cups_helper_unittest.cc | 33 | ||||
-rw-r--r-- | printing/backend/print_backend.h | 3 | ||||
-rw-r--r-- | printing/backend/print_backend_win.cc | 4 |
4 files changed, 75 insertions, 4 deletions
diff --git a/printing/backend/cups_helper.cc b/printing/backend/cups_helper.cc index 981a539..b36722d 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); diff --git a/printing/backend/cups_helper_unittest.cc b/printing/backend/cups_helper_unittest.cc index 83dc0a1..2a0e72b 100644 --- a/printing/backend/cups_helper_unittest.cc +++ b/printing/backend/cups_helper_unittest.cc @@ -172,3 +172,36 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingColorFalseDuplexLongEdge) { EXPECT_TRUE(caps.color_changeable); EXPECT_FALSE(caps.color_default); } + +TEST(PrintBackendCupsHelperTest, TestPpdParsingPageSize) { + std::string test_ppd_data; + test_ppd_data.append( + "*PPD-Adobe: \"4.3\"\n\n" + "*OpenUI *PageSize: PickOne\n" + "*OrderDependency: 30 AnySetup *PageSize\n" + "*DefaultPageSize: Letter\n" + "*PageSize Letter/US Letter: \"" + " <</DeferredMediaSelection true /PageSize [612 792] " + " /ImagingBBox null /MediaClass null >> setpagedevice\"\n" + "*End\n" + "*PageSize Legal/US Legal: \"" + " <</DeferredMediaSelection true /PageSize [612 1008] " + " /ImagingBBox null /MediaClass null >> setpagedevice\"\n" + "*End\n" + "*DefaultPaperDimension: Letter\n" + "*PaperDimension Letter/US Letter: \"612 792\"\n" + "*PaperDimension Legal/US Legal: \"612 1008\"\n\n" + "*CloseUI: *PageSize\n\n"); + + printing::PrinterSemanticCapsAndDefaults caps; + EXPECT_TRUE(printing::ParsePpdCapabilities("test", test_ppd_data, &caps)); + ASSERT_EQ(2UL, caps.papers.size()); + EXPECT_EQ("Letter", caps.papers[0].vendor_id); + EXPECT_EQ("US Letter", caps.papers[0].display_name); + EXPECT_EQ(214200, caps.papers[0].size_um.width()); + EXPECT_EQ(277200, caps.papers[0].size_um.height()); + EXPECT_EQ("Legal", caps.papers[1].vendor_id); + EXPECT_EQ("US Legal", caps.papers[1].display_name); + EXPECT_EQ(214200, caps.papers[1].size_um.width()); + EXPECT_EQ(352800, caps.papers[1].size_um.height()); +} diff --git a/printing/backend/print_backend.h b/printing/backend/print_backend.h index 3b307f1..e03ef42 100644 --- a/printing/backend/print_backend.h +++ b/printing/backend/print_backend.h @@ -52,7 +52,8 @@ struct PRINTING_EXPORT PrinterSemanticCapsAndDefaults { ColorModel bw_model; struct Paper { - std::string name; + std::string display_name; + std::string vendor_id; gfx::Size size_um; }; std::vector<Paper> papers; diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc index 87c69ee..287a1f0 100644 --- a/printing/backend/print_backend_win.cc +++ b/printing/backend/print_backend_win.cc @@ -93,7 +93,7 @@ void LoadPaper(const wchar_t* printer, base::string16 tmp_name(name_start, kMaxPaperName); // Trim trailing zeros. tmp_name = tmp_name.c_str(); - paper.name = base::WideToUTF8(tmp_name); + paper.display_name = base::WideToUTF8(tmp_name); } caps->papers.push_back(paper); } @@ -119,7 +119,7 @@ void LoadPaper(const wchar_t* printer, base::string16 tmp_name(name_start, kMaxPaperName); // Trim trailing zeros. tmp_name = tmp_name.c_str(); - paper.name = base::WideToUTF8(tmp_name); + paper.display_name = base::WideToUTF8(tmp_name); } caps->default_paper = paper; break; |