| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/filesystem/public/cpp/prefs/filesystem_json_pref_store.h" | 5 #include "components/filesystem/public/cpp/prefs/filesystem_json_pref_store.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 if (err != FileError::OK) { | 338 if (err != FileError::OK) { |
| 339 // Do real error checking. | 339 // Do real error checking. |
| 340 NOTIMPLEMENTED(); | 340 NOTIMPLEMENTED(); |
| 341 return; | 341 return; |
| 342 } | 342 } |
| 343 | 343 |
| 344 callback.Run(); | 344 callback.Run(); |
| 345 } | 345 } |
| 346 | 346 |
| 347 void FilesystemJsonPrefStore::OnTempFileWriteStart() { | 347 void FilesystemJsonPrefStore::OnTempFileWriteStart() { |
| 348 // Open up a temporary file and truncate it. |
| 349 directory_->OpenFile( |
| 350 "tmp", GetProxy(&temporary_file_), kFlagWrite | kFlagCreate, |
| 351 Bind(&FilesystemJsonPrefStore::OnTempFileOpened, AsWeakPtr())); |
| 352 } |
| 353 |
| 354 void FilesystemJsonPrefStore::OnTempFileOpened(FileError err) { |
| 355 // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the |
| 356 // file can never fail. |
| 357 CHECK_EQ(FileError::OK, err); |
| 358 |
| 348 // Calculate what we want to write, and then write to the temporary file. | 359 // Calculate what we want to write, and then write to the temporary file. |
| 349 pending_lossy_write_ = false; | 360 pending_lossy_write_ = false; |
| 350 | 361 |
| 351 if (pref_filter_) | 362 if (pref_filter_) |
| 352 pref_filter_->FilterSerializeData(prefs_.get()); | 363 pref_filter_->FilterSerializeData(prefs_.get()); |
| 353 | 364 |
| 354 std::string output; | 365 std::string output; |
| 355 JSONStringValueSerializer serializer(&output); | 366 JSONStringValueSerializer serializer(&output); |
| 356 serializer.set_pretty_print(false); | 367 serializer.set_pretty_print(false); |
| 357 serializer.Serialize(*prefs_); | 368 serializer.Serialize(*prefs_); |
| 358 | 369 |
| 359 directory_->WriteFile( | 370 temporary_file_->Write( |
| 360 "tmp", | 371 mojo::Array<uint8_t>::From(output), 0, Whence::FROM_CURRENT, |
| 361 mojo::Array<uint8_t>::From(output), | |
| 362 Bind(&FilesystemJsonPrefStore::OnTempFileWrite, AsWeakPtr())); | 372 Bind(&FilesystemJsonPrefStore::OnTempFileWrite, AsWeakPtr())); |
| 363 } | 373 } |
| 364 | 374 |
| 365 void FilesystemJsonPrefStore::OnTempFileWrite(FileError err) { | 375 void FilesystemJsonPrefStore::OnTempFileWrite(FileError err, |
| 376 uint32_t num_bytes_written) { |
| 366 // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the | 377 // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the |
| 367 // file can never fail. | 378 // file can never fail. |
| 368 CHECK_EQ(FileError::OK, err); | 379 CHECK_EQ(FileError::OK, err); |
| 369 | 380 |
| 381 // Now that we've written the file, close it. |
| 382 temporary_file_->Close( |
| 383 Bind(&FilesystemJsonPrefStore::OnTempFileClosed, AsWeakPtr())); |
| 384 } |
| 385 |
| 386 void FilesystemJsonPrefStore::OnTempFileClosed(FileError err) { |
| 387 // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the |
| 388 // file can never fail. |
| 389 CHECK_EQ(FileError::OK, err); |
| 390 |
| 391 temporary_file_.reset(); |
| 370 directory_->Rename( | 392 directory_->Rename( |
| 371 "tmp", path_, | 393 "tmp", path_, |
| 372 Bind(&FilesystemJsonPrefStore::OnTempFileRenamed, AsWeakPtr())); | 394 Bind(&FilesystemJsonPrefStore::OnTempFileRenamed, AsWeakPtr())); |
| 373 } | 395 } |
| 374 | 396 |
| 375 void FilesystemJsonPrefStore::OnTempFileRenamed(FileError err) { | 397 void FilesystemJsonPrefStore::OnTempFileRenamed(FileError err) {} |
| 398 |
| 399 void FilesystemJsonPrefStore::OnPreferencesReadStart() { |
| 400 // TODO(erg): implement me. |
| 401 directory_->OpenFile( |
| 402 path_, GetProxy(&preferences_file_), kFlagRead | kFlagOpen, |
| 403 Bind(&FilesystemJsonPrefStore::OnPreferencesFileOpened, AsWeakPtr())); |
| 376 } | 404 } |
| 377 | 405 |
| 378 void FilesystemJsonPrefStore::OnPreferencesReadStart() { | 406 void FilesystemJsonPrefStore::OnPreferencesFileOpened(FileError err) { |
| 379 directory_->ReadEntireFile( | 407 // TODO(erg): Error handling. |
| 380 path_, | 408 if (err == FileError::OK) { |
| 381 Bind(&FilesystemJsonPrefStore::OnPreferencesFileRead, AsWeakPtr())); | 409 preferences_file_->ReadEntireFile( |
| 410 Bind(&FilesystemJsonPrefStore::OnPreferencesFileRead, AsWeakPtr())); |
| 411 } else { |
| 412 OnPreferencesFileRead(err, mojo::Array<uint8_t>()); |
| 413 } |
| 382 } | 414 } |
| 383 | 415 |
| 384 void FilesystemJsonPrefStore::OnPreferencesFileRead( | 416 void FilesystemJsonPrefStore::OnPreferencesFileRead( |
| 385 FileError err, | 417 FileError err, |
| 386 mojo::Array<uint8_t> contents) { | 418 mojo::Array<uint8_t> contents) { |
| 387 scoped_ptr<FilesystemJsonPrefStore::ReadResult> read_result( | 419 scoped_ptr<FilesystemJsonPrefStore::ReadResult> read_result( |
| 388 new FilesystemJsonPrefStore::ReadResult); | 420 new FilesystemJsonPrefStore::ReadResult); |
| 389 // TODO(erg): Needs even better error handling. | 421 // TODO(erg): Needs even better error handling. |
| 390 switch (err) { | 422 switch (err) { |
| 391 case FileError::FAILED: | |
| 392 case FileError::IN_USE: | 423 case FileError::IN_USE: |
| 393 case FileError::ACCESS_DENIED: | 424 case FileError::ACCESS_DENIED: { |
| 394 case FileError::NOT_A_FILE: { | |
| 395 read_only_ = true; | 425 read_only_ = true; |
| 396 break; | 426 break; |
| 397 } | 427 } |
| 428 case FileError::FAILED: |
| 398 case FileError::NOT_FOUND: { | 429 case FileError::NOT_FOUND: { |
| 399 // If the file just doesn't exist, maybe this is the first run. Just | 430 // If the file just doesn't exist, maybe this is the first run. Just |
| 400 // don't pass a value. | 431 // don't pass a value. |
| 401 read_result->error = PREF_READ_ERROR_NO_FILE; | 432 read_result->error = PREF_READ_ERROR_NO_FILE; |
| 402 break; | 433 break; |
| 403 } | 434 } |
| 404 default: { | 435 default: { |
| 405 int error_code; | 436 int error_code; |
| 406 std::string error_msg; | 437 std::string error_msg; |
| 407 JSONStringValueDeserializer deserializer(base::StringPiece( | 438 JSONStringValueDeserializer deserializer(base::StringPiece( |
| 408 reinterpret_cast<char*>(&contents.front()), contents.size())); | 439 reinterpret_cast<char*>(&contents.front()), contents.size())); |
| 409 read_result->value = deserializer.Deserialize(&error_code, &error_msg); | 440 read_result->value = deserializer.Deserialize(&error_code, &error_msg); |
| 410 read_result->error = HandleReadErrors(read_result->value.get()); | 441 read_result->error = HandleReadErrors(read_result->value.get()); |
| 411 } | 442 } |
| 412 } | 443 } |
| 413 | 444 |
| 445 preferences_file_.reset(); |
| 446 |
| 414 OnFileRead(std::move(read_result)); | 447 OnFileRead(std::move(read_result)); |
| 415 } | 448 } |
| 416 | 449 |
| 417 } // namespace filesystem | 450 } // namespace filesystem |
| OLD | NEW |