| Index: chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
|
| diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
|
| index f8d13d1b06d433c35fa5a676a6674747a9c409ac..49a7f9af282960d7f56f05cdbda93eafa91cbd8b 100644
|
| --- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
|
| +++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
|
| @@ -17,11 +17,13 @@
|
| #include "base/threading/sequenced_task_runner_handle.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/chromeos/printing/combining_printer_detector.h"
|
| #include "chrome/browser/chromeos/printing/ppd_provider_factory.h"
|
| #include "chrome/browser/chromeos/printing/printer_configurer.h"
|
| -#include "chrome/browser/chromeos/printing/printer_discoverer.h"
|
| #include "chrome/browser/chromeos/printing/printer_info.h"
|
| #include "chrome/browser/chromeos/printing/printers_manager_factory.h"
|
| +#include "chrome/browser/chromeos/printing/usb_printer_detector.h"
|
| +#include "chrome/browser/chromeos/printing/usb_printer_detector_factory.h"
|
| #include "chrome/browser/download/download_prefs.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/ui/browser_finder.h"
|
| @@ -126,11 +128,11 @@ std::string GetPrinterQueue(const base::DictionaryValue& printer_dict) {
|
| } // namespace
|
|
|
| CupsPrintersHandler::CupsPrintersHandler(content::WebUI* webui)
|
| - : printer_discoverer_(nullptr),
|
| + : printer_detector_(nullptr),
|
| profile_(Profile::FromWebUI(webui)),
|
| weak_factory_(this) {
|
| ppd_provider_ = printing::CreateProvider(profile_);
|
| - printer_configurer_ = chromeos::PrinterConfigurer::Create(profile_);
|
| + printer_configurer_ = PrinterConfigurer::Create(profile_);
|
| }
|
|
|
| CupsPrintersHandler::~CupsPrintersHandler() {}
|
| @@ -224,8 +226,7 @@ void CupsPrintersHandler::HandleRemoveCupsPrinter(const base::ListValue* args) {
|
| Printer::PrinterProtocol protocol = printer->GetProtocol();
|
| prefs->RemovePrinter(printer_id);
|
|
|
| - chromeos::DebugDaemonClient* client =
|
| - chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
|
| + DebugDaemonClient* client = DBusThreadManager::Get()->GetDebugDaemonClient();
|
| client->CupsRemovePrinter(printer_name,
|
| base::Bind(&OnRemovedPrinter, protocol),
|
| base::Bind(&base::DoNothing));
|
| @@ -290,10 +291,9 @@ void CupsPrintersHandler::HandleGetPrinterInfo(const base::ListValue* args) {
|
| }
|
| }
|
|
|
| - ::chromeos::QueryIppPrinter(
|
| - host.as_string(), port, printer_queue,
|
| - base::Bind(&CupsPrintersHandler::OnPrinterInfo,
|
| - weak_factory_.GetWeakPtr(), callback_id));
|
| + QueryIppPrinter(host.as_string(), port, printer_queue,
|
| + base::Bind(&CupsPrintersHandler::OnPrinterInfo,
|
| + weak_factory_.GetWeakPtr(), callback_id));
|
| }
|
|
|
| void CupsPrintersHandler::OnPrinterInfo(const std::string& callback_id,
|
| @@ -390,14 +390,13 @@ void CupsPrintersHandler::HandleAddCupsPrinter(const base::ListValue* args) {
|
| weak_factory_.GetWeakPtr(), base::Passed(&printer)));
|
| }
|
|
|
| -void CupsPrintersHandler::OnAddedPrinter(
|
| - std::unique_ptr<Printer> printer,
|
| - chromeos::PrinterSetupResult result_code) {
|
| +void CupsPrintersHandler::OnAddedPrinter(std::unique_ptr<Printer> printer,
|
| + PrinterSetupResult result_code) {
|
| std::string printer_name = printer->display_name();
|
| UMA_HISTOGRAM_ENUMERATION("Printing.CUPS.PrinterSetupResult", result_code,
|
| - chromeos::PrinterSetupResult::kMaxValue);
|
| + PrinterSetupResult::kMaxValue);
|
| switch (result_code) {
|
| - case chromeos::PrinterSetupResult::kSuccess: {
|
| + case PrinterSetupResult::kSuccess: {
|
| UMA_HISTOGRAM_ENUMERATION("Printing.CUPS.PrinterAdded",
|
| printer->GetProtocol(), Printer::kProtocolMax);
|
| auto* manager = PrintersManagerFactory::GetForBrowserContext(profile_);
|
| @@ -405,32 +404,32 @@ void CupsPrintersHandler::OnAddedPrinter(
|
| manager->RegisterPrinter(std::move(printer));
|
| break;
|
| }
|
| - case chromeos::PrinterSetupResult::kPpdNotFound:
|
| + case PrinterSetupResult::kPpdNotFound:
|
| LOG(WARNING) << "Could not locate requested PPD";
|
| break;
|
| - case chromeos::PrinterSetupResult::kPpdTooLarge:
|
| + case PrinterSetupResult::kPpdTooLarge:
|
| LOG(WARNING) << "PPD is too large";
|
| break;
|
| - case chromeos::PrinterSetupResult::kPpdUnretrievable:
|
| + case PrinterSetupResult::kPpdUnretrievable:
|
| LOG(WARNING) << "Could not retrieve PPD from server";
|
| break;
|
| - case chromeos::PrinterSetupResult::kInvalidPpd:
|
| + case PrinterSetupResult::kInvalidPpd:
|
| LOG(WARNING) << "Provided PPD is invalid.";
|
| break;
|
| - case chromeos::PrinterSetupResult::kPrinterUnreachable:
|
| + case PrinterSetupResult::kPrinterUnreachable:
|
| LOG(WARNING) << "Could not contact printer for configuration";
|
| break;
|
| - case chromeos::PrinterSetupResult::kDbusError:
|
| - case chromeos::PrinterSetupResult::kFatalError:
|
| + case PrinterSetupResult::kDbusError:
|
| + case PrinterSetupResult::kFatalError:
|
| LOG(ERROR) << "Unrecoverable error. Reboot required.";
|
| break;
|
| - case chromeos::PrinterSetupResult::kMaxValue:
|
| + case PrinterSetupResult::kMaxValue:
|
| NOTREACHED() << "This is not an expected value";
|
| break;
|
| }
|
| CallJavascriptFunction(
|
| "cr.webUIListenerCallback", base::Value("on-add-cups-printer"),
|
| - base::Value(result_code == chromeos::PrinterSetupResult::kSuccess),
|
| + base::Value(result_code == PrinterSetupResult::kSuccess),
|
| base::Value(printer_name));
|
| }
|
|
|
| @@ -495,30 +494,28 @@ void CupsPrintersHandler::HandleSelectPPDFile(const base::ListValue* args) {
|
|
|
| void CupsPrintersHandler::ResolveManufacturersDone(
|
| const std::string& js_callback,
|
| - chromeos::printing::PpdProvider::CallbackResultCode result_code,
|
| + printing::PpdProvider::CallbackResultCode result_code,
|
| const std::vector<std::string>& manufacturers) {
|
| auto manufacturers_value = base::MakeUnique<base::ListValue>();
|
| - if (result_code == chromeos::printing::PpdProvider::SUCCESS) {
|
| + if (result_code == printing::PpdProvider::SUCCESS) {
|
| manufacturers_value->AppendStrings(manufacturers);
|
| }
|
| base::DictionaryValue response;
|
| - response.SetBoolean("success",
|
| - result_code == chromeos::printing::PpdProvider::SUCCESS);
|
| + response.SetBoolean("success", result_code == printing::PpdProvider::SUCCESS);
|
| response.Set("manufacturers", std::move(manufacturers_value));
|
| ResolveJavascriptCallback(base::Value(js_callback), response);
|
| }
|
|
|
| void CupsPrintersHandler::ResolvePrintersDone(
|
| const std::string& js_callback,
|
| - chromeos::printing::PpdProvider::CallbackResultCode result_code,
|
| + printing::PpdProvider::CallbackResultCode result_code,
|
| const std::vector<std::string>& printers) {
|
| auto printers_value = base::MakeUnique<base::ListValue>();
|
| - if (result_code == chromeos::printing::PpdProvider::SUCCESS) {
|
| + if (result_code == printing::PpdProvider::SUCCESS) {
|
| printers_value->AppendStrings(printers);
|
| }
|
| base::DictionaryValue response;
|
| - response.SetBoolean("success",
|
| - result_code == chromeos::printing::PpdProvider::SUCCESS);
|
| + response.SetBoolean("success", result_code == printing::PpdProvider::SUCCESS);
|
| response.Set("models", std::move(printers_value));
|
| ResolveJavascriptCallback(base::Value(js_callback), response);
|
| }
|
| @@ -533,31 +530,45 @@ void CupsPrintersHandler::FileSelected(const base::FilePath& path,
|
| }
|
|
|
| void CupsPrintersHandler::HandleStartDiscovery(const base::ListValue* args) {
|
| - if (!printer_discoverer_.get()) {
|
| - printer_discoverer_ =
|
| - chromeos::PrinterDiscoverer::CreateForProfile(profile_);
|
| - }
|
| -
|
| - printer_discoverer_->AddObserver(this);
|
| + // Create (or recreate) the printer_detector_. If one already existed, we
|
| + // want to start over anyways.
|
| + printer_detector_ = CombiningPrinterDetector::Create();
|
| + PrinterDetector* usb_detector =
|
| + UsbPrinterDetectorFactory::GetInstance()->Get(profile_);
|
| + DCHECK(usb_detector);
|
| + printer_detector_->AddDetector(usb_detector);
|
| + printer_detector_->AddObserver(this);
|
| + OnPrintersFound(printer_detector_->GetPrinters());
|
| + printer_detector_->Start();
|
| }
|
|
|
| void CupsPrintersHandler::HandleStopDiscovery(const base::ListValue* args) {
|
| - printer_discoverer_.reset();
|
| + printer_detector_.reset();
|
| }
|
|
|
| void CupsPrintersHandler::OnPrintersFound(
|
| const std::vector<Printer>& printers) {
|
| std::unique_ptr<base::ListValue> printers_list =
|
| base::MakeUnique<base::ListValue>();
|
| - for (const auto& printer : printers) {
|
| - printers_list->Append(GetPrinterInfo(printer));
|
| + // Filter out already-configured printers as we go.
|
| + PrintersManager* printers_manager =
|
| + PrintersManagerFactory::GetForBrowserContext(profile_);
|
| + if (printers_manager != nullptr) {
|
| + for (const auto& printer : printers) {
|
| + if (printers_manager->GetPrinter(printer.id()).get() == nullptr) {
|
| + printers_list->Append(GetPrinterInfo(printer));
|
| + }
|
| + }
|
| + } else {
|
| + LOG(WARNING) << "Failing to get available printers because no "
|
| + "PrintersManager exists.";
|
| }
|
| -
|
| FireWebUIListener("on-printer-discovered", *printers_list);
|
| }
|
|
|
| -void CupsPrintersHandler::OnDiscoveryInitialScanDone(int printer_count) {
|
| - UMA_HISTOGRAM_COUNTS_100("Printing.CUPS.PrintersDiscovered", printer_count);
|
| +void CupsPrintersHandler::OnPrinterScanComplete() {
|
| + UMA_HISTOGRAM_COUNTS_100("Printing.CUPS.PrintersDiscovered",
|
| + printer_detector_->GetPrinters().size());
|
| FireWebUIListener("on-printer-discovery-done");
|
| }
|
|
|
|
|