Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/profiles/profile_info_cache.h" | 5 #include "chrome/browser/profiles/profile_info_cache.h" |
| 6 | 6 |
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
| 11 #include "base/string_number_conversions.h" | 11 #include "base/string_number_conversions.h" |
| 12 #include "base/stringprintf.h" | 12 #include "base/stringprintf.h" |
| 13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "chrome/browser/browser_process.h" | |
| 15 #include "chrome/browser/prefs/pref_service.h" | 16 #include "chrome/browser/prefs/pref_service.h" |
| 16 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 17 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
| 17 #include "chrome/common/chrome_notification_types.h" | 18 #include "chrome/common/chrome_notification_types.h" |
| 18 #include "chrome/common/pref_names.h" | 19 #include "chrome/common/pref_names.h" |
| 19 #include "content/public/browser/notification_service.h" | 20 #include "content/public/browser/notification_service.h" |
| 20 #include "grit/generated_resources.h" | 21 #include "grit/generated_resources.h" |
| 21 #include "grit/theme_resources.h" | 22 #include "grit/theme_resources.h" |
| 22 #include "ui/base/l10n/l10n_util.h" | 23 #include "ui/base/l10n/l10n_util.h" |
| 23 #include "ui/base/resource/resource_bundle.h" | 24 #include "ui/base/resource/resource_bundle.h" |
| 24 | 25 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 79 IDS_DEFAULT_AVATAR_NAME_18, | 80 IDS_DEFAULT_AVATAR_NAME_18, |
| 80 IDS_DEFAULT_AVATAR_NAME_19, | 81 IDS_DEFAULT_AVATAR_NAME_19, |
| 81 IDS_DEFAULT_AVATAR_NAME_20, | 82 IDS_DEFAULT_AVATAR_NAME_20, |
| 82 IDS_DEFAULT_AVATAR_NAME_21, | 83 IDS_DEFAULT_AVATAR_NAME_21, |
| 83 IDS_DEFAULT_AVATAR_NAME_22, | 84 IDS_DEFAULT_AVATAR_NAME_22, |
| 84 IDS_DEFAULT_AVATAR_NAME_23, | 85 IDS_DEFAULT_AVATAR_NAME_23, |
| 85 IDS_DEFAULT_AVATAR_NAME_24, | 86 IDS_DEFAULT_AVATAR_NAME_24, |
| 86 IDS_DEFAULT_AVATAR_NAME_25 | 87 IDS_DEFAULT_AVATAR_NAME_25 |
| 87 }; | 88 }; |
| 88 | 89 |
| 89 } // namespace | 90 } // namespace |
| 90 | 91 |
| 91 ProfileInfoCache::ProfileInfoCache(PrefService* prefs, | 92 ProfileInfoCache::ProfileInfoCache(PrefService* prefs, |
| 92 const FilePath& user_data_dir) | 93 const FilePath& user_data_dir) |
| 93 : prefs_(prefs), | 94 : prefs_(prefs), |
| 94 user_data_dir_(user_data_dir) { | 95 user_data_dir_(user_data_dir) { |
| 95 // Populate the cache | 96 // Populate the cache |
| 96 const DictionaryValue* cache = | 97 const DictionaryValue* cache = |
| 97 prefs_->GetDictionary(prefs::kProfileInfoCache); | 98 prefs_->GetDictionary(prefs::kProfileInfoCache); |
| 98 for (DictionaryValue::key_iterator it = cache->begin_keys(); | 99 for (DictionaryValue::key_iterator it = cache->begin_keys(); |
| 99 it != cache->end_keys(); ++it) { | 100 it != cache->end_keys(); ++it) { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 120 scoped_ptr<DictionaryValue> info(new DictionaryValue); | 121 scoped_ptr<DictionaryValue> info(new DictionaryValue); |
| 121 info->SetString(kNameKey, name); | 122 info->SetString(kNameKey, name); |
| 122 info->SetString(kUserNameKey, username); | 123 info->SetString(kUserNameKey, username); |
| 123 info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index)); | 124 info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index)); |
| 124 // Default value for whether background apps are running is false. | 125 // Default value for whether background apps are running is false. |
| 125 info->SetBoolean(kBackgroundAppsKey, false); | 126 info->SetBoolean(kBackgroundAppsKey, false); |
| 126 cache->Set(key, info.release()); | 127 cache->Set(key, info.release()); |
| 127 | 128 |
| 128 sorted_keys_.insert(FindPositionForProfile(key, name), key); | 129 sorted_keys_.insert(FindPositionForProfile(key, name), key); |
| 129 | 130 |
| 131 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, | |
| 132 observer_list_, | |
| 133 OnProfileAdded(name, UTF8ToUTF16(key))); | |
| 134 | |
| 130 content::NotificationService::current()->Notify( | 135 content::NotificationService::current()->Notify( |
| 131 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, | 136 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
| 132 content::NotificationService::AllSources(), | 137 content::NotificationService::AllSources(), |
| 133 content::NotificationService::NoDetails()); | 138 content::NotificationService::NoDetails()); |
| 134 } | 139 } |
| 135 | 140 |
| 141 void ProfileInfoCache::AddObserver(ProfileInfoCacheObserver* obs) { | |
| 142 observer_list_.AddObserver(obs); | |
| 143 } | |
| 144 | |
| 145 void ProfileInfoCache::RemoveObserver(ProfileInfoCacheObserver* obs) { | |
| 146 observer_list_.RemoveObserver(obs); | |
| 147 } | |
| 148 | |
| 136 void ProfileInfoCache::DeleteProfileFromCache(const FilePath& profile_path) { | 149 void ProfileInfoCache::DeleteProfileFromCache(const FilePath& profile_path) { |
| 137 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); | 150 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); |
| 138 DictionaryValue* cache = update.Get(); | 151 DictionaryValue* cache = update.Get(); |
| 152 if (!cache) | |
|
grt (UTC plus 2)
2011/11/21 15:21:18
if any kind of check is needed here (i'm not sure
Miranda Callahan
2011/11/21 15:40:38
Yes, this was based on a discussion w/robertshield
| |
| 153 NOTREACHED(); | |
| 154 std::string key = CacheKeyFromProfilePath(profile_path); | |
| 155 DictionaryValue* info = NULL; | |
| 156 cache->GetDictionary(key, &info); | |
| 157 DCHECK(info); | |
| 158 string16 name; | |
| 159 info->GetString(kNameKey, &name); | |
| 139 | 160 |
| 140 std::string key = CacheKeyFromProfilePath(profile_path); | 161 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, |
| 162 observer_list_, | |
| 163 OnProfileRemoved(name)); | |
| 164 | |
| 141 cache->Remove(key, NULL); | 165 cache->Remove(key, NULL); |
| 142 sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key)); | 166 sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key)); |
| 143 | 167 |
| 144 content::NotificationService::current()->Notify( | 168 content::NotificationService::current()->Notify( |
| 145 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, | 169 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
| 146 content::NotificationService::AllSources(), | 170 content::NotificationService::AllSources(), |
| 147 content::NotificationService::NoDetails()); | 171 content::NotificationService::NoDetails()); |
| 148 } | 172 } |
| 149 | 173 |
| 150 size_t ProfileInfoCache::GetNumberOfProfiles() const { | 174 size_t ProfileInfoCache::GetNumberOfProfiles() const { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 208 if (IsDefaultAvatarIconUrl(icon_url, &icon_index)) | 232 if (IsDefaultAvatarIconUrl(icon_url, &icon_index)) |
| 209 return icon_index; | 233 return icon_index; |
| 210 | 234 |
| 211 DLOG(WARNING) << "Unknown avatar icon: " << icon_url; | 235 DLOG(WARNING) << "Unknown avatar icon: " << icon_url; |
| 212 return GetDefaultAvatarIconResourceIDAtIndex(0); | 236 return GetDefaultAvatarIconResourceIDAtIndex(0); |
| 213 } | 237 } |
| 214 | 238 |
| 215 void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index, | 239 void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index, |
| 216 const string16& name) { | 240 const string16& name) { |
| 217 scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy()); | 241 scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy()); |
| 242 string16 old_name; | |
| 243 info->GetString(kNameKey, &old_name); | |
| 218 info->SetString(kNameKey, name); | 244 info->SetString(kNameKey, name); |
| 219 // This takes ownership of |info|. | 245 // This takes ownership of |info|. |
| 220 SetInfoForProfileAtIndex(index, info.release()); | 246 SetInfoForProfileAtIndex(index, info.release()); |
| 221 | 247 |
| 222 // Remove and reinsert key in |sorted_keys_| to alphasort. | 248 // Remove and reinsert key in |sorted_keys_| to alphasort. |
| 223 std::string key = CacheKeyFromProfilePath(GetPathOfProfileAtIndex(index)); | 249 std::string key = CacheKeyFromProfilePath(GetPathOfProfileAtIndex(index)); |
| 224 std::vector<std::string>::iterator key_it = | 250 std::vector<std::string>::iterator key_it = |
| 225 std::find(sorted_keys_.begin(), sorted_keys_.end(), key); | 251 std::find(sorted_keys_.begin(), sorted_keys_.end(), key); |
| 226 DCHECK(key_it != sorted_keys_.end()); | 252 DCHECK(key_it != sorted_keys_.end()); |
| 227 sorted_keys_.erase(key_it); | 253 sorted_keys_.erase(key_it); |
| 228 sorted_keys_.insert(FindPositionForProfile(key, name), key); | 254 sorted_keys_.insert(FindPositionForProfile(key, name), key); |
| 229 | 255 |
| 256 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, | |
| 257 observer_list_, | |
| 258 OnProfileNameChanged(old_name, name)); | |
| 259 | |
| 230 content::NotificationService::current()->Notify( | 260 content::NotificationService::current()->Notify( |
| 231 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, | 261 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
| 232 content::NotificationService::AllSources(), | 262 content::NotificationService::AllSources(), |
| 233 content::NotificationService::NoDetails()); | 263 content::NotificationService::NoDetails()); |
| 234 } | 264 } |
| 235 | 265 |
| 236 void ProfileInfoCache::SetUserNameOfProfileAtIndex(size_t index, | 266 void ProfileInfoCache::SetUserNameOfProfileAtIndex(size_t index, |
| 237 const string16& user_name) { | 267 const string16& user_name) { |
| 238 string16 old_user_name; | 268 string16 old_user_name; |
| 239 const base::DictionaryValue* old_info = GetInfoForProfileAtIndex(index); | 269 const base::DictionaryValue* old_info = GetInfoForProfileAtIndex(index); |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 378 return false; | 408 return false; |
| 379 } | 409 } |
| 380 | 410 |
| 381 const DictionaryValue* ProfileInfoCache::GetInfoForProfileAtIndex( | 411 const DictionaryValue* ProfileInfoCache::GetInfoForProfileAtIndex( |
| 382 size_t index) const { | 412 size_t index) const { |
| 383 DCHECK_LT(index, GetNumberOfProfiles()); | 413 DCHECK_LT(index, GetNumberOfProfiles()); |
| 384 const DictionaryValue* cache = | 414 const DictionaryValue* cache = |
| 385 prefs_->GetDictionary(prefs::kProfileInfoCache); | 415 prefs_->GetDictionary(prefs::kProfileInfoCache); |
| 386 DictionaryValue* info = NULL; | 416 DictionaryValue* info = NULL; |
| 387 cache->GetDictionary(sorted_keys_[index], &info); | 417 cache->GetDictionary(sorted_keys_[index], &info); |
| 418 if (!info) | |
|
grt (UTC plus 2)
2011/11/21 15:21:18
same
| |
| 419 NOTREACHED(); | |
| 388 return info; | 420 return info; |
| 389 } | 421 } |
| 390 | 422 |
| 391 void ProfileInfoCache::SetInfoForProfileAtIndex(size_t index, | 423 void ProfileInfoCache::SetInfoForProfileAtIndex(size_t index, |
| 392 DictionaryValue* info) { | 424 DictionaryValue* info) { |
| 393 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); | 425 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); |
| 394 DictionaryValue* cache = update.Get(); | 426 DictionaryValue* cache = update.Get(); |
| 395 cache->Set(sorted_keys_[index], info); | 427 cache->Set(sorted_keys_[index], info); |
| 396 | 428 |
| 397 content::NotificationService::current()->Notify( | 429 content::NotificationService::current()->Notify( |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 416 return sorted_keys_.begin() + i; | 448 return sorted_keys_.begin() + i; |
| 417 if (name_compare == 0) { | 449 if (name_compare == 0) { |
| 418 int key_compare = search_key.compare(sorted_keys_[i]); | 450 int key_compare = search_key.compare(sorted_keys_[i]); |
| 419 if (key_compare < 0) | 451 if (key_compare < 0) |
| 420 return sorted_keys_.begin() + i; | 452 return sorted_keys_.begin() + i; |
| 421 } | 453 } |
| 422 } | 454 } |
| 423 return sorted_keys_.end(); | 455 return sorted_keys_.end(); |
| 424 } | 456 } |
| 425 | 457 |
| 458 // static | |
| 459 std::vector<string16> ProfileInfoCache::GetProfileNames() { | |
| 460 std::vector<string16> names; | |
| 461 PrefService* local_state = g_browser_process->local_state(); | |
| 462 const DictionaryValue* cache = local_state->GetDictionary( | |
| 463 prefs::kProfileInfoCache); | |
| 464 string16 name; | |
| 465 for (base::DictionaryValue::key_iterator it = cache->begin_keys(); | |
| 466 it != cache->end_keys(); | |
| 467 ++it) { | |
| 468 base::DictionaryValue* info = NULL; | |
| 469 cache->GetDictionary(*it, &info); | |
| 470 info->GetString(kNameKey, &name); | |
| 471 names.push_back(name); | |
| 472 } | |
| 473 return names; | |
| 474 } | |
| 475 | |
| 476 // static | |
| 426 void ProfileInfoCache::RegisterPrefs(PrefService* prefs) { | 477 void ProfileInfoCache::RegisterPrefs(PrefService* prefs) { |
| 427 prefs->RegisterDictionaryPref(prefs::kProfileInfoCache); | 478 prefs->RegisterDictionaryPref(prefs::kProfileInfoCache); |
| 428 } | 479 } |
| OLD | NEW |