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 |