| Index: chrome/browser/sync_file_system/drive_file_sync_service.cc
|
| diff --git a/chrome/browser/sync_file_system/drive_file_sync_service.cc b/chrome/browser/sync_file_system/drive_file_sync_service.cc
|
| index ad7b758fdedbe5e444a556413f1aeeacd5640d97..16feb07f0a8a0e41f4d7006fed7b7ed044d5e5fe 100644
|
| --- a/chrome/browser/sync_file_system/drive_file_sync_service.cc
|
| +++ b/chrome/browser/sync_file_system/drive_file_sync_service.cc
|
| @@ -31,6 +31,7 @@
|
| #include "chrome/common/extensions/extension.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "extensions/common/constants.h"
|
| +#include "webkit/blob/scoped_file.h"
|
| #include "webkit/fileapi/file_system_url.h"
|
| #include "webkit/fileapi/syncable/sync_file_metadata.h"
|
| #include "webkit/fileapi/syncable/sync_file_type.h"
|
| @@ -55,22 +56,17 @@ const int64 kPollingDelaySecondsWithNotification = 4 * 60 * 60; // 4 hr
|
| const double kDelayMultiplier = 1.6;
|
|
|
| bool CreateTemporaryFile(const base::FilePath& dir_path,
|
| - base::FilePath* temp_file) {
|
| - return file_util::CreateDirectory(dir_path) &&
|
| - file_util::CreateTemporaryFileInDir(dir_path, temp_file);
|
| -}
|
| -
|
| -void DeleteTemporaryFile(const base::FilePath& file_path) {
|
| - if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)) {
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&DeleteTemporaryFile, file_path));
|
| - return;
|
| - }
|
| -
|
| - if (!file_util::Delete(file_path, true))
|
| - LOG(ERROR) << "Leaked temporary file for Sync FileSystem: "
|
| - << file_path.value();
|
| + webkit_blob::ScopedFile* temp_file) {
|
| + base::FilePath temp_file_path;
|
| + const bool success = file_util::CreateDirectory(dir_path) &&
|
| + file_util::CreateTemporaryFileInDir(dir_path, &temp_file_path);
|
| + if (!success)
|
| + return success;
|
| + *temp_file = webkit_blob::ScopedFile(
|
| + temp_file_path,
|
| + webkit_blob::ScopedFile::DELETE_ON_SCOPE_OUT,
|
| + base::MessageLoopProxy::current());
|
| + return success;
|
| }
|
|
|
| void EmptyStatusCallback(SyncStatusCode status) {}
|
| @@ -159,7 +155,7 @@ struct DriveFileSyncService::ProcessRemoteChangeParam {
|
| DriveMetadata drive_metadata;
|
| SyncFileMetadata local_metadata;
|
| bool metadata_updated;
|
| - base::FilePath temporary_file_path;
|
| + webkit_blob::ScopedFile temporary_file;
|
| std::string md5_checksum;
|
| SyncAction sync_action;
|
| bool clear_local_changes;
|
| @@ -1590,13 +1586,10 @@ void DriveFileSyncService::DidResolveConflictToLocalChange(
|
|
|
| void DriveFileSyncService::DownloadForRemoteSync(
|
| scoped_ptr<ProcessRemoteChangeParam> param) {
|
| - // TODO(tzik): Use ShareableFileReference here after we get thread-safe
|
| - // version of it. crbug.com/162598
|
| - base::FilePath* temporary_file_path = ¶m->temporary_file_path;
|
| + webkit_blob::ScopedFile* temporary_file = ¶m->temporary_file;
|
| content::BrowserThread::PostTaskAndReplyWithResult(
|
| content::BrowserThread::FILE, FROM_HERE,
|
| - base::Bind(&CreateTemporaryFile,
|
| - temporary_file_dir_, temporary_file_path),
|
| + base::Bind(&CreateTemporaryFile, temporary_file_dir_, temporary_file),
|
| base::Bind(&DriveFileSyncService::DidGetTemporaryFileForDownload,
|
| AsWeakPtr(), base::Passed(¶m)));
|
| }
|
| @@ -1609,8 +1602,9 @@ void DriveFileSyncService::DidGetTemporaryFileForDownload(
|
| return;
|
| }
|
|
|
| - const base::FilePath& temporary_file_path = param->temporary_file_path;
|
| + const base::FilePath& temporary_file_path = param->temporary_file.path();
|
| std::string resource_id = param->remote_change.resource_id;
|
| + DCHECK(!temporary_file_path.empty());
|
|
|
| // We should not use the md5 in metadata for FETCH type to avoid the download
|
| // finishes due to NOT_MODIFIED.
|
| @@ -1645,7 +1639,7 @@ void DriveFileSyncService::DidDownloadFileForRemoteSync(
|
|
|
| param->drive_metadata.set_md5_checksum(md5_checksum);
|
| const FileChange& change = param->remote_change.change;
|
| - const base::FilePath& temporary_file_path = param->temporary_file_path;
|
| + const base::FilePath& temporary_file_path = param->temporary_file.path();
|
| const FileSystemURL& url = param->remote_change.url;
|
| remote_change_processor_->ApplyRemoteChange(
|
| change, temporary_file_path, url,
|
| @@ -1746,8 +1740,6 @@ void DriveFileSyncService::FinalizeRemoteSync(
|
| return;
|
| }
|
|
|
| - if (!param->temporary_file_path.empty())
|
| - DeleteTemporaryFile(param->temporary_file_path);
|
| NotifyTaskDone(status, param->token.Pass());
|
| if (status == SYNC_STATUS_OK && param->sync_action != SYNC_ACTION_NONE) {
|
| NotifyObserversFileStatusChanged(param->remote_change.url,
|
|
|