| Index: chrome/browser/profiles/profile_info_cache.cc
|
| ===================================================================
|
| --- chrome/browser/profiles/profile_info_cache.cc (revision 111260)
|
| +++ chrome/browser/profiles/profile_info_cache.cc (working copy)
|
| @@ -4,14 +4,10 @@
|
|
|
| #include "chrome/browser/profiles/profile_info_cache.h"
|
|
|
| -#include "base/bind.h"
|
| -#include "base/file_util.h"
|
| #include "base/format_macros.h"
|
| -#include "base/i18n/case_conversion.h"
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/rand_util.h"
|
| -#include "base/stl_util.h"
|
| #include "base/string_number_conversions.h"
|
| #include "base/stringprintf.h"
|
| #include "base/utf_string_conversions.h"
|
| @@ -21,30 +17,19 @@
|
| #include "chrome/browser/prefs/scoped_user_pref_update.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/common/pref_names.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/notification_service.h"
|
| #include "grit/generated_resources.h"
|
| #include "grit/theme_resources.h"
|
| -#include "third_party/skia/include/core/SkBitmap.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/gfx/image/image.h"
|
| -#include "ui/gfx/image/image_util.h"
|
|
|
| -using content::BrowserThread;
|
| -
|
| namespace {
|
|
|
| const char kNameKey[] = "name";
|
| -const char kGAIANameKey[] = "gaia_name";
|
| -const char kUseGAIANameKey[] = "use_gaia_name";
|
| const char kUserNameKey[] = "user_name";
|
| const char kAvatarIconKey[] = "avatar_icon";
|
| -const char kUseGAIAPictureKey[] = "use_gaia_picture";
|
| const char kBackgroundAppsKey[] = "background_apps";
|
| -const char kHasMigratedToGAIAInfoKey[] = "has_migrated_to_gaia_info";
|
| const char kDefaultUrlPrefix[] = "chrome://theme/IDR_PROFILE_AVATAR_";
|
| -const char kGAIAPictureFileName[] = "Google Profile Picture.png";
|
|
|
| const int kDefaultAvatarIconResources[] = {
|
| IDR_PROFILE_AVATAR_0,
|
| @@ -102,62 +87,6 @@
|
| IDS_DEFAULT_AVATAR_NAME_25
|
| };
|
|
|
| -// Writes the given bitmap as a PNG to disk. On completion |success| is set to
|
| -// true on success and false on failure.
|
| -void SaveBitmap(gfx::Image image,
|
| - FilePath image_path,
|
| - bool* success) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| - *success = false;
|
| -
|
| - // Make sure the destination directory exists.
|
| - FilePath dir = image_path.DirName();
|
| - if (!file_util::DirectoryExists(dir) && !file_util::CreateDirectory(dir)) {
|
| - LOG(ERROR) << "Failed to create parent directory.";
|
| - return;
|
| - }
|
| -
|
| - std::vector<unsigned char> encoded_image;
|
| - if (!gfx::PNGEncodedDataFromImage(image, &encoded_image)) {
|
| - LOG(ERROR) << "Failed to PNG encode the image.";
|
| - return;
|
| - }
|
| -
|
| - if (file_util::WriteFile(image_path,
|
| - reinterpret_cast<char*>(&encoded_image[0]),
|
| - encoded_image.size()) == -1) {
|
| - LOG(ERROR) << "Failed to save image to file.";
|
| - return;
|
| - }
|
| -
|
| - *success = true;
|
| -}
|
| -
|
| -// Reads a PNG from disk and decodes it. If the bitmap was successfully read
|
| -// from disk the then |out_image| will contain the bitmap image, otherwise it
|
| -// will be NULL.
|
| -void ReadBitmap(FilePath image_path,
|
| - gfx::Image** out_image) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| - *out_image = NULL;
|
| -
|
| - std::string image_data;
|
| - if (!file_util::ReadFileToString(image_path, &image_data)) {
|
| - LOG(ERROR) << "Failed to read PNG file from disk.";
|
| - return;
|
| - }
|
| -
|
| - const unsigned char* data =
|
| - reinterpret_cast<const unsigned char*>(image_data.data());
|
| - gfx::Image* image = gfx::ImageFromPNGEncodedData(data, image_data.length());
|
| - if (image == NULL) {
|
| - LOG(ERROR) << "Failed to decode PNG file.";
|
| - return;
|
| - }
|
| -
|
| - *out_image = image;
|
| -}
|
| -
|
| } // namespace
|
|
|
| ProfileInfoCache::ProfileInfoCache(PrefService* prefs,
|
| @@ -179,8 +108,6 @@
|
| }
|
|
|
| ProfileInfoCache::~ProfileInfoCache() {
|
| - STLDeleteContainerPairSecondPointers(
|
| - gaia_pictures_.begin(), gaia_pictures_.end());
|
| }
|
|
|
| void ProfileInfoCache::AddProfileToCache(const FilePath& profile_path,
|
| @@ -259,16 +186,19 @@
|
| }
|
|
|
| string16 ProfileInfoCache::GetNameOfProfileAtIndex(size_t index) const {
|
| - if (IsUsingGAIANameOfProfileAtIndex(index))
|
| - return GetGAIANameOfProfileAtIndex(index);
|
| -
|
| string16 name;
|
| GetInfoForProfileAtIndex(index)->GetString(kNameKey, &name);
|
| return name;
|
| }
|
|
|
| FilePath ProfileInfoCache::GetPathOfProfileAtIndex(size_t index) const {
|
| - return user_data_dir_.AppendASCII(sorted_keys_[index]);
|
| + 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 {
|
| @@ -279,9 +209,6 @@
|
|
|
| const gfx::Image& ProfileInfoCache::GetAvatarIconOfProfileAtIndex(
|
| size_t index) const {
|
| - if (IsUsingGAIAPictureOfProfileAtIndex(index))
|
| - return GetGAIAPictureOfProfileAtIndex(index);
|
| -
|
| int resource_id = GetDefaultAvatarIconResourceIDAtIndex(
|
| GetAvatarIconIndexOfProfileAtIndex(index));
|
| return ResourceBundle::GetSharedInstance().GetImageNamed(resource_id);
|
| @@ -295,75 +222,6 @@
|
| return background_app_status;
|
| }
|
|
|
| -string16 ProfileInfoCache::GetGAIANameOfProfileAtIndex(size_t index) const {
|
| - string16 name;
|
| - GetInfoForProfileAtIndex(index)->GetString(kGAIANameKey, &name);
|
| - return name;
|
| -}
|
| -
|
| -bool ProfileInfoCache::IsUsingGAIANameOfProfileAtIndex(size_t index) const {
|
| - bool value = false;
|
| - GetInfoForProfileAtIndex(index)->GetBoolean(kUseGAIANameKey, &value);
|
| - return value;
|
| -}
|
| -
|
| -const gfx::Image& ProfileInfoCache::GetGAIAPictureOfProfileAtIndex(
|
| - size_t index) const {
|
| - FilePath path = GetPathOfProfileAtIndex(index);
|
| - std::string key = CacheKeyFromProfilePath(path);
|
| - if (gaia_pictures_.count(key)) {
|
| - return *gaia_pictures_[key];
|
| - }
|
| -
|
| - // The GAIA picture is not in the cache yet. Load it from disk and return
|
| - // a blank picture for now.
|
| - gaia_pictures_[key] = new gfx::Image(new SkBitmap());
|
| -
|
| - FilePath image_path = path.AppendASCII(kGAIAPictureFileName);
|
| - gfx::Image** image = new gfx::Image*;
|
| - BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&ReadBitmap, image_path, image),
|
| - base::Bind(&ProfileInfoCache::OnGAIAPictureLoaded,
|
| - const_cast<ProfileInfoCache*>(this)->AsWeakPtr(), path, image));
|
| -
|
| - return *gaia_pictures_[key];
|
| -}
|
| -
|
| -void ProfileInfoCache::OnGAIAPictureLoaded(FilePath path,
|
| - gfx::Image** image) const {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - if (*image) {
|
| - std::string key = CacheKeyFromProfilePath(path);
|
| - gaia_pictures_[key] = *image;
|
| -
|
| - content::NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
|
| - content::NotificationService::AllSources(),
|
| - content::NotificationService::NoDetails());
|
| - }
|
| - delete image;
|
| -}
|
| -
|
| -void ProfileInfoCache::OnGAIAPictureSaved(FilePath path, bool* success) const {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - if (*success) {
|
| - content::NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_PROFILE_CACHE_PICTURE_SAVED,
|
| - content::NotificationService::AllSources(),
|
| - content::NotificationService::NoDetails());
|
| - }
|
| - delete success;
|
| -}
|
| -
|
| -bool ProfileInfoCache::IsUsingGAIAPictureOfProfileAtIndex(
|
| - size_t index) const {
|
| - bool value = false;
|
| - GetInfoForProfileAtIndex(index)->GetBoolean(kUseGAIAPictureKey, &value);
|
| - return value;
|
| -}
|
| -
|
| size_t ProfileInfoCache::GetAvatarIconIndexOfProfileAtIndex(size_t index)
|
| const {
|
| std::string icon_url;
|
| @@ -378,28 +236,40 @@
|
|
|
| void ProfileInfoCache::SetNameOfProfileAtIndex(size_t index,
|
| const string16& name) {
|
| - if (name == GetNameOfProfileAtIndex(index))
|
| - return;
|
| -
|
| scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
|
| string16 old_name;
|
| info->GetString(kNameKey, &old_name);
|
| info->SetString(kNameKey, name);
|
| // This takes ownership of |info|.
|
| SetInfoForProfileAtIndex(index, info.release());
|
| - UpdateSortForProfileIndex(index);
|
|
|
| + // 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);
|
| +
|
| FOR_EACH_OBSERVER(ProfileInfoCacheObserver,
|
| observer_list_,
|
| OnProfileNameChanged(old_name, name));
|
| +
|
| + content::NotificationService::current()->Notify(
|
| + chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
| }
|
|
|
| void ProfileInfoCache::SetUserNameOfProfileAtIndex(size_t index,
|
| const string16& user_name) {
|
| - if (user_name == GetUserNameOfProfileAtIndex(index))
|
| + 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(GetInfoForProfileAtIndex(index)->DeepCopy());
|
| + scoped_ptr<DictionaryValue> info(old_info->DeepCopy());
|
| info->SetString(kUserNameKey, user_name);
|
| // This takes ownership of |info|.
|
| SetInfoForProfileAtIndex(index, info.release());
|
| @@ -424,59 +294,6 @@
|
| SetInfoForProfileAtIndex(index, info.release());
|
| }
|
|
|
| -void ProfileInfoCache::SetGAIANameOfProfileAtIndex(size_t index,
|
| - const string16& name) {
|
| - if (name == GetGAIANameOfProfileAtIndex(index))
|
| - return;
|
| -
|
| - scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
|
| - info->SetString(kGAIANameKey, name);
|
| - // This takes ownership of |info|.
|
| - SetInfoForProfileAtIndex(index, info.release());
|
| - UpdateSortForProfileIndex(index);
|
| -}
|
| -
|
| -void ProfileInfoCache::SetIsUsingGAIANameOfProfileAtIndex(size_t index,
|
| - bool value) {
|
| - if (value == IsUsingGAIANameOfProfileAtIndex(index))
|
| - return;
|
| -
|
| - scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
|
| - info->SetBoolean(kUseGAIANameKey, value);
|
| - // This takes ownership of |info|.
|
| - SetInfoForProfileAtIndex(index, info.release());
|
| - UpdateSortForProfileIndex(index);
|
| -}
|
| -
|
| -void ProfileInfoCache::SetGAIAPictureOfProfileAtIndex(size_t index,
|
| - const gfx::Image& image) {
|
| - FilePath path = GetPathOfProfileAtIndex(index);
|
| - std::string key = CacheKeyFromProfilePath(path);
|
| -
|
| - delete gaia_pictures_[key];
|
| - gaia_pictures_[key] = new gfx::Image(image);
|
| -
|
| - FilePath image_path = path.AppendASCII(kGAIAPictureFileName);
|
| - bool* success = new bool;
|
| - BrowserThread::PostTaskAndReply(BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&SaveBitmap, image, image_path, success),
|
| - base::Bind(&ProfileInfoCache::OnGAIAPictureSaved, AsWeakPtr(),
|
| - path, success));
|
| -
|
| - content::NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
|
| - content::NotificationService::AllSources(),
|
| - content::NotificationService::NoDetails());
|
| -}
|
| -
|
| -void ProfileInfoCache::SetIsUsingGAIAPictureOfProfileAtIndex(size_t index,
|
| - bool value) {
|
| - scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
|
| - info->SetBoolean(kUseGAIAPictureKey, value);
|
| - // 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) {
|
| @@ -503,22 +320,6 @@
|
| }
|
| }
|
|
|
| -bool ProfileInfoCache::GetHasMigratedToGAIAInfoOfProfileAtIndex(
|
| - size_t index) const {
|
| - bool value = false;
|
| - GetInfoForProfileAtIndex(index)->GetBoolean(
|
| - kHasMigratedToGAIAInfoKey, &value);
|
| - return value;
|
| -}
|
| -
|
| -void ProfileInfoCache::SetHasMigratedToGAIAInfoOfProfileAtIndex(
|
| - size_t index, bool value) {
|
| - scoped_ptr<DictionaryValue> info(GetInfoForProfileAtIndex(index)->DeepCopy());
|
| - info->SetBoolean(kHasMigratedToGAIAInfoKey, value);
|
| - // This takes ownership of |info|.
|
| - SetInfoForProfileAtIndex(index, info.release());
|
| -}
|
| -
|
| bool ProfileInfoCache::IconIndexIsUnique(size_t icon_index) const {
|
| for (size_t i = 0; i < GetNumberOfProfiles(); ++i) {
|
| if (GetAvatarIconIndexOfProfileAtIndex(i) == icon_index)
|
| @@ -637,10 +438,8 @@
|
| std::vector<std::string>::iterator ProfileInfoCache::FindPositionForProfile(
|
| std::string search_key,
|
| const string16& search_name) {
|
| - string16 search_name_l = base::i18n::ToLower(search_name);
|
| for (size_t i = 0; i < GetNumberOfProfiles(); ++i) {
|
| - string16 name_l = base::i18n::ToLower(GetNameOfProfileAtIndex(i));
|
| - int name_compare = search_name_l.compare(name_l);
|
| + int name_compare = search_name.compare(GetNameOfProfileAtIndex(i));
|
| if (name_compare < 0)
|
| return sorted_keys_.begin() + i;
|
| if (name_compare == 0) {
|
| @@ -652,23 +451,6 @@
|
| return sorted_keys_.end();
|
| }
|
|
|
| -void ProfileInfoCache::UpdateSortForProfileIndex(size_t index) {
|
| - string16 name = GetNameOfProfileAtIndex(index);
|
| -
|
| - // 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);
|
| -
|
| - content::NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_PROFILE_CACHED_INFO_CHANGED,
|
| - content::NotificationService::AllSources(),
|
| - content::NotificationService::NoDetails());
|
| -}
|
| -
|
| // static
|
| std::vector<string16> ProfileInfoCache::GetProfileNames() {
|
| std::vector<string16> names;
|
|
|