| Index: chrome/browser/chromeos/drive/drive_file_system.cc
|
| diff --git a/chrome/browser/chromeos/drive/drive_file_system.cc b/chrome/browser/chromeos/drive/drive_file_system.cc
|
| index cb34bfb043eda98bd3ffefea0f87faad332f7bfb..faa4bb60899d0e51f6eae04b215fd186541d73ab 100644
|
| --- a/chrome/browser/chromeos/drive/drive_file_system.cc
|
| +++ b/chrome/browser/chromeos/drive/drive_file_system.cc
|
| @@ -181,9 +181,9 @@ struct DriveFileSystem::GetResolvedFileParams {
|
| }
|
| }
|
|
|
| - void OnDownloadFileCompleted(const base::FilePath& downloaded_file_path) {
|
| + void OnStoreCompleted(const base::FilePath& local_file_path) {
|
| get_file_callback.Run(
|
| - DRIVE_FILE_OK, downloaded_file_path,
|
| + DRIVE_FILE_OK, local_file_path,
|
| entry_proto->file_specific_info().content_mime_type(), REGULAR_FILE);
|
| }
|
|
|
| @@ -930,15 +930,13 @@ void DriveFileSystem::GetResolvedFileByPathAfterRefreshEntry(
|
| params->entry_proto = entry_proto.Pass(); // Update the entry in |params|.
|
| cache_->FreeDiskSpaceIfNeededFor(
|
| file_size,
|
| - base::Bind(
|
| - &DriveFileSystem
|
| - ::GetResolvedFileByPathAfterFreeDiskSpacePreliminarily,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(¶ms),
|
| - download_url));
|
| + base::Bind(&DriveFileSystem::GetResolvedFileByPathAfterFreeDiskSpace,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Passed(¶ms),
|
| + download_url));
|
| }
|
|
|
| -void DriveFileSystem::GetResolvedFileByPathAfterFreeDiskSpacePreliminarily(
|
| +void DriveFileSystem::GetResolvedFileByPathAfterFreeDiskSpace(
|
| scoped_ptr<GetResolvedFileParams> params,
|
| const GURL& download_url,
|
| bool has_enough_space) {
|
| @@ -951,16 +949,40 @@ void DriveFileSystem::GetResolvedFileByPathAfterFreeDiskSpacePreliminarily(
|
| return;
|
| }
|
|
|
| - // We have enough disk space. Start downloading the file.
|
| - base::FilePath local_tmp_path = cache_->GetCacheFilePath(
|
| - params->entry_proto->resource_id(),
|
| - params->entry_proto->file_specific_info().file_md5(),
|
| - DriveCache::CACHE_TYPE_TMP,
|
| - DriveCache::CACHED_FILE_FROM_SERVER);
|
| + // We have enough disk space. Create download destination file.
|
| + const base::FilePath temp_download_directory =
|
| + cache_->GetCacheDirectoryPath(DriveCache::CACHE_TYPE_TMP_DOWNLOADS);
|
| + base::FilePath* file_path = new base::FilePath;
|
| + base::PostTaskAndReplyWithResult(
|
| + blocking_task_runner_,
|
| + FROM_HERE,
|
| + base::Bind(&file_util::CreateTemporaryFileInDir,
|
| + temp_download_directory,
|
| + file_path),
|
| + base::Bind(&DriveFileSystem::GetResolveFileByPathAfterCreateTemporaryFile,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Passed(¶ms),
|
| + download_url,
|
| + base::Owned(file_path)));
|
| +}
|
| +
|
| +void DriveFileSystem::GetResolveFileByPathAfterCreateTemporaryFile(
|
| + scoped_ptr<GetResolvedFileParams> params,
|
| + const GURL& download_url,
|
| + base::FilePath* temp_file,
|
| + bool success) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(params);
|
| +
|
| + if (!success) {
|
| + params->OnError(DRIVE_FILE_ERROR_FAILED);
|
| + return;
|
| + }
|
| +
|
| GetResolvedFileParams* params_ptr = params.get();
|
| scheduler_->DownloadFile(
|
| params_ptr->drive_file_path,
|
| - local_tmp_path,
|
| + *temp_file,
|
| download_url,
|
| params_ptr->context,
|
| base::Bind(&DriveFileSystem::GetResolvedFileByPathAfterDownloadFile,
|
| @@ -995,20 +1017,15 @@ void DriveFileSystem::GetResolvedFileByPathAfterDownloadFile(
|
| return;
|
| }
|
|
|
| - // At this point, the disk can be full or nearly full for several reasons:
|
| - // - The expected file size was incorrect and the file was larger
|
| - // - There was an in-flight download operation and it used up space
|
| - // - The disk became full for some user actions we cannot control
|
| - // (ex. the user might have downloaded a large file from a regular web site)
|
| - //
|
| - // If we don't have enough space, we return PLATFORM_FILE_ERROR_NO_SPACE,
|
| - // and try to free up space, even if the file was downloaded successfully.
|
| - cache_->FreeDiskSpaceIfNeededFor(
|
| - 0,
|
| - base::Bind(&DriveFileSystem::GetResolvedFileByPathAfterFreeDiskSpace,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - base::Passed(¶ms),
|
| - downloaded_file_path));
|
| + DriveEntryProto* entry = params->entry_proto.get();
|
| + cache_->Store(entry->resource_id(),
|
| + entry->file_specific_info().file_md5(),
|
| + downloaded_file_path,
|
| + DriveCache::FILE_OPERATION_MOVE,
|
| + base::Bind(&DriveFileSystem::GetResolvedFileByPathAfterStore,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Passed(¶ms),
|
| + downloaded_file_path));
|
| }
|
|
|
| void DriveFileSystem::GetResolvedFileByPathAfterGetCacheEntryForCancel(
|
| @@ -1026,37 +1043,46 @@ void DriveFileSystem::GetResolvedFileByPathAfterGetCacheEntryForCancel(
|
| }
|
| }
|
|
|
| -void DriveFileSystem::GetResolvedFileByPathAfterFreeDiskSpace(
|
| +void DriveFileSystem::GetResolvedFileByPathAfterStore(
|
| scoped_ptr<GetResolvedFileParams> params,
|
| const base::FilePath& downloaded_file_path,
|
| - bool has_enough_space) {
|
| + DriveFileError error) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| DCHECK(params);
|
|
|
| - // If we don't have enough space, remove the downloaded file, and
|
| - // report "no space" error.
|
| - if (!has_enough_space) {
|
| + if (error != DRIVE_FILE_OK) {
|
| blocking_task_runner_->PostTask(
|
| FROM_HERE,
|
| base::Bind(base::IgnoreResult(&file_util::Delete),
|
| downloaded_file_path,
|
| false /* recursive*/));
|
| - params->OnError(DRIVE_FILE_ERROR_NO_SPACE);
|
| + params->OnError(error);
|
| return;
|
| }
|
| -
|
| - // Make sure that downloaded file is properly stored in cache. We don't have
|
| - // to wait for this operation to finish since the user can already use the
|
| - // downloaded file.
|
| - cache_->Store(params->entry_proto->resource_id(),
|
| - params->entry_proto->file_specific_info().file_md5(),
|
| - downloaded_file_path,
|
| - DriveCache::FILE_OPERATION_MOVE,
|
| - base::Bind(&util::EmptyFileOperationCallback));
|
| // Storing to cache changes the "offline available" status, hence notify.
|
| OnDirectoryChanged(params->drive_file_path.DirName());
|
|
|
| - params->OnDownloadFileCompleted(downloaded_file_path);
|
| + DriveEntryProto* entry = params->entry_proto.get();
|
| + cache_->GetFile(
|
| + entry->resource_id(),
|
| + entry->file_specific_info().file_md5(),
|
| + base::Bind(&DriveFileSystem::GetResolvedFileByPathAfterGetFile,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + base::Passed(¶ms)));
|
| +}
|
| +
|
| +void DriveFileSystem::GetResolvedFileByPathAfterGetFile(
|
| + scoped_ptr<GetResolvedFileParams> params,
|
| + DriveFileError error,
|
| + const base::FilePath& cache_file) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(params);
|
| +
|
| + if (error != DRIVE_FILE_OK) {
|
| + params->OnError(error);
|
| + return;
|
| + }
|
| + params->OnStoreCompleted(cache_file);
|
| }
|
|
|
| void DriveFileSystem::RefreshDirectory(
|
|
|