| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // This class keeps track of the currently-active profiles in the runtime. |
| |
| #ifndef CHROME_BROWSER_PROFILES_PROFILE_MANAGER_H_ |
| #define CHROME_BROWSER_PROFILES_PROFILE_MANAGER_H_ |
| #pragma once |
| |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "base/file_path.h" |
| #include "base/hash_tables.h" |
| #include "base/memory/linked_ptr.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop.h" |
| #include "base/threading/non_thread_safe.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "content/common/notification_observer.h" |
| #include "content/common/notification_registrar.h" |
| #include "ui/base/system_monitor/system_monitor.h" |
| |
| class FilePath; |
| |
| class ProfileManager : public base::NonThreadSafe, |
| public ui::SystemMonitor::PowerObserver, |
| public NotificationObserver, |
| public Profile::Delegate { |
| public: |
| class Observer { |
| public: |
| // This method is called when profile is ready. If profile creation has been |
| // failed, method is called with |profile| equals to NULL. |
| virtual void OnProfileCreated(Profile* profile) = 0; |
| }; |
| |
| ProfileManager(); |
| virtual ~ProfileManager(); |
| |
| // Invokes ShutdownSessionService() on all profiles. |
| static void ShutdownSessionServices(); |
| |
| // Returns the default profile. This adds the profile to the |
| // ProfileManager if it doesn't already exist. This method returns NULL if |
| // the profile doesn't exist and we can't create it. |
| // The profile used can be overridden by using --login-profile on cros. |
| Profile* GetDefaultProfile(const FilePath& user_data_dir); |
| |
| // Same as instance method but provides the default user_data_dir as well. |
| static Profile* GetDefaultProfile(); |
| |
| // Returns a profile for a specific profile directory within the user data |
| // dir. This will return an existing profile it had already been created, |
| // otherwise it will create and manage it. |
| Profile* GetProfile(const FilePath& profile_dir); |
| |
| // Explicit asynchronous creation of the profile. |observer| is called |
| // when profile is created. If profile has already been created, observer |
| // is called immediately. Should be called on the UI thread. |
| void CreateProfileAsync(const FilePath& user_data_dir, |
| Observer* observer); |
| |
| // Initiates default profile creation. If default profile has already been |
| // created, observer is called immediately. Should be called on the UI thread. |
| static void CreateDefaultProfileAsync(Observer* observer); |
| |
| // Returns the profile with the given |profile_id| or NULL if no such profile |
| // exists. |
| Profile* GetProfileWithId(ProfileId profile_id); |
| |
| // Returns true if the profile pointer is known to point to an existing |
| // profile. |
| bool IsValidProfile(Profile* profile); |
| |
| // Returns the directory where the currently active profile is |
| // stored, relative to the user data directory currently in use.. |
| FilePath GetCurrentProfileDir(); |
| |
| // Returns created profiles. Note, profiles order is NOT guaranteed to be |
| // related with the creation order. |
| std::vector<Profile*> GetLoadedProfiles() const; |
| |
| // PowerObserver notifications |
| virtual void OnSuspend(); |
| virtual void OnResume(); |
| |
| // NotificationObserver implementation. |
| virtual void Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details); |
| |
| // ------------------ static utility functions ------------------- |
| |
| // Returns the path to the default profile directory, based on the given |
| // user data directory. |
| static FilePath GetDefaultProfileDir(const FilePath& user_data_dir); |
| |
| // Returns the path to the preferences file given the user profile directory. |
| static FilePath GetProfilePrefsPath(const FilePath& profile_dir); |
| |
| // If a profile with the given path is currently managed by this object, |
| // return a pointer to the corresponding Profile object; |
| // otherwise return NULL. |
| Profile* GetProfileByPath(const FilePath& path) const; |
| |
| // Profile::Delegate implementation: |
| virtual void OnProfileCreated(Profile* profile, bool success); |
| |
| protected: |
| // Does final initial actions. |
| virtual void DoFinalInit(Profile* profile); |
| |
| private: |
| friend class ExtensionEventRouterForwarderTest; |
| |
| // This struct contains information about profiles which are being loaded or |
| // were loaded. |
| struct ProfileInfo { |
| ProfileInfo(Profile* profile, bool created) |
| : profile(profile), created(created) { |
| } |
| |
| ~ProfileInfo() {} |
| |
| scoped_ptr<Profile> profile; |
| // Whether profile has been fully loaded (created and initialized). |
| bool created; |
| // List of observers which should be notified when profile initialization is |
| // done. Note, when profile is fully loaded this vector will be empty. |
| std::vector<Observer*> observers; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(ProfileInfo); |
| }; |
| |
| // Adds a pre-existing Profile object to the set managed by this |
| // ProfileManager. This ProfileManager takes ownership of the Profile. |
| // The Profile should not already be managed by this ProfileManager. |
| // Returns true if the profile was added, false otherwise. |
| bool AddProfile(Profile* profile); |
| |
| // Registers profile with given info. Returns pointer to created ProfileInfo |
| // entry. |
| ProfileInfo* RegisterProfile(Profile* profile, bool created); |
| |
| NotificationRegistrar registrar_; |
| |
| // Indicates that a user has logged in and that the profile specified |
| // in the --login-profile command line argument should be used as the |
| // default. |
| bool logged_in_; |
| |
| // Maps profile path to ProfileInfo (if profile has been created). Use |
| // RegisterProfile() to add into this map. |
| typedef std::map<FilePath, linked_ptr<ProfileInfo> > ProfilesInfoMap; |
| ProfilesInfoMap profiles_info_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ProfileManager); |
| }; |
| |
| // Same as the ProfileManager, but doesn't initialize some services of the |
| // profile. This one is useful in unittests. |
| class ProfileManagerWithoutInit : public ProfileManager { |
| protected: |
| virtual void DoFinalInit(Profile*) {} |
| }; |
| |
| #endif // CHROME_BROWSER_PROFILES_PROFILE_MANAGER_H_ |