summaryrefslogtreecommitdiffstats
path: root/printing
diff options
context:
space:
mode:
authoralekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-13 22:00:57 +0000
committeralekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-06-13 22:00:57 +0000
commit117eb82d7a3b62cb363fb8e64dc9aa3a7ef7e028 (patch)
tree996988f3b9d32f0c8db3453dfcb9a62c1d8d6fc6 /printing
parent3a8b058d8c2eb1a6345196fdf8158593a3bcfeef (diff)
downloadchromium_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.cc39
-rw-r--r--printing/backend/cups_helper_unittest.cc33
-rw-r--r--printing/backend/print_backend.h3
-rw-r--r--printing/backend/print_backend_win.cc4
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;