1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/services/gcm/gcm_account_tracker.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <algorithm> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector> 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/time.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "google_apis/gaia/google_service_auth_error.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace gcm { 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kGCMGroupServerScope[] = "https://www.googleapis.com/auth/gcm"; 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kGCMCheckinServerScope[] = 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "https://www.googleapis.com/auth/android_checkin"; 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kGCMAccountTrackerName[] = "gcm_account_tracker"; 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGCMAccountTracker::AccountInfo::AccountInfo(const std::string& email, 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AccountState state) 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : email(email), state(state) { 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 27116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGCMAccountTracker::AccountInfo::~AccountInfo() { 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 30116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGCMAccountTracker::GCMAccountTracker( 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<gaia::AccountTracker> account_tracker, 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const UpdateAccountsCallback& callback) 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : OAuth2TokenService::Consumer(kGCMAccountTrackerName), 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_tracker_(account_tracker.release()), 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback_(callback), 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch shutdown_called_(false) { 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!callback_.is_null()); 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 40116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGCMAccountTracker::~GCMAccountTracker() { 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(shutdown_called_); 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::Shutdown() { 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Stop(); 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch shutdown_called_ = true; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_tracker_->Shutdown(); 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::Start() { 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!shutdown_called_); 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_tracker_->AddObserver(this); 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<gaia::AccountIds> accounts = account_tracker_->GetAccounts(); 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (accounts.empty()) { 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CompleteCollectingTokens(); 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (std::vector<gaia::AccountIds>::const_iterator iter = accounts.begin(); 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter != accounts.end(); 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++iter) { 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!iter->email.empty()) { 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_infos_.insert(std::make_pair( 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter->account_key, AccountInfo(iter->email, TOKEN_NEEDED))); 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetAllNeededTokens(); 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::Stop() { 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!shutdown_called_); 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_tracker_->RemoveObserver(this); 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_token_requests_.clear(); 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::OnAccountAdded(const gaia::AccountIds& ids) { 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << "Account added: " << ids.email; 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We listen for the account signing in, which happens after account is added. 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::OnAccountRemoved(const gaia::AccountIds& ids) { 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << "Account removed: " << ids.email; 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We listen for the account signing out, which happens before account is 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // removed. 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::OnAccountSignInChanged(const gaia::AccountIds& ids, 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_signed_in) { 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (is_signed_in) 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnAccountSignedIn(ids); 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnAccountSignedOut(ids); 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::OnGetTokenSuccess( 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const OAuth2TokenService::Request* request, 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& access_token, 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Time& expiration_time) { 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(request); 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!request->GetAccountId().empty()); 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << "Get token success: " << request->GetAccountId(); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AccountInfos::iterator iter = account_infos_.find(request->GetAccountId()); 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(iter != account_infos_.end()); 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iter != account_infos_.end()) { 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(iter->second.state == GETTING_TOKEN || 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter->second.state == ACCOUNT_REMOVED); 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If OnAccountSignedOut(..) was called most recently, account is kept in 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // ACCOUNT_REMOVED state. 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iter->second.state == GETTING_TOKEN) { 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter->second.state = TOKEN_PRESENT; 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter->second.access_token = access_token; 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeleteTokenRequest(request); 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CompleteCollectingTokens(); 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::OnGetTokenFailure( 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const OAuth2TokenService::Request* request, 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GoogleServiceAuthError& error) { 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(request); 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!request->GetAccountId().empty()); 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << "Get token failure: " << request->GetAccountId(); 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AccountInfos::iterator iter = account_infos_.find(request->GetAccountId()); 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(iter != account_infos_.end()); 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iter != account_infos_.end()) { 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(iter->second.state == GETTING_TOKEN || 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter->second.state == ACCOUNT_REMOVED); 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If OnAccountSignedOut(..) was called most recently, account is kept in 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // ACCOUNT_REMOVED state. 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iter->second.state == GETTING_TOKEN) 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter->second.state = TOKEN_NEEDED; 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeleteTokenRequest(request); 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CompleteCollectingTokens(); 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::CompleteCollectingTokens() { 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!callback_.is_null()); 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Wait for gaia::AccountTracker to be done with fetching the user info, as 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // well as all of the pending token requests from GCMAccountTracker to be done 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // before you report the results. 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!account_tracker_->IsAllUserInfoFetched() || 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch !pending_token_requests_.empty()) { 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool account_removed = false; 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::map<std::string, std::string> account_tokens; 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (AccountInfos::iterator iter = account_infos_.begin(); 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter != account_infos_.end();) { 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (iter->second.state) { 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ACCOUNT_REMOVED: 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We only mark accounts as removed when there was an account that was 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // explicitly signed out. 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_removed = true; 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We also stop tracking the account, now that it will be reported as 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // removed. 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_infos_.erase(iter++); 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case TOKEN_PRESENT: 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_tokens[iter->second.email] = iter->second.access_token; 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++iter; 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case GETTING_TOKEN: 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This should not happen, as we are making a check that there are no 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // pending requests above. 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NOTREACHED(); 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++iter; 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case TOKEN_NEEDED: 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We failed to fetch an access token for the account, but it has not 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // been signed out (perhaps there is a network issue). We don't report 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // it, but next time there is a sign-in change we will update its state. 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++iter; 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Make sure that there is something to report, otherwise bail out. 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!account_tokens.empty() || account_removed) { 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << "Calling callback: " << account_tokens.size(); 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch callback_.Run(account_tokens); 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << "No tokens and nothing removed. Skipping callback."; 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::DeleteTokenRequest( 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const OAuth2TokenService::Request* request) { 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScopedVector<OAuth2TokenService::Request>::iterator iter = std::find( 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_token_requests_.begin(), pending_token_requests_.end(), request); 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iter != pending_token_requests_.end()) 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_token_requests_.erase(iter); 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::GetAllNeededTokens() { 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (AccountInfos::iterator iter = account_infos_.begin(); 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter != account_infos_.end(); 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ++iter) { 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iter->second.state == TOKEN_NEEDED) 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetToken(iter); 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::GetToken(AccountInfos::iterator& account_iter) { 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(GetTokenService()); 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(account_iter->second.state, TOKEN_NEEDED); 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OAuth2TokenService::ScopeSet scopes; 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scopes.insert(kGCMGroupServerScope); 2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scopes.insert(kGCMCheckinServerScope); 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<OAuth2TokenService::Request> request = 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetTokenService()->StartRequest(account_iter->first, scopes, this); 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_token_requests_.push_back(request.release()); 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_iter->second.state = GETTING_TOKEN; 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::OnAccountSignedIn(const gaia::AccountIds& ids) { 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << "Account signed in: " << ids.email; 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AccountInfos::iterator iter = account_infos_.find(ids.account_key); 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iter == account_infos_.end()) { 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!ids.email.empty()); 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch account_infos_.insert( 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::make_pair(ids.account_key, AccountInfo(ids.email, TOKEN_NEEDED))); 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else if (iter->second.state == ACCOUNT_REMOVED) { 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter->second.state = TOKEN_NEEDED; 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetAllNeededTokens(); 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GCMAccountTracker::OnAccountSignedOut(const gaia::AccountIds& ids) { 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DVLOG(1) << "Account signed out: " << ids.email; 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AccountInfos::iterator iter = account_infos_.find(ids.account_key); 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (iter == account_infos_.end()) 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter->second.access_token.clear(); 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch iter->second.state = ACCOUNT_REMOVED; 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CompleteCollectingTokens(); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 254116680a4aac90f2aa7413d9095a592090648e557Ben MurdochOAuth2TokenService* GCMAccountTracker::GetTokenService() { 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(account_tracker_->identity_provider()); 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return account_tracker_->identity_provider()->GetTokenService(); 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace gcm 260