Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1237)

Side by Side Diff: printing/backend/cups_helper.cc

Issue 334763002: Add paper size reporting for CUPS printers (to let user to select one in the Print Preview). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add unit test for PPD page size extraction, log error on PPD file opening, address other cl comment… Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/file_util.h" 10 #include "base/file_util.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/path_service.h" 12 #include "base/path_service.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_split.h" 14 #include "base/strings/string_split.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "base/values.h" 16 #include "base/values.h"
17 #include "printing/backend/print_backend.h" 17 #include "printing/backend/print_backend.h"
18 #include "printing/backend/print_backend_consts.h" 18 #include "printing/backend/print_backend_consts.h"
19 #include "printing/units.h"
19 #include "url/gurl.h" 20 #include "url/gurl.h"
20 21
21 namespace printing { 22 namespace printing {
22 23
23 // This section contains helper code for PPD parsing for semantic capabilities. 24 // This section contains helper code for PPD parsing for semantic capabilities.
24 namespace { 25 namespace {
25 26
26 const char kColorDevice[] = "ColorDevice"; 27 const char kColorDevice[] = "ColorDevice";
27 const char kColorModel[] = "ColorModel"; 28 const char kColorModel[] = "ColorModel";
28 const char kColorMode[] = "ColorMode"; 29 const char kColorMode[] = "ColorMode";
29 const char kProcessColorModel[] = "ProcessColorModel"; 30 const char kProcessColorModel[] = "ProcessColorModel";
30 const char kPrintoutMode[] = "PrintoutMode"; 31 const char kPrintoutMode[] = "PrintoutMode";
31 const char kDraftGray[] = "Draft.Gray"; 32 const char kDraftGray[] = "Draft.Gray";
32 const char kHighGray[] = "High.Gray"; 33 const char kHighGray[] = "High.Gray";
33 34
34 const char kDuplex[] = "Duplex"; 35 const char kDuplex[] = "Duplex";
35 const char kDuplexNone[] = "None"; 36 const char kDuplexNone[] = "None";
37 const char kPageSize[] = "PageSize";
38
39 const double kMicronsPerPoint = kHundrethsMMPerInch / kPointsPerInch * 10;
36 40
37 #if !defined(OS_MACOSX) 41 #if !defined(OS_MACOSX)
38 void ParseLpOptions(const base::FilePath& filepath, 42 void ParseLpOptions(const base::FilePath& filepath,
39 const std::string& printer_name, 43 const std::string& printer_name,
40 int* num_options, cups_option_t** options) { 44 int* num_options, cups_option_t** options) {
41 std::string content; 45 std::string content;
42 if (!base::ReadFileToString(filepath, &content)) 46 if (!base::ReadFileToString(filepath, &content))
43 return; 47 return;
44 48
45 const char kDest[] = "dest"; 49 const char kDest[] = "dest";
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 int data_size = printer_capabilities.length(); 355 int data_size = printer_capabilities.length();
352 if (data_size != base::WriteFile( 356 if (data_size != base::WriteFile(
353 ppd_file_path, 357 ppd_file_path,
354 printer_capabilities.data(), 358 printer_capabilities.data(),
355 data_size)) { 359 data_size)) {
356 base::DeleteFile(ppd_file_path, false); 360 base::DeleteFile(ppd_file_path, false);
357 return false; 361 return false;
358 } 362 }
359 363
360 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str()); 364 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str());
361 if (!ppd) 365 if (!ppd) {
366 int line = 0;
367 ppd_status_t ppd_status = ppdLastError(&line);
368 LOG(ERROR) << "Failed to open PDD file: error " << ppd_status << " at line "
369 << line << ", " << ppdErrorString(ppd_status);
362 return false; 370 return false;
371 }
363 372
364 printing::PrinterSemanticCapsAndDefaults caps; 373 printing::PrinterSemanticCapsAndDefaults caps;
365 #if !defined(OS_MACOSX) 374 #if !defined(OS_MACOSX)
366 MarkLpOptions(printer_name, &ppd); 375 MarkLpOptions(printer_name, &ppd);
367 #endif 376 #endif
368 caps.collate_capable = true; 377 caps.collate_capable = true;
369 caps.collate_default = true; 378 caps.collate_default = true;
370 caps.copies_capable = true; 379 caps.copies_capable = true;
371 380
372 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex); 381 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex);
(...skipping 17 matching lines...) Expand all
390 VLOG(1) << "Unknown printer color model"; 399 VLOG(1) << "Unknown printer color model";
391 } 400 }
392 401
393 caps.color_changeable = ((cm_color != UNKNOWN_COLOR_MODEL) && 402 caps.color_changeable = ((cm_color != UNKNOWN_COLOR_MODEL) &&
394 (cm_black != UNKNOWN_COLOR_MODEL) && 403 (cm_black != UNKNOWN_COLOR_MODEL) &&
395 (cm_color != cm_black)); 404 (cm_color != cm_black));
396 caps.color_default = is_color; 405 caps.color_default = is_color;
397 caps.color_model = cm_color; 406 caps.color_model = cm_color;
398 caps.bw_model = cm_black; 407 caps.bw_model = cm_black;
399 408
409 if (ppd->num_sizes > 0 && ppd->sizes) {
410 VLOG(1) << "Paper list size - " << ppd->num_sizes;
411 ppd_option_t* paper_option = ppdFindOption(ppd, kPageSize);
412 for (int i = 0; i < ppd->num_sizes; ++i) {
413 gfx::Size paper_size_microns(
414 static_cast<int>(ppd->sizes[i].width * kMicronsPerPoint + 0.5),
415 static_cast<int>(ppd->sizes[i].length * kMicronsPerPoint + 0.5));
416 if (paper_size_microns.width() > 0 && paper_size_microns.height() > 0) {
417 PrinterSemanticCapsAndDefaults::Paper paper;
418 paper.size_um = paper_size_microns;
419 paper.vendor_id = ppd->sizes[i].name;
420 if (paper_option) {
421 ppd_choice_t* paper_choice =
422 ppdFindChoice(paper_option, ppd->sizes[i].name);
423 // Human readable paper name should be UTF-8 encoded, but some PPDs
424 // do not follow this standard.
425 if (paper_choice && base::IsStringUTF8(paper_choice->text)) {
426 paper.display_name = paper_choice->text;
427 }
428 }
429 caps.papers.push_back(paper);
430 if (i == 0 || ppd->sizes[i].marked) {
431 caps.default_paper = paper;
432 }
433 }
434 }
435 }
436
400 ppdClose(ppd); 437 ppdClose(ppd);
401 base::DeleteFile(ppd_file_path, false); 438 base::DeleteFile(ppd_file_path, false);
402 439
403 *printer_info = caps; 440 *printer_info = caps;
404 return true; 441 return true;
405 } 442 }
406 443
407 } // namespace printing 444 } // namespace printing
OLDNEW
« no previous file with comments | « chrome/common/cloud_print/cloud_print_cdd_conversion.cc ('k') | printing/backend/cups_helper_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698