| Index: trunk/src/base/prefs/json_pref_store.cc
|
| ===================================================================
|
| --- trunk/src/base/prefs/json_pref_store.cc (revision 269437)
|
| +++ trunk/src/base/prefs/json_pref_store.cc (working copy)
|
| @@ -39,8 +39,6 @@
|
|
|
| void Start(const base::FilePath& path) {
|
| DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
|
| - // TODO(gab): This should use PostTaskAndReplyWithResult instead of using
|
| - // the |error_| member to pass data across tasks.
|
| sequenced_task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(&FileThreadDeserializer::ReadFileAndReport,
|
| @@ -61,7 +59,7 @@
|
| // Reports deserialization result on the origin thread.
|
| void ReportOnOriginThread() {
|
| DCHECK(origin_loop_proxy_->BelongsToCurrentThread());
|
| - delegate_->OnFileRead(value_.Pass(), error_, no_dir_);
|
| + delegate_->OnFileRead(value_.release(), error_, no_dir_);
|
| }
|
|
|
| static base::Value* DoReading(const base::FilePath& path,
|
| @@ -163,9 +161,7 @@
|
| writer_(filename, sequenced_task_runner),
|
| pref_filter_(pref_filter.Pass()),
|
| initialized_(false),
|
| - filtering_in_progress_(false),
|
| - read_error_(PREF_READ_ERROR_NONE) {
|
| -}
|
| + read_error_(PREF_READ_ERROR_OTHER) {}
|
|
|
| bool JsonPrefStore::GetValue(const std::string& key,
|
| const base::Value** result) const {
|
| @@ -228,12 +224,6 @@
|
| ReportValueChanged(key);
|
| }
|
|
|
| -void JsonPrefStore::RemoveValueSilently(const std::string& key) {
|
| - prefs_->RemovePath(key, NULL);
|
| - if (!read_only_)
|
| - writer_.ScheduleWrite(this);
|
| -}
|
| -
|
| bool JsonPrefStore::ReadOnly() const {
|
| return read_only_;
|
| }
|
| @@ -244,26 +234,23 @@
|
|
|
| PersistentPrefStore::PrefReadError JsonPrefStore::ReadPrefs() {
|
| if (path_.empty()) {
|
| - OnFileRead(
|
| - scoped_ptr<base::Value>(), PREF_READ_ERROR_FILE_NOT_SPECIFIED, false);
|
| + OnFileRead(NULL, PREF_READ_ERROR_FILE_NOT_SPECIFIED, false);
|
| return PREF_READ_ERROR_FILE_NOT_SPECIFIED;
|
| }
|
|
|
| PrefReadError error;
|
| bool no_dir;
|
| - scoped_ptr<base::Value> value(
|
| - FileThreadDeserializer::DoReading(path_, &error, &no_dir));
|
| - OnFileRead(value.Pass(), error, no_dir);
|
| - return filtering_in_progress_ ? PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE :
|
| - error;
|
| + base::Value* value =
|
| + FileThreadDeserializer::DoReading(path_, &error, &no_dir);
|
| + OnFileRead(value, error, no_dir);
|
| + return error;
|
| }
|
|
|
| -void JsonPrefStore::ReadPrefsAsync(ReadErrorDelegate* error_delegate) {
|
| +void JsonPrefStore::ReadPrefsAsync(ReadErrorDelegate *error_delegate) {
|
| initialized_ = false;
|
| error_delegate_.reset(error_delegate);
|
| if (path_.empty()) {
|
| - OnFileRead(
|
| - scoped_ptr<base::Value>(), PREF_READ_ERROR_FILE_NOT_SPECIFIED, false);
|
| + OnFileRead(NULL, PREF_READ_ERROR_FILE_NOT_SPECIFIED, false);
|
| return;
|
| }
|
|
|
| @@ -289,63 +276,53 @@
|
| writer_.ScheduleWrite(this);
|
| }
|
|
|
| -void JsonPrefStore::RegisterOnNextSuccessfulWriteCallback(
|
| - const base::Closure& on_next_successful_write) {
|
| - writer_.RegisterOnNextSuccessfulWriteCallback(on_next_successful_write);
|
| -}
|
| -
|
| -void JsonPrefStore::OnFileRead(scoped_ptr<base::Value> value,
|
| +void JsonPrefStore::OnFileRead(base::Value* value_owned,
|
| PersistentPrefStore::PrefReadError error,
|
| bool no_dir) {
|
| - scoped_ptr<base::DictionaryValue> unfiltered_prefs(new base::DictionaryValue);
|
| -
|
| + scoped_ptr<base::Value> value(value_owned);
|
| read_error_ = error;
|
|
|
| - bool initialization_successful = !no_dir;
|
| -
|
| - if (initialization_successful) {
|
| - switch (read_error_) {
|
| - case PREF_READ_ERROR_ACCESS_DENIED:
|
| - case PREF_READ_ERROR_FILE_OTHER:
|
| - case PREF_READ_ERROR_FILE_LOCKED:
|
| - case PREF_READ_ERROR_JSON_TYPE:
|
| - case PREF_READ_ERROR_FILE_NOT_SPECIFIED:
|
| - read_only_ = true;
|
| - break;
|
| - case PREF_READ_ERROR_NONE:
|
| - DCHECK(value.get());
|
| - unfiltered_prefs.reset(
|
| - static_cast<base::DictionaryValue*>(value.release()));
|
| - break;
|
| - case PREF_READ_ERROR_NO_FILE:
|
| - // If the file just doesn't exist, maybe this is first run. In any case
|
| - // there's no harm in writing out default prefs in this case.
|
| - break;
|
| - case PREF_READ_ERROR_JSON_PARSE:
|
| - case PREF_READ_ERROR_JSON_REPEAT:
|
| - break;
|
| - case PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE:
|
| - // This is a special error code to be returned by ReadPrefs when it
|
| - // can't complete synchronously, it should never be returned by the read
|
| - // operation itself.
|
| - NOTREACHED();
|
| - break;
|
| - case PREF_READ_ERROR_MAX_ENUM:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| + if (no_dir) {
|
| + FOR_EACH_OBSERVER(PrefStore::Observer,
|
| + observers_,
|
| + OnInitializationCompleted(false));
|
| + return;
|
| }
|
|
|
| - if (pref_filter_) {
|
| - filtering_in_progress_ = true;
|
| - const PrefFilter::PostFilterOnLoadCallback post_filter_on_load_callback(
|
| - base::Bind(
|
| - &JsonPrefStore::FinalizeFileRead, this, initialization_successful));
|
| - pref_filter_->FilterOnLoad(post_filter_on_load_callback,
|
| - unfiltered_prefs.Pass());
|
| - } else {
|
| - FinalizeFileRead(initialization_successful, unfiltered_prefs.Pass(), false);
|
| + initialized_ = true;
|
| +
|
| + switch (error) {
|
| + case PREF_READ_ERROR_ACCESS_DENIED:
|
| + case PREF_READ_ERROR_FILE_OTHER:
|
| + case PREF_READ_ERROR_FILE_LOCKED:
|
| + case PREF_READ_ERROR_JSON_TYPE:
|
| + case PREF_READ_ERROR_FILE_NOT_SPECIFIED:
|
| + read_only_ = true;
|
| + break;
|
| + case PREF_READ_ERROR_NONE:
|
| + DCHECK(value.get());
|
| + prefs_.reset(static_cast<base::DictionaryValue*>(value.release()));
|
| + break;
|
| + case PREF_READ_ERROR_NO_FILE:
|
| + // If the file just doesn't exist, maybe this is first run. In any case
|
| + // there's no harm in writing out default prefs in this case.
|
| + break;
|
| + case PREF_READ_ERROR_JSON_PARSE:
|
| + case PREF_READ_ERROR_JSON_REPEAT:
|
| + break;
|
| + default:
|
| + NOTREACHED() << "Unknown error: " << error;
|
| }
|
| +
|
| + if (pref_filter_ && pref_filter_->FilterOnLoad(prefs_.get()))
|
| + writer_.ScheduleWrite(this);
|
| +
|
| + if (error_delegate_.get() && error != PREF_READ_ERROR_NONE)
|
| + error_delegate_->OnError(error);
|
| +
|
| + FOR_EACH_OBSERVER(PrefStore::Observer,
|
| + observers_,
|
| + OnInitializationCompleted(true));
|
| }
|
|
|
| JsonPrefStore::~JsonPrefStore() {
|
| @@ -360,32 +337,3 @@
|
| serializer.set_pretty_print(true);
|
| return serializer.Serialize(*prefs_);
|
| }
|
| -
|
| -void JsonPrefStore::FinalizeFileRead(bool initialization_successful,
|
| - scoped_ptr<base::DictionaryValue> prefs,
|
| - bool schedule_write) {
|
| - filtering_in_progress_ = false;
|
| -
|
| - if (!initialization_successful) {
|
| - FOR_EACH_OBSERVER(PrefStore::Observer,
|
| - observers_,
|
| - OnInitializationCompleted(false));
|
| - return;
|
| - }
|
| -
|
| - prefs_ = prefs.Pass();
|
| -
|
| - initialized_ = true;
|
| -
|
| - if (schedule_write && !read_only_)
|
| - writer_.ScheduleWrite(this);
|
| -
|
| - if (error_delegate_ && read_error_ != PREF_READ_ERROR_NONE)
|
| - error_delegate_->OnError(read_error_);
|
| -
|
| - FOR_EACH_OBSERVER(PrefStore::Observer,
|
| - observers_,
|
| - OnInitializationCompleted(true));
|
| -
|
| - return;
|
| -}
|
|
|