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