Chromium Code Reviews| 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 53abf17f57a789dd8557d4a025240a51e3893979..3a8c29b0fa5df18522a297d257ab68f476d545c6 100644 |
| --- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc |
| +++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc |
| @@ -4,25 +4,32 @@ |
| #include "chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h" |
| -#include <memory> |
| +#include <utility> |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| #include "base/memory/ptr_util.h" |
| +#include "base/path_service.h" |
| #include "base/strings/string_util.h" |
| #include "base/values.h" |
| +#include "chrome/browser/browser_process.h" |
| #include "chrome/browser/chromeos/printing/printer_pref_manager_factory.h" |
| #include "chrome/browser/download/download_prefs.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/browser_finder.h" |
| #include "chrome/browser/ui/browser_window.h" |
| #include "chrome/browser/ui/chrome_select_file_policy.h" |
| +#include "chrome/common/chrome_paths.h" |
| #include "chromeos/dbus/dbus_thread_manager.h" |
| #include "chromeos/dbus/debug_daemon_client.h" |
| #include "chromeos/printing/fake_printer_discoverer.h" |
| +#include "chromeos/printing/ppd_cache.h" |
| +#include "chromeos/printing/ppd_provider.h" |
| #include "content/public/browser/browser_context.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/web_ui.h" |
| +#include "google_apis/google_api_keys.h" |
| +#include "net/url_request/url_request_context_getter.h" |
| #include "printing/backend/print_backend.h" |
| #include "url/third_party/mozilla/url_parse.h" |
| @@ -70,7 +77,14 @@ std::unique_ptr<base::DictionaryValue> GetPrinterInfo(const Printer& printer) { |
| CupsPrintersHandler::CupsPrintersHandler(content::WebUI* webui) |
| : printer_discoverer_(nullptr), |
| profile_(Profile::FromWebUI(webui)), |
| - weak_factory_(this) {} |
| + weak_factory_(this) { |
| + base::FilePath ppd_cache_path; |
| + CHECK( |
| + base::PathService::Get(chrome::DIR_CHROMEOS_PPD_CACHE, &ppd_cache_path)); |
| + ppd_provider_ = chromeos::printing::PpdProvider::Create( |
| + google_apis::GetAPIKey(), g_browser_process->system_request_context(), |
| + chromeos::printing::PpdCache::Create(ppd_cache_path)); |
| +} |
| CupsPrintersHandler::~CupsPrintersHandler() {} |
| @@ -91,6 +105,14 @@ void CupsPrintersHandler::RegisterMessages() { |
| "addCupsPrinter", base::Bind(&CupsPrintersHandler::HandleAddCupsPrinter, |
| base::Unretained(this))); |
| web_ui()->RegisterMessageCallback( |
| + "getCupsPrinterManufacturersList", |
| + base::Bind(&CupsPrintersHandler::HandleGetCupsPrinterManufacturers, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + "getCupsPrinterModelsList", |
| + base::Bind(&CupsPrintersHandler::HandleGetCupsPrinterModels, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| "selectPPDFile", base::Bind(&CupsPrintersHandler::HandleSelectPPDFile, |
| base::Unretained(this))); |
| web_ui()->RegisterMessageCallback( |
| @@ -220,6 +242,28 @@ void CupsPrintersHandler::OnAddPrinterError() { |
| base::FundamentalValue(false), base::StringValue("")); |
| } |
| +void CupsPrintersHandler::HandleGetCupsPrinterManufacturers( |
| + const base::ListValue* args) { |
| + std::string js_callback; |
| + CHECK_EQ(1U, args->GetSize()); |
| + CHECK(args->GetString(0, &js_callback)); |
| + ppd_provider_->QueryAvailable( |
| + base::Bind(&CupsPrintersHandler::QueryAvailableManufacturersDone, |
| + base::Unretained(this), js_callback)); |
|
skau
2016/11/02 23:20:13
Get the weakptr for CupsPrintersHandler in case we
Carlson
2016/11/02 23:28:55
Done.
|
| +} |
| + |
| +void CupsPrintersHandler::HandleGetCupsPrinterModels( |
| + const base::ListValue* args) { |
| + std::string js_callback; |
| + std::string manufacturer; |
| + CHECK_EQ(2U, args->GetSize()); |
| + CHECK(args->GetString(0, &js_callback)); |
| + CHECK(args->GetString(1, &manufacturer)); |
| + ppd_provider_->QueryAvailable( |
| + base::Bind(&CupsPrintersHandler::QueryAvailableModelsDone, |
| + base::Unretained(this), js_callback, manufacturer)); |
|
skau
2016/11/02 23:20:13
ditto
Carlson
2016/11/02 23:28:55
Done.
|
| +} |
| + |
| void CupsPrintersHandler::HandleSelectPPDFile(const base::ListValue* args) { |
| CHECK_EQ(1U, args->GetSize()); |
| CHECK(args->GetString(0, &webui_callback_id_)); |
| @@ -238,6 +282,45 @@ void CupsPrintersHandler::HandleSelectPPDFile(const base::ListValue* args) { |
| nullptr, 0, FILE_PATH_LITERAL(""), owning_window, nullptr); |
| } |
| +void CupsPrintersHandler::QueryAvailableManufacturersDone( |
| + std::string js_callback, |
| + chromeos::printing::PpdProvider::CallbackResultCode result_code, |
| + const chromeos::printing::PpdProvider::AvailablePrintersMap& available) { |
| + bool callback_result = false; |
| + auto manufacturers = base::MakeUnique<base::ListValue>(); |
| + if (result_code == chromeos::printing::PpdProvider::SUCCESS) { |
| + callback_result = true; |
| + for (const auto& entry : available) { |
| + manufacturers->AppendString(entry.first); |
| + } |
| + } |
| + base::DictionaryValue response; |
| + response.SetBoolean("success", |
| + result_code == chromeos::printing::PpdProvider::SUCCESS); |
| + response.Set("manufacturers", std::move(manufacturers)); |
| + ResolveJavascriptCallback(base::StringValue(js_callback), response); |
| +} |
| + |
| +void CupsPrintersHandler::QueryAvailableModelsDone( |
| + std::string js_callback, |
| + std::string manufacturer, |
| + chromeos::printing::PpdProvider::CallbackResultCode result_code, |
| + const chromeos::printing::PpdProvider::AvailablePrintersMap& available) { |
| + auto models = base::MakeUnique<base::ListValue>(); |
| + if (result_code == chromeos::printing::PpdProvider::SUCCESS) { |
| + const auto it = available.find(manufacturer); |
| + if (it != available.end()) { |
| + // Everything looks good. |
| + models->AppendStrings(it->second); |
| + } |
| + } |
| + base::DictionaryValue response; |
| + response.SetBoolean("success", |
| + result_code == chromeos::printing::PpdProvider::SUCCESS); |
| + response.Set("models", std::move(models)); |
| + ResolveJavascriptCallback(base::StringValue(js_callback), response); |
| +} |
| + |
| void CupsPrintersHandler::FileSelected(const base::FilePath& path, |
| int index, |
| void* params) { |