Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Side by Side Diff: chrome/browser/profiles/profile_info_cache.cc

Issue 7155015: Store profile avatar to preferences (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address review comments Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/profiles/profile_info_cache.h"
6
7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/string_number_conversions.h"
10 #include "base/stringprintf.h"
11 #include "base/utf_string_conversions.h"
12 #include "base/values.h"
13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/prefs/pref_service.h"
15 #include "chrome/browser/prefs/scoped_user_pref_update.h"
16 #include "chrome/common/pref_names.h"
17 #include "grit/theme_resources.h"
18 #include "ui/base/resource/resource_bundle.h"
19
20 namespace {
21
22 const char* kNameKey = "name";
willchan no longer on Chromium 2011/06/21 08:26:27 Prefer `static const char kNameKey[] = "name";` ov
sail 2011/06/21 16:28:13 Done.
23 const char* kAvatarIconKey = "avatar_icon";
24 const char* kDefaultUrlPrefix = "chrome://theme/IDR_PROFILE_AVATAR_";
25
26 const int kDefaultAvatarIconResources[] = {
27 IDR_PROFILE_AVATAR_0,
28 IDR_PROFILE_AVATAR_1,
29 IDR_PROFILE_AVATAR_2,
30 IDR_PROFILE_AVATAR_3,
31 };
32
33 const int kDefaultAvatarIconsCount = arraysize(kDefaultAvatarIconResources);
34
35 // Checks if the given URL points to one of the default avatar icons. if it is,
36 // returns true and its index through |icon_index|. If not, returns false.
37 bool IsDefaultAvatarIconUrl(const std::string& url, size_t* icon_index) {
38 DCHECK(icon_index);
39 if (url.find(kDefaultUrlPrefix) != 0)
40 return false;
41
42 int int_value = -1;
43 if (base::StringToInt(url.begin() + url.size(),
44 url.end(),
45 &int_value)) {
46 if (int_value < 0 || int_value >= kDefaultAvatarIconsCount)
47 return false;
48 *icon_index = int_value;
49 return true;
50 }
51
52 return false;
53 }
54
55 // Returns a URL for the default avatar icon with specified index.
56 std::string GetDefaultAvatarIconUrl(int icon_index) {
57 DCHECK_LT(icon_index, kDefaultAvatarIconsCount);
58 return StringPrintf("%s%d", kDefaultUrlPrefix, icon_index);
59 }
60
61 } // namespace
62
63 ProfileInfoCache::ProfileInfoCache(const FilePath& user_data_dir)
64 : user_data_dir_(user_data_dir) {
65 // Populate the cache
66 const DictionaryValue* cache =
67 g_browser_process->local_state()->GetDictionary(prefs::kProfileInfoCache);
willchan no longer on Chromium 2011/06/21 08:26:27 This is why your test is crashing. g_browser_proce
sail 2011/06/21 16:28:13 Done. Awesome, thanks!
68 for (DictionaryValue::key_iterator it = cache->begin_keys();
69 it != cache->end_keys(); ++it) {
70 std::string key = *it;
71 DictionaryValue* info = NULL;
72 cache->GetDictionary(key, &info);
73 string16 name;
74 info->GetString(kNameKey, &name);
75 sorted_keys_.insert(FindPositionForProfile(key, name), key);
76 }
77 }
78
79 void ProfileInfoCache::AddProfileToCache(const FilePath& profile_path,
80 const string16& name,
81 size_t icon_index) {
82 std::string key = CacheKeyFromProfilePath(profile_path);
83 DictionaryPrefUpdate update(g_browser_process->local_state(),
84 prefs::kProfileInfoCache);
85 DictionaryValue* cache = update.Get();
86
87 scoped_ptr<DictionaryValue> info(new DictionaryValue);
88 info->SetString(kNameKey, name);
89 info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index));
90 cache->Set(key, info.release());
91
92 sorted_keys_.insert(FindPositionForProfile(key, name), key);
93 }
94
95 void ProfileInfoCache::DeleteProfileFromCache(const FilePath& profile_path) {
96 DictionaryPrefUpdate update(g_browser_process->local_state(),
97 prefs::kProfileInfoCache);
98 DictionaryValue* cache = update.Get();
99
100 std::string key = CacheKeyFromProfilePath(profile_path);
101 cache->Remove(key, NULL);
102 sorted_keys_.erase(std::find(sorted_keys_.begin(), sorted_keys_.end(), key));
103 }
104
105 size_t ProfileInfoCache::GetNumberOfProfiles() const {
106 return sorted_keys_.size();
107 }
108
109 string16 ProfileInfoCache::GetNameOfProfileAtIndex(size_t index) const {
110 string16 name;
111 GetInfoForProfileAtIndex(index)->GetString(kNameKey, &name);
112 return name;
113 }
114
115 FilePath ProfileInfoCache::GetPathOfProfileAtIndex(size_t index) const {
116 FilePath::StringType base_name;
117 #if defined(OS_POSIX)
118 base_name = sorted_keys_[index];
119 #elif defined(OS_WIN)
120 base_name = ASCIIToWide(sorted_keys_[index]);
121 #endif
122 return user_data_dir_.Append(base_name);
123 }
124
125 const gfx::Image& ProfileInfoCache::GetAvatarIconOfProfileAtIndex(
126 size_t index) const {
127 std::string icon_url;
128 GetInfoForProfileAtIndex(index)->GetString(kAvatarIconKey, &icon_url);
129 size_t icon_index = 0;
130 if (IsDefaultAvatarIconUrl(icon_url, &icon_index)) {
131 int resource_id = GetDefaultAvatarIconResourceIDAtIndex(icon_index);
132 return ResourceBundle::GetSharedInstance().GetImageNamed(resource_id);
133 }
134
135 DLOG(WARNING) << "Unknown avatar icon: " << icon_url;
136 return ResourceBundle::GetSharedInstance().GetImageNamed(
137 GetDefaultAvatarIconResourceIDAtIndex(0));
138 }
139
140 void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index,
141 const string16& name) {
142 scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
143 info->SetString(kNameKey, name);
144 // This takes ownership of |info|.
145 SetInfoForProfileAtIndex(index, info.release());
146 }
147
148 void ProfileInfoCache::SetAvatarIconOfProfileAtIndex(size_t index,
149 size_t icon_index) {
150 scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
151 info->SetString(kAvatarIconKey, GetDefaultAvatarIconUrl(icon_index));
152 // This takes ownership of |info|.
153 SetInfoForProfileAtIndex(index, info.release());
154 }
155
156 size_t ProfileInfoCache::GetDefaultAvatarIconCount() {
157 return kDefaultAvatarIconsCount;
158 }
159
160 int ProfileInfoCache::GetDefaultAvatarIconResourceIDAtIndex(size_t index) {
161 DCHECK_LT(index, GetDefaultAvatarIconCount());
162 return kDefaultAvatarIconResources[index];
163 }
164
165 const DictionaryValue* ProfileInfoCache::GetInfoForProfileAtIndex(
166 size_t index) const {
167 DCHECK_LT(index, GetNumberOfProfiles());
168 const DictionaryValue* cache =
169 g_browser_process->local_state()->GetDictionary(prefs::kProfileInfoCache);
170 DictionaryValue* info = NULL;
171 cache->GetDictionary(sorted_keys_[index], &info);
172 return info;
173 }
174
175 void ProfileInfoCache::SetInfoForProfileAtIndex(size_t index,
176 DictionaryValue* info) {
177 DictionaryPrefUpdate update(g_browser_process->local_state(),
178 prefs::kProfileInfoCache);
179 DictionaryValue* cache = update.Get();
180 cache->Set(sorted_keys_[index], info);
181 }
182
183 std::string ProfileInfoCache::CacheKeyFromProfilePath(
184 const FilePath& profile_path) const {
185 DCHECK(user_data_dir_ == profile_path.DirName());
186 FilePath base_name = profile_path.BaseName();
187 return base_name.MaybeAsASCII();
188 }
189
190 std::vector<std::string>::iterator ProfileInfoCache::FindPositionForProfile(
191 std::string search_key,
192 const string16& search_name) {
193 for (size_t i = 0; i < GetNumberOfProfiles(); ++i) {
194 int name_compare = search_name.compare(GetNameOfProfileAtIndex(i));
195 if (name_compare < 0)
196 return sorted_keys_.begin() + i;
197 if (name_compare == 0) {
198 int key_compare = search_key.compare(sorted_keys_[i]);
199 if (key_compare < 0)
200 return sorted_keys_.begin() + i;
201 }
202 }
203 return sorted_keys_.end();
204 }
205
206 void ProfileInfoCache::RegisterPrefs(PrefService* prefs) {
207 prefs->RegisterDictionaryPref(prefs::kProfileInfoCache);
208 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698