| Index: components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc
|
| diff --git a/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc b/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc
|
| index d276116fc07e433a30a875c408421030bb1788a5..d80a34ffd77247491b3d22978952aebdd844a429 100644
|
| --- a/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc
|
| +++ b/components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc
|
| @@ -345,6 +345,17 @@
|
| }
|
|
|
| void FilesystemJsonPrefStore::OnTempFileWriteStart() {
|
| + // Open up a temporary file and truncate it.
|
| + directory_->OpenFile(
|
| + "tmp", GetProxy(&temporary_file_), kFlagWrite | kFlagCreate,
|
| + Bind(&FilesystemJsonPrefStore::OnTempFileOpened, AsWeakPtr()));
|
| +}
|
| +
|
| +void FilesystemJsonPrefStore::OnTempFileOpened(FileError err) {
|
| + // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the
|
| + // file can never fail.
|
| + CHECK_EQ(FileError::OK, err);
|
| +
|
| // Calculate what we want to write, and then write to the temporary file.
|
| pending_lossy_write_ = false;
|
|
|
| @@ -356,29 +367,50 @@
|
| serializer.set_pretty_print(false);
|
| serializer.Serialize(*prefs_);
|
|
|
| - directory_->WriteFile(
|
| - "tmp",
|
| - mojo::Array<uint8_t>::From(output),
|
| + temporary_file_->Write(
|
| + mojo::Array<uint8_t>::From(output), 0, Whence::FROM_CURRENT,
|
| Bind(&FilesystemJsonPrefStore::OnTempFileWrite, AsWeakPtr()));
|
| }
|
|
|
| -void FilesystemJsonPrefStore::OnTempFileWrite(FileError err) {
|
| +void FilesystemJsonPrefStore::OnTempFileWrite(FileError err,
|
| + uint32_t num_bytes_written) {
|
| // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the
|
| // file can never fail.
|
| CHECK_EQ(FileError::OK, err);
|
|
|
| + // Now that we've written the file, close it.
|
| + temporary_file_->Close(
|
| + Bind(&FilesystemJsonPrefStore::OnTempFileClosed, AsWeakPtr()));
|
| +}
|
| +
|
| +void FilesystemJsonPrefStore::OnTempFileClosed(FileError err) {
|
| + // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the
|
| + // file can never fail.
|
| + CHECK_EQ(FileError::OK, err);
|
| +
|
| + temporary_file_.reset();
|
| directory_->Rename(
|
| "tmp", path_,
|
| Bind(&FilesystemJsonPrefStore::OnTempFileRenamed, AsWeakPtr()));
|
| }
|
|
|
| -void FilesystemJsonPrefStore::OnTempFileRenamed(FileError err) {
|
| -}
|
| +void FilesystemJsonPrefStore::OnTempFileRenamed(FileError err) {}
|
|
|
| void FilesystemJsonPrefStore::OnPreferencesReadStart() {
|
| - directory_->ReadEntireFile(
|
| - path_,
|
| - Bind(&FilesystemJsonPrefStore::OnPreferencesFileRead, AsWeakPtr()));
|
| + // TODO(erg): implement me.
|
| + directory_->OpenFile(
|
| + path_, GetProxy(&preferences_file_), kFlagRead | kFlagOpen,
|
| + Bind(&FilesystemJsonPrefStore::OnPreferencesFileOpened, AsWeakPtr()));
|
| +}
|
| +
|
| +void FilesystemJsonPrefStore::OnPreferencesFileOpened(FileError err) {
|
| + // TODO(erg): Error handling.
|
| + if (err == FileError::OK) {
|
| + preferences_file_->ReadEntireFile(
|
| + Bind(&FilesystemJsonPrefStore::OnPreferencesFileRead, AsWeakPtr()));
|
| + } else {
|
| + OnPreferencesFileRead(err, mojo::Array<uint8_t>());
|
| + }
|
| }
|
|
|
| void FilesystemJsonPrefStore::OnPreferencesFileRead(
|
| @@ -388,13 +420,12 @@
|
| new FilesystemJsonPrefStore::ReadResult);
|
| // TODO(erg): Needs even better error handling.
|
| switch (err) {
|
| + case FileError::IN_USE:
|
| + case FileError::ACCESS_DENIED: {
|
| + read_only_ = true;
|
| + break;
|
| + }
|
| case FileError::FAILED:
|
| - case FileError::IN_USE:
|
| - case FileError::ACCESS_DENIED:
|
| - case FileError::NOT_A_FILE: {
|
| - read_only_ = true;
|
| - break;
|
| - }
|
| case FileError::NOT_FOUND: {
|
| // If the file just doesn't exist, maybe this is the first run. Just
|
| // don't pass a value.
|
| @@ -411,6 +442,8 @@
|
| }
|
| }
|
|
|
| + preferences_file_.reset();
|
| +
|
| OnFileRead(std::move(read_result));
|
| }
|
|
|
|
|