| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/sync_file_system/local/local_file_sync_context.h" | 5 #include "chrome/browser/sync_file_system/local/local_file_sync_context.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/platform_file.h" | 10 #include "base/platform_file.h" |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 void LocalFileSyncContext::HandleRemoteAddOrUpdate( | 327 void LocalFileSyncContext::HandleRemoteAddOrUpdate( |
| 328 FileSystemContext* file_system_context, | 328 FileSystemContext* file_system_context, |
| 329 const FileChange& change, | 329 const FileChange& change, |
| 330 const base::FilePath& local_path, | 330 const base::FilePath& local_path, |
| 331 const FileSystemURL& url, | 331 const FileSystemURL& url, |
| 332 const SyncStatusCallback& callback) { | 332 const SyncStatusCallback& callback) { |
| 333 FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync( | 333 FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync( |
| 334 file_system_context, url); | 334 file_system_context, url); |
| 335 | 335 |
| 336 if (fileapi::VirtualPath::IsRootPath(url.path())) { | 336 if (fileapi::VirtualPath::IsRootPath(url.path())) { |
| 337 DidApplyRemoteChange(url, callback, base::PLATFORM_FILE_OK); | 337 DidApplyRemoteChange(url, callback, base::File::FILE_OK); |
| 338 return; | 338 return; |
| 339 } | 339 } |
| 340 | 340 |
| 341 file_system_context->operation_runner()->Remove( | 341 file_system_context->operation_runner()->Remove( |
| 342 url_for_sync, true /* recursive */, | 342 url_for_sync, true /* recursive */, |
| 343 base::Bind( | 343 base::Bind( |
| 344 &LocalFileSyncContext::DidRemoveExistingEntryForRemoteAddOrUpdate, | 344 &LocalFileSyncContext::DidRemoveExistingEntryForRemoteAddOrUpdate, |
| 345 this, | 345 this, |
| 346 make_scoped_refptr(file_system_context), | 346 make_scoped_refptr(file_system_context), |
| 347 change, | 347 change, |
| 348 local_path, | 348 local_path, |
| 349 url, | 349 url, |
| 350 callback)); | 350 callback)); |
| 351 } | 351 } |
| 352 | 352 |
| 353 void LocalFileSyncContext::DidRemoveExistingEntryForRemoteAddOrUpdate( | 353 void LocalFileSyncContext::DidRemoveExistingEntryForRemoteAddOrUpdate( |
| 354 FileSystemContext* file_system_context, | 354 FileSystemContext* file_system_context, |
| 355 const FileChange& change, | 355 const FileChange& change, |
| 356 const base::FilePath& local_path, | 356 const base::FilePath& local_path, |
| 357 const FileSystemURL& url, | 357 const FileSystemURL& url, |
| 358 const SyncStatusCallback& callback, | 358 const SyncStatusCallback& callback, |
| 359 base::PlatformFileError error) { | 359 base::File::Error error) { |
| 360 // Remove() may fail if the target entry does not exist (which is ok), | 360 // Remove() may fail if the target entry does not exist (which is ok), |
| 361 // so we ignore |error| here. | 361 // so we ignore |error| here. |
| 362 | 362 |
| 363 if (shutdown_on_io_) { | 363 if (shutdown_on_io_) { |
| 364 callback.Run(SYNC_FILE_ERROR_ABORT); | 364 callback.Run(SYNC_FILE_ERROR_ABORT); |
| 365 return; | 365 return; |
| 366 } | 366 } |
| 367 | 367 |
| 368 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 368 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 369 DCHECK(!sync_status()->IsWritable(url)); | 369 DCHECK(!sync_status()->IsWritable(url)); |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 615 root_delete_helper_.reset(); | 615 root_delete_helper_.reset(); |
| 616 sync_status_.reset(); | 616 sync_status_.reset(); |
| 617 timer_on_io_.reset(); | 617 timer_on_io_.reset(); |
| 618 } | 618 } |
| 619 | 619 |
| 620 void LocalFileSyncContext::InitializeFileSystemContextOnIOThread( | 620 void LocalFileSyncContext::InitializeFileSystemContextOnIOThread( |
| 621 const GURL& source_url, | 621 const GURL& source_url, |
| 622 FileSystemContext* file_system_context, | 622 FileSystemContext* file_system_context, |
| 623 const GURL& /* root */, | 623 const GURL& /* root */, |
| 624 const std::string& /* name */, | 624 const std::string& /* name */, |
| 625 base::PlatformFileError error) { | 625 base::File::Error error) { |
| 626 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 626 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 627 if (shutdown_on_io_) | 627 if (shutdown_on_io_) |
| 628 error = base::PLATFORM_FILE_ERROR_ABORT; | 628 error = base::File::FILE_ERROR_ABORT; |
| 629 if (error != base::PLATFORM_FILE_OK) { | 629 if (error != base::File::FILE_OK) { |
| 630 DidInitialize(source_url, file_system_context, | 630 DidInitialize(source_url, file_system_context, |
| 631 PlatformFileErrorToSyncStatusCode(error)); | 631 FileErrorToSyncStatusCode(error)); |
| 632 return; | 632 return; |
| 633 } | 633 } |
| 634 DCHECK(file_system_context); | 634 DCHECK(file_system_context); |
| 635 SyncFileSystemBackend* backend = | 635 SyncFileSystemBackend* backend = |
| 636 SyncFileSystemBackend::GetBackend(file_system_context); | 636 SyncFileSystemBackend::GetBackend(file_system_context); |
| 637 DCHECK(backend); | 637 DCHECK(backend); |
| 638 if (!backend->change_tracker()) { | 638 if (!backend->change_tracker()) { |
| 639 // Create and initialize LocalFileChangeTracker and call back this method | 639 // Create and initialize LocalFileChangeTracker and call back this method |
| 640 // later again. | 640 // later again. |
| 641 std::set<GURL>* origins_with_changes = new std::set<GURL>; | 641 std::set<GURL>* origins_with_changes = new std::set<GURL>; |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 SyncFileSystemBackend::GetBackend(file_system_context); | 718 SyncFileSystemBackend::GetBackend(file_system_context); |
| 719 DCHECK(backend); | 719 DCHECK(backend); |
| 720 backend->SetLocalFileChangeTracker(tracker_ptr->Pass()); | 720 backend->SetLocalFileChangeTracker(tracker_ptr->Pass()); |
| 721 | 721 |
| 722 origins_with_pending_changes_.insert(origins_with_changes->begin(), | 722 origins_with_pending_changes_.insert(origins_with_changes->begin(), |
| 723 origins_with_changes->end()); | 723 origins_with_changes->end()); |
| 724 ScheduleNotifyChangesUpdatedOnIOThread(); | 724 ScheduleNotifyChangesUpdatedOnIOThread(); |
| 725 | 725 |
| 726 InitializeFileSystemContextOnIOThread(source_url, file_system_context, | 726 InitializeFileSystemContextOnIOThread(source_url, file_system_context, |
| 727 GURL(), std::string(), | 727 GURL(), std::string(), |
| 728 base::PLATFORM_FILE_OK); | 728 base::File::FILE_OK); |
| 729 } | 729 } |
| 730 | 730 |
| 731 void LocalFileSyncContext::DidInitialize( | 731 void LocalFileSyncContext::DidInitialize( |
| 732 const GURL& source_url, | 732 const GURL& source_url, |
| 733 FileSystemContext* file_system_context, | 733 FileSystemContext* file_system_context, |
| 734 SyncStatusCode status) { | 734 SyncStatusCode status) { |
| 735 if (!ui_task_runner_->RunsTasksOnCurrentThread()) { | 735 if (!ui_task_runner_->RunsTasksOnCurrentThread()) { |
| 736 ui_task_runner_->PostTask( | 736 ui_task_runner_->PostTask( |
| 737 FROM_HERE, | 737 FROM_HERE, |
| 738 base::Bind(&LocalFileSyncContext::DidInitialize, | 738 base::Bind(&LocalFileSyncContext::DidInitialize, |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 } | 846 } |
| 847 | 847 |
| 848 SyncFileSystemBackend* backend = | 848 SyncFileSystemBackend* backend = |
| 849 SyncFileSystemBackend::GetBackend(file_system_context); | 849 SyncFileSystemBackend::GetBackend(file_system_context); |
| 850 DCHECK(backend); | 850 DCHECK(backend); |
| 851 DCHECK(backend->change_tracker()); | 851 DCHECK(backend->change_tracker()); |
| 852 FileChangeList changes; | 852 FileChangeList changes; |
| 853 backend->change_tracker()->GetChangesForURL(url, &changes); | 853 backend->change_tracker()->GetChangesForURL(url, &changes); |
| 854 | 854 |
| 855 base::FilePath platform_path; | 855 base::FilePath platform_path; |
| 856 base::PlatformFileInfo file_info; | 856 base::File::Info file_info; |
| 857 FileSystemFileUtil* file_util = | 857 FileSystemFileUtil* file_util = |
| 858 file_system_context->sandbox_delegate()->sync_file_util(); | 858 file_system_context->sandbox_delegate()->sync_file_util(); |
| 859 DCHECK(file_util); | 859 DCHECK(file_util); |
| 860 | 860 |
| 861 base::PlatformFileError file_error = file_util->GetFileInfo( | 861 base::File::Error file_error = file_util->GetFileInfo( |
| 862 make_scoped_ptr( | 862 make_scoped_ptr( |
| 863 new FileSystemOperationContext(file_system_context)).get(), | 863 new FileSystemOperationContext(file_system_context)).get(), |
| 864 url, | 864 url, |
| 865 &file_info, | 865 &file_info, |
| 866 &platform_path); | 866 &platform_path); |
| 867 | 867 |
| 868 webkit_blob::ScopedFile snapshot; | 868 webkit_blob::ScopedFile snapshot; |
| 869 if (file_error == base::PLATFORM_FILE_OK && sync_mode == SYNC_SNAPSHOT) { | 869 if (file_error == base::File::FILE_OK && sync_mode == SYNC_SNAPSHOT) { |
| 870 base::FilePath snapshot_path; | 870 base::FilePath snapshot_path; |
| 871 base::CreateTemporaryFileInDir(local_base_path_.Append(kSnapshotDir), | 871 base::CreateTemporaryFileInDir(local_base_path_.Append(kSnapshotDir), |
| 872 &snapshot_path); | 872 &snapshot_path); |
| 873 if (base::CopyFile(platform_path, snapshot_path)) { | 873 if (base::CopyFile(platform_path, snapshot_path)) { |
| 874 platform_path = snapshot_path; | 874 platform_path = snapshot_path; |
| 875 snapshot = webkit_blob::ScopedFile( | 875 snapshot = webkit_blob::ScopedFile( |
| 876 snapshot_path, | 876 snapshot_path, |
| 877 webkit_blob::ScopedFile::DELETE_ON_SCOPE_OUT, | 877 webkit_blob::ScopedFile::DELETE_ON_SCOPE_OUT, |
| 878 file_system_context->default_file_task_runner()); | 878 file_system_context->default_file_task_runner()); |
| 879 } | 879 } |
| 880 } | 880 } |
| 881 | 881 |
| 882 if (status == SYNC_STATUS_OK && | 882 if (status == SYNC_STATUS_OK && |
| 883 file_error != base::PLATFORM_FILE_OK && | 883 file_error != base::File::FILE_OK && |
| 884 file_error != base::PLATFORM_FILE_ERROR_NOT_FOUND) | 884 file_error != base::File::FILE_ERROR_NOT_FOUND) { |
| 885 status = PlatformFileErrorToSyncStatusCode(file_error); | 885 status = FileErrorToSyncStatusCode(file_error); |
| 886 } |
| 886 | 887 |
| 887 DCHECK(!file_info.is_symbolic_link); | 888 DCHECK(!file_info.is_symbolic_link); |
| 888 | 889 |
| 889 SyncFileType file_type = SYNC_FILE_TYPE_FILE; | 890 SyncFileType file_type = SYNC_FILE_TYPE_FILE; |
| 890 if (file_error == base::PLATFORM_FILE_ERROR_NOT_FOUND) | 891 if (file_error == base::File::FILE_ERROR_NOT_FOUND) |
| 891 file_type = SYNC_FILE_TYPE_UNKNOWN; | 892 file_type = SYNC_FILE_TYPE_UNKNOWN; |
| 892 else if (file_info.is_directory) | 893 else if (file_info.is_directory) |
| 893 file_type = SYNC_FILE_TYPE_DIRECTORY; | 894 file_type = SYNC_FILE_TYPE_DIRECTORY; |
| 894 | 895 |
| 895 LocalFileSyncInfo sync_file_info; | 896 LocalFileSyncInfo sync_file_info; |
| 896 sync_file_info.url = url; | 897 sync_file_info.url = url; |
| 897 sync_file_info.local_file_path = platform_path; | 898 sync_file_info.local_file_path = platform_path; |
| 898 sync_file_info.metadata.file_type = file_type; | 899 sync_file_info.metadata.file_type = file_type; |
| 899 sync_file_info.metadata.size = file_info.size; | 900 sync_file_info.metadata.size = file_info.size; |
| 900 sync_file_info.metadata.last_modified = file_info.last_modified; | 901 sync_file_info.metadata.last_modified = file_info.last_modified; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 return; | 948 return; |
| 948 sync_status()->EndWriting(url); | 949 sync_status()->EndWriting(url); |
| 949 | 950 |
| 950 // Since a sync has finished the number of changes must have been updated. | 951 // Since a sync has finished the number of changes must have been updated. |
| 951 UpdateChangesForOrigin(url.origin()); | 952 UpdateChangesForOrigin(url.origin()); |
| 952 } | 953 } |
| 953 | 954 |
| 954 void LocalFileSyncContext::DidApplyRemoteChange( | 955 void LocalFileSyncContext::DidApplyRemoteChange( |
| 955 const FileSystemURL& url, | 956 const FileSystemURL& url, |
| 956 const SyncStatusCallback& callback_on_ui, | 957 const SyncStatusCallback& callback_on_ui, |
| 957 base::PlatformFileError file_error) { | 958 base::File::Error file_error) { |
| 958 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 959 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 959 root_delete_helper_.reset(); | 960 root_delete_helper_.reset(); |
| 960 ui_task_runner_->PostTask( | 961 ui_task_runner_->PostTask( |
| 961 FROM_HERE, | 962 FROM_HERE, |
| 962 base::Bind(callback_on_ui, | 963 base::Bind(callback_on_ui, FileErrorToSyncStatusCode(file_error))); |
| 963 PlatformFileErrorToSyncStatusCode(file_error))); | |
| 964 } | 964 } |
| 965 | 965 |
| 966 void LocalFileSyncContext::DidGetFileMetadata( | 966 void LocalFileSyncContext::DidGetFileMetadata( |
| 967 const SyncFileMetadataCallback& callback, | 967 const SyncFileMetadataCallback& callback, |
| 968 base::PlatformFileError file_error, | 968 base::File::Error file_error, |
| 969 const base::PlatformFileInfo& file_info) { | 969 const base::File::Info& file_info) { |
| 970 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); | 970 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); |
| 971 SyncFileMetadata metadata; | 971 SyncFileMetadata metadata; |
| 972 if (file_error == base::PLATFORM_FILE_OK) { | 972 if (file_error == base::File::FILE_OK) { |
| 973 metadata.file_type = file_info.is_directory ? | 973 metadata.file_type = file_info.is_directory ? |
| 974 SYNC_FILE_TYPE_DIRECTORY : SYNC_FILE_TYPE_FILE; | 974 SYNC_FILE_TYPE_DIRECTORY : SYNC_FILE_TYPE_FILE; |
| 975 metadata.size = file_info.size; | 975 metadata.size = file_info.size; |
| 976 metadata.last_modified = file_info.last_modified; | 976 metadata.last_modified = file_info.last_modified; |
| 977 } | 977 } |
| 978 ui_task_runner_->PostTask( | 978 ui_task_runner_->PostTask( |
| 979 FROM_HERE, | 979 FROM_HERE, |
| 980 base::Bind(callback, | 980 base::Bind(callback, FileErrorToSyncStatusCode(file_error), metadata)); |
| 981 PlatformFileErrorToSyncStatusCode(file_error), | |
| 982 metadata)); | |
| 983 } | 981 } |
| 984 | 982 |
| 985 base::TimeDelta LocalFileSyncContext::NotifyChangesDuration() { | 983 base::TimeDelta LocalFileSyncContext::NotifyChangesDuration() { |
| 986 if (mock_notify_changes_duration_in_sec_ >= 0) | 984 if (mock_notify_changes_duration_in_sec_ >= 0) |
| 987 return base::TimeDelta::FromSeconds(mock_notify_changes_duration_in_sec_); | 985 return base::TimeDelta::FromSeconds(mock_notify_changes_duration_in_sec_); |
| 988 return base::TimeDelta::FromSeconds(kNotifyChangesDurationInSec); | 986 return base::TimeDelta::FromSeconds(kNotifyChangesDurationInSec); |
| 989 } | 987 } |
| 990 | 988 |
| 991 void LocalFileSyncContext::DidCreateDirectoryForCopyIn( | 989 void LocalFileSyncContext::DidCreateDirectoryForCopyIn( |
| 992 FileSystemContext* file_system_context, | 990 FileSystemContext* file_system_context, |
| 993 const base::FilePath& local_path, | 991 const base::FilePath& local_path, |
| 994 const FileSystemURL& dest_url, | 992 const FileSystemURL& dest_url, |
| 995 const StatusCallback& callback, | 993 const StatusCallback& callback, |
| 996 base::PlatformFileError error) { | 994 base::File::Error error) { |
| 997 if (error != base::PLATFORM_FILE_OK) { | 995 if (error != base::File::FILE_OK) { |
| 998 callback.Run(error); | 996 callback.Run(error); |
| 999 return; | 997 return; |
| 1000 } | 998 } |
| 1001 | 999 |
| 1002 FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync( | 1000 FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync( |
| 1003 file_system_context, dest_url); | 1001 file_system_context, dest_url); |
| 1004 file_system_context->operation_runner()->CopyInForeignFile( | 1002 file_system_context->operation_runner()->CopyInForeignFile( |
| 1005 local_path, url_for_sync, callback); | 1003 local_path, url_for_sync, callback); |
| 1006 } | 1004 } |
| 1007 | 1005 |
| 1008 } // namespace sync_file_system | 1006 } // namespace sync_file_system |
| OLD | NEW |