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