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

Side by Side Diff: chrome/browser/ui/webui/print_preview/print_preview_handler.cc

Issue 59843010: Print to Privet local printers (PDF only) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/print_preview/print_preview_handler.h" 5 #include "chrome/browser/ui/webui/print_preview/print_preview_handler.h"
6 6
7 #include <ctype.h> 7 #include <ctype.h>
8 8
9 #include <string> 9 #include <string>
10 10
(...skipping 19 matching lines...) Expand all
30 #include "chrome/browser/printing/cloud_print/cloud_print_url.h" 30 #include "chrome/browser/printing/cloud_print/cloud_print_url.h"
31 #include "chrome/browser/printing/print_dialog_cloud.h" 31 #include "chrome/browser/printing/print_dialog_cloud.h"
32 #include "chrome/browser/printing/print_error_dialog.h" 32 #include "chrome/browser/printing/print_error_dialog.h"
33 #include "chrome/browser/printing/print_job_manager.h" 33 #include "chrome/browser/printing/print_job_manager.h"
34 #include "chrome/browser/printing/print_preview_dialog_controller.h" 34 #include "chrome/browser/printing/print_preview_dialog_controller.h"
35 #include "chrome/browser/printing/print_view_manager.h" 35 #include "chrome/browser/printing/print_view_manager.h"
36 #include "chrome/browser/printing/printer_manager_dialog.h" 36 #include "chrome/browser/printing/printer_manager_dialog.h"
37 #include "chrome/browser/profiles/profile.h" 37 #include "chrome/browser/profiles/profile.h"
38 #include "chrome/browser/signin/profile_oauth2_token_service.h" 38 #include "chrome/browser/signin/profile_oauth2_token_service.h"
39 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 39 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
40 #include "chrome/browser/signin/signin_manager.h"
41 #include "chrome/browser/signin/signin_manager_base.h"
42 #include "chrome/browser/signin/signin_manager_factory.h"
40 #include "chrome/browser/ui/browser_finder.h" 43 #include "chrome/browser/ui/browser_finder.h"
41 #include "chrome/browser/ui/browser_tabstrip.h" 44 #include "chrome/browser/ui/browser_tabstrip.h"
42 #include "chrome/browser/ui/chrome_select_file_policy.h" 45 #include "chrome/browser/ui/chrome_select_file_policy.h"
43 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" 46 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
44 #include "chrome/browser/ui/webui/print_preview/sticky_settings.h" 47 #include "chrome/browser/ui/webui/print_preview/sticky_settings.h"
45 #include "chrome/common/chrome_paths.h" 48 #include "chrome/common/chrome_paths.h"
46 #include "chrome/common/chrome_switches.h" 49 #include "chrome/common/chrome_switches.h"
47 #include "chrome/common/cloud_print/cloud_print_constants.h" 50 #include "chrome/common/cloud_print/cloud_print_constants.h"
48 #include "chrome/common/crash_keys.h" 51 #include "chrome/common/crash_keys.h"
49 #include "chrome/common/pref_names.h" 52 #include "chrome/common/pref_names.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 enum UserActionBuckets { 84 enum UserActionBuckets {
82 PRINT_TO_PRINTER, 85 PRINT_TO_PRINTER,
83 PRINT_TO_PDF, 86 PRINT_TO_PDF,
84 CANCEL, 87 CANCEL,
85 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG, 88 FALLBACK_TO_ADVANCED_SETTINGS_DIALOG,
86 PREVIEW_FAILED, 89 PREVIEW_FAILED,
87 PREVIEW_STARTED, 90 PREVIEW_STARTED,
88 INITIATOR_CRASHED, // UNUSED 91 INITIATOR_CRASHED, // UNUSED
89 INITIATOR_CLOSED, 92 INITIATOR_CLOSED,
90 PRINT_WITH_CLOUD_PRINT, 93 PRINT_WITH_CLOUD_PRINT,
94 PRINT_WITH_PRIVET,
91 USERACTION_BUCKET_BOUNDARY 95 USERACTION_BUCKET_BOUNDARY
92 }; 96 };
93 97
94 enum PrintSettingsBuckets { 98 enum PrintSettingsBuckets {
95 LANDSCAPE = 0, 99 LANDSCAPE = 0,
96 PORTRAIT, 100 PORTRAIT,
97 COLOR, 101 COLOR,
98 BLACK_AND_WHITE, 102 BLACK_AND_WHITE,
99 COLLATE, 103 COLLATE,
100 SIMPLEX, 104 SIMPLEX,
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 } 599 }
596 } 600 }
597 601
598 void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities( 602 void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities(
599 const base::ListValue* args) { 603 const base::ListValue* args) {
600 #if defined(ENABLE_MDNS) 604 #if defined(ENABLE_MDNS)
601 std::string name; 605 std::string name;
602 bool success = args->GetString(0, &name); 606 bool success = args->GetString(0, &name);
603 DCHECK(success); 607 DCHECK(success);
604 608
605 const local_discovery::DeviceDescription* device_description = 609 CreatePrivetHTTP(
606 printer_lister_->GetDeviceDescription(name);
607
608 if (!device_description) {
609 SendPrivetCapabilitiesError(name);
610 return;
611 }
612
613 privet_http_factory_ =
614 local_discovery::PrivetHTTPAsynchronousFactory::CreateInstance(
615 service_discovery_client_,
616 Profile::FromWebUI(web_ui())->GetRequestContext());
617 privet_http_resolution_ = privet_http_factory_->CreatePrivetHTTP(
618 name, 610 name,
619 device_description->address, 611 base::Bind(&PrintPreviewHandler::PrivetCapabilitiesUpdateClient,
620 base::Bind(&PrintPreviewHandler::StartPrivetCapabilities,
621 base::Unretained(this))); 612 base::Unretained(this)));
622 privet_http_resolution_->Start();
623 #endif 613 #endif
624 } 614 }
625 615
626 void PrintPreviewHandler::HandleGetPreview(const ListValue* args) { 616 void PrintPreviewHandler::HandleGetPreview(const ListValue* args) {
627 DCHECK_EQ(3U, args->GetSize()); 617 DCHECK_EQ(3U, args->GetSize());
628 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); 618 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
629 if (!settings.get()) 619 if (!settings.get())
630 return; 620 return;
631 int request_id = -1; 621 int request_id = -1;
632 if (!settings->GetInteger(printing::kPreviewRequestID, &request_id)) 622 if (!settings->GetInteger(printing::kPreviewRequestID, &request_id))
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 701
712 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args)); 702 scoped_ptr<DictionaryValue> settings(GetSettingsDictionary(args));
713 if (!settings.get()) 703 if (!settings.get())
714 return; 704 return;
715 705
716 // Never try to add headers/footers here. It's already in the generated PDF. 706 // Never try to add headers/footers here. It's already in the generated PDF.
717 settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false); 707 settings->SetBoolean(printing::kSettingHeaderFooterEnabled, false);
718 708
719 bool print_to_pdf = false; 709 bool print_to_pdf = false;
720 bool is_cloud_printer = false; 710 bool is_cloud_printer = false;
711 bool print_with_privet = false;
721 712
722 bool open_pdf_in_preview = false; 713 bool open_pdf_in_preview = false;
723 #if defined(OS_MACOSX) 714 #if defined(OS_MACOSX)
724 open_pdf_in_preview = settings->HasKey(printing::kSettingOpenPDFInPreview); 715 open_pdf_in_preview = settings->HasKey(printing::kSettingOpenPDFInPreview);
725 #endif 716 #endif
726 717
727 if (!open_pdf_in_preview) { 718 if (!open_pdf_in_preview) {
728 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf); 719 settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
720 settings->GetBoolean(printing::kSettingPrintWithPrivet, &print_with_privet);
729 is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId); 721 is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId);
730 } 722 }
731 723
732 int page_count = 0; 724 int page_count = 0;
733 settings->GetInteger(printing::kSettingPreviewPageCount, &page_count); 725 settings->GetInteger(printing::kSettingPreviewPageCount, &page_count);
734 726
735 if (print_to_pdf) { 727 if (print_to_pdf) {
736 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", page_count); 728 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToPDF", page_count);
737 ReportUserActionHistogram(PRINT_TO_PDF); 729 ReportUserActionHistogram(PRINT_TO_PDF);
738 PrintToPdf(); 730 PrintToPdf();
739 return; 731 return;
740 } 732 }
741 733
734 #if defined(ENABLE_MDNS)
735 if (print_with_privet && PrivetPrintingEnabled()) {
736 std::string printer_name;
737 std::string print_ticket;
738 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintWithPrivet",
739 page_count);
740 ReportUserActionHistogram(PRINT_WITH_PRIVET);
741
742 bool success = settings->GetString(printing::kSettingDeviceName,
743 &printer_name);
744 DCHECK(success);
745 success = settings->GetString(printing::kSettingTicket,
746 &print_ticket);
747 DCHECK(success);
748
749 PrintToPrivetPrinter(printer_name, print_ticket);
750 return;
751 }
752 #endif
753
742 scoped_refptr<base::RefCountedBytes> data; 754 scoped_refptr<base::RefCountedBytes> data;
743 string16 title; 755 string16 title;
744 if (!GetPreviewDataAndTitle(&data, &title)) { 756 if (!GetPreviewDataAndTitle(&data, &title)) {
745 // Nothing to print, no preview available. 757 // Nothing to print, no preview available.
746 return; 758 return;
747 } 759 }
748 760
749 if (is_cloud_printer) { 761 if (is_cloud_printer) {
750 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrint", 762 UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintToCloudPrint",
751 page_count); 763 page_count);
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after
1359 } 1371 }
1360 1372
1361 void PrintPreviewHandler::LocalPrinterCacheFlushed() { 1373 void PrintPreviewHandler::LocalPrinterCacheFlushed() {
1362 } 1374 }
1363 1375
1364 void PrintPreviewHandler::StopPrivetPrinterSearch() { 1376 void PrintPreviewHandler::StopPrivetPrinterSearch() {
1365 printer_lister_->Stop(); 1377 printer_lister_->Stop();
1366 web_ui()->CallJavascriptFunction("onPrivetPrinterSearchDone"); 1378 web_ui()->CallJavascriptFunction("onPrivetPrinterSearchDone");
1367 } 1379 }
1368 1380
1369 void PrintPreviewHandler::StartPrivetCapabilities( 1381 void PrintPreviewHandler::PrivetCapabilitiesUpdateClient(
1382 scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1383 if (!PrivetUpdateClient(http_client.Pass()))
1384 return;
1385
1386 privet_capabilities_operation_ =
1387 privet_http_client_->CreateCapabilitiesOperation(
1388 this);
1389 privet_capabilities_operation_->Start();
1390 }
1391
1392 bool PrintPreviewHandler::PrivetUpdateClient(
1370 scoped_ptr<local_discovery::PrivetHTTPClient> http_client) { 1393 scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1371 if (!http_client) { 1394 if (!http_client) {
1372 SendPrivetCapabilitiesError(privet_http_resolution_->GetName()); 1395 SendPrivetCapabilitiesError(privet_http_resolution_->GetName());
1373 privet_http_resolution_.reset(); 1396 privet_http_resolution_.reset();
1374 return; 1397 return false;
1375 } 1398 }
1376 1399
1400 privet_local_print_operation_.reset();
1401 privet_capabilities_operation_.reset();
1377 privet_http_client_ = http_client.Pass(); 1402 privet_http_client_ = http_client.Pass();
1378 privet_capabilities_operation_ = 1403
1379 privet_http_client_->CreateCapabilitiesOperation(
1380 this);
1381 privet_http_resolution_.reset(); 1404 privet_http_resolution_.reset();
1382 privet_capabilities_operation_->Start(); 1405
1406 return true;
1383 } 1407 }
1384 1408
1409 void PrintPreviewHandler::PrivetLocalPrintUpdateClient(
1410 std::string print_ticket,
1411 scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
1412 if (!PrivetUpdateClient(http_client.Pass()))
1413 return;
1414
1415 StartPrivetLocalPrint(print_ticket);
1416 }
1417
1418 void PrintPreviewHandler::StartPrivetLocalPrint(
1419 const std::string& print_ticket) {
1420 privet_local_print_operation_ =
1421 privet_http_client_->CreateLocalPrintOperation(this);
1422
1423 privet_local_print_operation_->SetTicket(print_ticket);
1424
1425 PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
1426 web_ui()->GetController());
1427 privet_local_print_operation_->SetJobname(
1428 base::UTF16ToUTF8(print_preview_ui->initiator_title()));
1429
1430 Profile* profile = Profile::FromWebUI(web_ui());
1431 SigninManagerBase* signin_manager =
1432 SigninManagerFactory::GetForProfileIfExists(profile);
1433
1434 if (signin_manager) {
1435 privet_local_print_operation_->SetUsername(
1436 signin_manager->GetAuthenticatedUsername());
1437 }
1438
1439 privet_local_print_operation_->Start();
1440 }
1441
1442
1385 void PrintPreviewHandler::OnPrivetCapabilities( 1443 void PrintPreviewHandler::OnPrivetCapabilities(
1386 local_discovery::PrivetCapabilitiesOperation* capabilities_operation, 1444 local_discovery::PrivetCapabilitiesOperation* capabilities_operation,
1387 int http_error, 1445 int http_error,
1388 const base::DictionaryValue* capabilities) { 1446 const base::DictionaryValue* capabilities) {
1389 std::string name = capabilities_operation->GetHTTPClient()->GetName(); 1447 std::string name = capabilities_operation->GetHTTPClient()->GetName();
1390 1448
1391 if (!capabilities || capabilities->HasKey(local_discovery::kPrivetKeyError)) { 1449 if (!capabilities || capabilities->HasKey(local_discovery::kPrivetKeyError)) {
1392 SendPrivetCapabilitiesError(name); 1450 SendPrivetCapabilitiesError(name);
1393 return; 1451 return;
1394 } 1452 }
(...skipping 18 matching lines...) Expand all
1413 } 1471 }
1414 1472
1415 void PrintPreviewHandler::SendPrivetCapabilitiesError( 1473 void PrintPreviewHandler::SendPrivetCapabilitiesError(
1416 const std::string& device_name) { 1474 const std::string& device_name) {
1417 base::StringValue name_value(device_name); 1475 base::StringValue name_value(device_name);
1418 web_ui()->CallJavascriptFunction( 1476 web_ui()->CallJavascriptFunction(
1419 "failedToGetPrivetPrinterCapabilities", 1477 "failedToGetPrivetPrinterCapabilities",
1420 name_value); 1478 name_value);
1421 } 1479 }
1422 1480
1481 void PrintPreviewHandler::PrintToPrivetPrinter(
1482 const std::string& device_name,
1483 const std::string& ticket) {
1484 CreatePrivetHTTP(
1485 device_name,
1486 base::Bind(&PrintPreviewHandler::PrivetLocalPrintUpdateClient,
1487 base::Unretained(this),
1488 ticket));
1489 }
1490
1491 bool PrintPreviewHandler::CreatePrivetHTTP(
1492 const std::string& name,
1493 const local_discovery::PrivetHTTPAsynchronousFactory::ResultCallback&
1494 callback) {
1495 const local_discovery::DeviceDescription* device_description =
1496 printer_lister_->GetDeviceDescription(name);
1497
1498 if (!device_description) {
1499 SendPrivetCapabilitiesError(name);
1500 return false;
1501 }
1502
1503 privet_http_factory_ =
1504 local_discovery::PrivetHTTPAsynchronousFactory::CreateInstance(
1505 service_discovery_client_,
1506 Profile::FromWebUI(web_ui())->GetRequestContext());
1507 privet_http_resolution_ = privet_http_factory_->CreatePrivetHTTP(
1508 name,
1509 device_description->address,
1510 callback);
1511 privet_http_resolution_->Start();
1512
1513 return true;
1514 }
1515
1516 void PrintPreviewHandler::OnPrivetPrintingRequestPDF(
1517 const local_discovery::PrivetLocalPrintOperation* print_operation) {
1518 scoped_refptr<base::RefCountedBytes> data;
1519 string16 title;
1520
1521 if (!GetPreviewDataAndTitle(&data, &title)) {
1522 base::FundamentalValue http_code_value(-1);
1523 web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
1524 return;
1525 }
1526
1527 // TODO(noamsml): Move data into request without copying it?
1528 std::string data_str((const char*)data->front(), data->size());
1529
1530 privet_local_print_operation_->SendData(data_str);
1531 }
1532
1533 void PrintPreviewHandler::OnPrivetPrintingRequestPWGRaster(
1534 const local_discovery::PrivetLocalPrintOperation* print_operation) {
1535 NOTIMPLEMENTED();
1536 }
1537
1538 void PrintPreviewHandler::OnPrivetPrintingDone(
1539 const local_discovery::PrivetLocalPrintOperation* print_operation) {
1540 ClosePreviewDialog();
1541 }
1542
1543 void PrintPreviewHandler::OnPrivetPrintingError(
1544 const local_discovery::PrivetLocalPrintOperation* print_operation,
1545 int http_code) {
1546 base::FundamentalValue http_code_value(http_code);
1547 web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
1548 }
1549
1423 void PrintPreviewHandler::FillPrinterDescription( 1550 void PrintPreviewHandler::FillPrinterDescription(
1424 const std::string& name, 1551 const std::string& name,
1425 const local_discovery::DeviceDescription& description, 1552 const local_discovery::DeviceDescription& description,
1426 base::DictionaryValue* printer_value) { 1553 base::DictionaryValue* printer_value) {
1427 printer_value->SetString("serviceName", name); 1554 printer_value->SetString("serviceName", name);
1428 printer_value->SetString("name", description.name); 1555 printer_value->SetString("name", description.name);
1429 } 1556 }
1430 1557
1431 #endif 1558 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698