Index: chrome/browser/profiles/profile_info_cache.cc |
diff --git a/chrome/browser/profiles/profile_info_cache.cc b/chrome/browser/profiles/profile_info_cache.cc |
index c0966da348b2ab04e09c279767c0bc8a1308188f..4ef8bfc69ea68aa35900a51cfac8e34a105a0e72 100644 |
--- a/chrome/browser/profiles/profile_info_cache.cc |
+++ b/chrome/browser/profiles/profile_info_cache.cc |
@@ -4,89 +4,15 @@ |
#include "chrome/browser/profiles/profile_info_cache.h" |
-#include "base/format_macros.h" |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
-#include "base/rand_util.h" |
-#include "base/string_number_conversions.h" |
-#include "base/stringprintf.h" |
-#include "base/utf_string_conversions.h" |
#include "base/values.h" |
#include "chrome/browser/prefs/pref_service.h" |
#include "chrome/browser/prefs/scoped_user_pref_update.h" |
+#include "chrome/browser/profiles/profile_info_util.h" |
#include "chrome/common/chrome_notification_types.h" |
#include "chrome/common/pref_names.h" |
#include "content/public/browser/notification_service.h" |
-#include "grit/generated_resources.h" |
-#include "grit/theme_resources.h" |
-#include "ui/base/l10n/l10n_util.h" |
-#include "ui/base/resource/resource_bundle.h" |
- |
-namespace { |
- |
-const char kNameKey[] = "name"; |
-const char kUserNameKey[] = "user_name"; |
-const char kAvatarIconKey[] = "avatar_icon"; |
-const char kBackgroundAppsKey[] = "background_apps"; |
-const char kDefaultUrlPrefix[] = "chrome://theme/IDR_PROFILE_AVATAR_"; |
- |
-const int kDefaultAvatarIconResources[] = { |
- IDR_PROFILE_AVATAR_0, |
- IDR_PROFILE_AVATAR_1, |
- IDR_PROFILE_AVATAR_2, |
- IDR_PROFILE_AVATAR_3, |
- IDR_PROFILE_AVATAR_4, |
- IDR_PROFILE_AVATAR_5, |
- IDR_PROFILE_AVATAR_6, |
- IDR_PROFILE_AVATAR_7, |
- IDR_PROFILE_AVATAR_8, |
- IDR_PROFILE_AVATAR_9, |
- IDR_PROFILE_AVATAR_10, |
- IDR_PROFILE_AVATAR_11, |
- IDR_PROFILE_AVATAR_12, |
- IDR_PROFILE_AVATAR_13, |
- IDR_PROFILE_AVATAR_14, |
- IDR_PROFILE_AVATAR_15, |
- IDR_PROFILE_AVATAR_16, |
- IDR_PROFILE_AVATAR_17, |
- IDR_PROFILE_AVATAR_18, |
- IDR_PROFILE_AVATAR_19, |
- IDR_PROFILE_AVATAR_20, |
- IDR_PROFILE_AVATAR_21, |
- IDR_PROFILE_AVATAR_22, |
- IDR_PROFILE_AVATAR_23, |
- IDR_PROFILE_AVATAR_24, |
- IDR_PROFILE_AVATAR_25, |
-}; |
- |
-const size_t kDefaultAvatarIconsCount = arraysize(kDefaultAvatarIconResources); |
- |
-// The first 8 icons are generic. |
-const size_t kGenericIconCount = 8; |
- |
-// First eight are generic icons, which use IDS_NUMBERED_PROFILE_NAME. |
-const int kDefaultNames[] = { |
- IDS_DEFAULT_AVATAR_NAME_8, |
- IDS_DEFAULT_AVATAR_NAME_9, |
- IDS_DEFAULT_AVATAR_NAME_10, |
- IDS_DEFAULT_AVATAR_NAME_11, |
- IDS_DEFAULT_AVATAR_NAME_12, |
- IDS_DEFAULT_AVATAR_NAME_13, |
- IDS_DEFAULT_AVATAR_NAME_14, |
- IDS_DEFAULT_AVATAR_NAME_15, |
- IDS_DEFAULT_AVATAR_NAME_16, |
- IDS_DEFAULT_AVATAR_NAME_17, |
- IDS_DEFAULT_AVATAR_NAME_18, |
- IDS_DEFAULT_AVATAR_NAME_19, |
- IDS_DEFAULT_AVATAR_NAME_20, |
- IDS_DEFAULT_AVATAR_NAME_21, |
- IDS_DEFAULT_AVATAR_NAME_22, |
- IDS_DEFAULT_AVATAR_NAME_23, |
- IDS_DEFAULT_AVATAR_NAME_24, |
- IDS_DEFAULT_AVATAR_NAME_25 |
-}; |
- |
-} // namespace |
ProfileInfoCache::ProfileInfoCache(PrefService* prefs, |
const FilePath& user_data_dir) |
@@ -99,47 +25,52 @@ ProfileInfoCache::ProfileInfoCache(PrefService* prefs, |
it != cache->end_keys(); ++it) { |
std::string key = *it; |
DictionaryValue* info = NULL; |
- cache->GetDictionary(key, &info); |
- string16 name; |
- info->GetString(kNameKey, &name); |
- sorted_keys_.insert(FindPositionForProfile(key, name), key); |
+ if (cache->GetDictionary(key, &info)) { |
+ FilePath path = user_data_dir.AppendASCII(key); |
+ cached_entries_[key] = ProfileInfoEntry(path, *info); |
+ } |
} |
} |
ProfileInfoCache::~ProfileInfoCache() { |
} |
-void ProfileInfoCache::AddProfileToCache(const FilePath& profile_path, |
- const string16& name, |
- const string16& username, |
- size_t icon_index) { |
- std::string key = CacheKeyFromProfilePath(profile_path); |
- DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); |
- DictionaryValue* cache = update.Get(); |
+size_t ProfileInfoCache::GetNumberOfProfiles() const { |
+ return cached_entries_.size(); |
+} |
- scoped_ptr<DictionaryValue> info(new DictionaryValue); |
- info->SetString(kNameKey, name); |
- info->SetString(kUserNameKey, username); |
- info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index)); |
- // Default value for whether background apps are running is false. |
- info->SetBoolean(kBackgroundAppsKey, false); |
- cache->Set(key, info.release()); |
+std::vector<ProfileInfoEntry> ProfileInfoCache::GetProfilesSortedByName() |
+ const { |
+ std::vector<ProfileInfoEntry> entries; |
+ for (std::map<std::string, ProfileInfoEntry>::const_iterator it = |
+ cached_entries_.begin(); it != cached_entries_.end(); ++it) { |
+ entries.push_back(it->second); |
+ } |
+ std::sort(entries.begin(), entries.end()); |
+ return entries; |
+} |
- sorted_keys_.insert(FindPositionForProfile(key, name), key); |
+bool ProfileInfoCache::GetInfoForProfile(const FilePath& path, |
+ ProfileInfoEntry* entry) const { |
+ // If the info is not in the cache then the profile was deleted. |
+ std::string key = CacheKeyFromProfilePath(path); |
+ std::map<std::string, ProfileInfoEntry>::const_iterator it = |
+ cached_entries_.find(key); |
+ if (it == cached_entries_.end()) |
+ return false; |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
- content::NotificationService::AllSources(), |
- content::NotificationService::NoDetails()); |
+ *entry = it->second; |
+ return true; |
} |
void ProfileInfoCache::DeleteProfileFromCache(const FilePath& profile_path) { |
+ std::string key = CacheKeyFromProfilePath(profile_path); |
+ if (cached_entries_.count(key)) |
+ cached_entries_.erase(key); |
+ |
DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); |
DictionaryValue* cache = update.Get(); |
- |
- std::string key = CacheKeyFromProfilePath(profile_path); |
cache->Remove(key, NULL); |
- sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key)); |
content::NotificationService::current()->Notify( |
chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
@@ -147,85 +78,13 @@ void ProfileInfoCache::DeleteProfileFromCache(const FilePath& profile_path) { |
content::NotificationService::NoDetails()); |
} |
-size_t ProfileInfoCache::GetNumberOfProfiles() const { |
- return sorted_keys_.size(); |
-} |
- |
-size_t ProfileInfoCache::GetIndexOfProfileWithPath( |
- const FilePath& profile_path) const { |
- if (profile_path.DirName() != user_data_dir_) |
- return std::string::npos; |
- std::string search_key = CacheKeyFromProfilePath(profile_path); |
- for (size_t i = 0; i < sorted_keys_.size(); ++i) { |
- if (sorted_keys_[i] == search_key) |
- return i; |
- } |
- return std::string::npos; |
-} |
- |
-string16 ProfileInfoCache::GetNameOfProfileAtIndex(size_t index) const { |
- string16 name; |
- GetInfoForProfileAtIndex(index)->GetString(kNameKey, &name); |
- return name; |
-} |
- |
-FilePath ProfileInfoCache::GetPathOfProfileAtIndex(size_t index) const { |
- FilePath::StringType base_name; |
-#if defined(OS_POSIX) |
- base_name = sorted_keys_[index]; |
-#elif defined(OS_WIN) |
- base_name = ASCIIToWide(sorted_keys_[index]); |
-#endif |
- return user_data_dir_.Append(base_name); |
-} |
- |
-string16 ProfileInfoCache::GetUserNameOfProfileAtIndex(size_t index) const { |
- string16 user_name; |
- GetInfoForProfileAtIndex(index)->GetString(kUserNameKey, &user_name); |
- return user_name; |
-} |
- |
-const gfx::Image& ProfileInfoCache::GetAvatarIconOfProfileAtIndex( |
- size_t index) const { |
- int resource_id = GetDefaultAvatarIconResourceIDAtIndex( |
- GetAvatarIconIndexOfProfileAtIndex(index)); |
- return ResourceBundle::GetSharedInstance().GetImageNamed(resource_id); |
-} |
- |
-bool ProfileInfoCache::GetBackgroundStatusOfProfileAtIndex( |
- size_t index) const { |
- bool background_app_status; |
- GetInfoForProfileAtIndex(index)->GetBoolean(kBackgroundAppsKey, |
- &background_app_status); |
- return background_app_status; |
-} |
- |
-size_t ProfileInfoCache::GetAvatarIconIndexOfProfileAtIndex(size_t index) |
- const { |
- std::string icon_url; |
- GetInfoForProfileAtIndex(index)->GetString(kAvatarIconKey, &icon_url); |
- size_t icon_index = 0; |
- if (IsDefaultAvatarIconUrl(icon_url, &icon_index)) |
- return icon_index; |
- |
- DLOG(WARNING) << "Unknown avatar icon: " << icon_url; |
- return GetDefaultAvatarIconResourceIDAtIndex(0); |
-} |
+void ProfileInfoCache::SetInfoForProfile(const ProfileInfoEntry& info) { |
+ std::string key = CacheKeyFromProfilePath(info.path()); |
+ cached_entries_[key] = info; |
-void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index, |
- const string16& name) { |
- scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy()); |
- info->SetString(kNameKey, name); |
- // This takes ownership of |info|. |
- SetInfoForProfileAtIndex(index, info.release()); |
- |
- // Remove and reinsert key in |sorted_keys_| to alphasort. |
- std::string key = CacheKeyFromProfilePath(GetPathOfProfileAtIndex(index)); |
- std::vector<std::string>::iterator key_it = |
- std::find(sorted_keys_.begin(), sorted_keys_.end(), key); |
- DCHECK(key_it != sorted_keys_.end()); |
- sorted_keys_.erase(key_it); |
- sorted_keys_.insert(FindPositionForProfile(key, name), key); |
+ DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); |
+ DictionaryValue* cache = update.Get(); |
+ cache->Set(key, info.GetEntryAsDictionary()); |
content::NotificationService::current()->Notify( |
chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
@@ -233,173 +92,10 @@ void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index, |
content::NotificationService::NoDetails()); |
} |
-void ProfileInfoCache::SetUserNameOfProfileAtIndex(size_t index, |
- const string16& user_name) { |
- string16 old_user_name; |
- const base::DictionaryValue* old_info = GetInfoForProfileAtIndex(index); |
- old_info->GetString(kUserNameKey, &old_user_name); |
- if (old_user_name == user_name) |
- return; |
- |
- scoped_ptr<DictionaryValue> info(old_info->DeepCopy()); |
- info->SetString(kUserNameKey, user_name); |
- // This takes ownership of |info|. |
- SetInfoForProfileAtIndex(index, info.release()); |
-} |
- |
-void ProfileInfoCache::SetAvatarIconOfProfileAtIndex(size_t index, |
- size_t icon_index) { |
- scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy()); |
- info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index)); |
- // This takes ownership of |info|. |
- SetInfoForProfileAtIndex(index, info.release()); |
-} |
- |
-void ProfileInfoCache::SetBackgroundStatusOfProfileAtIndex( |
- size_t index, |
- bool running_background_apps) { |
- if (GetBackgroundStatusOfProfileAtIndex(index) == running_background_apps) |
- return; |
- scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy()); |
- info->SetBoolean(kBackgroundAppsKey, running_background_apps); |
- // This takes ownership of |info|. |
- SetInfoForProfileAtIndex(index, info.release()); |
-} |
- |
-string16 ProfileInfoCache::ChooseNameForNewProfile(size_t icon_index) { |
- string16 name; |
- for (int name_index = 1; ; ++name_index) { |
- if (icon_index < kGenericIconCount) { |
- name = l10n_util::GetStringFUTF16Int(IDS_NUMBERED_PROFILE_NAME, |
- name_index); |
- } else { |
- name = l10n_util::GetStringUTF16( |
- kDefaultNames[icon_index - kGenericIconCount]); |
- if (name_index > 1) |
- name.append(UTF8ToUTF16(base::IntToString(name_index))); |
- } |
- |
- // Loop through previously named profiles to ensure we're not duplicating. |
- bool name_found = false; |
- for (size_t i = 0; i < GetNumberOfProfiles(); ++i) { |
- if (GetNameOfProfileAtIndex(i) == name) { |
- name_found = true; |
- break; |
- } |
- } |
- if (!name_found) |
- return name; |
- } |
-} |
- |
-bool ProfileInfoCache::IconIndexIsUnique(size_t icon_index) const { |
- for (size_t i = 0; i < GetNumberOfProfiles(); ++i) { |
- if (GetAvatarIconIndexOfProfileAtIndex(i) == icon_index) |
- return false; |
- } |
- return true; |
-} |
- |
-bool ProfileInfoCache::ChooseAvatarIconIndexForNewProfile( |
- bool allow_generic_icon, |
- bool must_be_unique, |
- size_t* out_icon_index) const { |
- size_t start = allow_generic_icon ? 0 : kGenericIconCount; |
- size_t end = GetDefaultAvatarIconCount(); |
- size_t count = end - start; |
- |
- int rand = base::RandInt(0, count); |
- for (size_t i = 0; i < count; ++i) { |
- size_t icon_index = start + (rand + i) % count; |
- if (!must_be_unique || IconIndexIsUnique(icon_index)) { |
- *out_icon_index = icon_index; |
- return true; |
- } |
- } |
- |
- return false; |
-} |
- |
-size_t ProfileInfoCache::ChooseAvatarIconIndexForNewProfile() const { |
- size_t icon_index = 0; |
- // Try to find a unique, non-generic icon. |
- if (ChooseAvatarIconIndexForNewProfile(false, true, &icon_index)) |
- return icon_index; |
- // Try to find any unique icon. |
- if (ChooseAvatarIconIndexForNewProfile(true, true, &icon_index)) |
- return icon_index; |
- // Settle for any random icon, even if it's not unique. |
- if (ChooseAvatarIconIndexForNewProfile(true, false, &icon_index)) |
- return icon_index; |
- |
- NOTREACHED(); |
- return 0; |
-} |
- |
const FilePath& ProfileInfoCache::GetUserDataDir() const { |
return user_data_dir_; |
} |
-// static |
-size_t ProfileInfoCache::GetDefaultAvatarIconCount() { |
- return kDefaultAvatarIconsCount; |
-} |
- |
-// static |
-int ProfileInfoCache::GetDefaultAvatarIconResourceIDAtIndex(size_t index) { |
- DCHECK_LT(index, GetDefaultAvatarIconCount()); |
- return kDefaultAvatarIconResources[index]; |
-} |
- |
-// static |
-std::string ProfileInfoCache::GetDefaultAvatarIconUrl(size_t index) { |
- DCHECK_LT(index, kDefaultAvatarIconsCount); |
- return StringPrintf("%s%" PRIuS, kDefaultUrlPrefix, index); |
-} |
- |
-// static |
-bool ProfileInfoCache::IsDefaultAvatarIconUrl(const std::string& url, |
- size_t* icon_index) { |
- DCHECK(icon_index); |
- if (url.find(kDefaultUrlPrefix) != 0) |
- return false; |
- |
- int int_value = -1; |
- if (base::StringToInt(url.begin() + strlen(kDefaultUrlPrefix), |
- url.end(), |
- &int_value)) { |
- if (int_value < 0 || |
- int_value >= static_cast<int>(kDefaultAvatarIconsCount)) |
- return false; |
- *icon_index = int_value; |
- return true; |
- } |
- |
- return false; |
-} |
- |
-const DictionaryValue* ProfileInfoCache::GetInfoForProfileAtIndex( |
- size_t index) const { |
- DCHECK_LT(index, GetNumberOfProfiles()); |
- const DictionaryValue* cache = |
- prefs_->GetDictionary(prefs::kProfileInfoCache); |
- DictionaryValue* info = NULL; |
- cache->GetDictionary(sorted_keys_[index], &info); |
- return info; |
-} |
- |
-void ProfileInfoCache::SetInfoForProfileAtIndex(size_t index, |
- DictionaryValue* info) { |
- DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); |
- DictionaryValue* cache = update.Get(); |
- cache->Set(sorted_keys_[index], info); |
- |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
- content::NotificationService::AllSources(), |
- content::NotificationService::NoDetails()); |
-} |
- |
std::string ProfileInfoCache::CacheKeyFromProfilePath( |
const FilePath& profile_path) const { |
DCHECK(user_data_dir_ == profile_path.DirName()); |
@@ -407,22 +103,6 @@ std::string ProfileInfoCache::CacheKeyFromProfilePath( |
return base_name.MaybeAsASCII(); |
} |
-std::vector<std::string>::iterator ProfileInfoCache::FindPositionForProfile( |
- std::string search_key, |
- const string16& search_name) { |
- for (size_t i = 0; i < GetNumberOfProfiles(); ++i) { |
- int name_compare = search_name.compare(GetNameOfProfileAtIndex(i)); |
- if (name_compare < 0) |
- return sorted_keys_.begin() + i; |
- if (name_compare == 0) { |
- int key_compare = search_key.compare(sorted_keys_[i]); |
- if (key_compare < 0) |
- return sorted_keys_.begin() + i; |
- } |
- } |
- return sorted_keys_.end(); |
-} |
- |
void ProfileInfoCache::RegisterPrefs(PrefService* prefs) { |
prefs->RegisterDictionaryPref(prefs::kProfileInfoCache); |
} |