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 |