Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(991)

Unified Diff: chrome/browser/chromeos/drive/job_scheduler.cc

Issue 17101020: Support cancellation of non-yet-running jobs in drive::JobScheduler. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698