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