blob: 101155b2d49b7a4ebac3e4a07682bbbe18747f97 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/profile_resetter/automatic_profile_resetter_mementos.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/prefs/pref_service.h"
#include "base/prefs/scoped_user_pref_update.h"
#include "base/values.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_constants.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/browser_thread.h"
using base::DictionaryValue;
// AutomaticProfileResetter::PreferenceHostedPromptMemento -------------------
PreferenceHostedPromptMemento::PreferenceHostedPromptMemento(Profile* profile)
: profile_(profile) {}
PreferenceHostedPromptMemento::~PreferenceHostedPromptMemento() {}
std::string PreferenceHostedPromptMemento::ReadValue() const {
PrefService* prefs = profile_->GetPrefs();
DCHECK(prefs);
return prefs->GetString(prefs::kProfileResetPromptMemento);
}
void PreferenceHostedPromptMemento::StoreValue(const std::string& value) {
PrefService* prefs = profile_->GetPrefs();
DCHECK(prefs);
prefs->SetString(prefs::kProfileResetPromptMemento, value);
}
// AutomaticProfileResetter::LocalStateHostedPromptMemento -------------------
LocalStateHostedPromptMemento::LocalStateHostedPromptMemento(Profile* profile)
: profile_(profile) {}
LocalStateHostedPromptMemento::~LocalStateHostedPromptMemento() {}
std::string LocalStateHostedPromptMemento::ReadValue() const {
PrefService* local_state = g_browser_process->local_state();
DCHECK(local_state);
const base::DictionaryValue* prompt_shown_dict =
local_state->GetDictionary(prefs::kProfileResetPromptMemento);
std::string profile_key = GetProfileKey();
if (!prompt_shown_dict || profile_key.empty()) {
NOTREACHED();
return std::string();
}
std::string value;
return prompt_shown_dict->GetStringWithoutPathExpansion(profile_key, &value) ?
value : std::string();
}
void LocalStateHostedPromptMemento::StoreValue(const std::string& value) {
PrefService* local_state = g_browser_process->local_state();
DCHECK(local_state);
DictionaryPrefUpdate prompt_shown_dict_update(
local_state, prefs::kProfileResetPromptMemento);
std::string profile_key = GetProfileKey();
if (profile_key.empty()) {
NOTREACHED();
return;
}
prompt_shown_dict_update.Get()->SetStringWithoutPathExpansion(profile_key,
value);
}
std::string LocalStateHostedPromptMemento::GetProfileKey() const {
return profile_->GetPath().BaseName().MaybeAsASCII();
}
// AutomaticProfileResetter::FileHostedPromptMemento -------------------------
FileHostedPromptMemento::FileHostedPromptMemento(Profile* profile)
: profile_(profile) {}
FileHostedPromptMemento::~FileHostedPromptMemento() {}
void FileHostedPromptMemento::ReadValue(
const ReadValueCallback& callback) const {
base::FilePath path = GetMementoFilePath();
content::BrowserThread::PostTaskAndReplyWithResult(
content::BrowserThread::FILE,
FROM_HERE,
base::Bind(&ReadValueOnFileThread, path),
callback);
}
void FileHostedPromptMemento::StoreValue(const std::string& value) {
base::FilePath path = GetMementoFilePath();
content::BrowserThread::PostTask(
content::BrowserThread::FILE,
FROM_HERE,
base::Bind(&StoreValueOnFileThread, path, value));
}
std::string FileHostedPromptMemento::ReadValueOnFileThread(
const base::FilePath& memento_file_path) {
std::string value;
base::ReadFileToString(memento_file_path, &value);
return value;
}
void FileHostedPromptMemento::StoreValueOnFileThread(
const base::FilePath& memento_file_path,
const std::string& value) {
int retval =
base::WriteFile(memento_file_path, value.c_str(), value.size());
DCHECK_EQ(retval, (int)value.size());
}
base::FilePath FileHostedPromptMemento::GetMementoFilePath() const {
return profile_->GetPath().Append(chrome::kResetPromptMementoFilename);
}