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 386a8f791154c238628486f5b377212b29f5197b..53abf17f57a789dd8557d4a025240a51e3893979 100644 |
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc |
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc |
@@ -19,6 +19,7 @@ |
#include "chrome/browser/ui/chrome_select_file_policy.h" |
#include "chromeos/dbus/dbus_thread_manager.h" |
#include "chromeos/dbus/debug_daemon_client.h" |
+#include "chromeos/printing/fake_printer_discoverer.h" |
#include "content/public/browser/browser_context.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/web_ui.h" |
@@ -30,12 +31,46 @@ namespace settings { |
namespace { |
-void onRemovedPrinter(bool success) {} |
+void OnRemovedPrinter(bool success) {} |
+ |
+std::unique_ptr<base::DictionaryValue> GetPrinterInfo(const Printer& printer) { |
+ std::unique_ptr<base::DictionaryValue> printer_info = |
+ base::MakeUnique<base::DictionaryValue>(); |
+ printer_info->SetString("printerId", printer.id()); |
+ printer_info->SetString("printerName", printer.display_name()); |
+ printer_info->SetString("printerDescription", printer.description()); |
+ printer_info->SetString("printerManufacturer", printer.manufacturer()); |
+ printer_info->SetString("printerModel", printer.model()); |
+ |
+ // Get protocol, ip address and queue from the printer's URI. |
+ const std::string printer_uri = printer.uri(); |
+ url::Parsed parsed; |
+ url::ParseStandardURL(printer_uri.c_str(), printer_uri.length(), &parsed); |
+ |
+ std::string scheme; |
+ std::string host; |
+ std::string path; |
+ if (parsed.scheme.len > 0) |
+ scheme = std::string(printer_uri, parsed.scheme.begin, parsed.scheme.len); |
+ if (parsed.host.len > 0) |
+ host = std::string(printer_uri, parsed.host.begin, parsed.host.len); |
+ if (parsed.path.len > 0) |
+ path = std::string(printer_uri, parsed.path.begin, parsed.path.len); |
+ |
+ printer_info->SetString("printerAddress", host); |
+ printer_info->SetString("printerProtocol", base::ToLowerASCII(scheme)); |
+ if (base::ToLowerASCII(scheme) == "lpd" && !path.empty()) |
+ printer_info->SetString("printerQueue", path.substr(1)); |
+ |
+ return printer_info; |
+} |
} // namespace |
CupsPrintersHandler::CupsPrintersHandler(content::WebUI* webui) |
- : profile_(Profile::FromWebUI(webui)), weak_factory_(this) {} |
+ : printer_discoverer_(nullptr), |
+ profile_(Profile::FromWebUI(webui)), |
+ weak_factory_(this) {} |
CupsPrintersHandler::~CupsPrintersHandler() {} |
@@ -58,6 +93,14 @@ void CupsPrintersHandler::RegisterMessages() { |
web_ui()->RegisterMessageCallback( |
"selectPPDFile", base::Bind(&CupsPrintersHandler::HandleSelectPPDFile, |
base::Unretained(this))); |
+ web_ui()->RegisterMessageCallback( |
+ "startDiscoveringPrinters", |
+ base::Bind(&CupsPrintersHandler::HandleStartDiscovery, |
+ base::Unretained(this))); |
+ web_ui()->RegisterMessageCallback( |
+ "stopDiscoveringPrinters", |
+ base::Bind(&CupsPrintersHandler::HandleStopDiscovery, |
+ base::Unretained(this))); |
} |
void CupsPrintersHandler::HandleGetCupsPrintersList( |
@@ -74,33 +117,7 @@ void CupsPrintersHandler::HandleGetCupsPrintersList( |
base::ListValue* printers_list = new base::ListValue; |
for (const std::unique_ptr<Printer>& printer : printers) { |
std::unique_ptr<base::DictionaryValue> printer_info = |
- base::MakeUnique<base::DictionaryValue>(); |
- printer_info->SetString("printerId", printer->id()); |
- printer_info->SetString("printerName", printer->display_name()); |
- printer_info->SetString("printerDescription", printer->description()); |
- printer_info->SetString("printerManufacturer", printer->manufacturer()); |
- printer_info->SetString("printerModel", printer->model()); |
- |
- // Get protocol, ip address and queue from the printer's URI. |
- const std::string printer_uri = printer->uri(); |
- url::Parsed parsed; |
- url::ParseStandardURL(printer_uri.c_str(), printer_uri.length(), &parsed); |
- |
- std::string scheme; |
- std::string host; |
- std::string path; |
- if (parsed.scheme.len > 0) |
- scheme = std::string(printer_uri, parsed.scheme.begin, parsed.scheme.len); |
- if (parsed.host.len > 0) |
- host = std::string(printer_uri, parsed.host.begin, parsed.host.len); |
- if (parsed.path.len > 0) |
- path = std::string(printer_uri, parsed.path.begin, parsed.path.len); |
- |
- printer_info->SetString("printerAddress", host); |
- printer_info->SetString("printerProtocol", base::ToLowerASCII(scheme)); |
- if (base::ToLowerASCII(scheme) == "lpd" && !path.empty()) |
- printer_info->SetString("printerQueue", path.substr(1)); |
- |
+ GetPrinterInfo(*printer.get()); |
printers_list->Append(std::move(printer_info)); |
} |
@@ -132,7 +149,7 @@ void CupsPrintersHandler::HandleRemoveCupsPrinter(const base::ListValue* args) { |
chromeos::DebugDaemonClient* client = |
chromeos::DBusThreadManager::Get()->GetDebugDaemonClient(); |
- client->CupsRemovePrinter(printer_name, base::Bind(&onRemovedPrinter), |
+ client->CupsRemovePrinter(printer_name, base::Bind(&OnRemovedPrinter), |
base::Bind(&base::DoNothing)); |
} |
@@ -158,8 +175,10 @@ void CupsPrintersHandler::HandleAddCupsPrinter(const base::ListValue* args) { |
CHECK(printer_dict->GetString("printerModel", &printer_model)); |
CHECK(printer_dict->GetString("printerAddress", &printer_address)); |
CHECK(printer_dict->GetString("printerProtocol", &printer_protocol)); |
- CHECK(printer_dict->GetString("printerQueue", &printer_queue)); |
- CHECK(printer_dict->GetString("printerPPDPath", &printer_ppd_path)); |
+ // printerQueue might be null for a printer whose protocol is not 'LPD'. |
+ printer_dict->GetString("printerQueue", &printer_queue); |
+ // printerPPDPath might be null for an auto-discovered printer. |
+ printer_dict->GetString("printerPPDPath", &printer_ppd_path); |
std::string printer_uri = |
printer_protocol + "://" + printer_address + "/" + printer_queue; |
@@ -228,5 +247,45 @@ void CupsPrintersHandler::FileSelected(const base::FilePath& path, |
webui_callback_id_.clear(); |
} |
+void CupsPrintersHandler::HandleStartDiscovery(const base::ListValue* args) { |
+ if (!printer_discoverer_.get()) |
+ printer_discoverer_ = chromeos::PrinterDiscoverer::Create(); |
+ |
+ printer_discoverer_->AddObserver(this); |
+ if (!printer_discoverer_->StartDiscovery()) { |
+ CallJavascriptFunction("cr.webUIListenerCallback", |
+ base::StringValue("on-printer-discovery-failed")); |
+ printer_discoverer_->RemoveObserver(this); |
+ } |
+} |
+ |
+void CupsPrintersHandler::HandleStopDiscovery(const base::ListValue* args) { |
+ if (printer_discoverer_.get()) { |
+ printer_discoverer_->RemoveObserver(this); |
+ printer_discoverer_->StopDiscovery(); |
+ printer_discoverer_.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) { |
+ std::unique_ptr<base::DictionaryValue> printer_info = |
+ GetPrinterInfo(printer); |
+ printers_list->Append(std::move(printer_info)); |
+ } |
+ |
+ CallJavascriptFunction("cr.webUIListenerCallback", |
+ base::StringValue("on-printer-discovered"), |
+ *printers_list); |
+} |
+ |
+void CupsPrintersHandler::OnDiscoveryDone() { |
+ CallJavascriptFunction("cr.webUIListenerCallback", |
+ base::StringValue("on-printer-discovery-done")); |
+} |
+ |
} // namespace settings |
} // namespace chromeos |