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

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: Fix failures in tests. 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
« no previous file with comments | « chrome/browser/chromeos/drive/job_scheduler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « chrome/browser/chromeos/drive/job_scheduler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698