summaryrefslogtreecommitdiff
path: root/chromium/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc')
-rw-r--r--chromium/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc428
1 files changed, 0 insertions, 428 deletions
diff --git a/chromium/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc b/chromium/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc
deleted file mode 100644
index eb15b25fd27..00000000000
--- a/chromium/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc
+++ /dev/null
@@ -1,428 +0,0 @@
-// Copyright (c) 2012 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 "components/filesystem/public/cpp/prefs/filesystem_json_pref_store.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/json/json_string_value_serializer.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/task_runner_util.h"
-#include "base/time/default_clock.h"
-#include "base/values.h"
-#include "components/prefs/pref_filter.h"
-
-namespace filesystem {
-
-// Result returned from internal read tasks.
-struct FilesystemJsonPrefStore::ReadResult {
- public:
- ReadResult();
- ~ReadResult();
-
- std::unique_ptr<base::Value> value;
- PrefReadError error;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ReadResult);
-};
-
-FilesystemJsonPrefStore::ReadResult::ReadResult()
- : error(PersistentPrefStore::PREF_READ_ERROR_NONE) {}
-
-FilesystemJsonPrefStore::ReadResult::~ReadResult() {}
-
-namespace {
-
-PersistentPrefStore::PrefReadError HandleReadErrors(const base::Value* value) {
- if (!value->IsType(base::Value::Type::DICTIONARY))
- return PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE;
- return PersistentPrefStore::PREF_READ_ERROR_NONE;
-}
-
-} // namespace
-
-FilesystemJsonPrefStore::FilesystemJsonPrefStore(
- const std::string& pref_filename,
- filesystem::mojom::FileSystemPtr filesystem,
- std::unique_ptr<PrefFilter> pref_filter)
- : path_(pref_filename),
- binding_(this),
- filesystem_(std::move(filesystem)),
- prefs_(new base::DictionaryValue()),
- read_only_(false),
- pref_filter_(std::move(pref_filter)),
- initialized_(false),
- filtering_in_progress_(false),
- pending_lossy_write_(false),
- read_error_(PREF_READ_ERROR_NONE) {
- DCHECK(!path_.empty());
-}
-
-bool FilesystemJsonPrefStore::GetValue(const std::string& key,
- const base::Value** result) const {
- DCHECK(CalledOnValidThread());
-
- base::Value* tmp = nullptr;
- if (!prefs_->Get(key, &tmp))
- return false;
-
- if (result)
- *result = tmp;
- return true;
-}
-
-std::unique_ptr<base::DictionaryValue> FilesystemJsonPrefStore::GetValues()
- const {
- return prefs_->CreateDeepCopy();
-}
-
-void FilesystemJsonPrefStore::AddObserver(PrefStore::Observer* observer) {
- DCHECK(CalledOnValidThread());
-
- observers_.AddObserver(observer);
-}
-
-void FilesystemJsonPrefStore::RemoveObserver(PrefStore::Observer* observer) {
- DCHECK(CalledOnValidThread());
-
- observers_.RemoveObserver(observer);
-}
-
-bool FilesystemJsonPrefStore::HasObservers() const {
- DCHECK(CalledOnValidThread());
-
- return observers_.might_have_observers();
-}
-
-bool FilesystemJsonPrefStore::IsInitializationComplete() const {
- DCHECK(CalledOnValidThread());
-
- return initialized_;
-}
-
-bool FilesystemJsonPrefStore::GetMutableValue(const std::string& key,
- base::Value** result) {
- DCHECK(CalledOnValidThread());
-
- return prefs_->Get(key, result);
-}
-
-void FilesystemJsonPrefStore::SetValue(const std::string& key,
- std::unique_ptr<base::Value> value,
- uint32_t flags) {
- DCHECK(CalledOnValidThread());
-
- DCHECK(value);
- base::Value* old_value = nullptr;
- prefs_->Get(key, &old_value);
- if (!old_value || !value->Equals(old_value)) {
- prefs_->Set(key, std::move(value));
- ReportValueChanged(key, flags);
- }
-}
-
-void FilesystemJsonPrefStore::SetValueSilently(
- const std::string& key,
- std::unique_ptr<base::Value> value,
- uint32_t flags) {
- DCHECK(CalledOnValidThread());
-
- DCHECK(value);
- base::Value* old_value = nullptr;
- prefs_->Get(key, &old_value);
- if (!old_value || !value->Equals(old_value)) {
- prefs_->Set(key, std::move(value));
- ScheduleWrite(flags);
- }
-}
-
-void FilesystemJsonPrefStore::RemoveValue(const std::string& key,
- uint32_t flags) {
- DCHECK(CalledOnValidThread());
-
- if (prefs_->RemovePath(key, nullptr))
- ReportValueChanged(key, flags);
-}
-
-void FilesystemJsonPrefStore::RemoveValueSilently(const std::string& key,
- uint32_t flags) {
- DCHECK(CalledOnValidThread());
-
- prefs_->RemovePath(key, nullptr);
- ScheduleWrite(flags);
-}
-
-void FilesystemJsonPrefStore::ClearMutableValues() {
- NOTIMPLEMENTED();
-}
-
-bool FilesystemJsonPrefStore::ReadOnly() const {
- DCHECK(CalledOnValidThread());
-
- return read_only_;
-}
-
-PersistentPrefStore::PrefReadError FilesystemJsonPrefStore::GetReadError()
- const {
- DCHECK(CalledOnValidThread());
-
- return read_error_;
-}
-
-PersistentPrefStore::PrefReadError FilesystemJsonPrefStore::ReadPrefs() {
- NOTREACHED();
- // TODO(erg): Synchronously reading files makes no sense in a mojo world and
- // should be removed from the API.
- return PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE;
-}
-
-void FilesystemJsonPrefStore::ReadPrefsAsync(
- ReadErrorDelegate* error_delegate) {
- DCHECK(CalledOnValidThread());
-
- initialized_ = false;
- error_delegate_.reset(error_delegate);
-
- if (!directory_) {
- OpenFilesystem(
- Bind(&FilesystemJsonPrefStore::OnPreferencesReadStart, AsWeakPtr()));
- } else {
- OnPreferencesReadStart();
- }
-}
-
-void FilesystemJsonPrefStore::CommitPendingWrite() {
- DCHECK(CalledOnValidThread());
-
- // TODO(erg): This is another one of those cases where we have problems
- // because of mismatch between the models used in the pref service versus
- // here. Most of the time, CommitPendingWrite() is called from
- // PrefService. However, in JSONPrefStore, we also call this method on
- // shutdown and thus need to synchronously write. But in mojo:filesystem,
- // everything is done asynchronously. So we're sort of stuck until we can
- // change the interface, which we'll do in the longer term.
-
- SchedulePendingLossyWrites();
-}
-
-void FilesystemJsonPrefStore::SchedulePendingLossyWrites() {
- // This method is misnamed for the sake of the interface. Given that writing
- // is already asynchronous in this new world, "sheduleing" a pending write
- // just starts the asynchronous process.
- if (pending_lossy_write_)
- PerformWrite();
-}
-
-void FilesystemJsonPrefStore::ReportValueChanged(const std::string& key,
- uint32_t flags) {
- DCHECK(CalledOnValidThread());
-
- if (pref_filter_)
- pref_filter_->FilterUpdate(key);
-
- for (PrefStore::Observer& observer : observers_)
- observer.OnPrefValueChanged(key);
-
- ScheduleWrite(flags);
-}
-
-void FilesystemJsonPrefStore::OnFileSystemShutdown() {}
-
-void FilesystemJsonPrefStore::OnFileRead(
- std::unique_ptr<ReadResult> read_result) {
- DCHECK(CalledOnValidThread());
-
- DCHECK(read_result);
-
- std::unique_ptr<base::DictionaryValue> unfiltered_prefs(
- new base::DictionaryValue);
-
- read_error_ = read_result->error;
-
- 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(read_result->value.get());
- unfiltered_prefs.reset(
- static_cast<base::DictionaryValue*>(read_result->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.
- 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.
- case PREF_READ_ERROR_MAX_ENUM:
- NOTREACHED();
- break;
- }
-
- if (pref_filter_) {
- filtering_in_progress_ = true;
- const PrefFilter::PostFilterOnLoadCallback post_filter_on_load_callback(
- base::Bind(&FilesystemJsonPrefStore::FinalizeFileRead, AsWeakPtr()));
- pref_filter_->FilterOnLoad(post_filter_on_load_callback,
- std::move(unfiltered_prefs));
- } else {
- FinalizeFileRead(std::move(unfiltered_prefs), false);
- }
-}
-
-FilesystemJsonPrefStore::~FilesystemJsonPrefStore() {
- // TODO(erg): Now that writing is asynchronous, we can't really async write
- // prefs at shutdown. See comment in CommitPendingWrite().
-}
-
-void FilesystemJsonPrefStore::FinalizeFileRead(
- std::unique_ptr<base::DictionaryValue> prefs,
- bool schedule_write) {
- DCHECK(CalledOnValidThread());
-
- filtering_in_progress_ = false;
-
- prefs_ = std::move(prefs);
-
- initialized_ = true;
-
- if (schedule_write)
- ScheduleWrite(DEFAULT_PREF_WRITE_FLAGS);
-
- if (error_delegate_ && read_error_ != PREF_READ_ERROR_NONE)
- error_delegate_->OnError(read_error_);
-
- for (PrefStore::Observer& observer : observers_)
- observer.OnInitializationCompleted(true);
-}
-
-void FilesystemJsonPrefStore::ScheduleWrite(uint32_t flags) {
- if (read_only_)
- return;
-
- if (flags & LOSSY_PREF_WRITE_FLAG)
- pending_lossy_write_ = true;
- else
- PerformWrite();
-}
-
-void FilesystemJsonPrefStore::PerformWrite() {
- if (!directory_) {
- OpenFilesystem(
- Bind(&FilesystemJsonPrefStore::OnTempFileWriteStart, AsWeakPtr()));
- } else {
- OnTempFileWriteStart();
- }
-}
-
-void FilesystemJsonPrefStore::OpenFilesystem(base::Closure callback) {
- filesystem::mojom::FileSystemClientPtr client;
- binding_.Bind(MakeRequest(&client));
-
- filesystem_->OpenFileSystem(
- "origin", MakeRequest(&directory_), std::move(client),
- base::Bind(&FilesystemJsonPrefStore::OnOpenFilesystem, AsWeakPtr(),
- callback));
-}
-
-void FilesystemJsonPrefStore::OnOpenFilesystem(base::Closure callback,
- mojom::FileError err) {
- if (err != mojom::FileError::OK) {
- // Do real error checking.
- NOTIMPLEMENTED();
- return;
- }
-
- callback.Run();
-}
-
-void FilesystemJsonPrefStore::OnTempFileWriteStart() {
- // Calculate what we want to write, and then write to the temporary file.
- pending_lossy_write_ = false;
-
- if (pref_filter_)
- pref_filter_->FilterSerializeData(prefs_.get());
-
- std::string output;
- JSONStringValueSerializer serializer(&output);
- serializer.set_pretty_print(false);
- serializer.Serialize(*prefs_);
-
- directory_->WriteFile(
- "tmp", std::vector<uint8_t>(output.begin(), output.end()),
- Bind(&FilesystemJsonPrefStore::OnTempFileWrite, AsWeakPtr()));
-}
-
-void FilesystemJsonPrefStore::OnTempFileWrite(mojom::FileError err) {
- // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the
- // file can never fail.
- CHECK_EQ(mojom::FileError::OK, err);
-
- directory_->Rename(
- "tmp", path_,
- Bind(&FilesystemJsonPrefStore::OnTempFileRenamed, AsWeakPtr()));
-}
-
-void FilesystemJsonPrefStore::OnTempFileRenamed(mojom::FileError err) {}
-
-void FilesystemJsonPrefStore::OnPreferencesReadStart() {
- directory_->ReadEntireFile(
- path_,
- Bind(&FilesystemJsonPrefStore::OnPreferencesFileRead, AsWeakPtr()));
-}
-
-void FilesystemJsonPrefStore::OnPreferencesFileRead(
- mojom::FileError err,
- const std::vector<uint8_t>& contents) {
- std::unique_ptr<FilesystemJsonPrefStore::ReadResult> read_result(
- new FilesystemJsonPrefStore::ReadResult);
- // TODO(erg): Needs even better error handling.
- switch (err) {
- case mojom::FileError::IN_USE:
- case mojom::FileError::ACCESS_DENIED:
- case mojom::FileError::NOT_A_FILE: {
- read_only_ = true;
- break;
- }
- case mojom::FileError::FAILED:
- case mojom::FileError::NOT_FOUND: {
- // If the file just doesn't exist, maybe this is the first run. Just
- // don't pass a value.
- read_result->error = PREF_READ_ERROR_NO_FILE;
- break;
- }
- default: {
- int error_code;
- std::string error_msg;
- JSONStringValueDeserializer deserializer(base::StringPiece(
- reinterpret_cast<char*>(&contents.front()), contents.size()));
- read_result->value = deserializer.Deserialize(&error_code, &error_msg);
- read_result->error = HandleReadErrors(read_result->value.get());
- }
- }
-
- OnFileRead(std::move(read_result));
-}
-
-} // namespace filesystem