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

Side by Side Diff: cloud_print/gcp20/prototype/printer.cc

Issue 22184007: GCP2.0 Device: Instant AccessToken update on AuthFailed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 4 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "cloud_print/gcp20/prototype/printer.h" 5 #include "cloud_print/gcp20/prototype/printer.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 20 matching lines...) Expand all
31 31
32 const char kServiceType[] = "_privet._tcp.local"; 32 const char kServiceType[] = "_privet._tcp.local";
33 const char kServiceNamePrefixDefault[] = "first_gcp20_device"; 33 const char kServiceNamePrefixDefault[] = "first_gcp20_device";
34 const char kServiceDomainNameDefault[] = "my-privet-device.local"; 34 const char kServiceDomainNameDefault[] = "my-privet-device.local";
35 35
36 const char kPrinterName[] = "Google GCP2.0 Prototype"; 36 const char kPrinterName[] = "Google GCP2.0 Prototype";
37 const char kPrinterDescription[] = "Printer emulator"; 37 const char kPrinterDescription[] = "Printer emulator";
38 38
39 const char kUserConfirmationTitle[] = "Confirm registration: type 'y' if you " 39 const char kUserConfirmationTitle[] = "Confirm registration: type 'y' if you "
40 "agree and any other to discard\n"; 40 "agree and any other to discard\n";
41 const int64 kUserConfirmationTimeout = 30; // in seconds 41 const int kUserConfirmationTimeout = 30; // in seconds
42 42 const int kRegistrationTimeout = 60; // in seconds
43 const uint32 kReconnectTimeout = 5; // in seconds 43 const int kReconnectTimeout = 5; // in seconds
44 44
45 const double kTimeToNextAccessTokenUpdate = 0.8; // relatively to living time. 45 const double kTimeToNextAccessTokenUpdate = 0.8; // relatively to living time.
46 46
47 const char kCdd[] = 47 const char kCdd[] =
48 "{\n" 48 "{\n"
49 " 'version': '1.0',\n" 49 " 'version': '1.0',\n"
50 " 'printer': {\n" 50 " 'printer': {\n"
51 " 'vendor_capability': [\n" 51 " 'vendor_capability': [\n"
52 " {\n" 52 " {\n"
53 " 'id': 'psk:MediaType',\n" 53 " 'id': 'psk:MediaType',\n"
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 175
176 void Printer::Stop() { 176 void Printer::Stop() {
177 dns_server_.Shutdown(); 177 dns_server_.Shutdown();
178 http_server_.Shutdown(); 178 http_server_.Shutdown();
179 requester_.reset(); 179 requester_.reset();
180 print_job_handler_.reset(); 180 print_job_handler_.reset();
181 xmpp_listener_.reset(); 181 xmpp_listener_.reset();
182 } 182 }
183 183
184 void Printer::OnAuthError() { 184 void Printer::OnAuthError() {
185 access_token_update_ = base::Time::Now(); 185 access_token_update_ = base::Time::UnixEpoch();
186 ChangeState(OFFLINE); 186 ReconnectIn(base::TimeDelta::FromSeconds(0));
187 // TODO(maksymb): Implement *instant* updating of access_token.
188 } 187 }
189 188
190 std::string Printer::GetAccessToken() { 189 std::string Printer::GetAccessToken() {
191 return access_token_; 190 return access_token_;
192 } 191 }
193 192
194 PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationStart( 193 PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationStart(
195 const std::string& user) { 194 const std::string& user) {
195 CheckRegistrationExpiration();
196 RegistrationInfo::ConfirmationState conf_state = reg_info_.confirmation_state;
197 if (user != reg_info_.user)
198 if (conf_state == RegistrationInfo::CONFIRMATION_TIMEOUT ||
199 conf_state == RegistrationInfo::CONFIRMATION_DISCARDED) {
200 reg_info_ = RegistrationInfo();
201 }
202
196 PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user); 203 PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user);
197 if (status != PrivetHttpServer::REG_ERROR_OK) 204 if (status != PrivetHttpServer::REG_ERROR_OK)
198 return status; 205 return status;
199 206
200 if (reg_info_.state != RegistrationInfo::DEV_REG_UNREGISTERED) 207 if (reg_info_.state != RegistrationInfo::DEV_REG_UNREGISTERED)
201 return PrivetHttpServer::REG_ERROR_INVALID_ACTION; 208 return PrivetHttpServer::REG_ERROR_INVALID_ACTION;
202 209
210 UpdateRegistrationExpiration();
211
203 reg_info_ = RegistrationInfo(); 212 reg_info_ = RegistrationInfo();
204 reg_info_.user = user; 213 reg_info_.user = user;
205 reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_STARTED; 214 reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_STARTED;
206 215
207 if (CommandLine::ForCurrentProcess()->HasSwitch("disable-confirmation")) { 216 if (CommandLine::ForCurrentProcess()->HasSwitch("disable-confirmation")) {
208 reg_info_.confirmation_state = RegistrationInfo::CONFIRMATION_CONFIRMED; 217 reg_info_.confirmation_state = RegistrationInfo::CONFIRMATION_CONFIRMED;
209 LOG(INFO) << "Registration confirmed by default."; 218 LOG(INFO) << "Registration confirmed by default.";
210 } else { 219 } else {
211 printf("%s", kUserConfirmationTitle); 220 printf("%s", kUserConfirmationTitle);
212 base::Time valid_until = base::Time::Now() + 221 base::Time valid_until = base::Time::Now() +
(...skipping 20 matching lines...) Expand all
233 if (reg_info_.state != RegistrationInfo::DEV_REG_REGISTRATION_STARTED && 242 if (reg_info_.state != RegistrationInfo::DEV_REG_REGISTRATION_STARTED &&
234 reg_info_.state != 243 reg_info_.state !=
235 RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY) 244 RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY)
236 return PrivetHttpServer::REG_ERROR_INVALID_ACTION; 245 return PrivetHttpServer::REG_ERROR_INVALID_ACTION;
237 246
238 // If |action=getClaimToken| is valid in this state (was checked above) then 247 // If |action=getClaimToken| is valid in this state (was checked above) then
239 // check confirmation status. 248 // check confirmation status.
240 if (reg_info_.confirmation_state != RegistrationInfo::CONFIRMATION_CONFIRMED) 249 if (reg_info_.confirmation_state != RegistrationInfo::CONFIRMATION_CONFIRMED)
241 return ConfirmationToRegistrationError(reg_info_.confirmation_state); 250 return ConfirmationToRegistrationError(reg_info_.confirmation_state);
242 251
252 UpdateRegistrationExpiration();
253
243 // If reply wasn't received yet, reply with |device_busy| error. 254 // If reply wasn't received yet, reply with |device_busy| error.
244 if (reg_info_.state == RegistrationInfo::DEV_REG_REGISTRATION_STARTED) 255 if (reg_info_.state == RegistrationInfo::DEV_REG_REGISTRATION_STARTED)
245 return PrivetHttpServer::REG_ERROR_DEVICE_BUSY; 256 return PrivetHttpServer::REG_ERROR_DEVICE_BUSY;
246 257
247 DCHECK_EQ(reg_info_.state, 258 DCHECK_EQ(reg_info_.state,
248 RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY); 259 RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY);
249 DCHECK_EQ(reg_info_.confirmation_state, 260 DCHECK_EQ(reg_info_.confirmation_state,
250 RegistrationInfo::CONFIRMATION_CONFIRMED); 261 RegistrationInfo::CONFIRMATION_CONFIRMED);
251 262
252 *token = reg_info_.registration_token; 263 *token = reg_info_.registration_token;
253 *claim_url = reg_info_.complete_invite_url; 264 *claim_url = reg_info_.complete_invite_url;
254 return PrivetHttpServer::REG_ERROR_OK; 265 return PrivetHttpServer::REG_ERROR_OK;
255 } 266 }
256 267
257 PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationComplete( 268 PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationComplete(
258 const std::string& user, 269 const std::string& user,
259 std::string* device_id) { 270 std::string* device_id) {
260 PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user); 271 PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user);
261 if (status != PrivetHttpServer::REG_ERROR_OK) 272 if (status != PrivetHttpServer::REG_ERROR_OK)
262 return status; 273 return status;
263 274
264 if (reg_info_.state != 275 if (reg_info_.state !=
265 RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY) { 276 RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY) {
266 return PrivetHttpServer::REG_ERROR_INVALID_ACTION; 277 return PrivetHttpServer::REG_ERROR_INVALID_ACTION;
267 } 278 }
268 279
280 UpdateRegistrationExpiration();
281
269 if (reg_info_.confirmation_state != RegistrationInfo::CONFIRMATION_CONFIRMED) 282 if (reg_info_.confirmation_state != RegistrationInfo::CONFIRMATION_CONFIRMED)
270 return ConfirmationToRegistrationError(reg_info_.confirmation_state); 283 return ConfirmationToRegistrationError(reg_info_.confirmation_state);
271 284
272 reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_COMPLETING; 285 reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_COMPLETING;
273 requester_->CompleteRegistration(); 286 requester_->CompleteRegistration();
274 *device_id = reg_info_.device_id; 287 *device_id = reg_info_.device_id;
275 288
276 return PrivetHttpServer::REG_ERROR_OK; 289 return PrivetHttpServer::REG_ERROR_OK;
277 } 290 }
278 291
279 PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationCancel( 292 PrivetHttpServer::RegistrationErrorStatus Printer::RegistrationCancel(
280 const std::string& user) { 293 const std::string& user) {
281 PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user); 294 PrivetHttpServer::RegistrationErrorStatus status = CheckCommonRegErrors(user);
282 if (status != PrivetHttpServer::REG_ERROR_OK && 295 if (status != PrivetHttpServer::REG_ERROR_OK &&
283 status != PrivetHttpServer::REG_ERROR_SERVER_ERROR) { 296 status != PrivetHttpServer::REG_ERROR_SERVER_ERROR) {
284 return status; 297 return status;
285 } 298 }
286 299
287 if (reg_info_.state == RegistrationInfo::DEV_REG_UNREGISTERED) 300 if (reg_info_.state == RegistrationInfo::DEV_REG_UNREGISTERED)
288 return PrivetHttpServer::REG_ERROR_INVALID_ACTION; 301 return PrivetHttpServer::REG_ERROR_INVALID_ACTION;
289 302
303 InvalidateRegistrationExpiration();
304
290 reg_info_ = RegistrationInfo(); 305 reg_info_ = RegistrationInfo();
291 requester_.reset(new CloudPrintRequester(GetTaskRunner(), this)); 306 requester_.reset(new CloudPrintRequester(GetTaskRunner(), this));
292 307
293 return PrivetHttpServer::REG_ERROR_OK; 308 return PrivetHttpServer::REG_ERROR_OK;
294 } 309 }
295 310
296 void Printer::GetRegistrationServerError(std::string* description) { 311 void Printer::GetRegistrationServerError(std::string* description) {
297 DCHECK_EQ(reg_info_.state, RegistrationInfo::DEV_REG_REGISTRATION_ERROR) << 312 DCHECK_EQ(reg_info_.state, RegistrationInfo::DEV_REG_REGISTRATION_ERROR)
298 "Method shouldn't be called when not needed."; 313 << "Method shouldn't be called when not needed.";
299 314
300 *description = reg_info_.error_description; 315 *description = reg_info_.error_description;
301 } 316 }
302 317
303 void Printer::CreateInfo(PrivetHttpServer::DeviceInfo* info) { 318 void Printer::CreateInfo(PrivetHttpServer::DeviceInfo* info) {
319 CheckRegistrationExpiration();
320
304 // TODO(maksymb): Replace "text" with constants. 321 // TODO(maksymb): Replace "text" with constants.
305 322
306 *info = PrivetHttpServer::DeviceInfo(); 323 *info = PrivetHttpServer::DeviceInfo();
307 info->version = "1.0"; 324 info->version = "1.0";
308 info->name = kPrinterName; 325 info->name = kPrinterName;
309 info->description = kPrinterDescription; 326 info->description = kPrinterDescription;
310 info->url = kCloudPrintUrl; 327 info->url = kCloudPrintUrl;
311 info->id = reg_info_.device_id; 328 info->id = reg_info_.device_id;
312 info->device_state = "idle"; 329 info->device_state = "idle";
313 info->connection_state = ConnectionStateToString(connection_state_); 330 info->connection_state = ConnectionStateToString(connection_state_);
314 info->manufacturer = "Google"; 331 info->manufacturer = "Google";
315 info->model = "Prototype"; 332 info->model = "Prototype";
316 info->serial_number = "2.3.5.7.13.17.19.31.61.89.107.127.521.607.1279.2203"; 333 info->serial_number = "2.3.5.7.13.17.19.31.61.89.107.127.521.607.1279.2203";
317 info->firmware = "3.7.31.127.8191.131071.524287.2147483647"; 334 info->firmware = "3.7.31.127.8191.131071.524287.2147483647";
318 info->uptime = static_cast<int>((base::Time::Now() - starttime_).InSeconds()); 335 info->uptime = static_cast<int>((base::Time::Now() - starttime_).InSeconds());
319 336
320 info->x_privet_token = xtoken_.GenerateXToken(); 337 info->x_privet_token = xtoken_.GenerateXToken();
321 338
322 if (reg_info_.state == RegistrationInfo::DEV_REG_UNREGISTERED) 339 if (reg_info_.state == RegistrationInfo::DEV_REG_UNREGISTERED)
323 info->api.push_back("/privet/register"); 340 info->api.push_back("/privet/register");
324 341
325 info->type.push_back("printer"); 342 info->type.push_back("printer");
326 } 343 }
327 344
328 bool Printer::IsRegistered() const { 345 bool Printer::IsRegistered() {
346 CheckRegistrationExpiration();
329 return reg_info_.state == RegistrationInfo::DEV_REG_REGISTERED; 347 return reg_info_.state == RegistrationInfo::DEV_REG_REGISTERED;
330 } 348 }
331 349
332 bool Printer::CheckXPrivetTokenHeader(const std::string& token) const { 350 bool Printer::CheckXPrivetTokenHeader(const std::string& token) const {
333 return xtoken_.CheckValidXToken(token); 351 return xtoken_.CheckValidXToken(token);
334 } 352 }
335 353
336 void Printer::OnRegistrationStartResponseParsed( 354 void Printer::OnRegistrationStartResponseParsed(
337 const std::string& registration_token, 355 const std::string& registration_token,
338 const std::string& complete_invite_url, 356 const std::string& complete_invite_url,
339 const std::string& device_id) { 357 const std::string& device_id) {
340 reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY; 358 reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_CLAIM_TOKEN_READY;
341 reg_info_.device_id = device_id; 359 reg_info_.device_id = device_id;
342 reg_info_.registration_token = registration_token; 360 reg_info_.registration_token = registration_token;
343 reg_info_.complete_invite_url = complete_invite_url; 361 reg_info_.complete_invite_url = complete_invite_url;
344 } 362 }
345 363
346 void Printer::OnGetAuthCodeResponseParsed(const std::string& refresh_token, 364 void Printer::OnRegistrationFinished(const std::string& refresh_token,
347 const std::string& access_token, 365 const std::string& access_token,
348 int access_token_expires_in_seconds) { 366 int access_token_expires_in_seconds) {
367 InvalidateRegistrationExpiration();
368
349 reg_info_.state = RegistrationInfo::DEV_REG_REGISTERED; 369 reg_info_.state = RegistrationInfo::DEV_REG_REGISTERED;
350 reg_info_.refresh_token = refresh_token; 370 reg_info_.refresh_token = refresh_token;
351 RememberAccessToken(access_token, access_token_expires_in_seconds); 371 RememberAccessToken(access_token, access_token_expires_in_seconds);
352 TryConnect(); 372 TryConnect();
353 } 373 }
354 374
355 void Printer::OnAccesstokenReceviced(const std::string& access_token, 375 void Printer::OnAccesstokenReceviced(const std::string& access_token,
356 int expires_in_seconds) { 376 int expires_in_seconds) {
357 VLOG(3) << "Function: " << __FUNCTION__; 377 VLOG(3) << "Function: " << __FUNCTION__;
358 RememberAccessToken(access_token, expires_in_seconds); 378 RememberAccessToken(access_token, expires_in_seconds);
(...skipping 12 matching lines...) Expand all
371 } 391 }
372 392
373 void Printer::OnXmppJidReceived(const std::string& xmpp_jid) { 393 void Printer::OnXmppJidReceived(const std::string& xmpp_jid) {
374 reg_info_.xmpp_jid = xmpp_jid; 394 reg_info_.xmpp_jid = xmpp_jid;
375 } 395 }
376 396
377 void Printer::OnRegistrationError(const std::string& description) { 397 void Printer::OnRegistrationError(const std::string& description) {
378 LOG(ERROR) << "server_error: " << description; 398 LOG(ERROR) << "server_error: " << description;
379 399
380 // TODO(maksymb): Implement waiting after error and timeout of registration. 400 // TODO(maksymb): Implement waiting after error and timeout of registration.
381 reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_ERROR; 401 SetRegistrationError(description);
382 reg_info_.error_description = description;
383 } 402 }
384 403
385 void Printer::OnNetworkError() { 404 void Printer::OnNetworkError() {
386 VLOG(3) << "Function: " << __FUNCTION__; 405 VLOG(3) << "Function: " << __FUNCTION__;
387 ChangeState(OFFLINE); 406 ChangeState(OFFLINE);
388 } 407 }
389 408
390 void Printer::OnServerError(const std::string& description) { 409 void Printer::OnServerError(const std::string& description) {
391 VLOG(3) << "Function: " << __FUNCTION__; 410 VLOG(3) << "Function: " << __FUNCTION__;
392 LOG(ERROR) << "Server error: " << description; 411 LOG(ERROR) << "Server error: " << description;
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 using base::Time; 551 using base::Time;
533 using base::TimeDelta; 552 using base::TimeDelta;
534 access_token_ = access_token; 553 access_token_ = access_token;
535 int64 time_to_update = static_cast<int64>(expires_in_seconds * 554 int64 time_to_update = static_cast<int64>(expires_in_seconds *
536 kTimeToNextAccessTokenUpdate); 555 kTimeToNextAccessTokenUpdate);
537 access_token_update_ = Time::Now() + TimeDelta::FromSeconds(time_to_update); 556 access_token_update_ = Time::Now() + TimeDelta::FromSeconds(time_to_update);
538 VLOG(1) << "Current access_token: " << access_token; 557 VLOG(1) << "Current access_token: " << access_token;
539 SaveToFile(); 558 SaveToFile();
540 } 559 }
541 560
561 void Printer::SetRegistrationError(const std::string& description) {
562 DCHECK(!IsRegistered());
563 reg_info_.state = RegistrationInfo::DEV_REG_REGISTRATION_ERROR;
564 reg_info_.error_description = description;
565 }
566
542 PrivetHttpServer::RegistrationErrorStatus Printer::CheckCommonRegErrors( 567 PrivetHttpServer::RegistrationErrorStatus Printer::CheckCommonRegErrors(
543 const std::string& user) const { 568 const std::string& user) {
569 CheckRegistrationExpiration();
544 DCHECK(!IsRegistered()); 570 DCHECK(!IsRegistered());
545 571
546 if (reg_info_.state != RegistrationInfo::DEV_REG_UNREGISTERED && 572 if (reg_info_.state != RegistrationInfo::DEV_REG_UNREGISTERED &&
547 user != reg_info_.user) { 573 user != reg_info_.user) {
548 return PrivetHttpServer::REG_ERROR_DEVICE_BUSY; 574 return PrivetHttpServer::REG_ERROR_DEVICE_BUSY;
549 } 575 }
550 576
551 if (reg_info_.state == RegistrationInfo::DEV_REG_REGISTRATION_ERROR) 577 if (reg_info_.state == RegistrationInfo::DEV_REG_REGISTRATION_ERROR)
552 return PrivetHttpServer::REG_ERROR_SERVER_ERROR; 578 return PrivetHttpServer::REG_ERROR_SERVER_ERROR;
553 579
580 DCHECK(connection_state_ == ONLINE);
581
554 return PrivetHttpServer::REG_ERROR_OK; 582 return PrivetHttpServer::REG_ERROR_OK;
555 } 583 }
556 584
557 void Printer::WaitUserConfirmation(base::Time valid_until) { 585 void Printer::WaitUserConfirmation(base::Time valid_until) {
586 // TODO(maksymb): Move to separate class.
587
558 if (base::Time::Now() > valid_until) { 588 if (base::Time::Now() > valid_until) {
559 reg_info_.confirmation_state = RegistrationInfo::CONFIRMATION_TIMEOUT; 589 reg_info_.confirmation_state = RegistrationInfo::CONFIRMATION_TIMEOUT;
560 LOG(INFO) << "Confirmation timeout reached."; 590 LOG(INFO) << "Confirmation timeout reached.";
561 return; 591 return;
562 } 592 }
563 593
564 if (_kbhit()) { 594 if (_kbhit()) {
565 int c = _getche(); 595 int c = _getche();
566 if (c == 'y' || c == 'Y') { 596 if (c == 'y' || c == 'Y') {
567 reg_info_.confirmation_state = RegistrationInfo::CONFIRMATION_CONFIRMED; 597 reg_info_.confirmation_state = RegistrationInfo::CONFIRMATION_CONFIRMED;
(...skipping 21 matching lines...) Expand all
589 txt.push_back("ty=" + std::string(kPrinterName)); 619 txt.push_back("ty=" + std::string(kPrinterName));
590 txt.push_back("note=" + std::string(kPrinterDescription)); 620 txt.push_back("note=" + std::string(kPrinterDescription));
591 txt.push_back("url=" + std::string(kCloudPrintUrl)); 621 txt.push_back("url=" + std::string(kCloudPrintUrl));
592 txt.push_back("type=printer"); 622 txt.push_back("type=printer");
593 txt.push_back("id=" + reg_info_.device_id); 623 txt.push_back("id=" + reg_info_.device_id);
594 txt.push_back("cs=" + ConnectionStateToString(connection_state_)); 624 txt.push_back("cs=" + ConnectionStateToString(connection_state_));
595 625
596 return txt; 626 return txt;
597 } 627 }
598 628
599 void Printer::SaveToFile() const { 629 void Printer::SaveToFile() {
600 base::FilePath file_path; 630 base::FilePath file_path;
601 file_path = file_path.AppendASCII( 631 file_path = file_path.AppendASCII(
602 command_line_reader::ReadStatePath(kPrinterStatePathDefault)); 632 command_line_reader::ReadStatePath(kPrinterStatePathDefault));
603 633
604 base::DictionaryValue json; 634 base::DictionaryValue json;
605 // TODO(maksymb): Get rid of in-place constants. 635 // TODO(maksymb): Get rid of in-place constants.
606 if (IsRegistered()) { 636 if (IsRegistered()) {
607 json.SetBoolean("registered", true); 637 json.SetBoolean("registered", true);
608 json.SetString("user", reg_info_.user); 638 json.SetString("user", reg_info_.user);
609 json.SetString("device_id", reg_info_.device_id); 639 json.SetString("device_id", reg_info_.device_id);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 void Printer::PostOnIdle() { 743 void Printer::PostOnIdle() {
714 VLOG(3) << "Function: " << __FUNCTION__; 744 VLOG(3) << "Function: " << __FUNCTION__;
715 DCHECK(!on_idle_posted_) << "Only one instance can be posted."; 745 DCHECK(!on_idle_posted_) << "Only one instance can be posted.";
716 on_idle_posted_ = true; 746 on_idle_posted_ = true;
717 747
718 base::MessageLoop::current()->PostTask( 748 base::MessageLoop::current()->PostTask(
719 FROM_HERE, 749 FROM_HERE,
720 base::Bind(&Printer::OnIdle, AsWeakPtr())); 750 base::Bind(&Printer::OnIdle, AsWeakPtr()));
721 } 751 }
722 752
753 void Printer::CheckRegistrationExpiration() {
754 if (!registration_expiration_.is_null() &&
755 registration_expiration_ < base::Time::Now()) {
756 reg_info_ = RegistrationInfo();
757 InvalidateRegistrationExpiration();
758 if (connection_state_ != ONLINE)
759 TryConnect();
760 }
761 }
762
763 void Printer::UpdateRegistrationExpiration() {
764 registration_expiration_ =
765 base::Time::Now() + base::TimeDelta::FromSeconds(kRegistrationTimeout);
766 }
767
768 void Printer::InvalidateRegistrationExpiration() {
769 registration_expiration_ = base::Time();
770 }
771
723 PrivetHttpServer::RegistrationErrorStatus 772 PrivetHttpServer::RegistrationErrorStatus
724 Printer::ConfirmationToRegistrationError( 773 Printer::ConfirmationToRegistrationError(
725 RegistrationInfo::ConfirmationState state) { 774 RegistrationInfo::ConfirmationState state) {
726 switch (state) { 775 switch (state) {
727 case RegistrationInfo::CONFIRMATION_PENDING: 776 case RegistrationInfo::CONFIRMATION_PENDING:
728 return PrivetHttpServer::REG_ERROR_PENDING_USER_ACTION; 777 return PrivetHttpServer::REG_ERROR_PENDING_USER_ACTION;
729 case RegistrationInfo::CONFIRMATION_DISCARDED: 778 case RegistrationInfo::CONFIRMATION_DISCARDED:
730 return PrivetHttpServer::REG_ERROR_USER_CANCEL; 779 return PrivetHttpServer::REG_ERROR_USER_CANCEL;
731 case RegistrationInfo::CONFIRMATION_CONFIRMED: 780 case RegistrationInfo::CONFIRMATION_CONFIRMED:
732 NOTREACHED(); 781 NOTREACHED();
733 return PrivetHttpServer::REG_ERROR_OK; 782 return PrivetHttpServer::REG_ERROR_OK;
734 case RegistrationInfo::CONFIRMATION_TIMEOUT: 783 case RegistrationInfo::CONFIRMATION_TIMEOUT:
735 return PrivetHttpServer::REG_ERROR_CONFIRMATION_TIMEOUT; 784 return PrivetHttpServer::REG_ERROR_CONFIRMATION_TIMEOUT;
(...skipping 13 matching lines...) Expand all
749 return "connecting"; 798 return "connecting";
750 case NOT_CONFIGURED: 799 case NOT_CONFIGURED:
751 return "not-configured"; 800 return "not-configured";
752 801
753 default: 802 default:
754 NOTREACHED(); 803 NOTREACHED();
755 return ""; 804 return "";
756 } 805 }
757 } 806 }
758 807
808 void Printer::ReconnectIn(const base::TimeDelta& delay) {
809 if (!IsRegistered()) {
810 SetRegistrationError("Cannot access server during registration process");
gene 2013/08/08 02:01:55 I am not sure I understand in what cases this erro
maksymb 2013/08/08 18:35:46 Once something bad happened during registration, t
811 return;
812 }
813
814 requester_.reset();
815 xmpp_listener_.reset();
816 base::MessageLoop::current()->PostDelayedTask(
817 FROM_HERE,
818 base::Bind(&Printer::TryConnect, AsWeakPtr()),
819 delay);
820 }
821
759 bool Printer::ChangeState(ConnectionState new_state) { 822 bool Printer::ChangeState(ConnectionState new_state) {
760 if (connection_state_ == new_state) 823 if (connection_state_ == new_state)
761 return false; 824 return false;
762 825
763 connection_state_ = new_state; 826 connection_state_ = new_state;
764 LOG(INFO) << base::StringPrintf( 827 LOG(INFO) << base::StringPrintf(
765 "Printer is now %s (%s)", 828 "Printer is now %s (%s)",
766 ConnectionStateToString(connection_state_).c_str(), 829 ConnectionStateToString(connection_state_).c_str(),
767 IsRegistered() ? "registered" : "unregistered"); 830 IsRegistered() ? "registered" : "unregistered");
768 831
769 dns_server_.UpdateMetadata(CreateTxt()); 832 dns_server_.UpdateMetadata(CreateTxt());
770 833
771 switch (connection_state_) { 834 if (connection_state_ == OFFLINE)
772 case CONNECTING: 835 ReconnectIn(base::TimeDelta::FromSeconds(kReconnectTimeout));
773 break;
774
775 case ONLINE:
776 break;
777
778 case OFFLINE:
779 requester_.reset();
780 xmpp_listener_.reset();
781 base::MessageLoop::current()->PostDelayedTask(
782 FROM_HERE,
783 base::Bind(&Printer::TryConnect, AsWeakPtr()),
784 base::TimeDelta::FromSeconds(kReconnectTimeout));
785
786 case NOT_CONFIGURED:
787 break;
788
789 default:
790 NOTREACHED();
791 }
792 836
793 return true; 837 return true;
794 } 838 }
795 839
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698