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 "storage/browser/fileapi/obfuscated_file_util.h" | 5 #include "storage/browser/fileapi/obfuscated_file_util.h" |
6 | 6 |
7 #include <queue> | 7 #include <queue> |
8 | 8 |
9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 return false; | 81 return false; |
82 context->set_allowed_bytes_growth(new_quota); | 82 context->set_allowed_bytes_growth(new_quota); |
83 return true; | 83 return true; |
84 } | 84 } |
85 | 85 |
86 void UpdateUsage( | 86 void UpdateUsage( |
87 FileSystemOperationContext* context, | 87 FileSystemOperationContext* context, |
88 const FileSystemURL& url, | 88 const FileSystemURL& url, |
89 int64 growth) { | 89 int64 growth) { |
90 context->update_observers()->Notify( | 90 context->update_observers()->Notify( |
91 &FileUpdateObserver::OnUpdate, MakeTuple(url, growth)); | 91 &FileUpdateObserver::OnUpdate, base::MakeTuple(url, growth)); |
92 } | 92 } |
93 | 93 |
94 void TouchDirectory(SandboxDirectoryDatabase* db, FileId dir_id) { | 94 void TouchDirectory(SandboxDirectoryDatabase* db, FileId dir_id) { |
95 DCHECK(db); | 95 DCHECK(db); |
96 if (!db->UpdateModificationTime(dir_id, base::Time::Now())) | 96 if (!db->UpdateModificationTime(dir_id, base::Time::Now())) |
97 NOTREACHED(); | 97 NOTREACHED(); |
98 } | 98 } |
99 | 99 |
100 enum IsolatedOriginStatus { | 100 enum IsolatedOriginStatus { |
101 kIsolatedOriginMatch, | 101 kIsolatedOriginMatch, |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 | 312 |
313 int64 growth = UsageForPath(file_info.name.size()); | 313 int64 growth = UsageForPath(file_info.name.size()); |
314 if (!AllocateQuota(context, growth)) | 314 if (!AllocateQuota(context, growth)) |
315 return base::File::FILE_ERROR_NO_SPACE; | 315 return base::File::FILE_ERROR_NO_SPACE; |
316 base::File::Error error = CreateFile(context, base::FilePath(), url, | 316 base::File::Error error = CreateFile(context, base::FilePath(), url, |
317 &file_info); | 317 &file_info); |
318 if (created && base::File::FILE_OK == error) { | 318 if (created && base::File::FILE_OK == error) { |
319 *created = true; | 319 *created = true; |
320 UpdateUsage(context, url, growth); | 320 UpdateUsage(context, url, growth); |
321 context->change_observers()->Notify( | 321 context->change_observers()->Notify( |
322 &FileChangeObserver::OnCreateFile, MakeTuple(url)); | 322 &FileChangeObserver::OnCreateFile, base::MakeTuple(url)); |
323 } | 323 } |
324 return error; | 324 return error; |
325 } | 325 } |
326 | 326 |
327 base::File::Error ObfuscatedFileUtil::CreateDirectory( | 327 base::File::Error ObfuscatedFileUtil::CreateDirectory( |
328 FileSystemOperationContext* context, | 328 FileSystemOperationContext* context, |
329 const FileSystemURL& url, | 329 const FileSystemURL& url, |
330 bool exclusive, | 330 bool exclusive, |
331 bool recursive) { | 331 bool recursive) { |
332 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); | 332 SandboxDirectoryDatabase* db = GetDirectoryDatabase(url, true); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 file_info.modification_time = base::Time::Now(); | 371 file_info.modification_time = base::Time::Now(); |
372 file_info.parent_id = parent_id; | 372 file_info.parent_id = parent_id; |
373 int64 growth = UsageForPath(file_info.name.size()); | 373 int64 growth = UsageForPath(file_info.name.size()); |
374 if (!AllocateQuota(context, growth)) | 374 if (!AllocateQuota(context, growth)) |
375 return base::File::FILE_ERROR_NO_SPACE; | 375 return base::File::FILE_ERROR_NO_SPACE; |
376 base::File::Error error = db->AddFileInfo(file_info, &parent_id); | 376 base::File::Error error = db->AddFileInfo(file_info, &parent_id); |
377 if (error != base::File::FILE_OK) | 377 if (error != base::File::FILE_OK) |
378 return error; | 378 return error; |
379 UpdateUsage(context, url, growth); | 379 UpdateUsage(context, url, growth); |
380 context->change_observers()->Notify( | 380 context->change_observers()->Notify( |
381 &FileChangeObserver::OnCreateDirectory, MakeTuple(url)); | 381 &FileChangeObserver::OnCreateDirectory, base::MakeTuple(url)); |
382 if (first) { | 382 if (first) { |
383 first = false; | 383 first = false; |
384 TouchDirectory(db, file_info.parent_id); | 384 TouchDirectory(db, file_info.parent_id); |
385 } | 385 } |
386 } | 386 } |
387 return base::File::FILE_OK; | 387 return base::File::FILE_OK; |
388 } | 388 } |
389 | 389 |
390 base::File::Error ObfuscatedFileUtil::GetFileInfo( | 390 base::File::Error ObfuscatedFileUtil::GetFileInfo( |
391 FileSystemOperationContext* context, | 391 FileSystemOperationContext* context, |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 if (error != base::File::FILE_OK) | 472 if (error != base::File::FILE_OK) |
473 return error; | 473 return error; |
474 | 474 |
475 int64 growth = length - file_info.size; | 475 int64 growth = length - file_info.size; |
476 if (!AllocateQuota(context, growth)) | 476 if (!AllocateQuota(context, growth)) |
477 return base::File::FILE_ERROR_NO_SPACE; | 477 return base::File::FILE_ERROR_NO_SPACE; |
478 error = NativeFileUtil::Truncate(local_path, length); | 478 error = NativeFileUtil::Truncate(local_path, length); |
479 if (error == base::File::FILE_OK) { | 479 if (error == base::File::FILE_OK) { |
480 UpdateUsage(context, url, growth); | 480 UpdateUsage(context, url, growth); |
481 context->change_observers()->Notify( | 481 context->change_observers()->Notify( |
482 &FileChangeObserver::OnModifyFile, MakeTuple(url)); | 482 &FileChangeObserver::OnModifyFile, base::MakeTuple(url)); |
483 } | 483 } |
484 return error; | 484 return error; |
485 } | 485 } |
486 | 486 |
487 base::File::Error ObfuscatedFileUtil::CopyOrMoveFile( | 487 base::File::Error ObfuscatedFileUtil::CopyOrMoveFile( |
488 FileSystemOperationContext* context, | 488 FileSystemOperationContext* context, |
489 const FileSystemURL& src_url, | 489 const FileSystemURL& src_url, |
490 const FileSystemURL& dest_url, | 490 const FileSystemURL& dest_url, |
491 CopyOrMoveOption option, | 491 CopyOrMoveOption option, |
492 bool copy) { | 492 bool copy) { |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
599 error = base::File::FILE_ERROR_FAILED; | 599 error = base::File::FILE_ERROR_FAILED; |
600 } | 600 } |
601 } | 601 } |
602 | 602 |
603 if (error != base::File::FILE_OK) | 603 if (error != base::File::FILE_OK) |
604 return error; | 604 return error; |
605 | 605 |
606 if (overwrite) { | 606 if (overwrite) { |
607 context->change_observers()->Notify( | 607 context->change_observers()->Notify( |
608 &FileChangeObserver::OnModifyFile, | 608 &FileChangeObserver::OnModifyFile, |
609 MakeTuple(dest_url)); | 609 base::MakeTuple(dest_url)); |
610 } else { | 610 } else { |
611 context->change_observers()->Notify( | 611 context->change_observers()->Notify( |
612 &FileChangeObserver::OnCreateFileFrom, | 612 &FileChangeObserver::OnCreateFileFrom, |
613 MakeTuple(dest_url, src_url)); | 613 base::MakeTuple(dest_url, src_url)); |
614 } | 614 } |
615 | 615 |
616 if (!copy) { | 616 if (!copy) { |
617 context->change_observers()->Notify( | 617 context->change_observers()->Notify( |
618 &FileChangeObserver::OnRemoveFile, MakeTuple(src_url)); | 618 &FileChangeObserver::OnRemoveFile, base::MakeTuple(src_url)); |
619 TouchDirectory(db, src_file_info.parent_id); | 619 TouchDirectory(db, src_file_info.parent_id); |
620 } | 620 } |
621 | 621 |
622 TouchDirectory(db, dest_file_info.parent_id); | 622 TouchDirectory(db, dest_file_info.parent_id); |
623 | 623 |
624 UpdateUsage(context, dest_url, growth); | 624 UpdateUsage(context, dest_url, growth); |
625 return error; | 625 return error; |
626 } | 626 } |
627 | 627 |
628 base::File::Error ObfuscatedFileUtil::CopyInForeignFile( | 628 base::File::Error ObfuscatedFileUtil::CopyInForeignFile( |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 true /* copy */)); | 687 true /* copy */)); |
688 } else { | 688 } else { |
689 error = CreateFile(context, src_file_path, dest_url, &dest_file_info); | 689 error = CreateFile(context, src_file_path, dest_url, &dest_file_info); |
690 } | 690 } |
691 | 691 |
692 if (error != base::File::FILE_OK) | 692 if (error != base::File::FILE_OK) |
693 return error; | 693 return error; |
694 | 694 |
695 if (overwrite) { | 695 if (overwrite) { |
696 context->change_observers()->Notify( | 696 context->change_observers()->Notify( |
697 &FileChangeObserver::OnModifyFile, MakeTuple(dest_url)); | 697 &FileChangeObserver::OnModifyFile, base::MakeTuple(dest_url)); |
698 } else { | 698 } else { |
699 context->change_observers()->Notify( | 699 context->change_observers()->Notify( |
700 &FileChangeObserver::OnCreateFile, MakeTuple(dest_url)); | 700 &FileChangeObserver::OnCreateFile, base::MakeTuple(dest_url)); |
701 } | 701 } |
702 | 702 |
703 UpdateUsage(context, dest_url, growth); | 703 UpdateUsage(context, dest_url, growth); |
704 TouchDirectory(db, dest_file_info.parent_id); | 704 TouchDirectory(db, dest_file_info.parent_id); |
705 return base::File::FILE_OK; | 705 return base::File::FILE_OK; |
706 } | 706 } |
707 | 707 |
708 base::File::Error ObfuscatedFileUtil::DeleteFile( | 708 base::File::Error ObfuscatedFileUtil::DeleteFile( |
709 FileSystemOperationContext* context, | 709 FileSystemOperationContext* context, |
710 const FileSystemURL& url) { | 710 const FileSystemURL& url) { |
(...skipping 19 matching lines...) Expand all Loading... |
730 int64 growth = -UsageForPath(file_info.name.size()) - platform_file_info.size; | 730 int64 growth = -UsageForPath(file_info.name.size()) - platform_file_info.size; |
731 AllocateQuota(context, growth); | 731 AllocateQuota(context, growth); |
732 if (!db->RemoveFileInfo(file_id)) { | 732 if (!db->RemoveFileInfo(file_id)) { |
733 NOTREACHED(); | 733 NOTREACHED(); |
734 return base::File::FILE_ERROR_FAILED; | 734 return base::File::FILE_ERROR_FAILED; |
735 } | 735 } |
736 UpdateUsage(context, url, growth); | 736 UpdateUsage(context, url, growth); |
737 TouchDirectory(db, file_info.parent_id); | 737 TouchDirectory(db, file_info.parent_id); |
738 | 738 |
739 context->change_observers()->Notify( | 739 context->change_observers()->Notify( |
740 &FileChangeObserver::OnRemoveFile, MakeTuple(url)); | 740 &FileChangeObserver::OnRemoveFile, base::MakeTuple(url)); |
741 | 741 |
742 if (error == base::File::FILE_ERROR_NOT_FOUND) | 742 if (error == base::File::FILE_ERROR_NOT_FOUND) |
743 return base::File::FILE_OK; | 743 return base::File::FILE_OK; |
744 | 744 |
745 error = NativeFileUtil::DeleteFile(local_path); | 745 error = NativeFileUtil::DeleteFile(local_path); |
746 if (base::File::FILE_OK != error) | 746 if (base::File::FILE_OK != error) |
747 LOG(WARNING) << "Leaked a backing file."; | 747 LOG(WARNING) << "Leaked a backing file."; |
748 return base::File::FILE_OK; | 748 return base::File::FILE_OK; |
749 } | 749 } |
750 | 750 |
(...skipping 14 matching lines...) Expand all Loading... |
765 } | 765 } |
766 if (!file_info.is_directory()) | 766 if (!file_info.is_directory()) |
767 return base::File::FILE_ERROR_NOT_A_DIRECTORY; | 767 return base::File::FILE_ERROR_NOT_A_DIRECTORY; |
768 if (!db->RemoveFileInfo(file_id)) | 768 if (!db->RemoveFileInfo(file_id)) |
769 return base::File::FILE_ERROR_NOT_EMPTY; | 769 return base::File::FILE_ERROR_NOT_EMPTY; |
770 int64 growth = -UsageForPath(file_info.name.size()); | 770 int64 growth = -UsageForPath(file_info.name.size()); |
771 AllocateQuota(context, growth); | 771 AllocateQuota(context, growth); |
772 UpdateUsage(context, url, growth); | 772 UpdateUsage(context, url, growth); |
773 TouchDirectory(db, file_info.parent_id); | 773 TouchDirectory(db, file_info.parent_id); |
774 context->change_observers()->Notify( | 774 context->change_observers()->Notify( |
775 &FileChangeObserver::OnRemoveDirectory, MakeTuple(url)); | 775 &FileChangeObserver::OnRemoveDirectory, base::MakeTuple(url)); |
776 return base::File::FILE_OK; | 776 return base::File::FILE_OK; |
777 } | 777 } |
778 | 778 |
779 storage::ScopedFile ObfuscatedFileUtil::CreateSnapshotFile( | 779 storage::ScopedFile ObfuscatedFileUtil::CreateSnapshotFile( |
780 FileSystemOperationContext* context, | 780 FileSystemOperationContext* context, |
781 const FileSystemURL& url, | 781 const FileSystemURL& url, |
782 base::File::Error* error, | 782 base::File::Error* error, |
783 base::File::Info* file_info, | 783 base::File::Info* file_info, |
784 base::FilePath* platform_path) { | 784 base::FilePath* platform_path) { |
785 // We're just returning the local file information. | 785 // We're just returning the local file information. |
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1359 InitFileInfo(&file_info, parent_id, | 1359 InitFileInfo(&file_info, parent_id, |
1360 VirtualPath::BaseName(url.path()).value()); | 1360 VirtualPath::BaseName(url.path()).value()); |
1361 | 1361 |
1362 int64 growth = UsageForPath(file_info.name.size()); | 1362 int64 growth = UsageForPath(file_info.name.size()); |
1363 if (!AllocateQuota(context, growth)) | 1363 if (!AllocateQuota(context, growth)) |
1364 return base::File(base::File::FILE_ERROR_NO_SPACE); | 1364 return base::File(base::File::FILE_ERROR_NO_SPACE); |
1365 base::File file = CreateAndOpenFile(context, url, &file_info, file_flags); | 1365 base::File file = CreateAndOpenFile(context, url, &file_info, file_flags); |
1366 if (file.IsValid()) { | 1366 if (file.IsValid()) { |
1367 UpdateUsage(context, url, growth); | 1367 UpdateUsage(context, url, growth); |
1368 context->change_observers()->Notify( | 1368 context->change_observers()->Notify( |
1369 &FileChangeObserver::OnCreateFile, MakeTuple(url)); | 1369 &FileChangeObserver::OnCreateFile, base::MakeTuple(url)); |
1370 } | 1370 } |
1371 return file.Pass(); | 1371 return file.Pass(); |
1372 } | 1372 } |
1373 | 1373 |
1374 if (file_flags & base::File::FLAG_CREATE) | 1374 if (file_flags & base::File::FLAG_CREATE) |
1375 return base::File(base::File::FILE_ERROR_EXISTS); | 1375 return base::File(base::File::FILE_ERROR_EXISTS); |
1376 | 1376 |
1377 base::File::Info platform_file_info; | 1377 base::File::Info platform_file_info; |
1378 base::FilePath local_path; | 1378 base::FilePath local_path; |
1379 FileInfo file_info; | 1379 FileInfo file_info; |
(...skipping 22 matching lines...) Expand all Loading... |
1402 LOG(WARNING) << "Lost a backing file."; | 1402 LOG(WARNING) << "Lost a backing file."; |
1403 return base::File(base::File::FILE_ERROR_FAILED); | 1403 return base::File(base::File::FILE_ERROR_FAILED); |
1404 } | 1404 } |
1405 return file.Pass(); | 1405 return file.Pass(); |
1406 } | 1406 } |
1407 | 1407 |
1408 // If truncating we need to update the usage. | 1408 // If truncating we need to update the usage. |
1409 if (delta) { | 1409 if (delta) { |
1410 UpdateUsage(context, url, delta); | 1410 UpdateUsage(context, url, delta); |
1411 context->change_observers()->Notify( | 1411 context->change_observers()->Notify( |
1412 &FileChangeObserver::OnModifyFile, MakeTuple(url)); | 1412 &FileChangeObserver::OnModifyFile, base::MakeTuple(url)); |
1413 } | 1413 } |
1414 return file.Pass(); | 1414 return file.Pass(); |
1415 } | 1415 } |
1416 | 1416 |
1417 bool ObfuscatedFileUtil::HasIsolatedStorage(const GURL& origin) { | 1417 bool ObfuscatedFileUtil::HasIsolatedStorage(const GURL& origin) { |
1418 return special_storage_policy_.get() && | 1418 return special_storage_policy_.get() && |
1419 special_storage_policy_->HasIsolatedStorage(origin); | 1419 special_storage_policy_->HasIsolatedStorage(origin); |
1420 } | 1420 } |
1421 | 1421 |
1422 } // namespace storage | 1422 } // namespace storage |
OLD | NEW |