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

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

Issue 2613683004: Completely rewrite the PpdProvider/PpdCache to use the SCS backend. Along the way, clean it up a l… (Closed)
Patch Set: Address michealpg@ comments Created 3 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h" 5 #include "chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/files/file_util.h" 11 #include "base/files/file_util.h"
12 #include "base/json/json_string_value_serializer.h"
12 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
13 #include "base/path_service.h" 14 #include "base/path_service.h"
14 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
15 #include "base/threading/sequenced_task_runner_handle.h" 16 #include "base/threading/sequenced_task_runner_handle.h"
16 #include "base/values.h" 17 #include "base/values.h"
17 #include "chrome/browser/browser_process.h" 18 #include "chrome/browser/browser_process.h"
18 #include "chrome/browser/chromeos/printing/ppd_provider_factory.h" 19 #include "chrome/browser/chromeos/printing/ppd_provider_factory.h"
19 #include "chrome/browser/chromeos/printing/printer_pref_manager_factory.h" 20 #include "chrome/browser/chromeos/printing/printer_pref_manager_factory.h"
20 #include "chrome/browser/download/download_prefs.h" 21 #include "chrome/browser/download/download_prefs.h"
21 #include "chrome/browser/profiles/profile.h" 22 #include "chrome/browser/profiles/profile.h"
22 #include "chrome/browser/ui/browser_finder.h" 23 #include "chrome/browser/ui/browser_finder.h"
23 #include "chrome/browser/ui/browser_window.h" 24 #include "chrome/browser/ui/browser_window.h"
24 #include "chrome/browser/ui/chrome_select_file_policy.h" 25 #include "chrome/browser/ui/chrome_select_file_policy.h"
25 #include "chrome/common/chrome_paths.h" 26 #include "chrome/common/chrome_paths.h"
26 #include "chromeos/dbus/dbus_thread_manager.h" 27 #include "chromeos/dbus/dbus_thread_manager.h"
27 #include "chromeos/dbus/debug_daemon_client.h" 28 #include "chromeos/dbus/debug_daemon_client.h"
28 #include "chromeos/printing/fake_printer_discoverer.h" 29 #include "chromeos/printing/fake_printer_discoverer.h"
29 #include "chromeos/printing/ppd_cache.h" 30 #include "chromeos/printing/ppd_cache.h"
30 #include "chromeos/printing/ppd_provider.h" 31 #include "chromeos/printing/ppd_provider.h"
31 #include "content/public/browser/browser_context.h" 32 #include "content/public/browser/browser_context.h"
32 #include "content/public/browser/browser_thread.h" 33 #include "content/public/browser/browser_thread.h"
33 #include "content/public/browser/web_ui.h" 34 #include "content/public/browser/web_ui.h"
34 #include "google_apis/google_api_keys.h" 35 #include "google_apis/google_api_keys.h"
36 #include "net/base/filename_util.h"
35 #include "net/url_request/url_request_context_getter.h" 37 #include "net/url_request/url_request_context_getter.h"
36 #include "printing/backend/print_backend.h" 38 #include "printing/backend/print_backend.h"
37 #include "url/third_party/mozilla/url_parse.h" 39 #include "url/third_party/mozilla/url_parse.h"
38 40
39 namespace chromeos { 41 namespace chromeos {
40 namespace settings { 42 namespace settings {
41 43
42 namespace { 44 namespace {
43 45
44 void OnRemovedPrinter(bool success) {} 46 void OnRemovedPrinter(bool success) {}
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 std::string printer_ppd_path; 192 std::string printer_ppd_path;
191 CHECK(printer_dict->GetString("printerId", &printer_id)); 193 CHECK(printer_dict->GetString("printerId", &printer_id));
192 CHECK(printer_dict->GetString("printerName", &printer_name)); 194 CHECK(printer_dict->GetString("printerName", &printer_name));
193 CHECK(printer_dict->GetString("printerDescription", &printer_description)); 195 CHECK(printer_dict->GetString("printerDescription", &printer_description));
194 CHECK(printer_dict->GetString("printerManufacturer", &printer_manufacturer)); 196 CHECK(printer_dict->GetString("printerManufacturer", &printer_manufacturer));
195 CHECK(printer_dict->GetString("printerModel", &printer_model)); 197 CHECK(printer_dict->GetString("printerModel", &printer_model));
196 CHECK(printer_dict->GetString("printerAddress", &printer_address)); 198 CHECK(printer_dict->GetString("printerAddress", &printer_address));
197 CHECK(printer_dict->GetString("printerProtocol", &printer_protocol)); 199 CHECK(printer_dict->GetString("printerProtocol", &printer_protocol));
198 // printerQueue might be null for a printer whose protocol is not 'LPD'. 200 // printerQueue might be null for a printer whose protocol is not 'LPD'.
199 printer_dict->GetString("printerQueue", &printer_queue); 201 printer_dict->GetString("printerQueue", &printer_queue);
202
200 // printerPPDPath might be null for an auto-discovered printer. 203 // printerPPDPath might be null for an auto-discovered printer.
201 printer_dict->GetString("printerPPDPath", &printer_ppd_path); 204 printer_dict->GetString("printerPPDPath", &printer_ppd_path);
202 std::string printer_uri = 205 std::string printer_uri =
203 printer_protocol + "://" + printer_address + "/" + printer_queue; 206 printer_protocol + "://" + printer_address + "/" + printer_queue;
204 207
205 std::unique_ptr<Printer> printer = base::MakeUnique<Printer>(printer_id); 208 std::unique_ptr<Printer> printer = base::MakeUnique<Printer>(printer_id);
206 printer->set_display_name(printer_name); 209 printer->set_display_name(printer_name);
207 printer->set_description(printer_description); 210 printer->set_description(printer_description);
208 printer->set_manufacturer(printer_manufacturer); 211 printer->set_manufacturer(printer_manufacturer);
209 printer->set_model(printer_model); 212 printer->set_model(printer_model);
210 printer->set_uri(printer_uri); 213 printer->set_uri(printer_uri);
211 if (!printer_ppd_path.empty()) { 214 if (!printer_ppd_path.empty()) {
212 printer->mutable_ppd_reference()->user_supplied_ppd_url = printer_ppd_path; 215 GURL tmp = net::FilePathToFileURL(base::FilePath(printer_ppd_path));
213 if (!ppd_provider_->CachePpd(printer->ppd_reference(), 216 if (!tmp.is_valid()) {
214 base::FilePath(printer_ppd_path))) { 217 LOG(ERROR) << "Invalid ppd path: " << printer_ppd_path;
215 LOG(WARNING) << "PPD could not be stored in the cache";
216 OnAddPrinterError(); 218 OnAddPrinterError();
217 return; 219 return;
218 } 220 }
221 printer->mutable_ppd_reference()->user_supplied_ppd_url = tmp.spec();
219 } else if (!printer_manufacturer.empty() && !printer_model.empty()) { 222 } else if (!printer_manufacturer.empty() && !printer_model.empty()) {
220 Printer::PpdReference* ppd = printer->mutable_ppd_reference(); 223 // Using the manufacturer and model, get a ppd reference.
221 ppd->effective_manufacturer = printer_manufacturer; 224 if (!ppd_provider_->GetPpdReference(printer_manufacturer, printer_model,
222 ppd->effective_model = printer_model; 225 printer->mutable_ppd_reference())) {
226 LOG(ERROR) << "Failed to get ppd reference";
227 OnAddPrinterError();
228 return;
229 }
223 } 230 }
224 231
225 if (printer->IsIppEverywhere()) { 232 if (printer->IsIppEverywhere()) {
226 AddPrinterToCups(std::move(printer), base::FilePath(), true); 233 std::string printer_id = printer->id();
227 return; 234 std::string printer_uri = printer->uri();
235
236 chromeos::DebugDaemonClient* client =
237 chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
238
239 client->CupsAddAutoConfiguredPrinter(
240 printer_id, printer_uri,
241 base::Bind(&CupsPrintersHandler::OnAddedPrinter,
242 weak_factory_.GetWeakPtr(), base::Passed(&printer)),
243 base::Bind(&CupsPrintersHandler::OnAddPrinterError,
244 weak_factory_.GetWeakPtr()));
245 } else {
246 // We need to save a reference to members of printer since we transfer
247 // ownership in the bind call.
248 const Printer::PpdReference ppd_reference = printer->ppd_reference();
249 ppd_provider_->ResolvePpd(
250 ppd_reference,
251 base::Bind(&CupsPrintersHandler::ResolvePpdDone,
252 weak_factory_.GetWeakPtr(), base::Passed(&printer)));
228 } 253 }
229
230 // We need to save a reference to members of printer since we transfer
231 // ownership in the bind call.
232 const Printer::PpdReference& ppd_reference = printer->ppd_reference();
233 ppd_provider_->Resolve(
234 ppd_reference,
235 base::Bind(&CupsPrintersHandler::OnPPDResolved,
236 weak_factory_.GetWeakPtr(), base::Passed(&printer)));
237 } 254 }
238 255
239 void CupsPrintersHandler::OnAddedPrinter(std::unique_ptr<Printer> printer, 256 void CupsPrintersHandler::OnAddedPrinter(std::unique_ptr<Printer> printer,
240 bool success) { 257 int32_t result_code) {
241 std::string printer_name = printer->display_name(); 258 std::string printer_name = printer->display_name();
259 bool success = (result_code == 0);
242 if (success) { 260 if (success) {
243 PrinterPrefManagerFactory::GetForBrowserContext(profile_)->RegisterPrinter( 261 PrinterPrefManagerFactory::GetForBrowserContext(profile_)->RegisterPrinter(
244 std::move(printer)); 262 std::move(printer));
245 } 263 }
246 CallJavascriptFunction( 264 CallJavascriptFunction(
247 "cr.webUIListenerCallback", base::StringValue("on-add-cups-printer"), 265 "cr.webUIListenerCallback", base::StringValue("on-add-cups-printer"),
248 base::FundamentalValue(success), base::StringValue(printer_name)); 266 base::FundamentalValue(success), base::StringValue(printer_name));
249 } 267 }
250 268
251 void CupsPrintersHandler::OnAddPrinterError() { 269 void CupsPrintersHandler::OnAddPrinterError() {
252 CallJavascriptFunction("cr.webUIListenerCallback", 270 CallJavascriptFunction("cr.webUIListenerCallback",
253 base::StringValue("on-add-cups-printer"), 271 base::StringValue("on-add-cups-printer"),
254 base::FundamentalValue(false), base::StringValue("")); 272 base::FundamentalValue(false), base::StringValue(""));
255 } 273 }
256 274
257 void CupsPrintersHandler::HandleGetCupsPrinterManufacturers( 275 void CupsPrintersHandler::HandleGetCupsPrinterManufacturers(
258 const base::ListValue* args) { 276 const base::ListValue* args) {
277 AllowJavascript();
259 std::string js_callback; 278 std::string js_callback;
260 CHECK_EQ(1U, args->GetSize()); 279 CHECK_EQ(1U, args->GetSize());
261 CHECK(args->GetString(0, &js_callback)); 280 CHECK(args->GetString(0, &js_callback));
262 ppd_provider_->QueryAvailable( 281 ppd_provider_->ResolveManufacturers(
263 base::Bind(&CupsPrintersHandler::QueryAvailableManufacturersDone, 282 base::Bind(&CupsPrintersHandler::ResolveManufacturersDone,
264 weak_factory_.GetWeakPtr(), 283 weak_factory_.GetWeakPtr(), js_callback));
265 js_callback));
266 } 284 }
267 285
268 void CupsPrintersHandler::HandleGetCupsPrinterModels( 286 void CupsPrintersHandler::HandleGetCupsPrinterModels(
269 const base::ListValue* args) { 287 const base::ListValue* args) {
288 AllowJavascript();
270 std::string js_callback; 289 std::string js_callback;
271 std::string manufacturer; 290 std::string manufacturer;
272 CHECK_EQ(2U, args->GetSize()); 291 CHECK_EQ(2U, args->GetSize());
273 CHECK(args->GetString(0, &js_callback)); 292 CHECK(args->GetString(0, &js_callback));
274 CHECK(args->GetString(1, &manufacturer)); 293 CHECK(args->GetString(1, &manufacturer));
275 // Special case the "asked with no manufacturer case" since the UI sometimes 294
276 // triggers this and it should yield a trivial (empty) result 295 // Empty manufacturer queries may be triggered as a part of the ui
296 // initialization, and should just return empty results.
277 if (manufacturer.empty()) { 297 if (manufacturer.empty()) {
278 base::SequencedTaskRunnerHandle::Get()->PostTask( 298 base::DictionaryValue response;
279 FROM_HERE, 299 response.SetBoolean("success", true);
280 base::Bind(&CupsPrintersHandler::QueryAvailableModelsDone, 300 response.Set("models", base::MakeUnique<base::ListValue>());
281 weak_factory_.GetWeakPtr(), js_callback, manufacturer, 301 ResolveJavascriptCallback(base::StringValue(js_callback), response);
282 chromeos::printing::PpdProvider::SUCCESS, 302 return;
283 chromeos::printing::PpdProvider::AvailablePrintersMap()));
284 } else {
285 ppd_provider_->QueryAvailable(
286 base::Bind(&CupsPrintersHandler::QueryAvailableModelsDone,
287 weak_factory_.GetWeakPtr(), js_callback, manufacturer));
288 } 303 }
304
305 ppd_provider_->ResolvePrinters(
306 manufacturer, base::Bind(&CupsPrintersHandler::ResolvePrintersDone,
307 weak_factory_.GetWeakPtr(), js_callback));
289 } 308 }
290 309
291 void CupsPrintersHandler::HandleSelectPPDFile(const base::ListValue* args) { 310 void CupsPrintersHandler::HandleSelectPPDFile(const base::ListValue* args) {
292 CHECK_EQ(1U, args->GetSize()); 311 CHECK_EQ(1U, args->GetSize());
293 CHECK(args->GetString(0, &webui_callback_id_)); 312 CHECK(args->GetString(0, &webui_callback_id_));
294 313
295 base::FilePath downloads_path = DownloadPrefs::FromDownloadManager( 314 base::FilePath downloads_path =
296 content::BrowserContext::GetDownloadManager(profile_))->DownloadPath(); 315 DownloadPrefs::FromDownloadManager(
316 content::BrowserContext::GetDownloadManager(profile_))
317 ->DownloadPath();
297 318
298 select_file_dialog_ = ui::SelectFileDialog::Create( 319 select_file_dialog_ = ui::SelectFileDialog::Create(
299 this, new ChromeSelectFilePolicy(web_ui()->GetWebContents())); 320 this, new ChromeSelectFilePolicy(web_ui()->GetWebContents()));
300 gfx::NativeWindow owning_window = 321 gfx::NativeWindow owning_window =
301 chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()) 322 chrome::FindBrowserWithWebContents(web_ui()->GetWebContents())
302 ->window() 323 ->window()
303 ->GetNativeWindow(); 324 ->GetNativeWindow();
304 select_file_dialog_->SelectFile( 325 select_file_dialog_->SelectFile(
305 ui::SelectFileDialog::SELECT_OPEN_FILE, base::string16(), downloads_path, 326 ui::SelectFileDialog::SELECT_OPEN_FILE, base::string16(), downloads_path,
306 nullptr, 0, FILE_PATH_LITERAL(""), owning_window, nullptr); 327 nullptr, 0, FILE_PATH_LITERAL(""), owning_window, nullptr);
307 } 328 }
308 329
309 void CupsPrintersHandler::QueryAvailableManufacturersDone( 330 void CupsPrintersHandler::ResolveManufacturersDone(
310 const std::string& js_callback, 331 const std::string& js_callback,
311 chromeos::printing::PpdProvider::CallbackResultCode result_code, 332 chromeos::printing::PpdProvider::CallbackResultCode result_code,
312 const chromeos::printing::PpdProvider::AvailablePrintersMap& available) { 333 const std::vector<std::string>& manufacturers) {
313 auto manufacturers = base::MakeUnique<base::ListValue>(); 334 auto manufacturers_value = base::MakeUnique<base::ListValue>();
314 if (result_code == chromeos::printing::PpdProvider::SUCCESS) { 335 if (result_code == chromeos::printing::PpdProvider::SUCCESS) {
315 for (const auto& entry : available) { 336 manufacturers_value->AppendStrings(manufacturers);
316 manufacturers->AppendString(entry.first);
317 }
318 } 337 }
319 base::DictionaryValue response; 338 base::DictionaryValue response;
320 response.SetBoolean("success", 339 response.SetBoolean("success",
321 result_code == chromeos::printing::PpdProvider::SUCCESS); 340 result_code == chromeos::printing::PpdProvider::SUCCESS);
322 response.Set("manufacturers", std::move(manufacturers)); 341 response.Set("manufacturers", std::move(manufacturers_value));
323 ResolveJavascriptCallback(base::StringValue(js_callback), response); 342 ResolveJavascriptCallback(base::StringValue(js_callback), response);
324 } 343 }
325 344
326 void CupsPrintersHandler::QueryAvailableModelsDone( 345 void CupsPrintersHandler::ResolvePrintersDone(
327 const std::string& js_callback, 346 const std::string& js_callback,
328 const std::string& manufacturer,
329 chromeos::printing::PpdProvider::CallbackResultCode result_code, 347 chromeos::printing::PpdProvider::CallbackResultCode result_code,
330 const chromeos::printing::PpdProvider::AvailablePrintersMap& available) { 348 const std::vector<std::string>& printers) {
331 auto models = base::MakeUnique<base::ListValue>(); 349 auto printers_value = base::MakeUnique<base::ListValue>();
332 if (result_code == chromeos::printing::PpdProvider::SUCCESS) { 350 if (result_code == chromeos::printing::PpdProvider::SUCCESS) {
333 const auto it = available.find(manufacturer); 351 printers_value->AppendStrings(printers);
334 if (it != available.end()) {
335 // Everything looks good.
336 models->AppendStrings(it->second);
337 }
338 } 352 }
339 base::DictionaryValue response; 353 base::DictionaryValue response;
340 response.SetBoolean("success", 354 response.SetBoolean("success",
341 result_code == chromeos::printing::PpdProvider::SUCCESS); 355 result_code == chromeos::printing::PpdProvider::SUCCESS);
342 response.Set("models", std::move(models)); 356 response.Set("models", std::move(printers_value));
343 ResolveJavascriptCallback(base::StringValue(js_callback), response); 357 ResolveJavascriptCallback(base::StringValue(js_callback), response);
344 } 358 }
345 359
346 void CupsPrintersHandler::FileSelected(const base::FilePath& path, 360 void CupsPrintersHandler::FileSelected(const base::FilePath& path,
347 int index, 361 int index,
348 void* params) { 362 void* params) {
349 DCHECK(!webui_callback_id_.empty()); 363 DCHECK(!webui_callback_id_.empty());
350 ResolveJavascriptCallback(base::StringValue(webui_callback_id_), 364 ResolveJavascriptCallback(base::StringValue(webui_callback_id_),
351 base::StringValue(path.value())); 365 base::StringValue(path.value()));
352 webui_callback_id_.clear(); 366 webui_callback_id_.clear();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 CallJavascriptFunction("cr.webUIListenerCallback", 399 CallJavascriptFunction("cr.webUIListenerCallback",
386 base::StringValue("on-printer-discovered"), 400 base::StringValue("on-printer-discovered"),
387 *printers_list); 401 *printers_list);
388 } 402 }
389 403
390 void CupsPrintersHandler::OnDiscoveryDone() { 404 void CupsPrintersHandler::OnDiscoveryDone() {
391 CallJavascriptFunction("cr.webUIListenerCallback", 405 CallJavascriptFunction("cr.webUIListenerCallback",
392 base::StringValue("on-printer-discovery-done")); 406 base::StringValue("on-printer-discovery-done"));
393 } 407 }
394 408
395 void CupsPrintersHandler::AddPrinterToCups(std::unique_ptr<Printer> printer, 409 void CupsPrintersHandler::ResolvePpdDone(
396 const base::FilePath& ppd_path, 410 std::unique_ptr<Printer> printer,
397 bool ipp_everywhere) { 411 printing::PpdProvider::CallbackResultCode result,
412 const std::string& ppd_contents) {
413 if (result != printing::PpdProvider::SUCCESS) {
414 // TODO(skau): Add appropriate failure modes crbug.com/670068.
415 LOG(ERROR) << "Error resolving";
416 OnAddPrinterError();
417 return;
418 }
419
398 std::string printer_id = printer->id(); 420 std::string printer_id = printer->id();
399 std::string printer_uri = printer->uri(); 421 std::string printer_uri = printer->uri();
400 422
401 chromeos::DebugDaemonClient* client = 423 chromeos::DebugDaemonClient* client =
402 chromeos::DBusThreadManager::Get()->GetDebugDaemonClient(); 424 chromeos::DBusThreadManager::Get()->GetDebugDaemonClient();
403 client->CupsAddPrinter( 425
404 printer_id, printer_uri, ppd_path.value(), ipp_everywhere, 426 client->CupsAddManuallyConfiguredPrinter(
427 printer_id, printer_uri, ppd_contents,
405 base::Bind(&CupsPrintersHandler::OnAddedPrinter, 428 base::Bind(&CupsPrintersHandler::OnAddedPrinter,
406 weak_factory_.GetWeakPtr(), base::Passed(&printer)), 429 weak_factory_.GetWeakPtr(), base::Passed(&printer)),
407 base::Bind(&CupsPrintersHandler::OnAddPrinterError, 430 base::Bind(&CupsPrintersHandler::OnAddPrinterError,
408 weak_factory_.GetWeakPtr())); 431 weak_factory_.GetWeakPtr()));
409 } 432 }
410 433
411 void CupsPrintersHandler::OnPPDResolved(
412 std::unique_ptr<Printer> printer,
413 printing::PpdProvider::CallbackResultCode result,
414 base::FilePath path) {
415 if (result != printing::PpdProvider::SUCCESS) {
416 // TODO(skau): Add appropriate failure modes crbug.com/670068.
417 OnAddPrinterError();
418 return;
419 }
420
421 AddPrinterToCups(std::move(printer), path, false /* never ipp everywhere */);
422 }
423
424 } // namespace settings 434 } // namespace settings
425 } // namespace chromeos 435 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h ('k') | chromeos/printing/ppd_cache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698