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

Unified Diff: chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc

Issue 2380753004: [CUPS] Implement the Webui handler for the printers auto discovery. (Closed)
Patch Set: Address michaelpg@'s comments. Created 4 years, 2 months 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698