OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/gcm_driver/gcm_driver_desktop.h" | 5 #include "components/gcm_driver/gcm_driver_desktop.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_path.h" | 11 #include "base/files/file_path.h" |
12 #include "base/location.h" | 12 #include "base/location.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/sequenced_task_runner.h" | 14 #include "base/sequenced_task_runner.h" |
15 #include "base/threading/sequenced_worker_pool.h" | 15 #include "base/threading/sequenced_worker_pool.h" |
16 #include "components/gcm_driver/gcm_app_handler.h" | 16 #include "components/gcm_driver/gcm_app_handler.h" |
17 #include "components/gcm_driver/gcm_client_factory.h" | 17 #include "components/gcm_driver/gcm_client_factory.h" |
18 #include "components/gcm_driver/system_encryptor.h" | 18 #include "components/gcm_driver/system_encryptor.h" |
19 #include "google_apis/gaia/oauth2_token_service.h" | |
20 #include "net/base/ip_endpoint.h" | 19 #include "net/base/ip_endpoint.h" |
21 #include "net/url_request/url_request_context_getter.h" | 20 #include "net/url_request/url_request_context_getter.h" |
22 | 21 |
23 namespace gcm { | 22 namespace gcm { |
24 | 23 |
25 namespace { | 24 namespace { |
26 | 25 |
27 // Empty string is reserved for the default app handler. | 26 // Empty string is reserved for the default app handler. |
28 const char kDefaultAppHandler[] = ""; | 27 const char kDefaultAppHandler[] = ""; |
29 | 28 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 virtual void OnGCMReady() OVERRIDE; | 111 virtual void OnGCMReady() OVERRIDE; |
113 virtual void OnActivityRecorded() OVERRIDE; | 112 virtual void OnActivityRecorded() OVERRIDE; |
114 virtual void OnConnected(const net::IPEndPoint& ip_endpoint) OVERRIDE; | 113 virtual void OnConnected(const net::IPEndPoint& ip_endpoint) OVERRIDE; |
115 virtual void OnDisconnected() OVERRIDE; | 114 virtual void OnDisconnected() OVERRIDE; |
116 | 115 |
117 // Called on IO thread. | 116 // Called on IO thread. |
118 void Initialize( | 117 void Initialize( |
119 scoped_ptr<GCMClientFactory> gcm_client_factory, | 118 scoped_ptr<GCMClientFactory> gcm_client_factory, |
120 const GCMClient::ChromeBuildInfo& chrome_build_info, | 119 const GCMClient::ChromeBuildInfo& chrome_build_info, |
121 const base::FilePath& store_path, | 120 const base::FilePath& store_path, |
122 const std::vector<std::string>& account_ids, | |
123 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 121 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
124 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner); | 122 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner); |
125 void Start(const base::WeakPtr<GCMDriverDesktop>& service); | 123 void Start(const base::WeakPtr<GCMDriverDesktop>& service); |
126 void Stop(); | 124 void Stop(); |
127 void CheckOut(); | 125 void CheckOut(); |
128 void Register(const std::string& app_id, | 126 void Register(const std::string& app_id, |
129 const std::vector<std::string>& sender_ids); | 127 const std::vector<std::string>& sender_ids); |
130 void Unregister(const std::string& app_id); | 128 void Unregister(const std::string& app_id); |
131 void Send(const std::string& app_id, | 129 void Send(const std::string& app_id, |
132 const std::string& receiver_id, | 130 const std::string& receiver_id, |
(...skipping 24 matching lines...) Expand all Loading... |
157 } | 155 } |
158 | 156 |
159 GCMDriverDesktop::IOWorker::~IOWorker() { | 157 GCMDriverDesktop::IOWorker::~IOWorker() { |
160 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | 158 DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
161 } | 159 } |
162 | 160 |
163 void GCMDriverDesktop::IOWorker::Initialize( | 161 void GCMDriverDesktop::IOWorker::Initialize( |
164 scoped_ptr<GCMClientFactory> gcm_client_factory, | 162 scoped_ptr<GCMClientFactory> gcm_client_factory, |
165 const GCMClient::ChromeBuildInfo& chrome_build_info, | 163 const GCMClient::ChromeBuildInfo& chrome_build_info, |
166 const base::FilePath& store_path, | 164 const base::FilePath& store_path, |
167 const std::vector<std::string>& account_ids, | |
168 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 165 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
169 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) { | 166 const scoped_refptr<base::SequencedTaskRunner> blocking_task_runner) { |
170 DCHECK(io_thread_->RunsTasksOnCurrentThread()); | 167 DCHECK(io_thread_->RunsTasksOnCurrentThread()); |
171 | 168 |
172 gcm_client_ = gcm_client_factory->BuildInstance(); | 169 gcm_client_ = gcm_client_factory->BuildInstance(); |
173 | 170 |
174 gcm_client_->Initialize(chrome_build_info, | 171 gcm_client_->Initialize(chrome_build_info, |
175 store_path, | 172 store_path, |
176 account_ids, | |
177 blocking_task_runner, | 173 blocking_task_runner, |
178 request_context, | 174 request_context, |
179 make_scoped_ptr<Encryptor>(new SystemEncryptor), | 175 make_scoped_ptr<Encryptor>(new SystemEncryptor), |
180 this); | 176 this); |
181 } | 177 } |
182 | 178 |
183 void GCMDriverDesktop::IOWorker::OnRegisterFinished( | 179 void GCMDriverDesktop::IOWorker::OnRegisterFinished( |
184 const std::string& app_id, | 180 const std::string& app_id, |
185 const std::string& registration_id, | 181 const std::string& registration_id, |
186 GCMClient::Result result) { | 182 GCMClient::Result result) { |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 stats.gcm_client_created = true; | 340 stats.gcm_client_created = true; |
345 } | 341 } |
346 | 342 |
347 ui_thread_->PostTask( | 343 ui_thread_->PostTask( |
348 FROM_HERE, | 344 FROM_HERE, |
349 base::Bind(&GCMDriverDesktop::GetGCMStatisticsFinished, service_, stats)); | 345 base::Bind(&GCMDriverDesktop::GetGCMStatisticsFinished, service_, stats)); |
350 } | 346 } |
351 | 347 |
352 GCMDriverDesktop::GCMDriverDesktop( | 348 GCMDriverDesktop::GCMDriverDesktop( |
353 scoped_ptr<GCMClientFactory> gcm_client_factory, | 349 scoped_ptr<GCMClientFactory> gcm_client_factory, |
354 scoped_ptr<IdentityProvider> identity_provider, | |
355 const GCMClient::ChromeBuildInfo& chrome_build_info, | 350 const GCMClient::ChromeBuildInfo& chrome_build_info, |
356 const base::FilePath& store_path, | 351 const base::FilePath& store_path, |
357 const scoped_refptr<net::URLRequestContextGetter>& request_context, | 352 const scoped_refptr<net::URLRequestContextGetter>& request_context, |
358 const scoped_refptr<base::SequencedTaskRunner>& ui_thread, | 353 const scoped_refptr<base::SequencedTaskRunner>& ui_thread, |
359 const scoped_refptr<base::SequencedTaskRunner>& io_thread, | 354 const scoped_refptr<base::SequencedTaskRunner>& io_thread, |
360 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) | 355 const scoped_refptr<base::SequencedTaskRunner>& blocking_task_runner) |
361 : gcm_enabled_(true), | 356 : signed_in_(false), |
| 357 gcm_started_(false), |
| 358 gcm_enabled_(true), |
362 gcm_client_ready_(false), | 359 gcm_client_ready_(false), |
363 connected_(false), | 360 connected_(false), |
364 identity_provider_(identity_provider.Pass()), | |
365 ui_thread_(ui_thread), | 361 ui_thread_(ui_thread), |
366 io_thread_(io_thread), | 362 io_thread_(io_thread), |
367 weak_ptr_factory_(this) { | 363 weak_ptr_factory_(this) { |
368 // Get the list of available accounts. | |
369 std::vector<std::string> account_ids; | |
370 account_ids = identity_provider_->GetTokenService()->GetAccounts(); | |
371 | |
372 // Create and initialize the GCMClient. Note that this does not initiate the | 364 // Create and initialize the GCMClient. Note that this does not initiate the |
373 // GCM check-in. | 365 // GCM check-in. |
374 io_worker_.reset(new IOWorker(ui_thread, io_thread)); | 366 io_worker_.reset(new IOWorker(ui_thread, io_thread)); |
375 io_thread_->PostTask( | 367 io_thread_->PostTask( |
376 FROM_HERE, | 368 FROM_HERE, |
377 base::Bind(&GCMDriverDesktop::IOWorker::Initialize, | 369 base::Bind(&GCMDriverDesktop::IOWorker::Initialize, |
378 base::Unretained(io_worker_.get()), | 370 base::Unretained(io_worker_.get()), |
379 base::Passed(&gcm_client_factory), | 371 base::Passed(&gcm_client_factory), |
380 chrome_build_info, | 372 chrome_build_info, |
381 store_path, | 373 store_path, |
382 account_ids, | |
383 request_context, | 374 request_context, |
384 blocking_task_runner)); | 375 blocking_task_runner)); |
385 | |
386 identity_provider_->AddObserver(this); | |
387 } | 376 } |
388 | 377 |
389 GCMDriverDesktop::~GCMDriverDesktop() { | 378 GCMDriverDesktop::~GCMDriverDesktop() { |
390 } | 379 } |
391 | 380 |
392 void GCMDriverDesktop::OnActiveAccountLogin() { | |
393 EnsureStarted(); | |
394 } | |
395 | |
396 void GCMDriverDesktop::OnActiveAccountLogout() { | |
397 CheckOut(); | |
398 } | |
399 | |
400 void GCMDriverDesktop::Shutdown() { | 381 void GCMDriverDesktop::Shutdown() { |
401 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 382 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
402 identity_provider_->RemoveObserver(this); | |
403 GCMDriver::Shutdown(); | 383 GCMDriver::Shutdown(); |
404 io_thread_->DeleteSoon(FROM_HERE, io_worker_.release()); | 384 io_thread_->DeleteSoon(FROM_HERE, io_worker_.release()); |
405 } | 385 } |
406 | 386 |
| 387 void GCMDriverDesktop::OnSignedIn() { |
| 388 signed_in_ = true; |
| 389 EnsureStarted(); |
| 390 } |
| 391 |
| 392 void GCMDriverDesktop::Purge() { |
| 393 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
| 394 |
| 395 // We still proceed with the check-out logic even if the check-in is not |
| 396 // initiated in the current session. This will make sure that all the |
| 397 // persisted data written previously will get purged. |
| 398 signed_in_ = false; |
| 399 RemoveCachedData(); |
| 400 |
| 401 io_thread_->PostTask(FROM_HERE, |
| 402 base::Bind(&GCMDriverDesktop::IOWorker::CheckOut, |
| 403 base::Unretained(io_worker_.get()))); |
| 404 } |
| 405 |
407 void GCMDriverDesktop::AddAppHandler(const std::string& app_id, | 406 void GCMDriverDesktop::AddAppHandler(const std::string& app_id, |
408 GCMAppHandler* handler) { | 407 GCMAppHandler* handler) { |
409 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 408 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
410 GCMDriver::AddAppHandler(app_id, handler); | 409 GCMDriver::AddAppHandler(app_id, handler); |
411 | 410 |
412 // Ensures that the GCM service is started when there is an interest. | 411 // Ensures that the GCM service is started when there is an interest. |
413 EnsureStarted(); | 412 EnsureStarted(); |
414 } | 413 } |
415 | 414 |
416 void GCMDriverDesktop::RemoveAppHandler(const std::string& app_id) { | 415 void GCMDriverDesktop::RemoveAppHandler(const std::string& app_id) { |
(...skipping 22 matching lines...) Expand all Loading... |
439 return; | 438 return; |
440 gcm_enabled_ = false; | 439 gcm_enabled_ = false; |
441 | 440 |
442 Stop(); | 441 Stop(); |
443 } | 442 } |
444 | 443 |
445 void GCMDriverDesktop::Stop() { | 444 void GCMDriverDesktop::Stop() { |
446 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 445 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
447 | 446 |
448 // No need to stop GCM service if not started yet. | 447 // No need to stop GCM service if not started yet. |
449 if (account_id_.empty()) | 448 if (!gcm_started_) |
450 return; | 449 return; |
451 | 450 |
452 RemoveCachedData(); | 451 RemoveCachedData(); |
453 | 452 |
454 io_thread_->PostTask( | 453 io_thread_->PostTask( |
455 FROM_HERE, | 454 FROM_HERE, |
456 base::Bind(&GCMDriverDesktop::IOWorker::Stop, | 455 base::Bind(&GCMDriverDesktop::IOWorker::Stop, |
457 base::Unretained(io_worker_.get()))); | 456 base::Unretained(io_worker_.get()))); |
458 } | 457 } |
459 | 458 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 message)); | 542 message)); |
544 } | 543 } |
545 | 544 |
546 GCMClient* GCMDriverDesktop::GetGCMClientForTesting() const { | 545 GCMClient* GCMDriverDesktop::GetGCMClientForTesting() const { |
547 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 546 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
548 return io_worker_ ? io_worker_->gcm_client_for_testing() : NULL; | 547 return io_worker_ ? io_worker_->gcm_client_for_testing() : NULL; |
549 } | 548 } |
550 | 549 |
551 bool GCMDriverDesktop::IsStarted() const { | 550 bool GCMDriverDesktop::IsStarted() const { |
552 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 551 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
553 return !account_id_.empty(); | 552 return gcm_started_; |
554 } | 553 } |
555 | 554 |
556 bool GCMDriverDesktop::IsGCMClientReady() const { | 555 bool GCMDriverDesktop::IsGCMClientReady() const { |
557 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 556 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
558 return gcm_client_ready_; | 557 return gcm_client_ready_; |
559 } | 558 } |
560 | 559 |
561 bool GCMDriverDesktop::IsConnected() const { | 560 bool GCMDriverDesktop::IsConnected() const { |
562 return connected_; | 561 return connected_; |
563 } | 562 } |
(...skipping 20 matching lines...) Expand all Loading... |
584 io_thread_->PostTask( | 583 io_thread_->PostTask( |
585 FROM_HERE, | 584 FROM_HERE, |
586 base::Bind(&GCMDriverDesktop::IOWorker::SetGCMRecording, | 585 base::Bind(&GCMDriverDesktop::IOWorker::SetGCMRecording, |
587 base::Unretained(io_worker_.get()), | 586 base::Unretained(io_worker_.get()), |
588 recording)); | 587 recording)); |
589 } | 588 } |
590 | 589 |
591 GCMClient::Result GCMDriverDesktop::EnsureStarted() { | 590 GCMClient::Result GCMDriverDesktop::EnsureStarted() { |
592 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 591 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
593 | 592 |
| 593 if (gcm_started_) |
| 594 return GCMClient::SUCCESS; |
| 595 |
594 if (!gcm_enabled_) | 596 if (!gcm_enabled_) |
595 return GCMClient::GCM_DISABLED; | 597 return GCMClient::GCM_DISABLED; |
596 | 598 |
597 // Have any app requested the service? | 599 // Have any app requested the service? |
598 if (app_handlers().empty()) | 600 if (app_handlers().empty()) |
599 return GCMClient::UNKNOWN_ERROR; | 601 return GCMClient::UNKNOWN_ERROR; |
600 | 602 |
601 // Is the user signed in? | 603 // TODO(jianli): To be removed when sign-in enforcement is dropped. |
602 const std::string account_id = identity_provider_->GetActiveAccountId(); | 604 if (!signed_in_) |
603 if (account_id.empty()) | |
604 return GCMClient::NOT_SIGNED_IN; | 605 return GCMClient::NOT_SIGNED_IN; |
605 | 606 |
606 // CheckIn could be called more than once when: | |
607 // 1) The password changes. | |
608 // 2) Register/send function calls it to ensure CheckIn is done. | |
609 if (account_id_ == account_id) | |
610 return GCMClient::SUCCESS; | |
611 account_id_ = account_id; | |
612 | |
613 DCHECK(!delayed_task_controller_); | 607 DCHECK(!delayed_task_controller_); |
614 delayed_task_controller_.reset(new DelayedTaskController); | 608 delayed_task_controller_.reset(new DelayedTaskController); |
615 | 609 |
616 // Note that we need to pass weak pointer again since the existing weak | 610 // Note that we need to pass weak pointer again since the existing weak |
617 // pointer in IOWorker might have been invalidated when check-out occurs. | 611 // pointer in IOWorker might have been invalidated when check-out occurs. |
618 io_thread_->PostTask( | 612 io_thread_->PostTask( |
619 FROM_HERE, | 613 FROM_HERE, |
620 base::Bind(&GCMDriverDesktop::IOWorker::Start, | 614 base::Bind(&GCMDriverDesktop::IOWorker::Start, |
621 base::Unretained(io_worker_.get()), | 615 base::Unretained(io_worker_.get()), |
622 weak_ptr_factory_.GetWeakPtr())); | 616 weak_ptr_factory_.GetWeakPtr())); |
623 | 617 |
| 618 gcm_started_ = true; |
624 return GCMClient::SUCCESS; | 619 return GCMClient::SUCCESS; |
625 } | 620 } |
626 | 621 |
627 void GCMDriverDesktop::RemoveCachedData() { | 622 void GCMDriverDesktop::RemoveCachedData() { |
628 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 623 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
629 // Remove all the queued tasks since they no longer make sense after | 624 // Remove all the queued tasks since they no longer make sense after |
630 // GCM service is stopped. | 625 // GCM service is stopped. |
631 weak_ptr_factory_.InvalidateWeakPtrs(); | 626 weak_ptr_factory_.InvalidateWeakPtrs(); |
632 | 627 |
633 account_id_.clear(); | 628 gcm_started_ = false; |
634 gcm_client_ready_ = false; | 629 gcm_client_ready_ = false; |
635 delayed_task_controller_.reset(); | 630 delayed_task_controller_.reset(); |
636 ClearCallbacks(); | 631 ClearCallbacks(); |
637 } | 632 } |
638 | 633 |
639 void GCMDriverDesktop::CheckOut() { | |
640 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | |
641 | |
642 // We still proceed with the check-out logic even if the check-in is not | |
643 // initiated in the current session. This will make sure that all the | |
644 // persisted data written previously will get purged. | |
645 | |
646 RemoveCachedData(); | |
647 | |
648 io_thread_->PostTask( | |
649 FROM_HERE, | |
650 base::Bind(&GCMDriverDesktop::IOWorker::CheckOut, | |
651 base::Unretained(io_worker_.get()))); | |
652 } | |
653 | |
654 void GCMDriverDesktop::MessageReceived( | 634 void GCMDriverDesktop::MessageReceived( |
655 const std::string& app_id, | 635 const std::string& app_id, |
656 const GCMClient::IncomingMessage& message) { | 636 const GCMClient::IncomingMessage& message) { |
657 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 637 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
658 | 638 |
659 // Drop the event if signed out. | 639 // Drop the event if the service has been stopped. |
660 if (account_id_.empty()) | 640 if (!gcm_started_) |
661 return; | 641 return; |
662 | 642 |
663 GetAppHandler(app_id)->OnMessage(app_id, message); | 643 GetAppHandler(app_id)->OnMessage(app_id, message); |
664 } | 644 } |
665 | 645 |
666 void GCMDriverDesktop::MessagesDeleted(const std::string& app_id) { | 646 void GCMDriverDesktop::MessagesDeleted(const std::string& app_id) { |
667 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 647 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
668 | 648 |
669 // Drop the event if signed out. | 649 // Drop the event if the service has been stopped. |
670 if (account_id_.empty()) | 650 if (!gcm_started_) |
671 return; | 651 return; |
672 | 652 |
673 GetAppHandler(app_id)->OnMessagesDeleted(app_id); | 653 GetAppHandler(app_id)->OnMessagesDeleted(app_id); |
674 } | 654 } |
675 | 655 |
676 void GCMDriverDesktop::MessageSendError( | 656 void GCMDriverDesktop::MessageSendError( |
677 const std::string& app_id, | 657 const std::string& app_id, |
678 const GCMClient::SendErrorDetails& send_error_details) { | 658 const GCMClient::SendErrorDetails& send_error_details) { |
679 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 659 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
680 | 660 |
681 // Drop the event if signed out. | 661 // Drop the event if the service has been stopped. |
682 if (account_id_.empty()) | 662 if (!gcm_started_) |
683 return; | 663 return; |
684 | 664 |
685 GetAppHandler(app_id)->OnSendError(app_id, send_error_details); | 665 GetAppHandler(app_id)->OnSendError(app_id, send_error_details); |
686 } | 666 } |
687 | 667 |
688 void GCMDriverDesktop::GCMClientReady() { | 668 void GCMDriverDesktop::GCMClientReady() { |
689 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 669 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
690 | 670 |
691 if (gcm_client_ready_) | 671 if (gcm_client_ready_) |
692 return; | 672 return; |
693 gcm_client_ready_ = true; | 673 gcm_client_ready_ = true; |
694 | 674 |
695 delayed_task_controller_->SetReady(); | 675 delayed_task_controller_->SetReady(); |
696 } | 676 } |
697 | 677 |
698 void GCMDriverDesktop::OnConnected(const net::IPEndPoint& ip_endpoint) { | 678 void GCMDriverDesktop::OnConnected(const net::IPEndPoint& ip_endpoint) { |
699 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 679 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
700 | 680 |
701 connected_ = true; | 681 connected_ = true; |
702 | 682 |
703 // Drop the event if signed out. | 683 // Drop the event if signed out. |
704 if (account_id_.empty()) | 684 if (!signed_in_) |
705 return; | 685 return; |
706 | 686 |
707 const GCMAppHandlerMap& app_handler_map = app_handlers(); | 687 const GCMAppHandlerMap& app_handler_map = app_handlers(); |
708 for (GCMAppHandlerMap::const_iterator iter = app_handler_map.begin(); | 688 for (GCMAppHandlerMap::const_iterator iter = app_handler_map.begin(); |
709 iter != app_handler_map.end(); ++iter) { | 689 iter != app_handler_map.end(); ++iter) { |
710 iter->second->OnConnected(ip_endpoint); | 690 iter->second->OnConnected(ip_endpoint); |
711 } | 691 } |
712 | 692 |
713 GetAppHandler(kDefaultAppHandler)->OnConnected(ip_endpoint); | 693 GetAppHandler(kDefaultAppHandler)->OnConnected(ip_endpoint); |
714 } | 694 } |
715 | 695 |
716 void GCMDriverDesktop::OnDisconnected() { | 696 void GCMDriverDesktop::OnDisconnected() { |
717 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 697 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
718 | 698 |
719 connected_ = false; | 699 connected_ = false; |
720 | 700 |
721 // Drop the event if signed out. | 701 // Drop the event if signed out. |
722 if (account_id_.empty()) | 702 if (!signed_in_) |
723 return; | 703 return; |
724 | 704 |
725 const GCMAppHandlerMap& app_handler_map = app_handlers(); | 705 const GCMAppHandlerMap& app_handler_map = app_handlers(); |
726 for (GCMAppHandlerMap::const_iterator iter = app_handler_map.begin(); | 706 for (GCMAppHandlerMap::const_iterator iter = app_handler_map.begin(); |
727 iter != app_handler_map.end(); ++iter) { | 707 iter != app_handler_map.end(); ++iter) { |
728 iter->second->OnDisconnected(); | 708 iter->second->OnDisconnected(); |
729 } | 709 } |
730 | 710 |
731 GetAppHandler(kDefaultAppHandler)->OnDisconnected(); | 711 GetAppHandler(kDefaultAppHandler)->OnDisconnected(); |
732 } | 712 } |
733 | 713 |
734 void GCMDriverDesktop::GetGCMStatisticsFinished( | 714 void GCMDriverDesktop::GetGCMStatisticsFinished( |
735 const GCMClient::GCMStatistics& stats) { | 715 const GCMClient::GCMStatistics& stats) { |
736 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); | 716 DCHECK(ui_thread_->RunsTasksOnCurrentThread()); |
737 | 717 |
738 // Normally request_gcm_statistics_callback_ would not be null. | 718 // Normally request_gcm_statistics_callback_ would not be null. |
739 if (!request_gcm_statistics_callback_.is_null()) | 719 if (!request_gcm_statistics_callback_.is_null()) |
740 request_gcm_statistics_callback_.Run(stats); | 720 request_gcm_statistics_callback_.Run(stats); |
741 else | 721 else |
742 LOG(WARNING) << "request_gcm_statistics_callback_ is NULL."; | 722 LOG(WARNING) << "request_gcm_statistics_callback_ is NULL."; |
743 } | 723 } |
744 | 724 |
745 std::string GCMDriverDesktop::SignedInUserName() const { | |
746 if (IsStarted()) | |
747 return identity_provider_->GetActiveUsername(); | |
748 return std::string(); | |
749 } | |
750 | |
751 } // namespace gcm | 725 } // namespace gcm |
752 | 726 |
OLD | NEW |