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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/webui/print_preview/print_preview_handler.cc
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index aadc478dd0ca34c950c0fb93b41c1b40b9834293..8dcfd8cdbbb40f5cdd79fcb791baf6bd355b168d 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -37,6 +37,9 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/profile_oauth2_token_service.h"
#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
+#include "chrome/browser/signin/signin_manager.h"
+#include "chrome/browser/signin/signin_manager_base.h"
+#include "chrome/browser/signin/signin_manager_factory.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/chrome_select_file_policy.h"
@@ -88,6 +91,7 @@ enum UserActionBuckets {
INITIATOR_CRASHED, // UNUSED
INITIATOR_CLOSED,
PRINT_WITH_CLOUD_PRINT,
+ PRINT_WITH_PRIVET,
USERACTION_BUCKET_BOUNDARY
};
@@ -602,24 +606,10 @@ void PrintPreviewHandler::HandleGetPrivetPrinterCapabilities(
bool success = args->GetString(0, &name);
DCHECK(success);
- const local_discovery::DeviceDescription* device_description =
- printer_lister_->GetDeviceDescription(name);
-
- if (!device_description) {
- SendPrivetCapabilitiesError(name);
- return;
- }
-
- privet_http_factory_ =
- local_discovery::PrivetHTTPAsynchronousFactory::CreateInstance(
- service_discovery_client_,
- Profile::FromWebUI(web_ui())->GetRequestContext());
- privet_http_resolution_ = privet_http_factory_->CreatePrivetHTTP(
+ CreatePrivetHTTP(
name,
- device_description->address,
- base::Bind(&PrintPreviewHandler::StartPrivetCapabilities,
+ base::Bind(&PrintPreviewHandler::PrivetCapabilitiesUpdateClient,
base::Unretained(this)));
- privet_http_resolution_->Start();
#endif
}
@@ -718,6 +708,7 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
bool print_to_pdf = false;
bool is_cloud_printer = false;
+ bool print_with_privet = false;
bool open_pdf_in_preview = false;
#if defined(OS_MACOSX)
@@ -726,6 +717,7 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
if (!open_pdf_in_preview) {
settings->GetBoolean(printing::kSettingPrintToPDF, &print_to_pdf);
+ settings->GetBoolean(printing::kSettingPrintWithPrivet, &print_with_privet);
is_cloud_printer = settings->HasKey(printing::kSettingCloudPrintId);
}
@@ -739,6 +731,26 @@ void PrintPreviewHandler::HandlePrint(const ListValue* args) {
return;
}
+#if defined(ENABLE_MDNS)
+ if (print_with_privet && PrivetPrintingEnabled()) {
+ std::string printer_name;
+ std::string print_ticket;
+ UMA_HISTOGRAM_COUNTS("PrintPreview.PageCount.PrintWithPrivet",
+ page_count);
+ ReportUserActionHistogram(PRINT_WITH_PRIVET);
+
+ bool success = settings->GetString(printing::kSettingDeviceName,
+ &printer_name);
+ DCHECK(success);
+ success = settings->GetString(printing::kSettingTicket,
+ &print_ticket);
+ DCHECK(success);
+
+ PrintToPrivetPrinter(printer_name, print_ticket);
+ return;
+ }
+#endif
+
scoped_refptr<base::RefCountedBytes> data;
string16 title;
if (!GetPreviewDataAndTitle(&data, &title)) {
@@ -1366,22 +1378,68 @@ void PrintPreviewHandler::StopPrivetPrinterSearch() {
web_ui()->CallJavascriptFunction("onPrivetPrinterSearchDone");
}
-void PrintPreviewHandler::StartPrivetCapabilities(
+void PrintPreviewHandler::PrivetCapabilitiesUpdateClient(
+ scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
+ if (!PrivetUpdateClient(http_client.Pass()))
+ return;
+
+ privet_capabilities_operation_ =
+ privet_http_client_->CreateCapabilitiesOperation(
+ this);
+ privet_capabilities_operation_->Start();
+}
+
+bool PrintPreviewHandler::PrivetUpdateClient(
scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
if (!http_client) {
SendPrivetCapabilitiesError(privet_http_resolution_->GetName());
privet_http_resolution_.reset();
- return;
+ return false;
}
+ privet_local_print_operation_.reset();
+ privet_capabilities_operation_.reset();
privet_http_client_ = http_client.Pass();
- privet_capabilities_operation_ =
- privet_http_client_->CreateCapabilitiesOperation(
- this);
+
privet_http_resolution_.reset();
- privet_capabilities_operation_->Start();
+
+ return true;
}
+void PrintPreviewHandler::PrivetLocalPrintUpdateClient(
+ std::string print_ticket,
+ scoped_ptr<local_discovery::PrivetHTTPClient> http_client) {
+ if (!PrivetUpdateClient(http_client.Pass()))
+ return;
+
+ StartPrivetLocalPrint(print_ticket);
+}
+
+void PrintPreviewHandler::StartPrivetLocalPrint(
+ const std::string& print_ticket) {
+ privet_local_print_operation_ =
+ privet_http_client_->CreateLocalPrintOperation(this);
+
+ privet_local_print_operation_->SetTicket(print_ticket);
+
+ PrintPreviewUI* print_preview_ui = static_cast<PrintPreviewUI*>(
+ web_ui()->GetController());
+ privet_local_print_operation_->SetJobname(
+ base::UTF16ToUTF8(print_preview_ui->initiator_title()));
+
+ Profile* profile = Profile::FromWebUI(web_ui());
+ SigninManagerBase* signin_manager =
+ SigninManagerFactory::GetForProfileIfExists(profile);
+
+ if (signin_manager) {
+ privet_local_print_operation_->SetUsername(
+ signin_manager->GetAuthenticatedUsername());
+ }
+
+ privet_local_print_operation_->Start();
+}
+
+
void PrintPreviewHandler::OnPrivetCapabilities(
local_discovery::PrivetCapabilitiesOperation* capabilities_operation,
int http_error,
@@ -1420,6 +1478,75 @@ void PrintPreviewHandler::SendPrivetCapabilitiesError(
name_value);
}
+void PrintPreviewHandler::PrintToPrivetPrinter(
+ const std::string& device_name,
+ const std::string& ticket) {
+ CreatePrivetHTTP(
+ device_name,
+ base::Bind(&PrintPreviewHandler::PrivetLocalPrintUpdateClient,
+ base::Unretained(this),
+ ticket));
+}
+
+bool PrintPreviewHandler::CreatePrivetHTTP(
+ const std::string& name,
+ const local_discovery::PrivetHTTPAsynchronousFactory::ResultCallback&
+ callback) {
+ const local_discovery::DeviceDescription* device_description =
+ printer_lister_->GetDeviceDescription(name);
+
+ if (!device_description) {
+ SendPrivetCapabilitiesError(name);
+ return false;
+ }
+
+ privet_http_factory_ =
+ local_discovery::PrivetHTTPAsynchronousFactory::CreateInstance(
+ service_discovery_client_,
+ Profile::FromWebUI(web_ui())->GetRequestContext());
+ privet_http_resolution_ = privet_http_factory_->CreatePrivetHTTP(
+ name,
+ device_description->address,
+ callback);
+ privet_http_resolution_->Start();
+
+ return true;
+}
+
+void PrintPreviewHandler::OnPrivetPrintingRequestPDF(
+ const local_discovery::PrivetLocalPrintOperation* print_operation) {
+ scoped_refptr<base::RefCountedBytes> data;
+ string16 title;
+
+ if (!GetPreviewDataAndTitle(&data, &title)) {
+ base::FundamentalValue http_code_value(-1);
+ web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
+ return;
+ }
+
+ // TODO(noamsml): Move data into request without copying it?
+ std::string data_str((const char*)data->front(), data->size());
+
+ privet_local_print_operation_->SendData(data_str);
+}
+
+void PrintPreviewHandler::OnPrivetPrintingRequestPWGRaster(
+ const local_discovery::PrivetLocalPrintOperation* print_operation) {
+ NOTIMPLEMENTED();
+}
+
+void PrintPreviewHandler::OnPrivetPrintingDone(
+ const local_discovery::PrivetLocalPrintOperation* print_operation) {
+ ClosePreviewDialog();
+}
+
+void PrintPreviewHandler::OnPrivetPrintingError(
+ const local_discovery::PrivetLocalPrintOperation* print_operation,
+ int http_code) {
+ base::FundamentalValue http_code_value(http_code);
+ web_ui()->CallJavascriptFunction("onPrivetPrintFailed", http_code_value);
+}
+
void PrintPreviewHandler::FillPrinterDescription(
const std::string& name,
const local_discovery::DeviceDescription& description,

Powered by Google App Engine
This is Rietveld 408576698