Index: chrome/browser/chromeos/drive/job_scheduler.cc |
diff --git a/chrome/browser/chromeos/drive/job_scheduler.cc b/chrome/browser/chromeos/drive/job_scheduler.cc |
index ec7a62dc34d8ebbea8135a2a4c8eba440c8db312..855d637b2bdd31d6174afb186aab8f36516100b5 100644 |
--- a/chrome/browser/chromeos/drive/job_scheduler.cc |
+++ b/chrome/browser/chromeos/drive/job_scheduler.cc |
@@ -89,6 +89,34 @@ google_apis::CancelCallback RunResumeUploadFile( |
params.progress_callback); |
} |
+// Helper for CreateErrorRunCallback. |
+template<typename P1> |
+struct CreateErrorRunCallbackHelper { |
+ static void Run( |
+ const base::Callback<void(google_apis::GDataErrorCode, P1)>& callback, |
+ google_apis::GDataErrorCode error) { |
+ callback.Run(error, P1()); |
+ } |
+}; |
+ |
+template<typename P1> |
+struct CreateErrorRunCallbackHelper<const P1&> { |
+ static void Run( |
+ const base::Callback<void(google_apis::GDataErrorCode, |
+ const P1&)>& callback, |
+ google_apis::GDataErrorCode error) { |
+ callback.Run(error, P1()); |
+ } |
+}; |
+ |
+// Returns a callback with the tail parameter bound to its default value. |
+// In other words, returned_callback.Run(error) runs callback.Run(error, T()). |
+template<typename P1> |
+base::Callback<void(google_apis::GDataErrorCode)> CreateErrorRunCallback( |
+ const base::Callback<void(google_apis::GDataErrorCode, P1)>& callback) { |
+ return base::Bind(&CreateErrorRunCallbackHelper<P1>::Run, callback); |
+} |
+ |
} // namespace |
const int JobScheduler::kMaxJobCount[] = { |
@@ -163,9 +191,20 @@ void JobScheduler::CancelJob(JobID job_id) { |
JobEntry* job = job_map_.Lookup(job_id); |
if (job) { |
- // TODO(kinaba): crbug.com/251116 Support cancelling jobs not yet started. |
- if (!job->cancel_callback.is_null()) |
- job->cancel_callback.Run(); |
+ if (job->job_info.state == STATE_RUNNING) { |
+ // If the job is running an HTTP request, cancel it via |cancel_callback| |
+ // returned from the request, and wait for termination in the normal |
+ // callback handler, OnJobDone. |
+ if (!job->cancel_callback.is_null()) |
+ job->cancel_callback.Run(); |
+ } else { |
+ // Otherwise, just remove from the queue and calls back to the client. |
+ base::Callback<void(google_apis::GDataErrorCode)> callback = |
+ job->abort_callback; |
+ queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job_id); |
+ job_map_.Remove(job_id); |
+ callback.Run(google_apis::GDATA_CANCELLED); |
+ } |
} |
} |
@@ -191,6 +230,7 @@ void JobScheduler::GetAboutResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -207,6 +247,7 @@ void JobScheduler::GetAppList( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -223,6 +264,7 @@ void JobScheduler::GetAllResourceList( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -242,6 +284,7 @@ void JobScheduler::GetResourceListInDirectory( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -260,6 +303,7 @@ void JobScheduler::Search( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -278,6 +322,7 @@ void JobScheduler::GetChangeList( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -296,6 +341,7 @@ void JobScheduler::ContinueGetResourceList( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -316,6 +362,7 @@ void JobScheduler::GetResourceEntry( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -335,6 +382,7 @@ void JobScheduler::DeleteResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = callback; |
StartJob(new_job); |
} |
@@ -357,6 +405,7 @@ void JobScheduler::CopyResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -377,6 +426,7 @@ void JobScheduler::CopyHostedDocument( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -397,6 +447,7 @@ void JobScheduler::RenameResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = callback; |
StartJob(new_job); |
} |
@@ -419,6 +470,7 @@ void JobScheduler::TouchResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -439,6 +491,7 @@ void JobScheduler::AddResourceToDirectory( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = callback; |
StartJob(new_job); |
} |
@@ -458,6 +511,7 @@ void JobScheduler::RemoveResourceFromDirectory( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = callback; |
StartJob(new_job); |
} |
@@ -477,6 +531,7 @@ void JobScheduler::AddNewDirectory( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -505,7 +560,7 @@ JobID JobScheduler::DownloadFile( |
base::Bind(&JobScheduler::UpdateProgress, |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id)); |
- |
+ new_job->abort_callback = CreateErrorRunCallback(download_action_callback); |
StartJob(new_job); |
return new_job->job_info.job_id; |
} |
@@ -543,7 +598,7 @@ void JobScheduler::UploadNewFile( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id); |
new_job->task = base::Bind(&RunUploadNewFile, uploader_.get(), params); |
- |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -580,7 +635,7 @@ void JobScheduler::UploadExistingFile( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id); |
new_job->task = base::Bind(&RunUploadExistingFile, uploader_.get(), params); |
- |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -617,7 +672,7 @@ void JobScheduler::CreateFile( |
params.progress_callback = google_apis::ProgressCallback(); |
new_job->task = base::Bind(&RunUploadNewFile, uploader_.get(), params); |
- |
+ new_job->abort_callback = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |