Index: printing/backend/print_backend_cups_ipp.cc |
diff --git a/printing/backend/print_backend_cups_ipp.cc b/printing/backend/print_backend_cups_ipp.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..34139e482b3a7780e09202cbf0bb7045e8259fe2 |
--- /dev/null |
+++ b/printing/backend/print_backend_cups_ipp.cc |
@@ -0,0 +1,153 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "printing/backend/print_backend_cups_ipp.h" |
+ |
+#include <cups/cups.h> |
+#include <dlfcn.h> |
+#include <errno.h> |
+#include <pthread.h> |
+ |
+#include <memory> |
+#include <utility> |
+#include <vector> |
+ |
+#include "base/debug/leak_annotations.h" |
+#include "base/files/file_util.h" |
+#include "base/lazy_instance.h" |
+#include "base/logging.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "base/strings/string_split.h" |
+#include "base/strings/string_util.h" |
+#include "base/synchronization/lock.h" |
+#include "base/values.h" |
+#include "printing/backend/cups_connection.h" |
+#include "printing/backend/cups_ipp_util.h" |
+#include "printing/backend/print_backend_consts.h" |
+#include "printing/units.h" |
+#include "url/gurl.h" |
+ |
+namespace printing { |
+ |
+PrintBackendCupsIpp::PrintBackendCupsIpp( |
+ std::unique_ptr<CupsConnection> cups_connection) |
+ : cups_connection_(std::move(cups_connection)) {} |
+ |
+PrintBackendCupsIpp::~PrintBackendCupsIpp() {} |
+ |
+bool PrintBackendCupsIpp::EnumeratePrinters(PrinterList* printer_list) { |
+ DCHECK(printer_list); |
+ printer_list->clear(); |
+ |
+ std::vector<CupsPrinter> printers = cups_connection_->GetDests(); |
+ if (printers.empty()) { |
+ LOG(WARNING) << "CUPS: Error getting printers from CUPS server" |
+ << ", server: " << cups_connection_->server_name() |
+ << ", error: " |
+ << static_cast<int>(cups_connection_->last_error()); |
+ |
+ return false; |
+ } |
+ |
+ for (const auto& printer : printers) { |
+ PrinterBasicInfo basic_info; |
+ if (printer.ToPrinterInfo(&basic_info)) { |
+ printer_list->push_back(basic_info); |
+ } |
+ } |
+ |
+ return true; |
+} |
+ |
+std::string PrintBackendCupsIpp::GetDefaultPrinterName() { |
+ std::vector<CupsPrinter> printers = cups_connection_->GetDests(); |
+ for (const auto& printer : printers) { |
+ if (printer.is_default()) { |
+ return printer.GetName(); |
+ } |
+ } |
+ |
+ return std::string(); |
+} |
+ |
+bool PrintBackendCupsIpp::GetPrinterBasicInfo(const std::string& printer_name, |
+ PrinterBasicInfo* printer_info) { |
+ std::unique_ptr<CupsPrinter> printer( |
+ cups_connection_->GetPrinter(printer_name)); |
+ if (!printer || !printer->IsAvailable()) |
+ return false; |
+ |
+ DCHECK_EQ(printer_name, printer->GetName()); |
+ |
+ return printer->ToPrinterInfo(printer_info); |
+} |
+ |
+bool PrintBackendCupsIpp::GetPrinterSemanticCapsAndDefaults( |
+ const std::string& printer_name, |
+ PrinterSemanticCapsAndDefaults* printer_info) { |
+ std::unique_ptr<CupsPrinter> printer( |
+ cups_connection_->GetPrinter(printer_name)); |
+ if (!printer) |
+ return false; |
+ |
+ CapsAndDefaultsFromPrinter(*printer, printer_info); |
+ |
+ return true; |
+} |
+ |
+bool PrintBackendCupsIpp::GetPrinterCapsAndDefaults( |
+ const std::string& printer_name, |
+ PrinterCapsAndDefaults* printer_info) { |
+ DCHECK(printer_info); |
+ |
+ // Read the ppd file for Cloud Print. We don't use PPD anymore otherwise. |
+ std::unique_ptr<CupsPrinter> printer( |
+ cups_connection_->GetPrinter(printer_name)); |
+ if (!printer) |
+ return false; |
+ |
+ base::FilePath ppd_path(printer->GetPPD()); |
+ // In some cases CUPS failed to get ppd file. |
+ if (ppd_path.empty()) { |
+ LOG(ERROR) << "CUPS: Failed to get PPD, printer name: " << printer_name; |
+ return false; |
+ } |
+ |
+ std::string content; |
+ bool res = base::ReadFileToString(ppd_path, &content); |
+ |
+ base::DeleteFile(ppd_path, false); |
+ |
+ if (res) { |
+ printer_info->printer_capabilities.swap(content); |
+ printer_info->caps_mime_type = "application/pagemaker"; |
+ // In CUPS, printer defaults is a part of PPD file. Nothing to upload here. |
+ printer_info->printer_defaults.clear(); |
+ printer_info->defaults_mime_type.clear(); |
+ } |
+ |
+ return res; |
+} |
+ |
+std::string PrintBackendCupsIpp::GetPrinterDriverInfo( |
+ const std::string& printer_name) { |
+ std::unique_ptr<CupsPrinter> printer( |
+ cups_connection_->GetPrinter(printer_name)); |
+ if (!printer || !printer->IsAvailable()) |
+ return std::string(); |
+ |
+ DCHECK_EQ(printer_name, printer->GetName()); |
+ return printer->GetMakeAndModel(); |
+} |
+ |
+bool PrintBackendCupsIpp::IsValidPrinter(const std::string& printer_name) { |
+ std::unique_ptr<CupsPrinter> printer( |
+ cups_connection_->GetPrinter(printer_name)); |
+ if (!printer) |
+ return false; |
+ |
+ return printer->IsAvailable(); |
+} |
+ |
+} // namespace printing |