| Index: chrome/browser/chromeos/drive/file_system/update_operation.cc
|
| diff --git a/chrome/browser/chromeos/drive/file_system/update_operation.cc b/chrome/browser/chromeos/drive/file_system/update_operation.cc
|
| index ebd02e18577b11d9f47a10b6cf442ec239a3af80..b8b2cb3ac69ed159fe88f41e2f5e0c104a986011 100644
|
| --- a/chrome/browser/chromeos/drive/file_system/update_operation.cc
|
| +++ b/chrome/browser/chromeos/drive/file_system/update_operation.cc
|
| @@ -18,11 +18,64 @@ using content::BrowserThread;
|
| namespace drive {
|
| namespace file_system {
|
|
|
| -UpdateOperation::UpdateOperation(OperationObserver* observer,
|
| - JobScheduler* scheduler,
|
| - internal::ResourceMetadata* metadata,
|
| - internal::FileCache* cache)
|
| - : observer_(observer),
|
| +namespace {
|
| +
|
| +// Gets locally stored information about the specified file.
|
| +FileError GetFileLocalState(internal::ResourceMetadata* metadata,
|
| + internal::FileCache* cache,
|
| + const std::string& resource_id,
|
| + ResourceEntry* entry,
|
| + base::FilePath* drive_file_path,
|
| + base::FilePath* cache_file_path) {
|
| + FileError error = metadata->GetResourceEntryById(resource_id, NULL, entry);
|
| + if (error != FILE_ERROR_OK)
|
| + return error;
|
| +
|
| + if (entry->file_info().is_directory())
|
| + return FILE_ERROR_NOT_A_FILE;
|
| +
|
| + *drive_file_path = metadata->GetFilePath(resource_id);
|
| + if (drive_file_path->empty())
|
| + return FILE_ERROR_NOT_FOUND;
|
| +
|
| + return cache->GetFile(resource_id,
|
| + entry->file_specific_info().file_md5(),
|
| + cache_file_path);
|
| +}
|
| +
|
| +// Updates locally stored information about the specified file.
|
| +FileError UpdateFileLocalState(
|
| + internal::ResourceMetadata* metadata,
|
| + internal::FileCache* cache,
|
| + scoped_ptr<google_apis::ResourceEntry> resource_entry,
|
| + base::FilePath* drive_file_path) {
|
| + const ResourceEntry& entry = ConvertToResourceEntry(*resource_entry);
|
| + if (entry.resource_id().empty())
|
| + return FILE_ERROR_NOT_A_FILE;
|
| +
|
| + FileError error = metadata->RefreshEntry(entry, NULL, NULL);
|
| + if (error != FILE_ERROR_OK)
|
| + return error;
|
| +
|
| + *drive_file_path = metadata->GetFilePath(entry.resource_id());
|
| + if (drive_file_path->empty())
|
| + return FILE_ERROR_NOT_FOUND;
|
| +
|
| + // Clear the dirty bit if we have updated an existing file.
|
| + return cache->ClearDirty(entry.resource_id(),
|
| + entry.file_specific_info().file_md5());
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +UpdateOperation::UpdateOperation(
|
| + base::SequencedTaskRunner* blocking_task_runner,
|
| + OperationObserver* observer,
|
| + JobScheduler* scheduler,
|
| + internal::ResourceMetadata* metadata,
|
| + internal::FileCache* cache)
|
| + : blocking_task_runner_(blocking_task_runner),
|
| + observer_(observer),
|
| scheduler_(scheduler),
|
| metadata_(metadata),
|
| cache_(cache),
|
| @@ -41,54 +94,35 @@ void UpdateOperation::UpdateFileByResourceId(
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| - metadata_->GetResourceEntryByIdOnUIThread(
|
| - resource_id,
|
| - base::Bind(&UpdateOperation::UpdateFileAfterGetEntryInfo,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - context,
|
| - callback));
|
| -}
|
| -
|
| -void UpdateOperation::UpdateFileAfterGetEntryInfo(
|
| - DriveClientContext context,
|
| - const FileOperationCallback& callback,
|
| - FileError error,
|
| - const base::FilePath& drive_file_path,
|
| - scoped_ptr<ResourceEntry> entry) {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| - DCHECK(!callback.is_null());
|
| -
|
| - if (error != FILE_ERROR_OK) {
|
| - callback.Run(error);
|
| - return;
|
| - }
|
| -
|
| - DCHECK(entry);
|
| - if (entry->file_info().is_directory()) {
|
| - callback.Run(FILE_ERROR_NOT_A_FILE);
|
| - return;
|
| - }
|
| -
|
| - // Extract a pointer before we call Pass() so we can use it below.
|
| - ResourceEntry* entry_ptr = entry.get();
|
| - cache_->GetFileOnUIThread(
|
| - entry_ptr->resource_id(),
|
| - entry_ptr->file_specific_info().file_md5(),
|
| - base::Bind(&UpdateOperation::UpdateFileAfterGetFile,
|
| + ResourceEntry* entry = new ResourceEntry;
|
| + base::FilePath* drive_file_path = new base::FilePath;
|
| + base::FilePath* cache_file_path = new base::FilePath;
|
| + base::PostTaskAndReplyWithResult(
|
| + blocking_task_runner_,
|
| + FROM_HERE,
|
| + base::Bind(&GetFileLocalState,
|
| + metadata_,
|
| + cache_,
|
| + resource_id,
|
| + entry,
|
| + drive_file_path,
|
| + cache_file_path),
|
| + base::Bind(&UpdateOperation::UpdateFileAfterGetLocalState,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| context,
|
| callback,
|
| - drive_file_path,
|
| - base::Passed(&entry)));
|
| + base::Owned(entry),
|
| + base::Owned(drive_file_path),
|
| + base::Owned(cache_file_path)));
|
| }
|
|
|
| -void UpdateOperation::UpdateFileAfterGetFile(
|
| +void UpdateOperation::UpdateFileAfterGetLocalState(
|
| DriveClientContext context,
|
| const FileOperationCallback& callback,
|
| - const base::FilePath& drive_file_path,
|
| - scoped_ptr<ResourceEntry> entry,
|
| - FileError error,
|
| - const base::FilePath& cache_file_path) {
|
| + const ResourceEntry* entry,
|
| + const base::FilePath* drive_file_path,
|
| + const base::FilePath* cache_file_path,
|
| + FileError error) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| @@ -99,8 +133,8 @@ void UpdateOperation::UpdateFileAfterGetFile(
|
|
|
| scheduler_->UploadExistingFile(
|
| entry->resource_id(),
|
| - drive_file_path,
|
| - cache_file_path,
|
| + *drive_file_path,
|
| + *cache_file_path,
|
| entry->file_specific_info().content_mime_type(),
|
| "", // etag
|
| context,
|
| @@ -122,17 +156,25 @@ void UpdateOperation::UpdateFileAfterUpload(
|
| return;
|
| }
|
|
|
| - metadata_->RefreshEntryOnUIThread(
|
| - ConvertToResourceEntry(*resource_entry),
|
| - base::Bind(&UpdateOperation::UpdateFileAfterRefresh,
|
| - weak_ptr_factory_.GetWeakPtr(), callback));
|
| + base::FilePath* drive_file_path = new base::FilePath;
|
| + base::PostTaskAndReplyWithResult(
|
| + blocking_task_runner_,
|
| + FROM_HERE,
|
| + base::Bind(&UpdateFileLocalState,
|
| + metadata_,
|
| + cache_,
|
| + base::Passed(&resource_entry),
|
| + drive_file_path),
|
| + base::Bind(&UpdateOperation::UpdateFileAfterUpdateLocalState,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + callback,
|
| + base::Owned(drive_file_path)));
|
| }
|
|
|
| -void UpdateOperation::UpdateFileAfterRefresh(
|
| +void UpdateOperation::UpdateFileAfterUpdateLocalState(
|
| const FileOperationCallback& callback,
|
| - FileError error,
|
| - const base::FilePath& drive_file_path,
|
| - scoped_ptr<ResourceEntry> entry) {
|
| + const base::FilePath* drive_file_path,
|
| + FileError error) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(!callback.is_null());
|
|
|
| @@ -140,18 +182,8 @@ void UpdateOperation::UpdateFileAfterRefresh(
|
| callback.Run(error);
|
| return;
|
| }
|
| -
|
| - DCHECK(entry);
|
| - DCHECK(entry->has_resource_id());
|
| - DCHECK(entry->has_file_specific_info());
|
| - DCHECK(entry->file_specific_info().has_file_md5());
|
| -
|
| - observer_->OnDirectoryChangedByOperation(drive_file_path.DirName());
|
| -
|
| - // Clear the dirty bit if we have updated an existing file.
|
| - cache_->ClearDirtyOnUIThread(entry->resource_id(),
|
| - entry->file_specific_info().file_md5(),
|
| - callback);
|
| + observer_->OnDirectoryChangedByOperation(drive_file_path->DirName());
|
| + callback.Run(FILE_ERROR_OK);
|
| }
|
|
|
| } // namespace file_system
|
|
|