Commit 9a0c225c authored by Luum Habtemariam's avatar Luum Habtemariam Committed by Commit Bot

Adding cupsMaxCopies to PPD parsing

We recently starting sourcing the maximum copies value used in
Chrome from the printers; this change implements this for
non-ChromeOS platforms using CUPS.

Bug: chromium:1027830
Test: added/modified tests pass
Change-Id: I860c25f4e1d468b3785d27d6288398c8c3c83196
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2130887Reviewed-by: default avatarLei Zhang <thestig@chromium.org>
Reviewed-by: default avatarSean Kau <skau@chromium.org>
Commit-Queue: Luum Habtemariam <luum@chromium.org>
Cr-Commit-Position: refs/heads/master@{#760199}
parent efd65b5d
...@@ -44,9 +44,9 @@ WEAK_CUPS_FN(httpConnect2); ...@@ -44,9 +44,9 @@ WEAK_CUPS_FN(httpConnect2);
// able to start and respond on all systems within this duration. // able to start and respond on all systems within this duration.
constexpr base::TimeDelta kCupsTimeout = base::TimeDelta::FromSeconds(5); constexpr base::TimeDelta kCupsTimeout = base::TimeDelta::FromSeconds(5);
// CUPS default max copies value (taken from default cupsMaxCopies parsing in // CUPS default max copies value (parsed from kCupsMaxCopies PPD attribute).
// cups/ppd-cache.c).
constexpr int32_t kDefaultMaxCopies = 9999; constexpr int32_t kDefaultMaxCopies = 9999;
constexpr char kCupsMaxCopies[] = "cupsMaxCopies";
constexpr char kColorDevice[] = "ColorDevice"; constexpr char kColorDevice[] = "ColorDevice";
constexpr char kColorModel[] = "ColorModel"; constexpr char kColorModel[] = "ColorModel";
...@@ -162,6 +162,16 @@ void MarkLpOptions(base::StringPiece printer_name, ppd_file_t* ppd) { ...@@ -162,6 +162,16 @@ void MarkLpOptions(base::StringPiece printer_name, ppd_file_t* ppd) {
} }
} }
int32_t GetCopiesMax(ppd_file_t* ppd) {
ppd_attr_t* attr = ppdFindAttr(ppd, kCupsMaxCopies, nullptr);
if (!attr || !attr->value) {
return kDefaultMaxCopies;
}
int32_t ret;
return base::StringToInt(attr->value, &ret) ? ret : kDefaultMaxCopies;
}
void GetDuplexSettings(ppd_file_t* ppd, void GetDuplexSettings(ppd_file_t* ppd,
std::vector<DuplexMode>* duplex_modes, std::vector<DuplexMode>* duplex_modes,
DuplexMode* duplex_default) { DuplexMode* duplex_default) {
...@@ -612,8 +622,7 @@ bool ParsePpdCapabilities(base::StringPiece printer_name, ...@@ -612,8 +622,7 @@ bool ParsePpdCapabilities(base::StringPiece printer_name,
PrinterSemanticCapsAndDefaults caps; PrinterSemanticCapsAndDefaults caps;
caps.collate_capable = true; caps.collate_capable = true;
caps.collate_default = true; caps.collate_default = true;
// TODO(crbug.com/1027830): Parse PPD for cupsMaxCopies value. caps.copies_max = GetCopiesMax(ppd);
caps.copies_max = kDefaultMaxCopies;
GetDuplexSettings(ppd, &caps.duplex_modes, &caps.duplex_default); GetDuplexSettings(ppd, &caps.duplex_modes, &caps.duplex_default);
......
...@@ -58,7 +58,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexShortEdge) { ...@@ -58,7 +58,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexShortEdge) {
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_capable);
EXPECT_TRUE(caps.collate_default); EXPECT_TRUE(caps.collate_default);
EXPECT_GT(caps.copies_max, 1); EXPECT_EQ(caps.copies_max, 9999);
EXPECT_THAT(caps.duplex_modes, EXPECT_THAT(caps.duplex_modes,
testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE)); testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE));
EXPECT_EQ(SHORT_EDGE, caps.duplex_default); EXPECT_EQ(SHORT_EDGE, caps.duplex_default);
...@@ -86,7 +86,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexSimples) { ...@@ -86,7 +86,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorDuplexSimples) {
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_capable);
EXPECT_TRUE(caps.collate_default); EXPECT_TRUE(caps.collate_default);
EXPECT_GT(caps.copies_max, 1); EXPECT_EQ(caps.copies_max, 9999);
EXPECT_THAT(caps.duplex_modes, EXPECT_THAT(caps.duplex_modes,
testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE)); testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE));
EXPECT_EQ(SIMPLEX, caps.duplex_default); EXPECT_EQ(SIMPLEX, caps.duplex_default);
...@@ -111,7 +111,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorNoDuplex) { ...@@ -111,7 +111,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingNoColorNoDuplex) {
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_capable);
EXPECT_TRUE(caps.collate_default); EXPECT_TRUE(caps.collate_default);
EXPECT_GT(caps.copies_max, 1); EXPECT_EQ(caps.copies_max, 9999);
EXPECT_THAT(caps.duplex_modes, testing::UnorderedElementsAre()); EXPECT_THAT(caps.duplex_modes, testing::UnorderedElementsAre());
EXPECT_EQ(UNKNOWN_DUPLEX_MODE, caps.duplex_default); EXPECT_EQ(UNKNOWN_DUPLEX_MODE, caps.duplex_default);
EXPECT_FALSE(caps.color_changeable); EXPECT_FALSE(caps.color_changeable);
...@@ -144,7 +144,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingColorTrueDuplexShortEdge) { ...@@ -144,7 +144,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingColorTrueDuplexShortEdge) {
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_capable);
EXPECT_TRUE(caps.collate_default); EXPECT_TRUE(caps.collate_default);
EXPECT_GT(caps.copies_max, 1); EXPECT_EQ(caps.copies_max, 9999);
EXPECT_THAT(caps.duplex_modes, EXPECT_THAT(caps.duplex_modes,
testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE)); testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE));
EXPECT_EQ(SHORT_EDGE, caps.duplex_default); EXPECT_EQ(SHORT_EDGE, caps.duplex_default);
...@@ -184,7 +184,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingColorFalseDuplexLongEdge) { ...@@ -184,7 +184,7 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingColorFalseDuplexLongEdge) {
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps)); EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_TRUE(caps.collate_capable); EXPECT_TRUE(caps.collate_capable);
EXPECT_TRUE(caps.collate_default); EXPECT_TRUE(caps.collate_default);
EXPECT_GT(caps.copies_max, 1); EXPECT_EQ(caps.copies_max, 9999);
EXPECT_THAT(caps.duplex_modes, EXPECT_THAT(caps.duplex_modes,
testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE)); testing::UnorderedElementsAre(SIMPLEX, LONG_EDGE, SHORT_EDGE));
EXPECT_EQ(LONG_EDGE, caps.duplex_default); EXPECT_EQ(LONG_EDGE, caps.duplex_default);
...@@ -439,4 +439,32 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingXeroxPrinters) { ...@@ -439,4 +439,32 @@ TEST(PrintBackendCupsHelperTest, TestPpdParsingXeroxPrinters) {
VerifyCapabilityColorModels(caps); VerifyCapabilityColorModels(caps);
} }
TEST(PrintBackendCupsHelperTest, TestPpdParsingCupsMaxCopies) {
{
constexpr char kTestPpdData[] =
R"(*PPD-Adobe: "4.3"
*cupsMaxCopies: 99
*OpenUI *ColorMode/Color Mode: Boolean
*DefaultColorMode: True
*CloseUI: *ColorMode)";
PrinterSemanticCapsAndDefaults caps;
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_EQ(caps.copies_max, 99);
}
{
constexpr char kTestPpdData[] =
R"(*PPD-Adobe: "4.3"
*cupsMaxCopies: notavalidnumber
*OpenUI *ColorMode/Color Mode: Boolean
*DefaultColorMode: True
*CloseUI: *ColorMode)";
PrinterSemanticCapsAndDefaults caps;
EXPECT_TRUE(ParsePpdCapabilities("test", "", kTestPpdData, &caps));
EXPECT_EQ(caps.copies_max, 9999);
}
}
} // namespace printing } // namespace printing
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment