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

Side by Side Diff: chrome/browser/printing/print_system_task_proxy.cc

Issue 8572036: CUPS: Add a regression test for duplex detection. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/printing/print_system_task_proxy.h" 5 #include "chrome/browser/printing/print_system_task_proxy.h"
6 6
7 #include <ctype.h> 7 #include <ctype.h>
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
14 #include "base/string_split.h" 14 #include "base/string_split.h"
15 #include "base/string_util.h" 15 #include "base/string_util.h"
16 #include "base/values.h" 16 #include "base/values.h"
17 #include "chrome/browser/ui/webui/print_preview_handler.h"
17 #include "printing/backend/print_backend.h" 18 #include "printing/backend/print_backend.h"
18 #include "printing/print_job_constants.h" 19 #include "printing/print_job_constants.h"
19 #include "printing/print_settings.h" 20 #include "printing/print_settings.h"
20 21
21 #if defined(USE_CUPS) 22 #if defined(USE_CUPS)
22 #include <cups/cups.h> 23 #include <cups/cups.h>
23 #include <cups/ppd.h> 24 #include <cups/ppd.h>
24 25
25 #include "base/file_util.h" 26 #include "base/file_util.h"
26 #endif 27 #endif
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 305
305 PrintSystemTaskProxy::PrintSystemTaskProxy( 306 PrintSystemTaskProxy::PrintSystemTaskProxy(
306 const base::WeakPtr<PrintPreviewHandler>& handler, 307 const base::WeakPtr<PrintPreviewHandler>& handler,
307 printing::PrintBackend* print_backend, 308 printing::PrintBackend* print_backend,
308 bool has_logged_printers_count) 309 bool has_logged_printers_count)
309 : handler_(handler), 310 : handler_(handler),
310 print_backend_(print_backend), 311 print_backend_(print_backend),
311 has_logged_printers_count_(has_logged_printers_count) { 312 has_logged_printers_count_(has_logged_printers_count) {
312 } 313 }
313 314
315 #if defined(UNIT_TEST) && defined(USE_CUPS)
316 // Only used for testing.
317 PrintSystemTaskProxy::PrintSystemTaskProxy() {
318 }
319 #endif
320
314 PrintSystemTaskProxy::~PrintSystemTaskProxy() { 321 PrintSystemTaskProxy::~PrintSystemTaskProxy() {
315 } 322 }
316 323
317 void PrintSystemTaskProxy::GetDefaultPrinter() { 324 void PrintSystemTaskProxy::GetDefaultPrinter() {
318 VLOG(1) << "Get default printer start"; 325 VLOG(1) << "Get default printer start";
319 std::string* default_printer = NULL; 326 std::string* default_printer = NULL;
320 if (PrintPreviewHandler::last_used_printer_name_ == NULL) { 327 if (PrintPreviewHandler::last_used_printer_name_ == NULL) {
321 default_printer = new std::string(print_backend_->GetDefaultPrinterName()); 328 default_printer = new std::string(print_backend_->GetDefaultPrinterName());
322 } else { 329 } else {
323 default_printer = new std::string( 330 default_printer = new std::string(
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 BrowserThread::UI, FROM_HERE, 387 BrowserThread::UI, FROM_HERE,
381 base::Bind(&PrintSystemTaskProxy::SetupPrinterList, this, printers)); 388 base::Bind(&PrintSystemTaskProxy::SetupPrinterList, this, printers));
382 } 389 }
383 390
384 void PrintSystemTaskProxy::SetupPrinterList(ListValue* printers) { 391 void PrintSystemTaskProxy::SetupPrinterList(ListValue* printers) {
385 if (handler_) 392 if (handler_)
386 handler_->SetupPrinterList(*printers); 393 handler_->SetupPrinterList(*printers);
387 delete printers; 394 delete printers;
388 } 395 }
389 396
390 void PrintSystemTaskProxy::GetPrinterCapabilities(
391 const std::string& printer_name) {
392 VLOG(1) << "Get printer capabilities start for " << printer_name;
393 printing::PrinterCapsAndDefaults printer_info;
394
395 bool set_color_as_default = false;
396 bool disable_color_options = true;
397 bool set_duplex_as_default = false;
398 int printer_color_space_for_color = printing::UNKNOWN_COLOR_MODEL;
399 int printer_color_space_for_black = printing::UNKNOWN_COLOR_MODEL;
400 int default_duplex_setting_value = printing::UNKNOWN_DUPLEX_MODE;
401 if (!print_backend_->GetPrinterCapsAndDefaults(printer_name,
402 &printer_info)) {
403 return;
404 }
405
406 #if defined(USE_CUPS) 397 #if defined(USE_CUPS)
398 bool PrintSystemTaskProxy::GetPrinterCapabilitiesCUPS(
399 const printing::PrinterCapsAndDefaults& printer_info,
400 const std::string& printer_name,
401 bool* set_color_as_default,
402 int* printer_color_space_for_color,
403 int* printer_color_space_for_black,
404 bool* set_duplex_as_default,
405 int* default_duplex_setting_value) {
407 FilePath ppd_file_path; 406 FilePath ppd_file_path;
408 if (!file_util::CreateTemporaryFile(&ppd_file_path)) 407 if (!file_util::CreateTemporaryFile(&ppd_file_path))
409 return; 408 return false;
410 409
411 int data_size = printer_info.printer_capabilities.length(); 410 int data_size = printer_info.printer_capabilities.length();
412 if (data_size != file_util::WriteFile( 411 if (data_size != file_util::WriteFile(
413 ppd_file_path, 412 ppd_file_path,
414 printer_info.printer_capabilities.data(), 413 printer_info.printer_capabilities.data(),
415 data_size)) { 414 data_size)) {
416 file_util::Delete(ppd_file_path, false); 415 file_util::Delete(ppd_file_path, false);
417 return; 416 return false;
418 } 417 }
419 418
420 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str()); 419 ppd_file_t* ppd = ppdOpenFile(ppd_file_path.value().c_str());
421 if (ppd) { 420 if (ppd) {
422 #if !defined(OS_MACOSX) 421 #if !defined(OS_MACOSX)
423 printing_internal::mark_lpoptions(printer_name, &ppd); 422 printing_internal::mark_lpoptions(printer_name, &ppd);
424 #endif 423 #endif
425 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex); 424 ppd_choice_t* duplex_choice = ppdFindMarkedChoice(ppd, kDuplex);
426 if (!duplex_choice) { 425 if (!duplex_choice) {
427 ppd_option_t* option = ppdFindOption(ppd, kDuplex); 426 ppd_option_t* option = ppdFindOption(ppd, kDuplex);
428 if (option) 427 if (option)
429 duplex_choice = ppdFindChoice(option, option->defchoice); 428 duplex_choice = ppdFindChoice(option, option->defchoice);
430 } 429 }
431 430
432 if (duplex_choice) { 431 if (duplex_choice) {
433 if (base::strcasecmp(duplex_choice->choice, kDuplexNone) != 0) { 432 if (base::strcasecmp(duplex_choice->choice, kDuplexNone) != 0) {
434 set_duplex_as_default = true; 433 *set_duplex_as_default = true;
435 default_duplex_setting_value = printing::LONG_EDGE; 434 *default_duplex_setting_value = printing::LONG_EDGE;
436 } else { 435 } else {
437 default_duplex_setting_value = printing::SIMPLEX; 436 *default_duplex_setting_value = printing::SIMPLEX;
438 } 437 }
439 } 438 }
440 439
441 bool is_color_device = false; 440 bool is_color_device = false;
442 ppd_attr_t* attr = ppdFindAttr(ppd, kColorDevice, NULL); 441 ppd_attr_t* attr = ppdFindAttr(ppd, kColorDevice, NULL);
443 if (attr && attr->value) 442 if (attr && attr->value)
444 is_color_device = ppd->color_device; 443 is_color_device = ppd->color_device;
445 disable_color_options = !is_color_device; 444 *set_color_as_default = is_color_device;
446 set_color_as_default = is_color_device;
447 445
448 if (!((is_color_device && getBasicColorModelSettings( 446 if (!((is_color_device && getBasicColorModelSettings(
449 ppd, &printer_color_space_for_black, 447 ppd, printer_color_space_for_black,
450 &printer_color_space_for_color, &set_color_as_default)) || 448 printer_color_space_for_color, set_color_as_default)) ||
451 getPrintOutModeColorSettings( 449 getPrintOutModeColorSettings(
452 ppd, &printer_color_space_for_black, 450 ppd, printer_color_space_for_black,
453 &printer_color_space_for_color, &set_color_as_default) || 451 printer_color_space_for_color, set_color_as_default) ||
454 getColorModeSettings( 452 getColorModeSettings(
455 ppd, &printer_color_space_for_black, 453 ppd, printer_color_space_for_black,
456 &printer_color_space_for_color, &set_color_as_default) || 454 printer_color_space_for_color, set_color_as_default) ||
457 getHPColorSettings( 455 getHPColorSettings(
458 ppd, &printer_color_space_for_black, 456 ppd, printer_color_space_for_black,
459 &printer_color_space_for_color, &set_color_as_default) || 457 printer_color_space_for_color, set_color_as_default) ||
460 getProcessColorModelSettings( 458 getProcessColorModelSettings(
461 ppd, &printer_color_space_for_black, 459 ppd, printer_color_space_for_black,
462 &printer_color_space_for_color, &set_color_as_default))) { 460 printer_color_space_for_color, set_color_as_default))) {
463 VLOG(1) << "Unknown printer color model"; 461 VLOG(1) << "Unknown printer color model";
464 } 462 }
465 ppdClose(ppd); 463 ppdClose(ppd);
466 } 464 }
467 file_util::Delete(ppd_file_path, false); 465 file_util::Delete(ppd_file_path, false);
468 #elif defined(OS_WIN) 466 return true;
467 }
468 #endif // defined(USE_CUPS)
469
470 #if defined(OS_WIN)
471 void PrintSystemTaskProxy::GetPrinterCapabilitiesWin(
472 const printing::PrinterCapsAndDefaults& printer_info,
473 bool* set_color_as_default,
474 int* printer_color_space_for_color,
475 int* printer_color_space_for_black,
476 bool* set_duplex_as_default,
477 int* default_duplex_setting_value) {
469 // According to XPS 1.0 spec, only color printers have psk:Color. 478 // According to XPS 1.0 spec, only color printers have psk:Color.
470 // Therefore we don't need to parse the whole XML file, we just need to 479 // Therefore we don't need to parse the whole XML file, we just need to
471 // search the string. The spec can be found at: 480 // search the string. The spec can be found at:
472 // http://msdn.microsoft.com/en-us/windows/hardware/gg463431. 481 // http://msdn.microsoft.com/en-us/windows/hardware/gg463431.
473 if (printer_info.printer_capabilities.find(kPskColor) != std::string::npos) 482 if (printer_info.printer_capabilities.find(kPskColor) != std::string::npos)
474 printer_color_space_for_color = printing::COLOR; 483 *printer_color_space_for_color = printing::COLOR;
475 484
476 if ((printer_info.printer_capabilities.find(kPskGray) != 485 if ((printer_info.printer_capabilities.find(kPskGray) !=
477 std::string::npos) || 486 std::string::npos) ||
478 (printer_info.printer_capabilities.find(kPskMonochrome) != 487 (printer_info.printer_capabilities.find(kPskMonochrome) !=
479 std::string::npos)) { 488 std::string::npos)) {
480 printer_color_space_for_black = printing::GRAY; 489 *printer_color_space_for_black = printing::GRAY;
481 } 490 }
482 set_color_as_default = 491 *set_color_as_default =
483 (printer_info.printer_defaults.find(kPskColor) != std::string::npos); 492 (printer_info.printer_defaults.find(kPskColor) != std::string::npos);
484 493
485 set_duplex_as_default = 494 *set_duplex_as_default =
486 (printer_info.printer_defaults.find(kPskDuplexFeature) != 495 (printer_info.printer_defaults.find(kPskDuplexFeature) !=
487 std::string::npos) && 496 std::string::npos) &&
488 (printer_info.printer_defaults.find(kPskTwoSided) != 497 (printer_info.printer_defaults.find(kPskTwoSided) !=
489 std::string::npos); 498 std::string::npos);
490 499
491 if (printer_info.printer_defaults.find(kPskDuplexFeature) != 500 if (printer_info.printer_defaults.find(kPskDuplexFeature) !=
492 std::string::npos) { 501 std::string::npos) {
493 if (printer_info.printer_defaults.find(kPskTwoSided) != 502 if (printer_info.printer_defaults.find(kPskTwoSided) !=
494 std::string::npos) { 503 std::string::npos) {
495 default_duplex_setting_value = printing::LONG_EDGE; 504 *default_duplex_setting_value = printing::LONG_EDGE;
496 } else { 505 } else {
497 default_duplex_setting_value = printing::SIMPLEX; 506 *default_duplex_setting_value = printing::SIMPLEX;
498 } 507 }
499 } 508 }
509 }
510 #endif // defined(OS_WIN)
511
512 void PrintSystemTaskProxy::GetPrinterCapabilities(
513 const std::string& printer_name) {
514 VLOG(1) << "Get printer capabilities start for " << printer_name;
515 printing::PrinterCapsAndDefaults printer_info;
516 if (!print_backend_->GetPrinterCapsAndDefaults(printer_name,
517 &printer_info)) {
518 return;
519 }
520
521 bool set_color_as_default = false;
522 bool set_duplex_as_default = false;
523 int printer_color_space_for_color = printing::UNKNOWN_COLOR_MODEL;
524 int printer_color_space_for_black = printing::UNKNOWN_COLOR_MODEL;
525 int default_duplex_setting_value = printing::UNKNOWN_DUPLEX_MODE;
526
527 #if defined(USE_CUPS)
528 if (!GetPrinterCapabilitiesCUPS(printer_info,
529 printer_name,
530 &set_color_as_default,
531 &printer_color_space_for_color,
532 &printer_color_space_for_black,
533 &set_duplex_as_default,
534 &default_duplex_setting_value)) {
535 return;
536 }
537 #elif defined(OS_WIN)
538 GetPrinterCapabilitiesWin(printer_info,
539 &set_color_as_default,
540 &printer_color_space_for_color,
541 &printer_color_space_for_black,
542 &set_duplex_as_default,
543 &default_duplex_setting_value);
500 #else 544 #else
501 NOTIMPLEMENTED(); 545 NOTIMPLEMENTED();
502 #endif 546 #endif
503 disable_color_options = !printer_color_space_for_color || 547 bool disable_color_options = (!printer_color_space_for_color ||
504 !printer_color_space_for_black || 548 !printer_color_space_for_black ||
505 (printer_color_space_for_color == 549 (printer_color_space_for_color ==
506 printer_color_space_for_black); 550 printer_color_space_for_black));
507 551
508 DictionaryValue settings_info; 552 DictionaryValue settings_info;
509 settings_info.SetBoolean(kDisableColorOption, disable_color_options); 553 settings_info.SetBoolean(kDisableColorOption, disable_color_options);
510 if (printer_color_space_for_color == printing::UNKNOWN_COLOR_MODEL) 554 if (printer_color_space_for_color == printing::UNKNOWN_COLOR_MODEL)
511 printer_color_space_for_color = printing::COLOR; 555 printer_color_space_for_color = printing::COLOR;
512 556
513 if (printer_color_space_for_black == printing::UNKNOWN_COLOR_MODEL) 557 if (printer_color_space_for_black == printing::UNKNOWN_COLOR_MODEL)
514 printer_color_space_for_black = printing::GRAY; 558 printer_color_space_for_black = printing::GRAY;
515 559
516 if (disable_color_options || 560 if (disable_color_options ||
(...skipping 18 matching lines...) Expand all
535 base::Bind(&PrintSystemTaskProxy::SendPrinterCapabilities, this, 579 base::Bind(&PrintSystemTaskProxy::SendPrinterCapabilities, this,
536 settings_info.DeepCopy())); 580 settings_info.DeepCopy()));
537 } 581 }
538 582
539 void PrintSystemTaskProxy::SendPrinterCapabilities( 583 void PrintSystemTaskProxy::SendPrinterCapabilities(
540 DictionaryValue* settings_info) { 584 DictionaryValue* settings_info) {
541 if (handler_) 585 if (handler_)
542 handler_->SendPrinterCapabilities(*settings_info); 586 handler_->SendPrinterCapabilities(*settings_info);
543 delete settings_info; 587 delete settings_info;
544 } 588 }
OLDNEW
« no previous file with comments | « chrome/browser/printing/print_system_task_proxy.h ('k') | chrome/browser/printing/print_system_task_proxy_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698