Chromium Code Reviews| 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 b56ab3d1f8b67a96064681ca79db716b30ff6a0b..d062ec3b69df88733d4fdffbfc7badc34a23fd0e 100644 |
| --- a/chrome/browser/chromeos/gdata/gdata_file_system.cc |
| +++ b/chrome/browser/chromeos/gdata/gdata_file_system.cc |
| @@ -234,6 +234,28 @@ void RunFileOperationCallbackHelper( |
| callback.Run(*error); |
| } |
| +// Callback for StoreToCache invoked by AddUploadedFileOnUIThread. |
| +void OnStoreToCacheForAddUploadedFile( |
| + const base::Closure& callback, |
| + base::PlatformFileError /* error */, |
| + const std::string& /* resource_id */, |
| + const std::string& /* md5 */) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + if (!callback.is_null()) |
| + callback.Run(); |
| +} |
| + |
| +// Helper function called upon completion of AddUploadFile invoked by |
| +// OnTransferCompleted. |
| +void OnAddUploadFileCompleted( |
| + const FileOperationCallback& callback, |
| + base::PlatformFileError error, |
| + scoped_ptr<UploadFileInfo> /* upload_file_info */){ |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + if (!callback.is_null()) |
| + callback.Run(error); |
| +} |
| + |
| // Used to implement GetCacheState. |
| void RunGetCacheStateCallbackHelper( |
| const GetCacheStateCallback& callback, |
| @@ -1151,28 +1173,23 @@ void GDataFileSystem::StartFileUploadOnUIThread( |
| void GDataFileSystem::OnTransferCompleted( |
| const FileOperationCallback& callback, |
| base::PlatformFileError error, |
| - UploadFileInfo* upload_file_info) { |
| + scoped_ptr<UploadFileInfo> upload_file_info) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - DCHECK(upload_file_info); |
| + DCHECK(upload_file_info.get()); |
| if (error == base::PLATFORM_FILE_OK && upload_file_info->entry.get()) { |
| - AddUploadedFile(upload_file_info->gdata_path.DirName(), |
| - upload_file_info->entry.get(), |
| - upload_file_info->file_path, |
| - GDataCache::FILE_OPERATION_COPY); |
| - } |
| - if (!callback.is_null()) |
| + const UploadFileInfo* upload_file_info_ptr = upload_file_info.get(); |
|
achuithb
2012/06/15 21:53:58
Please add a comment.
satorux1
2012/06/15 21:59:15
yeah, this is subtle. glad you caught this before
hshi1
2012/06/15 22:05:48
Done.
hshi1
2012/06/15 22:05:48
Yes, thanks for mentioning a similar issue before
|
| + AddUploadedFile(upload_file_info_ptr->gdata_path.DirName(), |
| + upload_file_info_ptr->entry.get(), |
| + upload_file_info_ptr->file_path, |
| + GDataCache::FILE_OPERATION_COPY, |
| + base::Bind(&OnAddUploadFileCompleted, |
| + callback, |
| + error, |
| + base::Passed(&upload_file_info))); |
| + } else if (!callback.is_null()) { |
| callback.Run(error); |
| - |
| - // In case of error upload_file_info will be deleted by the uploader. |
| - if (error != base::PLATFORM_FILE_OK) |
| - return; |
| - |
| - // TODO(achuith): GDataFileSystem should not have to call DeleteUpload. |
| - GDataSystemService* service = |
| - GDataSystemServiceFactory::GetForProfile(profile_); |
| - if (service) |
| - service->uploader()->DeleteUpload(upload_file_info); |
| + } |
| } |
| void GDataFileSystem::Copy(const FilePath& src_file_path, |
| @@ -3483,26 +3500,56 @@ void GDataFileSystem::AddUploadedFile( |
| const FilePath& virtual_dir_path, |
| DocumentEntry* entry, |
| const FilePath& file_content_path, |
| - GDataCache::FileOperationType cache_operation) { |
| + GDataCache::FileOperationType cache_operation, |
| + const base::Closure& callback) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + // Post a task to the same thread, rather than calling it here, as |
| + // AddUploadedFile() is asynchronous. |
| + base::MessageLoopProxy::current()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&GDataFileSystem::AddUploadedFileOnUIThread, |
| + ui_weak_ptr_, |
| + virtual_dir_path, |
| + entry, |
| + file_content_path, |
| + cache_operation, |
| + callback)); |
| +} |
| + |
| +void GDataFileSystem::AddUploadedFileOnUIThread( |
| + const FilePath& virtual_dir_path, |
| + DocumentEntry* entry, |
| + const FilePath& file_content_path, |
| + GDataCache::FileOperationType cache_operation, |
| + const base::Closure& callback) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + DCHECK(!callback.is_null()); |
| + |
| if (!entry) { |
| NOTREACHED(); |
| + callback.Run(); |
| return; |
| } |
| GDataEntry* dir_entry = GetGDataEntryByPath(virtual_dir_path); |
| - if (!dir_entry) |
| + if (!dir_entry) { |
| + callback.Run(); |
| return; |
| + } |
| GDataDirectory* parent_dir = dir_entry->AsGDataDirectory(); |
| - if (!parent_dir) |
| + if (!parent_dir) { |
| + callback.Run(); |
| return; |
| + } |
| scoped_ptr<GDataEntry> new_entry( |
| GDataEntry::FromDocumentEntry(parent_dir, entry, root_.get())); |
| - if (!new_entry.get()) |
| + if (!new_entry.get()) { |
| + callback.Run(); |
| return; |
| + } |
| GDataFile* file = new_entry->AsGDataFile(); |
| DCHECK(file); |
| @@ -3513,7 +3560,8 @@ void GDataFileSystem::AddUploadedFile( |
| NotifyDirectoryChanged(virtual_dir_path); |
| cache_->StoreOnUIThread(resource_id, md5, file_content_path, cache_operation, |
| - CacheOperationCallback()); |
| + base::Bind(&OnStoreToCacheForAddUploadedFile, |
| + callback)); |
| } |
| void GDataFileSystem::Observe(int type, |