print_backend_cups_ipp.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "printing/backend/print_backend_cups_ipp.h"
  5. #include <cups/cups.h>
  6. #include <memory>
  7. #include <utility>
  8. #include <vector>
  9. #include "base/files/file_util.h"
  10. #include "base/logging.h"
  11. #include "base/strings/string_number_conversions.h"
  12. #include "base/strings/string_util.h"
  13. #include "printing/backend/cups_connection.h"
  14. #include "printing/backend/cups_ipp_helper.h"
  15. #include "printing/backend/print_backend_consts.h"
  16. #include "printing/mojom/print.mojom.h"
  17. #include "printing/units.h"
  18. namespace printing {
  19. PrintBackendCupsIpp::PrintBackendCupsIpp(
  20. std::unique_ptr<CupsConnection> cups_connection)
  21. : cups_connection_(std::move(cups_connection)) {}
  22. PrintBackendCupsIpp::~PrintBackendCupsIpp() = default;
  23. mojom::ResultCode PrintBackendCupsIpp::EnumeratePrinters(
  24. PrinterList& printer_list) {
  25. DCHECK(printer_list.empty());
  26. std::vector<std::unique_ptr<CupsPrinter>> printers;
  27. if (!cups_connection_->GetDests(printers)) {
  28. LOG(WARNING) << "CUPS: Error getting printers from CUPS server"
  29. << ", server: " << cups_connection_->server_name()
  30. << ", error: " << cups_connection_->last_error() << " - "
  31. << cups_connection_->last_error_message();
  32. return mojom::ResultCode::kFailed;
  33. }
  34. VLOG(1) << "CUPS: found " << printers.size()
  35. << " printers from CUPS server: " << cups_connection_->server_name();
  36. for (const auto& printer : printers) {
  37. PrinterBasicInfo basic_info;
  38. if (printer->ToPrinterInfo(&basic_info)) {
  39. printer_list.push_back(basic_info);
  40. }
  41. }
  42. return mojom::ResultCode::kSuccess;
  43. }
  44. mojom::ResultCode PrintBackendCupsIpp::GetDefaultPrinterName(
  45. std::string& default_printer) {
  46. std::vector<std::unique_ptr<CupsPrinter>> printers;
  47. if (!cups_connection_->GetDests(printers)) {
  48. LOG(ERROR) << "CUPS: unable to get default printer: "
  49. << cupsLastErrorString();
  50. return mojom::ResultCode::kFailed;
  51. }
  52. for (const auto& printer : printers) {
  53. if (printer->is_default()) {
  54. default_printer = printer->GetName();
  55. return mojom::ResultCode::kSuccess;
  56. }
  57. }
  58. default_printer = std::string();
  59. return mojom::ResultCode::kSuccess;
  60. }
  61. mojom::ResultCode PrintBackendCupsIpp::GetPrinterBasicInfo(
  62. const std::string& printer_name,
  63. PrinterBasicInfo* printer_info) {
  64. std::unique_ptr<CupsPrinter> printer(
  65. cups_connection_->GetPrinter(printer_name));
  66. if (!printer)
  67. return mojom::ResultCode::kFailed;
  68. DCHECK_EQ(printer_name, printer->GetName());
  69. return printer->ToPrinterInfo(printer_info) ? mojom::ResultCode::kSuccess
  70. : mojom::ResultCode::kFailed;
  71. }
  72. mojom::ResultCode PrintBackendCupsIpp::GetPrinterCapsAndDefaults(
  73. const std::string& printer_name,
  74. PrinterCapsAndDefaults* printer_info) {
  75. NOTREACHED();
  76. return mojom::ResultCode::kFailed;
  77. }
  78. mojom::ResultCode PrintBackendCupsIpp::GetPrinterSemanticCapsAndDefaults(
  79. const std::string& printer_name,
  80. PrinterSemanticCapsAndDefaults* printer_info) {
  81. std::unique_ptr<CupsPrinter> printer(
  82. cups_connection_->GetPrinter(printer_name));
  83. if (!printer || !printer->EnsureDestInfo())
  84. return mojom::ResultCode::kFailed;
  85. CapsAndDefaultsFromPrinter(*printer, printer_info);
  86. return mojom::ResultCode::kSuccess;
  87. }
  88. std::string PrintBackendCupsIpp::GetPrinterDriverInfo(
  89. const std::string& printer_name) {
  90. std::unique_ptr<CupsPrinter> printer(
  91. cups_connection_->GetPrinter(printer_name));
  92. if (!printer)
  93. return std::string();
  94. DCHECK_EQ(printer_name, printer->GetName());
  95. return printer->GetMakeAndModel();
  96. }
  97. bool PrintBackendCupsIpp::IsValidPrinter(const std::string& printer_name) {
  98. return !!cups_connection_->GetPrinter(printer_name);
  99. }
  100. } // namespace printing