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

Unified Diff: cloud_print/gcp20/prototype/printer.cc

Issue 19468002: Added confirmation for printer registration. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@new-api-availability-check
Patch Set: Created 7 years, 5 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: cloud_print/gcp20/prototype/printer.cc
diff --git a/cloud_print/gcp20/prototype/printer.cc b/cloud_print/gcp20/prototype/printer.cc
index 2922e8312711e0ac6a5e1fae507208fc1e48c32f..8b94d92996fba977ad2796816704510ad95e1271 100644
--- a/cloud_print/gcp20/prototype/printer.cc
+++ b/cloud_print/gcp20/prototype/printer.cc
@@ -4,6 +4,7 @@
#include "cloud_print/gcp20/prototype/printer.h"
+#include <stdio.h>
#include <string>
#include <vector>
@@ -15,21 +16,26 @@
#include "base/strings/string_number_conversions.h"
#include "cloud_print/gcp20/prototype/command_line_reader.h"
#include "cloud_print/gcp20/prototype/service_parameters.h"
+#include "cloud_print/gcp20/prototype/special_io.h"
#include "net/base/net_util.h"
#include "net/base/url_util.h"
-const char* kPrinterStatePath = "printer_state.json";
+const char kPrinterStatePath[] = "printer_state.json";
namespace {
-const char* kServiceType = "_privet._tcp.local";
-const char* kServiceNamePrefix = "first_gcp20_device";
-const char* kServiceDomainName = "my-privet-device.local";
+const char kServiceType[] = "_privet._tcp.local";
+const char kServiceNamePrefix[] = "first_gcp20_device";
+const char kServiceDomainName[] = "my-privet-device.local";
-const char* kPrinterName = "Google GCP2.0 Prototype";
-const char* kPrinterDescription = "Printer emulator";
+const char kPrinterName[] = "Google GCP2.0 Prototype";
+const char kPrinterDescription[] = "Printer emulator";
-const char* kCdd =
+const char kUserConfirmationTitle[] = "Confirm registration: type 'y' if you "
+ "agree and any other to discard";
+const uint kUserConfirmationTimeout = 30; // in seconds
+
+const char kCdd[] =
"{\n"
" 'version': '1.0',\n"
" 'printer': {\n"
@@ -85,7 +91,9 @@ net::IPAddressNumber GetLocalIp(const std::string& interface_name,
} // namespace
-Printer::RegistrationInfo::RegistrationInfo() : state(DEV_REG_UNREGISTERED) {
+Printer::RegistrationInfo::RegistrationInfo()
+ : state(DEV_REG_UNREGISTERED),
+ confirmation_state(CONFIRMATION_PENDING) {
}
Printer::RegistrationInfo::~RegistrationInfo() {
@@ -164,6 +172,14 @@ PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationStart(
reg_info_.user = user;
reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_STARTED;
+ printf("%s\n", kUserConfirmationTitle);
+ base::Time valid_until = base::Time::Now() +
+ base::TimeDelta::FromSeconds(kUserConfirmationTimeout);
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&Printer::WaitUserConfirmation,
Vitaly Buka (NO REVIEWS) 2013/07/22 04:01:23 can't use unretained here
maksymb 2013/07/22 19:52:16 Done.
+ base::Unretained(this), valid_until));
+
requester_->StartRegistration(GenerateProxyId(), kPrinterName, user, kCdd);
return PrivetHttpServer::REG_ERROR_OK;
@@ -185,19 +201,20 @@ PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationGetClaimToken(
if (status != PrivetHttpServer::REG_ERROR_OK)
return status;
- // TODO(maksymb): Add user confirmation.
+ if (reg_info_.state != RegistrationInfo::DEV_REG_REGISTRATION_STARTED &&
+ reg_info_.state !=
+ RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY)
+ return PrivetHttpServer::REG_ERROR_INVALID_ACTION;
+
+ if (reg_info_.confirmation_state != RegistrationInfo::CONFIRMATION_CONFIRMED)
+ return ConfirmationToRegistrationError(reg_info_.confirmation_state);
if (reg_info_.state == RegistrationInfo::DEV_REG_REGISTRATION_STARTED)
return PrivetHttpServer::REG_ERROR_DEVICE_BUSY;
- if (reg_info_.state ==
- RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY) {
- *token = reg_info_.registration_token;
- *claim_url = reg_info_.complete_invite_url;
- return PrivetHttpServer::REG_ERROR_OK;
- }
-
- return PrivetHttpServer::REG_ERROR_INVALID_ACTION;
+ *token = reg_info_.registration_token;
+ *claim_url = reg_info_.complete_invite_url;
+ return PrivetHttpServer::REG_ERROR_OK;
}
PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationComplete(
@@ -212,9 +229,11 @@ PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationComplete(
return PrivetHttpServer::REG_ERROR_INVALID_ACTION;
}
+ if (reg_info_.confirmation_state != RegistrationInfo::CONFIRMATION_CONFIRMED)
+ return ConfirmationToRegistrationError(reg_info_.confirmation_state);
+
reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_COMPLETING;
requester_->CompleteRegistration();
-
*device_id = reg_info_.device_id;
return PrivetHttpServer::REG_ERROR_OK;
@@ -232,6 +251,10 @@ PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationCancel(
return PrivetHttpServer::REG_ERROR_INVALID_ACTION;
reg_info_ = RegistrationInfo();
+ requester_.reset(new CloudPrintRequester(
+ base::MessageLoop::current()->message_loop_proxy(),
+ this)); // Forget all old queries.
+
return PrivetHttpServer::REG_ERROR_OK;
}
@@ -306,6 +329,32 @@ PrivetHttpServer::RegistrationErrorStatus Printer::CheckCommonRegErrors(
return PrivetHttpServer::REG_ERROR_OK;
}
+void Printer::WaitUserConfirmation(base::Time valid_until) {
+ if (base::Time::Now() > valid_until) {
+ reg_info_.confirmation_state = RegistrationInfo::CONFIRMATION_TIMEOUT;
+ LOG(INFO) << "Confirmation timeout reached.";
+ return;
+ }
+
+ if (kbhit()) {
+ int c = getche();
+ if (c == 'y' || c == 'Y') {
+ reg_info_.confirmation_state = RegistrationInfo::CONFIRMATION_CONFIRMED;
+ LOG(INFO) << "Registration confirmed by user.";
+ } else {
+ reg_info_.confirmation_state = RegistrationInfo::CONFIRMATION_DISCARDED;
+ LOG(INFO) << "Registration discarded by user.";
+ }
+ return;
+ }
+
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&Printer::WaitUserConfirmation, base::Unretained(this),
Vitaly Buka (NO REVIEWS) 2013/07/22 04:01:23 can't use unretained here
maksymb 2013/07/22 19:52:16 Done.
+ valid_until),
+ base::TimeDelta::FromMilliseconds(100));
+}
+
std::string Printer::GenerateProxyId() const {
return "{" + base::GenerateGUID() +"}";
}
@@ -404,3 +453,22 @@ bool Printer::LoadFromFile(const std::string& filename) {
return true;
}
+PrivetHttpServer::RegistrationErrorStatus
+ Printer::ConfirmationToRegistrationError(
+ RegistrationInfo::ConfirmationState state) {
+ switch (state) {
+ case RegistrationInfo::CONFIRMATION_PENDING:
+ return PrivetHttpServer::REG_ERROR_PENDING_USER_ACTION;
+ case RegistrationInfo::CONFIRMATION_DISCARDED:
+ return PrivetHttpServer::REG_ERROR_USER_CANCEL;
+ case RegistrationInfo::CONFIRMATION_CONFIRMED:
+ NOTREACHED();
+ return PrivetHttpServer::REG_ERROR_OK;
+ case RegistrationInfo::CONFIRMATION_TIMEOUT:
+ return PrivetHttpServer::REG_ERROR_CONFIRMATION_TIMEOUT;
+ default:
+ NOTREACHED();
+ return PrivetHttpServer::REG_ERROR_OK;
+ }
+}
+

Powered by Google App Engine
This is Rietveld 408576698