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 DCHECK(cache); | |
153 std::string key = CacheKeyFromProfilePath(profile_path); | |
154 DictionaryValue* info = NULL; | |
155 cache->GetDictionary(key, &info); | |
156 DCHECK(info); | |
157 string16 name; | |
158 info->GetString(kNameKey, &name); | |
139 | 159 |
140 std::string key = CacheKeyFromProfilePath(profile_path); | 160 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, |
161 observer_list_, | |
162 OnProfileRemoved(name)); | |
163 | |
141 cache->Remove(key, NULL); | 164 cache->Remove(key, NULL); |
142 sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key)); | 165 sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key)); |
143 | 166 |
144 content::NotificationService::current()->Notify( | 167 content::NotificationService::current()->Notify( |
145 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, | 168 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
146 content::NotificationService::AllSources(), | 169 content::NotificationService::AllSources(), |
147 content::NotificationService::NoDetails()); | 170 content::NotificationService::NoDetails()); |
148 } | 171 } |
149 | 172 |
150 size_t ProfileInfoCache::GetNumberOfProfiles() const { | 173 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)) | 231 if (IsDefaultAvatarIconUrl(icon_url, &icon_index)) |
209 return icon_index; | 232 return icon_index; |
210 | 233 |
211 DLOG(WARNING) << "Unknown avatar icon: " << icon_url; | 234 DLOG(WARNING) << "Unknown avatar icon: " << icon_url; |
212 return GetDefaultAvatarIconResourceIDAtIndex(0); | 235 return GetDefaultAvatarIconResourceIDAtIndex(0); |
213 } | 236 } |
214 | 237 |
215 void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index, | 238 void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index, |
216 const string16& name) { | 239 const string16& name) { |
217 scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy()); | 240 scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy()); |
241 string16 old_name; | |
242 info->GetString(kNameKey, &old_name); | |
218 info->SetString(kNameKey, name); | 243 info->SetString(kNameKey, name); |
219 // This takes ownership of |info|. | 244 // This takes ownership of |info|. |
220 SetInfoForProfileAtIndex(index, info.release()); | 245 SetInfoForProfileAtIndex(index, info.release()); |
221 | 246 |
222 // Remove and reinsert key in |sorted_keys_| to alphasort. | 247 // Remove and reinsert key in |sorted_keys_| to alphasort. |
223 std::string key = CacheKeyFromProfilePath(GetPathOfProfileAtIndex(index)); | 248 std::string key = CacheKeyFromProfilePath(GetPathOfProfileAtIndex(index)); |
224 std::vector<std::string>::iterator key_it = | 249 std::vector<std::string>::iterator key_it = |
225 std::find(sorted_keys_.begin(), sorted_keys_.end(), key); | 250 std::find(sorted_keys_.begin(), sorted_keys_.end(), key); |
226 DCHECK(key_it != sorted_keys_.end()); | 251 DCHECK(key_it != sorted_keys_.end()); |
227 sorted_keys_.erase(key_it); | 252 sorted_keys_.erase(key_it); |
228 sorted_keys_.insert(FindPositionForProfile(key, name), key); | 253 sorted_keys_.insert(FindPositionForProfile(key, name), key); |
229 | 254 |
255 FOR_EACH_OBSERVER(ProfileInfoCacheObserver, | |
256 observer_list_, | |
257 OnProfileNameChanged(old_name, name)); | |
258 | |
230 content::NotificationService::current()->Notify( | 259 content::NotificationService::current()->Notify( |
231 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, | 260 chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED, |
232 content::NotificationService::AllSources(), | 261 content::NotificationService::AllSources(), |
233 content::NotificationService::NoDetails()); | 262 content::NotificationService::NoDetails()); |
234 } | 263 } |
235 | 264 |
236 void ProfileInfoCache::SetUserNameOfProfileAtIndex(size_t index, | 265 void ProfileInfoCache::SetUserNameOfProfileAtIndex(size_t index, |
237 const string16& user_name) { | 266 const string16& user_name) { |
238 string16 old_user_name; | 267 string16 old_user_name; |
239 const base::DictionaryValue* old_info = GetInfoForProfileAtIndex(index); | 268 const base::DictionaryValue* old_info = GetInfoForProfileAtIndex(index); |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
378 return false; | 407 return false; |
379 } | 408 } |
380 | 409 |
381 const DictionaryValue* ProfileInfoCache::GetInfoForProfileAtIndex( | 410 const DictionaryValue* ProfileInfoCache::GetInfoForProfileAtIndex( |
382 size_t index) const { | 411 size_t index) const { |
383 DCHECK_LT(index, GetNumberOfProfiles()); | 412 DCHECK_LT(index, GetNumberOfProfiles()); |
384 const DictionaryValue* cache = | 413 const DictionaryValue* cache = |
385 prefs_->GetDictionary(prefs::kProfileInfoCache); | 414 prefs_->GetDictionary(prefs::kProfileInfoCache); |
386 DictionaryValue* info = NULL; | 415 DictionaryValue* info = NULL; |
387 cache->GetDictionary(sorted_keys_[index], &info); | 416 cache->GetDictionary(sorted_keys_[index], &info); |
417 DCHECK(info); | |
388 return info; | 418 return info; |
389 } | 419 } |
390 | 420 |
391 void ProfileInfoCache::SetInfoForProfileAtIndex(size_t index, | 421 void ProfileInfoCache::SetInfoForProfileAtIndex(size_t index, |
392 DictionaryValue* info) { | 422 DictionaryValue* info) { |
393 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); | 423 DictionaryPrefUpdate update(prefs_, prefs::kProfileInfoCache); |
394 DictionaryValue* cache = update.Get(); | 424 DictionaryValue* cache = update.Get(); |
395 cache->Set(sorted_keys_[index], info); | 425 cache->Set(sorted_keys_[index], info); |
396 | 426 |
397 content::NotificationService::current()->Notify( | 427 content::NotificationService::current()->Notify( |
(...skipping 18 matching lines...) Expand all Loading... | |
416 return sorted_keys_.begin() + i; | 446 return sorted_keys_.begin() + i; |
417 if (name_compare == 0) { | 447 if (name_compare == 0) { |
418 int key_compare = search_key.compare(sorted_keys_[i]); | 448 int key_compare = search_key.compare(sorted_keys_[i]); |
419 if (key_compare < 0) | 449 if (key_compare < 0) |
420 return sorted_keys_.begin() + i; | 450 return sorted_keys_.begin() + i; |
421 } | 451 } |
422 } | 452 } |
423 return sorted_keys_.end(); | 453 return sorted_keys_.end(); |
424 } | 454 } |
425 | 455 |
456 // static | |
457 std::vector<string16> ProfileInfoCache::GetProfileNames() { | |
458 std::vector<string16> names; | |
459 PrefService* local_state = g_browser_process->local_state(); | |
460 const DictionaryValue* cache = local_state->GetDictionary( | |
461 prefs::kProfileInfoCache); | |
462 string16 name; | |
463 for (base::DictionaryValue::key_iterator it = cache->begin_keys(); | |
464 it != cache->end_keys(); | |
465 ++it) { | |
grt (UTC plus 2)
2011/11/18 20:02:54
indent
Miranda Callahan
2011/11/18 22:41:33
Done.
| |
466 base::DictionaryValue* info = NULL; | |
467 cache->GetDictionary(*it, &info); | |
468 info->GetString(kNameKey, &name); | |
469 names.push_back(name); | |
470 } | |
471 return names; | |
472 } | |
473 | |
474 // static | |
426 void ProfileInfoCache::RegisterPrefs(PrefService* prefs) { | 475 void ProfileInfoCache::RegisterPrefs(PrefService* prefs) { |
427 prefs->RegisterDictionaryPref(prefs::kProfileInfoCache); | 476 prefs->RegisterDictionaryPref(prefs::kProfileInfoCache); |
428 } | 477 } |
OLD | NEW |