15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SIGNIN_SIGNIN_NAMES_IO_THREAD_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SIGNIN_SIGNIN_NAMES_IO_THREAD_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/signin_manager_base.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class provides access to a list of email addresses for all profiles 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// connected to a Google account, from the IO thread. The main purpose of 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this is to be a member of the ProfileIOData structure to allow access to 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the list of email addresses, and is used by the one-click sign in code to 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// know which Google accounts are already in use. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instance of this class are created and initialized on the UI 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread as part of the creation of ProfileIOData, and destroyed along with 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ProfileIOData. 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SigninNamesOnIOThread : public SigninManagerBase::Observer, 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public SigninManagerFactory::Observer { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef std::set<base::string16> EmailSet; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Objects should only be created on UI thread. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SigninNamesOnIOThread(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SigninNamesOnIOThread(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the set of email addresses of connected profiles. This method should 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only be called on the IO thread. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const EmailSet& GetEmails() const; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Releases all resource held by object. Once released, GetEmails() no 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // longer works. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReleaseResourcesOnUIThread(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // SigninManagerBase::Observer: 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void GoogleSigninSucceeded(const std::string& account_id, 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& username, 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& password) OVERRIDE; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void GoogleSignedOut(const std::string& account_id, 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& username) OVERRIDE; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // SigninManagerFactory::Observer: 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SigninManagerCreated(SigninManagerBase* manager) OVERRIDE; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SigninManagerShutdown(SigninManagerBase* manager) OVERRIDE; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks whether the current thread is the IO thread. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckOnIOThread() const; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Checks whether the current thread is the UI thread. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckOnUIThread() const; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Posts a task to the I/O thread to add or remove the email address from 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the set. 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void PostTaskToIOThread(bool add, const base::string16& email); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates the email set on the I/O thread. Protected for testing. 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UpdateOnIOThread(bool add, const base::string16& email); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EmailSet emails_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The set of SigninManagerBase instances that this instance is currently 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // observing. Can only be accessed on the UI thread. 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::set<SigninManagerBase*> observed_managers_; 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool resources_released_; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SigninNamesOnIOThread); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_SIGNIN_SIGNIN_NAMES_IO_THREAD_H_ 79