Home | History | Annotate | Download | only in signin
      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& account_id,
     75                                                   const std::string& username,
     76                                                   const std::string& password) {
     77   PostTaskToIOThread(true, base::UTF8ToUTF16(username));
     78 }
     79 
     80 void SigninNamesOnIOThread::GoogleSignedOut(const std::string& account_id,
     81                                             const std::string& username) {
     82   PostTaskToIOThread(false, base::UTF8ToUTF16(username));
     83 }
     84 
     85 void SigninNamesOnIOThread::CheckOnIOThread() const {
     86   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
     87 }
     88 
     89 void SigninNamesOnIOThread::CheckOnUIThread() const {
     90   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     91 }
     92 
     93 void SigninNamesOnIOThread::PostTaskToIOThread(bool add,
     94                                                const base::string16& email) {
     95   if (content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) {
     96     UpdateOnIOThread(add, email);
     97   } else {
     98     bool may_run = content::BrowserThread::PostTask(
     99         content::BrowserThread::IO,
    100         FROM_HERE,
    101         base::Bind(&SigninNamesOnIOThread::UpdateOnIOThread,
    102                    base::Unretained(this),
    103                    add,
    104                    email));
    105     DCHECK(may_run);
    106   }
    107 }
    108 
    109 void SigninNamesOnIOThread::UpdateOnIOThread(bool add,
    110                                              const base::string16& email) {
    111   CheckOnIOThread();
    112   if (add) {
    113     emails_.insert(email);
    114   } else {
    115     emails_.erase(email);
    116   }
    117 }
    118