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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 PersistentPrefStore::PrefReadError HandleReadErrors(const base::Value* value) { | 50 PersistentPrefStore::PrefReadError HandleReadErrors(const base::Value* value) { |
51 if (!value->IsType(base::Value::TYPE_DICTIONARY)) | 51 if (!value->IsType(base::Value::TYPE_DICTIONARY)) |
52 return PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE; | 52 return PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE; |
53 return PersistentPrefStore::PREF_READ_ERROR_NONE; | 53 return PersistentPrefStore::PREF_READ_ERROR_NONE; |
54 } | 54 } |
55 | 55 |
56 } // namespace | 56 } // namespace |
57 | 57 |
58 FilesystemJsonPrefStore::FilesystemJsonPrefStore( | 58 FilesystemJsonPrefStore::FilesystemJsonPrefStore( |
59 const std::string& pref_filename, | 59 const std::string& pref_filename, |
60 filesystem::FileSystemPtr filesystem, | 60 filesystem::mojom::FileSystemPtr filesystem, |
61 std::unique_ptr<PrefFilter> pref_filter) | 61 std::unique_ptr<PrefFilter> pref_filter) |
62 : path_(pref_filename), | 62 : path_(pref_filename), |
63 binding_(this), | 63 binding_(this), |
64 filesystem_(std::move(filesystem)), | 64 filesystem_(std::move(filesystem)), |
65 prefs_(new base::DictionaryValue()), | 65 prefs_(new base::DictionaryValue()), |
66 read_only_(false), | 66 read_only_(false), |
67 pref_filter_(std::move(pref_filter)), | 67 pref_filter_(std::move(pref_filter)), |
68 initialized_(false), | 68 initialized_(false), |
69 filtering_in_progress_(false), | 69 filtering_in_progress_(false), |
70 pending_lossy_write_(false), | 70 pending_lossy_write_(false), |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 void FilesystemJsonPrefStore::PerformWrite() { | 327 void FilesystemJsonPrefStore::PerformWrite() { |
328 if (!directory_) { | 328 if (!directory_) { |
329 OpenFilesystem( | 329 OpenFilesystem( |
330 Bind(&FilesystemJsonPrefStore::OnTempFileWriteStart, AsWeakPtr())); | 330 Bind(&FilesystemJsonPrefStore::OnTempFileWriteStart, AsWeakPtr())); |
331 } else { | 331 } else { |
332 OnTempFileWriteStart(); | 332 OnTempFileWriteStart(); |
333 } | 333 } |
334 } | 334 } |
335 | 335 |
336 void FilesystemJsonPrefStore::OpenFilesystem(base::Closure callback) { | 336 void FilesystemJsonPrefStore::OpenFilesystem(base::Closure callback) { |
337 filesystem::FileSystemClientPtr client; | 337 filesystem::mojom::FileSystemClientPtr client; |
338 binding_.Bind(GetProxy(&client)); | 338 binding_.Bind(GetProxy(&client)); |
339 | 339 |
340 filesystem_->OpenFileSystem( | 340 filesystem_->OpenFileSystem( |
341 "origin", GetProxy(&directory_), std::move(client), | 341 "origin", GetProxy(&directory_), std::move(client), |
342 base::Bind(&FilesystemJsonPrefStore::OnOpenFilesystem, AsWeakPtr(), | 342 base::Bind(&FilesystemJsonPrefStore::OnOpenFilesystem, AsWeakPtr(), |
343 callback)); | 343 callback)); |
344 } | 344 } |
345 | 345 |
346 void FilesystemJsonPrefStore::OnOpenFilesystem(base::Closure callback, | 346 void FilesystemJsonPrefStore::OnOpenFilesystem(base::Closure callback, |
347 FileError err) { | 347 mojom::FileError err) { |
348 if (err != FileError::OK) { | 348 if (err != mojom::FileError::OK) { |
349 // Do real error checking. | 349 // Do real error checking. |
350 NOTIMPLEMENTED(); | 350 NOTIMPLEMENTED(); |
351 return; | 351 return; |
352 } | 352 } |
353 | 353 |
354 callback.Run(); | 354 callback.Run(); |
355 } | 355 } |
356 | 356 |
357 void FilesystemJsonPrefStore::OnTempFileWriteStart() { | 357 void FilesystemJsonPrefStore::OnTempFileWriteStart() { |
358 // Calculate what we want to write, and then write to the temporary file. | 358 // Calculate what we want to write, and then write to the temporary file. |
359 pending_lossy_write_ = false; | 359 pending_lossy_write_ = false; |
360 | 360 |
361 if (pref_filter_) | 361 if (pref_filter_) |
362 pref_filter_->FilterSerializeData(prefs_.get()); | 362 pref_filter_->FilterSerializeData(prefs_.get()); |
363 | 363 |
364 std::string output; | 364 std::string output; |
365 JSONStringValueSerializer serializer(&output); | 365 JSONStringValueSerializer serializer(&output); |
366 serializer.set_pretty_print(false); | 366 serializer.set_pretty_print(false); |
367 serializer.Serialize(*prefs_); | 367 serializer.Serialize(*prefs_); |
368 | 368 |
369 directory_->WriteFile( | 369 directory_->WriteFile( |
370 "tmp", | 370 "tmp", |
371 mojo::Array<uint8_t>::From(output), | 371 mojo::Array<uint8_t>::From(output), |
372 Bind(&FilesystemJsonPrefStore::OnTempFileWrite, AsWeakPtr())); | 372 Bind(&FilesystemJsonPrefStore::OnTempFileWrite, AsWeakPtr())); |
373 } | 373 } |
374 | 374 |
375 void FilesystemJsonPrefStore::OnTempFileWrite(FileError err) { | 375 void FilesystemJsonPrefStore::OnTempFileWrite(mojom::FileError err) { |
376 // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the | 376 // TODO(erg): Error handling. The JsonPrefStore code assumes that writing the |
377 // file can never fail. | 377 // file can never fail. |
378 CHECK_EQ(FileError::OK, err); | 378 CHECK_EQ(mojom::FileError::OK, err); |
379 | 379 |
380 directory_->Rename( | 380 directory_->Rename( |
381 "tmp", path_, | 381 "tmp", path_, |
382 Bind(&FilesystemJsonPrefStore::OnTempFileRenamed, AsWeakPtr())); | 382 Bind(&FilesystemJsonPrefStore::OnTempFileRenamed, AsWeakPtr())); |
383 } | 383 } |
384 | 384 |
385 void FilesystemJsonPrefStore::OnTempFileRenamed(FileError err) { | 385 void FilesystemJsonPrefStore::OnTempFileRenamed(mojom::FileError err) {} |
386 } | |
387 | 386 |
388 void FilesystemJsonPrefStore::OnPreferencesReadStart() { | 387 void FilesystemJsonPrefStore::OnPreferencesReadStart() { |
389 directory_->ReadEntireFile( | 388 directory_->ReadEntireFile( |
390 path_, | 389 path_, |
391 Bind(&FilesystemJsonPrefStore::OnPreferencesFileRead, AsWeakPtr())); | 390 Bind(&FilesystemJsonPrefStore::OnPreferencesFileRead, AsWeakPtr())); |
392 } | 391 } |
393 | 392 |
394 void FilesystemJsonPrefStore::OnPreferencesFileRead( | 393 void FilesystemJsonPrefStore::OnPreferencesFileRead( |
395 FileError err, | 394 mojom::FileError err, |
396 mojo::Array<uint8_t> contents) { | 395 mojo::Array<uint8_t> contents) { |
397 std::unique_ptr<FilesystemJsonPrefStore::ReadResult> read_result( | 396 std::unique_ptr<FilesystemJsonPrefStore::ReadResult> read_result( |
398 new FilesystemJsonPrefStore::ReadResult); | 397 new FilesystemJsonPrefStore::ReadResult); |
399 // TODO(erg): Needs even better error handling. | 398 // TODO(erg): Needs even better error handling. |
400 switch (err) { | 399 switch (err) { |
401 case FileError::IN_USE: | 400 case mojom::FileError::IN_USE: |
402 case FileError::ACCESS_DENIED: | 401 case mojom::FileError::ACCESS_DENIED: |
403 case FileError::NOT_A_FILE: { | 402 case mojom::FileError::NOT_A_FILE: { |
404 read_only_ = true; | 403 read_only_ = true; |
405 break; | 404 break; |
406 } | 405 } |
407 case FileError::FAILED: | 406 case mojom::FileError::FAILED: |
408 case FileError::NOT_FOUND: { | 407 case mojom::FileError::NOT_FOUND: { |
409 // If the file just doesn't exist, maybe this is the first run. Just | 408 // If the file just doesn't exist, maybe this is the first run. Just |
410 // don't pass a value. | 409 // don't pass a value. |
411 read_result->error = PREF_READ_ERROR_NO_FILE; | 410 read_result->error = PREF_READ_ERROR_NO_FILE; |
412 break; | 411 break; |
413 } | 412 } |
414 default: { | 413 default: { |
415 int error_code; | 414 int error_code; |
416 std::string error_msg; | 415 std::string error_msg; |
417 JSONStringValueDeserializer deserializer(base::StringPiece( | 416 JSONStringValueDeserializer deserializer(base::StringPiece( |
418 reinterpret_cast<char*>(&contents.front()), contents.size())); | 417 reinterpret_cast<char*>(&contents.front()), contents.size())); |
419 read_result->value = deserializer.Deserialize(&error_code, &error_msg); | 418 read_result->value = deserializer.Deserialize(&error_code, &error_msg); |
420 read_result->error = HandleReadErrors(read_result->value.get()); | 419 read_result->error = HandleReadErrors(read_result->value.get()); |
421 } | 420 } |
422 } | 421 } |
423 | 422 |
424 OnFileRead(std::move(read_result)); | 423 OnFileRead(std::move(read_result)); |
425 } | 424 } |
426 | 425 |
427 } // namespace filesystem | 426 } // namespace filesystem |
OLD | NEW |