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)); |
} |