| Index: chrome/browser/chromeos/gdata/gdata_uploader.cc
|
| diff --git a/chrome/browser/chromeos/gdata/gdata_uploader.cc b/chrome/browser/chromeos/gdata/gdata_uploader.cc
|
| index f9dc6604b6655da8362e6fcd4d25d025e615318c..297362c91349ac55878fcbd19d61814ff1fa5cb9 100644
|
| --- a/chrome/browser/chromeos/gdata/gdata_uploader.cc
|
| +++ b/chrome/browser/chromeos/gdata/gdata_uploader.cc
|
| @@ -73,6 +73,8 @@ int GDataUploader::UploadFile(scoped_ptr<UploadFileInfo> upload_file_info) {
|
|
|
| void GDataUploader::UpdateUpload(int upload_id,
|
| content::DownloadItem* download) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| UploadFileInfo* upload_file_info = GetUploadFileInfo(upload_id);
|
| if (!upload_file_info)
|
| return;
|
| @@ -178,7 +180,8 @@ void GDataUploader::OpenCompletionCallback(int upload_id, int result) {
|
| upload_file_info->num_file_open_tries >= kMaxFileOpenTries;
|
| upload_file_info->should_retry_file_open = !exceeded_max_attempts;
|
| if (exceeded_max_attempts)
|
| - UploadFailed(upload_file_info, base::PLATFORM_FILE_ERROR_NOT_FOUND);
|
| + UploadFailed(scoped_ptr<UploadFileInfo>(upload_file_info),
|
| + base::PLATFORM_FILE_ERROR_NOT_FOUND);
|
|
|
| return;
|
| }
|
| @@ -188,7 +191,8 @@ void GDataUploader::OpenCompletionCallback(int upload_id, int result) {
|
| const GURL destination_directory_url = file_system_->GetUploadUrlForDirectory(
|
| upload_file_info->gdata_path.DirName());
|
| if (destination_directory_url.is_empty()) {
|
| - UploadFailed(upload_file_info, base::PLATFORM_FILE_ERROR_ABORT);
|
| + UploadFailed(scoped_ptr<UploadFileInfo>(upload_file_info),
|
| + base::PLATFORM_FILE_ERROR_ABORT);
|
| return;
|
| }
|
|
|
| @@ -218,7 +222,8 @@ void GDataUploader::OnUploadLocationReceived(
|
|
|
| if (code != HTTP_SUCCESS) {
|
| // TODO(achuith): Handle error codes from Google Docs server.
|
| - UploadFailed(upload_file_info, base::PLATFORM_FILE_ERROR_ABORT);
|
| + UploadFailed(scoped_ptr<UploadFileInfo>(upload_file_info),
|
| + base::PLATFORM_FILE_ERROR_ABORT);
|
| return;
|
| }
|
|
|
| @@ -313,14 +318,17 @@ void GDataUploader::OnResumeUploadResponseReceived(
|
| DVLOG(1) << "Successfully created uploaded file=["
|
| << upload_file_info->title;
|
|
|
| + // Remove |upload_id| from the UploadFileInfoMap. The UploadFileInfo object
|
| + // will be deleted upon completion of completion_callback.
|
| + RemoveUpload(upload_id);
|
| +
|
| // Done uploading.
|
| upload_file_info->entry = entry.Pass();
|
| if (!upload_file_info->completion_callback.is_null()) {
|
| - upload_file_info->completion_callback.Run(base::PLATFORM_FILE_OK,
|
| - upload_file_info);
|
| + upload_file_info->completion_callback.Run(
|
| + base::PLATFORM_FILE_OK,
|
| + scoped_ptr<UploadFileInfo>(upload_file_info));
|
| }
|
| - // TODO(achuith): DeleteUpload() here and let clients call
|
| - // GDataFileSystem::AddUploadedFile.
|
| return;
|
| }
|
|
|
| @@ -337,7 +345,8 @@ void GDataUploader::OnResumeUploadResponseReceived(
|
| << ", start_range_received=" << response.start_range_received
|
| << ", end_range_received=" << response.end_range_received
|
| << ", expected end range=" << upload_file_info->end_range;
|
| - UploadFailed(upload_file_info,
|
| + UploadFailed(
|
| + scoped_ptr<UploadFileInfo>(upload_file_info),
|
| response.code == HTTP_FORBIDDEN ?
|
| base::PLATFORM_FILE_ERROR_NO_SPACE :
|
| base::PLATFORM_FILE_ERROR_ABORT);
|
| @@ -357,35 +366,36 @@ void GDataUploader::MoveFileToCache(UploadFileInfo* upload_file_info) {
|
| if (upload_file_info->entry == NULL)
|
| return;
|
|
|
| + // Remove |upload_id| from the UploadFileInfoMap. The UploadFileInfo object
|
| + // will be deleted upon completion of AddUploadedFile.
|
| + RemoveUpload(upload_file_info->upload_id);
|
| +
|
| DVLOG(1) << "MoveFileToCache " << upload_file_info->file_path.value();
|
| file_system_->AddUploadedFile(
|
| upload_file_info->gdata_path.DirName(),
|
| upload_file_info->entry.get(),
|
| upload_file_info->file_path,
|
| - GDataCache::FILE_OPERATION_MOVE);
|
| - DeleteUpload(upload_file_info);
|
| + GDataCache::FILE_OPERATION_MOVE,
|
| + base::Bind(&base::DeletePointer<UploadFileInfo>,
|
| + upload_file_info));
|
| }
|
|
|
| -void GDataUploader::UploadFailed(UploadFileInfo* upload_file_info,
|
| +void GDataUploader::UploadFailed(scoped_ptr<UploadFileInfo> upload_file_info,
|
| base::PlatformFileError error) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + RemoveUpload(upload_file_info->upload_id);
|
| +
|
| LOG(ERROR) << "Upload failed " << upload_file_info->DebugString();
|
| if (!upload_file_info->completion_callback.is_null()) {
|
| upload_file_info->completion_callback.Run(error,
|
| - upload_file_info);
|
| + upload_file_info.Pass());
|
| }
|
| - DeleteUpload(upload_file_info);
|
| }
|
|
|
| -void GDataUploader::DeleteUpload(UploadFileInfo* upload_file_info) {
|
| +void GDataUploader::RemoveUpload(int upload_id) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| -
|
| - DVLOG(1) << "Deleting upload " << upload_file_info->gdata_path.value();
|
| - pending_uploads_.erase(upload_file_info->upload_id);
|
| -
|
| - // The file stream is closed by the destructor asynchronously.
|
| - delete upload_file_info->file_stream;
|
| - delete upload_file_info;
|
| + pending_uploads_.erase(upload_id);
|
| }
|
|
|
| } // namespace gdata
|
|
|