Index: chrome/browser/chromeos/gdata/gdata_file_system.cc |
diff --git a/chrome/browser/chromeos/gdata/gdata_file_system.cc b/chrome/browser/chromeos/gdata/gdata_file_system.cc |
index bf441df31f4bad2b6249e5036a95cb525e178ff4..a5ee0cb3bb02a3c3628ac8bd9a6235b71fe491a2 100644 |
--- a/chrome/browser/chromeos/gdata/gdata_file_system.cc |
+++ b/chrome/browser/chromeos/gdata/gdata_file_system.cc |
@@ -753,6 +753,19 @@ struct GDataFileSystem::FeedToFileResourceMapUmaStats { |
EntryKindToCountMap num_files_with_entry_kind; |
}; |
+// GDataFileSystem::StartFileUploadParams implementation. |
+struct GDataFileSystem::StartFileUploadParams { |
+ StartFileUploadParams(const FilePath& in_local_file_path, |
+ const FilePath& in_remote_file_path, |
+ const FileOperationCallback& in_callback) |
+ : local_file_path(in_local_file_path), |
+ remote_file_path(in_remote_file_path), |
+ callback(in_callback) {} |
+ |
+ const FilePath local_file_path; |
+ const FilePath remote_file_path; |
+ const FileOperationCallback callback; |
+}; |
// GDataFileSystem class implementation. |
@@ -1229,18 +1242,16 @@ void GDataFileSystem::TransferRegularFile( |
content_type), |
base::Bind(&GDataFileSystem::StartFileUploadOnUIThread, |
ui_weak_ptr_, |
- local_file_path, |
- remote_dest_file_path, |
- callback, |
+ StartFileUploadParams(local_file_path, |
+ remote_dest_file_path, |
+ callback), |
base::Owned(error), |
base::Owned(file_size), |
base::Owned(content_type))); |
} |
void GDataFileSystem::StartFileUploadOnUIThread( |
- const FilePath& local_file, |
- const FilePath& remote_dest_file, |
- const FileOperationCallback& callback, |
+ const StartFileUploadParams& params, |
GDataFileError* error, |
int64* file_size, |
std::string* content_type) { |
@@ -1252,38 +1263,57 @@ void GDataFileSystem::StartFileUploadOnUIThread( |
DCHECK(content_type); |
if (*error != GDATA_FILE_OK) { |
- if (!callback.is_null()) |
- callback.Run(*error); |
+ if (!params.callback.is_null()) |
+ params.callback.Run(*error); |
return; |
} |
// Make sure the destination directory exists. |
- GDataEntry* dest_dir = GetGDataEntryByPath(remote_dest_file.DirName()); |
- if (!dest_dir || !dest_dir->AsGDataDirectory()) { |
- if (!callback.is_null()) |
- callback.Run(GDATA_FILE_ERROR_NOT_FOUND); |
- NOTREACHED(); |
+ GetEntryInfoByPath( |
+ params.remote_file_path.DirName(), |
+ base::Bind( |
+ &GDataFileSystem::StartFileUploadOnUIThreadAfterGetEntryInfo, |
+ ui_weak_ptr_, |
+ params, |
+ *file_size, |
+ *content_type)); |
+} |
+ |
+void GDataFileSystem::StartFileUploadOnUIThreadAfterGetEntryInfo( |
+ const StartFileUploadParams& params, |
+ int64 file_size, |
+ std::string content_type, |
+ GDataFileError error, |
+ scoped_ptr<GDataEntryProto> entry_proto) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ if (entry_proto.get() && !entry_proto->file_info().is_directory()) |
+ error = GDATA_FILE_ERROR_NOT_A_DIRECTORY; |
+ |
+ if (error != GDATA_FILE_OK) { |
+ if (!params.callback.is_null()) |
+ params.callback.Run(error); |
return; |
} |
+ DCHECK(entry_proto.get()); |
// Fill in values of UploadFileInfo. |
scoped_ptr<UploadFileInfo> upload_file_info(new UploadFileInfo); |
- upload_file_info->file_path = local_file; |
- upload_file_info->file_size = *file_size; |
- upload_file_info->gdata_path = remote_dest_file; |
+ upload_file_info->file_path = params.local_file_path; |
+ upload_file_info->file_size = file_size; |
+ upload_file_info->gdata_path = params.remote_file_path; |
// Use the file name as the title. |
- upload_file_info->title = remote_dest_file.BaseName().value(); |
- upload_file_info->content_length = *file_size; |
+ upload_file_info->title = params.remote_file_path.BaseName().value(); |
+ upload_file_info->content_length = file_size; |
upload_file_info->all_bytes_present = true; |
- upload_file_info->content_type = *content_type; |
- upload_file_info->initial_upload_location = |
- dest_dir->AsGDataDirectory()->upload_url(); |
+ upload_file_info->content_type = content_type; |
+ upload_file_info->initial_upload_location = GURL(entry_proto->upload_url()); |
upload_file_info->completion_callback = |
base::Bind(&GDataFileSystem::OnTransferCompleted, |
ui_weak_ptr_, |
- callback); |
+ params.callback); |
uploader_->UploadNewFile(upload_file_info.Pass()); |
} |