1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/signin/signin_names_io_thread.h" 6 7 #include "base/logging.h" 8 #include "base/strings/utf_string_conversions.h" 9 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/chrome_notification_types.h" 11 #include "chrome/browser/profiles/profile_info_cache.h" 12 #include "chrome/browser/profiles/profile_manager.h" 13 #include "components/signin/core/browser/signin_manager.h" 14 #include "content/public/browser/browser_thread.h" 15 16 SigninNamesOnIOThread::SigninNamesOnIOThread() : resources_released_(false) { 17 CheckOnUIThread(); 18 19 SigninManagerFactory::GetInstance()->AddObserver(this); 20 21 // Get list of profiles and record the email addresses of any connected 22 // accounts. 23 if (g_browser_process) { 24 ProfileManager* manager = g_browser_process->profile_manager(); 25 if (manager) { 26 const ProfileInfoCache& cache = manager->GetProfileInfoCache(); 27 for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) { 28 base::string16 email = cache.GetUserNameOfProfileAtIndex(i); 29 if (!email.empty()) 30 emails_.insert(email); 31 } 32 } 33 } 34 } 35 36 SigninNamesOnIOThread::~SigninNamesOnIOThread() { 37 CheckOnIOThread(); 38 DCHECK(resources_released_) << "Must call ReleaseResourcesOnUIThread() first"; 39 DCHECK(!observed_managers_.size()) 40 << "Shouldn't be observing any SigninManagers"; 41 } 42 43 const SigninNamesOnIOThread::EmailSet& 44 SigninNamesOnIOThread::GetEmails() const { 45 CheckOnIOThread(); 46 return emails_; 47 } 48 49 void SigninNamesOnIOThread::ReleaseResourcesOnUIThread() { 50 CheckOnUIThread(); 51 DCHECK(!resources_released_); 52 SigninManagerFactory::GetInstance()->RemoveObserver(this); 53 54 for (std::set<SigninManagerBase*>::iterator i = observed_managers_.begin(); 55 i != observed_managers_.end(); 56 ++i) { 57 (*i)->RemoveObserver(this); 58 } 59 observed_managers_.clear(); 60 61 resources_released_ = true; 62 } 63 64 void SigninNamesOnIOThread::SigninManagerCreated(SigninManagerBase* manager) { 65 manager->AddObserver(this); 66 observed_managers_.insert(manager); 67 } 68 69 void SigninNamesOnIOThread::SigninManagerShutdown(SigninManagerBase* manager) { 70 manager->RemoveObserver(this); 71 observed_managers_.erase(manager); 72 } 73 74 void SigninNamesOnIOThread::GoogleSigninSucceeded(const std::string& username, 75 const std::string& password) { 76 PostTaskToIOThread(true, base::UTF8ToUTF16(username)); 77 } 78 79 void SigninNamesOnIOThread::GoogleSignedOut(const std::string& username) { 80 PostTaskToIOThread(false, base::UTF8ToUTF16(username)); 81 } 82 83 void SigninNamesOnIOThread::CheckOnIOThread() const { 84 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 85 } 86 87 void SigninNamesOnIOThread::CheckOnUIThread() const { 88 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 89 } 90 91 void SigninNamesOnIOThread::PostTaskToIOThread(bool add, 92 const base::string16& email) { 93 if (content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) { 94 UpdateOnIOThread(add, email); 95 } else { 96 bool may_run = content::BrowserThread::PostTask( 97 content::BrowserThread::IO, 98 FROM_HERE, 99 base::Bind(&SigninNamesOnIOThread::UpdateOnIOThread, 100 base::Unretained(this), 101 add, 102 email)); 103 DCHECK(may_run); 104 } 105 } 106 107 void SigninNamesOnIOThread::UpdateOnIOThread(bool add, 108 const base::string16& email) { 109 CheckOnIOThread(); 110 if (add) { 111 emails_.insert(email); 112 } else { 113 emails_.erase(email); 114 } 115 } 116