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 a6507a90071d2577687299b91c894e9cf1ca165e..f305e0c0f6e0cf0738848bfb6264537ce9ef65cb 100644 |
--- a/chrome/browser/chromeos/drive/job_scheduler.cc |
+++ b/chrome/browser/chromeos/drive/job_scheduler.cc |
@@ -91,6 +91,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[] = { |
@@ -165,9 +193,17 @@ 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()) |
+ if (!job->cancel_callback.is_null()) { |
+ // Non null |cancel_callback| means the corresponding HTTP request is |
+ // in-flight. Cancel the request by calling the callback, and wait for |
+ // its termination in the normal callback handling. |
job->cancel_callback.Run(); |
+ } else { |
+ base::Callback<void(google_apis::GDataErrorCode)> callback = job->abort; |
+ queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job_id); |
+ job_map_.Remove(job_id); |
+ callback.Run(google_apis::GDATA_CANCELLED); |
+ } |
} |
} |
@@ -193,6 +229,7 @@ void JobScheduler::GetAboutResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -209,6 +246,7 @@ void JobScheduler::GetAppList( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -225,6 +263,7 @@ void JobScheduler::GetAllResourceList( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -244,6 +283,7 @@ void JobScheduler::GetResourceListInDirectory( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -262,6 +302,7 @@ void JobScheduler::Search( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -280,6 +321,7 @@ void JobScheduler::GetChangeList( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -298,6 +340,7 @@ void JobScheduler::ContinueGetResourceList( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -318,6 +361,7 @@ void JobScheduler::GetResourceEntry( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -337,6 +381,7 @@ void JobScheduler::DeleteResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = callback; |
StartJob(new_job); |
} |
@@ -359,6 +404,7 @@ void JobScheduler::CopyResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -379,6 +425,7 @@ void JobScheduler::CopyHostedDocument( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -399,6 +446,7 @@ void JobScheduler::RenameResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = callback; |
StartJob(new_job); |
} |
@@ -421,6 +469,7 @@ void JobScheduler::TouchResource( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -441,6 +490,7 @@ void JobScheduler::AddResourceToDirectory( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = callback; |
StartJob(new_job); |
} |
@@ -460,6 +510,7 @@ void JobScheduler::RemoveResourceFromDirectory( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = callback; |
StartJob(new_job); |
} |
@@ -479,6 +530,7 @@ void JobScheduler::AddNewDirectory( |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id, |
callback)); |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -507,7 +559,7 @@ JobID JobScheduler::DownloadFile( |
base::Bind(&JobScheduler::UpdateProgress, |
weak_ptr_factory_.GetWeakPtr(), |
new_job->job_info.job_id)); |
- |
+ new_job->abort = CreateErrorRunCallback(download_action_callback); |
StartJob(new_job); |
return new_job->job_info.job_id; |
} |
@@ -545,7 +597,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 = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -582,7 +634,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 = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |
@@ -619,7 +671,7 @@ void JobScheduler::CreateFile( |
params.progress_callback = google_apis::ProgressCallback(); |
new_job->task = base::Bind(&RunUploadNewFile, uploader_.get(), params); |
- |
+ new_job->abort = CreateErrorRunCallback(callback); |
StartJob(new_job); |
} |