Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: components/filesystem/public/cpp/prefs/filesystem_json_pref_store.cc

Issue 1634293002: mojo filesystem: Simplify full file reading/writing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Further cleanup of pref store. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 CHECK_EQ(FileError::OK, err);
sky 2016/01/27 01:08:40 Seems like we shouldn't crash here, but have some
Elliot Glaysher 2016/01/27 01:13:42 There's no real error checking here because there'
sky 2016/01/27 02:48:13 Error checking is different than crashing if there
377 }
398 378
399 void FilesystemJsonPrefStore::OnPreferencesReadStart() { 379 void FilesystemJsonPrefStore::OnPreferencesReadStart() {
400 // TODO(erg): implement me. 380 directory_->ReadEntireFile(
401 directory_->OpenFile( 381 path_,
402 path_, GetProxy(&preferences_file_), kFlagRead | kFlagOpen, 382 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 } 383 }
415 384
416 void FilesystemJsonPrefStore::OnPreferencesFileRead( 385 void FilesystemJsonPrefStore::OnPreferencesFileRead(
417 FileError err, 386 FileError err,
418 mojo::Array<uint8_t> contents) { 387 mojo::Array<uint8_t> contents) {
419 scoped_ptr<FilesystemJsonPrefStore::ReadResult> read_result( 388 scoped_ptr<FilesystemJsonPrefStore::ReadResult> read_result(
420 new FilesystemJsonPrefStore::ReadResult); 389 new FilesystemJsonPrefStore::ReadResult);
421 // TODO(erg): Needs even better error handling. 390 // TODO(erg): Needs even better error handling.
422 switch (err) { 391 switch (err) {
392 case FileError::FAILED:
423 case FileError::IN_USE: 393 case FileError::IN_USE:
424 case FileError::ACCESS_DENIED: { 394 case FileError::ACCESS_DENIED:
395 case FileError::NOT_A_FILE: {
425 read_only_ = true; 396 read_only_ = true;
426 break; 397 break;
427 } 398 }
428 case FileError::FAILED:
429 case FileError::NOT_FOUND: { 399 case FileError::NOT_FOUND: {
430 // If the file just doesn't exist, maybe this is the first run. Just 400 // If the file just doesn't exist, maybe this is the first run. Just
431 // don't pass a value. 401 // don't pass a value.
432 read_result->error = PREF_READ_ERROR_NO_FILE; 402 read_result->error = PREF_READ_ERROR_NO_FILE;
433 break; 403 break;
434 } 404 }
435 default: { 405 default: {
436 int error_code; 406 int error_code;
437 std::string error_msg; 407 std::string error_msg;
438 JSONStringValueDeserializer deserializer(base::StringPiece( 408 JSONStringValueDeserializer deserializer(base::StringPiece(
439 reinterpret_cast<char*>(&contents.front()), contents.size())); 409 reinterpret_cast<char*>(&contents.front()), contents.size()));
440 read_result->value = deserializer.Deserialize(&error_code, &error_msg); 410 read_result->value = deserializer.Deserialize(&error_code, &error_msg);
441 read_result->error = HandleReadErrors(read_result->value.get()); 411 read_result->error = HandleReadErrors(read_result->value.get());
442 } 412 }
443 } 413 }
444 414
445 preferences_file_.reset();
446
447 OnFileRead(std::move(read_result)); 415 OnFileRead(std::move(read_result));
448 } 416 }
449 417
450 } // namespace filesystem 418 } // namespace filesystem
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698