| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/drive/job_scheduler.h" | 5 #include "chrome/browser/chromeos/drive/job_scheduler.h" |
| 6 | 6 |
| 7 #include "base/files/file_util.h" | 7 #include "base/files/file_util.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 // Metadata jobs are cheap, so we run them concurrently. File jobs run serially. | 164 // Metadata jobs are cheap, so we run them concurrently. File jobs run serially. |
| 165 const int JobScheduler::kMaxJobCount[] = { | 165 const int JobScheduler::kMaxJobCount[] = { |
| 166 5, // METADATA_QUEUE | 166 5, // METADATA_QUEUE |
| 167 1, // FILE_QUEUE | 167 1, // FILE_QUEUE |
| 168 }; | 168 }; |
| 169 | 169 |
| 170 JobScheduler::JobEntry::JobEntry(JobType type) | 170 JobScheduler::JobEntry::JobEntry(JobType type) |
| 171 : job_info(type), | 171 : job_info(type), |
| 172 context(ClientContext(USER_INITIATED)), | 172 context(ClientContext(USER_INITIATED)), |
| 173 retry_count(0) { | 173 retry_count(0) { |
| 174 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 174 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 175 } | 175 } |
| 176 | 176 |
| 177 JobScheduler::JobEntry::~JobEntry() { | 177 JobScheduler::JobEntry::~JobEntry() { |
| 178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 178 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 179 } | 179 } |
| 180 | 180 |
| 181 struct JobScheduler::ResumeUploadParams { | 181 struct JobScheduler::ResumeUploadParams { |
| 182 base::FilePath drive_file_path; | 182 base::FilePath drive_file_path; |
| 183 base::FilePath local_file_path; | 183 base::FilePath local_file_path; |
| 184 std::string content_type; | 184 std::string content_type; |
| 185 }; | 185 }; |
| 186 | 186 |
| 187 JobScheduler::JobScheduler(PrefService* pref_service, | 187 JobScheduler::JobScheduler(PrefService* pref_service, |
| 188 EventLogger* logger, | 188 EventLogger* logger, |
| 189 DriveServiceInterface* drive_service, | 189 DriveServiceInterface* drive_service, |
| 190 base::SequencedTaskRunner* blocking_task_runner) | 190 base::SequencedTaskRunner* blocking_task_runner) |
| 191 : throttle_count_(0), | 191 : throttle_count_(0), |
| 192 wait_until_(base::Time::Now()), | 192 wait_until_(base::Time::Now()), |
| 193 disable_throttling_(false), | 193 disable_throttling_(false), |
| 194 logger_(logger), | 194 logger_(logger), |
| 195 drive_service_(drive_service), | 195 drive_service_(drive_service), |
| 196 blocking_task_runner_(blocking_task_runner), | 196 blocking_task_runner_(blocking_task_runner), |
| 197 uploader_(new DriveUploader(drive_service, blocking_task_runner)), | 197 uploader_(new DriveUploader(drive_service, blocking_task_runner)), |
| 198 pref_service_(pref_service), | 198 pref_service_(pref_service), |
| 199 weak_ptr_factory_(this) { | 199 weak_ptr_factory_(this) { |
| 200 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 200 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 201 | 201 |
| 202 for (int i = 0; i < NUM_QUEUES; ++i) | 202 for (int i = 0; i < NUM_QUEUES; ++i) |
| 203 queue_[i].reset(new JobQueue(kMaxJobCount[i], NUM_CONTEXT_TYPES)); | 203 queue_[i].reset(new JobQueue(kMaxJobCount[i], NUM_CONTEXT_TYPES)); |
| 204 | 204 |
| 205 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); | 205 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); |
| 206 } | 206 } |
| 207 | 207 |
| 208 JobScheduler::~JobScheduler() { | 208 JobScheduler::~JobScheduler() { |
| 209 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 209 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 210 | 210 |
| 211 size_t num_queued_jobs = 0; | 211 size_t num_queued_jobs = 0; |
| 212 for (int i = 0; i < NUM_QUEUES; ++i) | 212 for (int i = 0; i < NUM_QUEUES; ++i) |
| 213 num_queued_jobs += queue_[i]->GetNumberOfJobs(); | 213 num_queued_jobs += queue_[i]->GetNumberOfJobs(); |
| 214 DCHECK_EQ(num_queued_jobs, job_map_.size()); | 214 DCHECK_EQ(num_queued_jobs, job_map_.size()); |
| 215 | 215 |
| 216 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); | 216 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); |
| 217 } | 217 } |
| 218 | 218 |
| 219 std::vector<JobInfo> JobScheduler::GetJobInfoList() { | 219 std::vector<JobInfo> JobScheduler::GetJobInfoList() { |
| 220 std::vector<JobInfo> job_info_list; | 220 std::vector<JobInfo> job_info_list; |
| 221 for (JobIDMap::iterator iter(&job_map_); !iter.IsAtEnd(); iter.Advance()) | 221 for (JobIDMap::iterator iter(&job_map_); !iter.IsAtEnd(); iter.Advance()) |
| 222 job_info_list.push_back(iter.GetCurrentValue()->job_info); | 222 job_info_list.push_back(iter.GetCurrentValue()->job_info); |
| 223 return job_info_list; | 223 return job_info_list; |
| 224 } | 224 } |
| 225 | 225 |
| 226 void JobScheduler::AddObserver(JobListObserver* observer) { | 226 void JobScheduler::AddObserver(JobListObserver* observer) { |
| 227 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 227 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 228 observer_list_.AddObserver(observer); | 228 observer_list_.AddObserver(observer); |
| 229 } | 229 } |
| 230 | 230 |
| 231 void JobScheduler::RemoveObserver(JobListObserver* observer) { | 231 void JobScheduler::RemoveObserver(JobListObserver* observer) { |
| 232 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 232 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 233 observer_list_.RemoveObserver(observer); | 233 observer_list_.RemoveObserver(observer); |
| 234 } | 234 } |
| 235 | 235 |
| 236 void JobScheduler::CancelJob(JobID job_id) { | 236 void JobScheduler::CancelJob(JobID job_id) { |
| 237 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 237 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 238 | 238 |
| 239 JobEntry* job = job_map_.Lookup(job_id); | 239 JobEntry* job = job_map_.Lookup(job_id); |
| 240 if (job) { | 240 if (job) { |
| 241 if (job->job_info.state == STATE_RUNNING) { | 241 if (job->job_info.state == STATE_RUNNING) { |
| 242 // If the job is running an HTTP request, cancel it via |cancel_callback| | 242 // If the job is running an HTTP request, cancel it via |cancel_callback| |
| 243 // returned from the request, and wait for termination in the normal | 243 // returned from the request, and wait for termination in the normal |
| 244 // callback handler, OnJobDone. | 244 // callback handler, OnJobDone. |
| 245 if (!job->cancel_callback.is_null()) | 245 if (!job->cancel_callback.is_null()) |
| 246 job->cancel_callback.Run(); | 246 job->cancel_callback.Run(); |
| 247 } else { | 247 } else { |
| 248 AbortNotRunningJob(job, google_apis::DRIVE_CANCELLED); | 248 AbortNotRunningJob(job, google_apis::DRIVE_CANCELLED); |
| 249 } | 249 } |
| 250 } | 250 } |
| 251 } | 251 } |
| 252 | 252 |
| 253 void JobScheduler::CancelAllJobs() { | 253 void JobScheduler::CancelAllJobs() { |
| 254 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 254 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 255 | 255 |
| 256 // CancelJob may remove the entry from |job_map_|. That's OK. IDMap supports | 256 // CancelJob may remove the entry from |job_map_|. That's OK. IDMap supports |
| 257 // removable during iteration. | 257 // removable during iteration. |
| 258 for (JobIDMap::iterator iter(&job_map_); !iter.IsAtEnd(); iter.Advance()) | 258 for (JobIDMap::iterator iter(&job_map_); !iter.IsAtEnd(); iter.Advance()) |
| 259 CancelJob(iter.GetCurrentKey()); | 259 CancelJob(iter.GetCurrentKey()); |
| 260 } | 260 } |
| 261 | 261 |
| 262 void JobScheduler::GetAboutResource( | 262 void JobScheduler::GetAboutResource( |
| 263 const google_apis::AboutResourceCallback& callback) { | 263 const google_apis::AboutResourceCallback& callback) { |
| 264 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 264 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 265 DCHECK(!callback.is_null()); | 265 DCHECK(!callback.is_null()); |
| 266 | 266 |
| 267 JobEntry* new_job = CreateNewJob(TYPE_GET_ABOUT_RESOURCE); | 267 JobEntry* new_job = CreateNewJob(TYPE_GET_ABOUT_RESOURCE); |
| 268 new_job->task = base::Bind( | 268 new_job->task = base::Bind( |
| 269 &DriveServiceInterface::GetAboutResource, | 269 &DriveServiceInterface::GetAboutResource, |
| 270 base::Unretained(drive_service_), | 270 base::Unretained(drive_service_), |
| 271 base::Bind(&JobScheduler::OnGetAboutResourceJobDone, | 271 base::Bind(&JobScheduler::OnGetAboutResourceJobDone, |
| 272 weak_ptr_factory_.GetWeakPtr(), | 272 weak_ptr_factory_.GetWeakPtr(), |
| 273 new_job->job_info.job_id, | 273 new_job->job_info.job_id, |
| 274 callback)); | 274 callback)); |
| 275 new_job->abort_callback = CreateErrorRunCallback(callback); | 275 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 276 StartJob(new_job); | 276 StartJob(new_job); |
| 277 } | 277 } |
| 278 | 278 |
| 279 void JobScheduler::GetAppList(const google_apis::AppListCallback& callback) { | 279 void JobScheduler::GetAppList(const google_apis::AppListCallback& callback) { |
| 280 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 280 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 281 DCHECK(!callback.is_null()); | 281 DCHECK(!callback.is_null()); |
| 282 | 282 |
| 283 JobEntry* new_job = CreateNewJob(TYPE_GET_APP_LIST); | 283 JobEntry* new_job = CreateNewJob(TYPE_GET_APP_LIST); |
| 284 new_job->task = base::Bind( | 284 new_job->task = base::Bind( |
| 285 &DriveServiceInterface::GetAppList, | 285 &DriveServiceInterface::GetAppList, |
| 286 base::Unretained(drive_service_), | 286 base::Unretained(drive_service_), |
| 287 base::Bind(&JobScheduler::OnGetAppListJobDone, | 287 base::Bind(&JobScheduler::OnGetAppListJobDone, |
| 288 weak_ptr_factory_.GetWeakPtr(), | 288 weak_ptr_factory_.GetWeakPtr(), |
| 289 new_job->job_info.job_id, | 289 new_job->job_info.job_id, |
| 290 callback)); | 290 callback)); |
| 291 new_job->abort_callback = CreateErrorRunCallback(callback); | 291 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 292 StartJob(new_job); | 292 StartJob(new_job); |
| 293 } | 293 } |
| 294 | 294 |
| 295 void JobScheduler::GetAllFileList( | 295 void JobScheduler::GetAllFileList( |
| 296 const google_apis::FileListCallback& callback) { | 296 const google_apis::FileListCallback& callback) { |
| 297 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 297 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 298 DCHECK(!callback.is_null()); | 298 DCHECK(!callback.is_null()); |
| 299 | 299 |
| 300 JobEntry* new_job = CreateNewJob(TYPE_GET_ALL_RESOURCE_LIST); | 300 JobEntry* new_job = CreateNewJob(TYPE_GET_ALL_RESOURCE_LIST); |
| 301 new_job->task = base::Bind( | 301 new_job->task = base::Bind( |
| 302 &DriveServiceInterface::GetAllFileList, | 302 &DriveServiceInterface::GetAllFileList, |
| 303 base::Unretained(drive_service_), | 303 base::Unretained(drive_service_), |
| 304 base::Bind(&JobScheduler::OnGetFileListJobDone, | 304 base::Bind(&JobScheduler::OnGetFileListJobDone, |
| 305 weak_ptr_factory_.GetWeakPtr(), | 305 weak_ptr_factory_.GetWeakPtr(), |
| 306 new_job->job_info.job_id, | 306 new_job->job_info.job_id, |
| 307 callback)); | 307 callback)); |
| 308 new_job->abort_callback = CreateErrorRunCallback(callback); | 308 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 309 StartJob(new_job); | 309 StartJob(new_job); |
| 310 } | 310 } |
| 311 | 311 |
| 312 void JobScheduler::GetFileListInDirectory( | 312 void JobScheduler::GetFileListInDirectory( |
| 313 const std::string& directory_resource_id, | 313 const std::string& directory_resource_id, |
| 314 const google_apis::FileListCallback& callback) { | 314 const google_apis::FileListCallback& callback) { |
| 315 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 315 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 316 DCHECK(!callback.is_null()); | 316 DCHECK(!callback.is_null()); |
| 317 | 317 |
| 318 JobEntry* new_job = CreateNewJob( | 318 JobEntry* new_job = CreateNewJob( |
| 319 TYPE_GET_RESOURCE_LIST_IN_DIRECTORY); | 319 TYPE_GET_RESOURCE_LIST_IN_DIRECTORY); |
| 320 new_job->task = base::Bind( | 320 new_job->task = base::Bind( |
| 321 &DriveServiceInterface::GetFileListInDirectory, | 321 &DriveServiceInterface::GetFileListInDirectory, |
| 322 base::Unretained(drive_service_), | 322 base::Unretained(drive_service_), |
| 323 directory_resource_id, | 323 directory_resource_id, |
| 324 base::Bind(&JobScheduler::OnGetFileListJobDone, | 324 base::Bind(&JobScheduler::OnGetFileListJobDone, |
| 325 weak_ptr_factory_.GetWeakPtr(), | 325 weak_ptr_factory_.GetWeakPtr(), |
| 326 new_job->job_info.job_id, | 326 new_job->job_info.job_id, |
| 327 callback)); | 327 callback)); |
| 328 new_job->abort_callback = CreateErrorRunCallback(callback); | 328 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 329 StartJob(new_job); | 329 StartJob(new_job); |
| 330 } | 330 } |
| 331 | 331 |
| 332 void JobScheduler::Search(const std::string& search_query, | 332 void JobScheduler::Search(const std::string& search_query, |
| 333 const google_apis::FileListCallback& callback) { | 333 const google_apis::FileListCallback& callback) { |
| 334 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 334 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 335 DCHECK(!callback.is_null()); | 335 DCHECK(!callback.is_null()); |
| 336 | 336 |
| 337 JobEntry* new_job = CreateNewJob(TYPE_SEARCH); | 337 JobEntry* new_job = CreateNewJob(TYPE_SEARCH); |
| 338 new_job->task = base::Bind( | 338 new_job->task = base::Bind( |
| 339 &DriveServiceInterface::Search, | 339 &DriveServiceInterface::Search, |
| 340 base::Unretained(drive_service_), | 340 base::Unretained(drive_service_), |
| 341 search_query, | 341 search_query, |
| 342 base::Bind(&JobScheduler::OnGetFileListJobDone, | 342 base::Bind(&JobScheduler::OnGetFileListJobDone, |
| 343 weak_ptr_factory_.GetWeakPtr(), | 343 weak_ptr_factory_.GetWeakPtr(), |
| 344 new_job->job_info.job_id, | 344 new_job->job_info.job_id, |
| 345 callback)); | 345 callback)); |
| 346 new_job->abort_callback = CreateErrorRunCallback(callback); | 346 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 347 StartJob(new_job); | 347 StartJob(new_job); |
| 348 } | 348 } |
| 349 | 349 |
| 350 void JobScheduler::GetChangeList( | 350 void JobScheduler::GetChangeList( |
| 351 int64 start_changestamp, | 351 int64 start_changestamp, |
| 352 const google_apis::ChangeListCallback& callback) { | 352 const google_apis::ChangeListCallback& callback) { |
| 353 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 353 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 354 DCHECK(!callback.is_null()); | 354 DCHECK(!callback.is_null()); |
| 355 | 355 |
| 356 JobEntry* new_job = CreateNewJob(TYPE_GET_CHANGE_LIST); | 356 JobEntry* new_job = CreateNewJob(TYPE_GET_CHANGE_LIST); |
| 357 new_job->task = base::Bind( | 357 new_job->task = base::Bind( |
| 358 &DriveServiceInterface::GetChangeList, | 358 &DriveServiceInterface::GetChangeList, |
| 359 base::Unretained(drive_service_), | 359 base::Unretained(drive_service_), |
| 360 start_changestamp, | 360 start_changestamp, |
| 361 base::Bind(&JobScheduler::OnGetChangeListJobDone, | 361 base::Bind(&JobScheduler::OnGetChangeListJobDone, |
| 362 weak_ptr_factory_.GetWeakPtr(), | 362 weak_ptr_factory_.GetWeakPtr(), |
| 363 new_job->job_info.job_id, | 363 new_job->job_info.job_id, |
| 364 callback)); | 364 callback)); |
| 365 new_job->abort_callback = CreateErrorRunCallback(callback); | 365 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 366 StartJob(new_job); | 366 StartJob(new_job); |
| 367 } | 367 } |
| 368 | 368 |
| 369 void JobScheduler::GetRemainingChangeList( | 369 void JobScheduler::GetRemainingChangeList( |
| 370 const GURL& next_link, | 370 const GURL& next_link, |
| 371 const google_apis::ChangeListCallback& callback) { | 371 const google_apis::ChangeListCallback& callback) { |
| 372 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 372 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 373 DCHECK(!callback.is_null()); | 373 DCHECK(!callback.is_null()); |
| 374 | 374 |
| 375 JobEntry* new_job = CreateNewJob(TYPE_GET_REMAINING_CHANGE_LIST); | 375 JobEntry* new_job = CreateNewJob(TYPE_GET_REMAINING_CHANGE_LIST); |
| 376 new_job->task = base::Bind( | 376 new_job->task = base::Bind( |
| 377 &DriveServiceInterface::GetRemainingChangeList, | 377 &DriveServiceInterface::GetRemainingChangeList, |
| 378 base::Unretained(drive_service_), | 378 base::Unretained(drive_service_), |
| 379 next_link, | 379 next_link, |
| 380 base::Bind(&JobScheduler::OnGetChangeListJobDone, | 380 base::Bind(&JobScheduler::OnGetChangeListJobDone, |
| 381 weak_ptr_factory_.GetWeakPtr(), | 381 weak_ptr_factory_.GetWeakPtr(), |
| 382 new_job->job_info.job_id, | 382 new_job->job_info.job_id, |
| 383 callback)); | 383 callback)); |
| 384 new_job->abort_callback = CreateErrorRunCallback(callback); | 384 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 385 StartJob(new_job); | 385 StartJob(new_job); |
| 386 } | 386 } |
| 387 | 387 |
| 388 void JobScheduler::GetRemainingFileList( | 388 void JobScheduler::GetRemainingFileList( |
| 389 const GURL& next_link, | 389 const GURL& next_link, |
| 390 const google_apis::FileListCallback& callback) { | 390 const google_apis::FileListCallback& callback) { |
| 391 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 391 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 392 DCHECK(!callback.is_null()); | 392 DCHECK(!callback.is_null()); |
| 393 | 393 |
| 394 JobEntry* new_job = CreateNewJob(TYPE_GET_REMAINING_FILE_LIST); | 394 JobEntry* new_job = CreateNewJob(TYPE_GET_REMAINING_FILE_LIST); |
| 395 new_job->task = base::Bind( | 395 new_job->task = base::Bind( |
| 396 &DriveServiceInterface::GetRemainingFileList, | 396 &DriveServiceInterface::GetRemainingFileList, |
| 397 base::Unretained(drive_service_), | 397 base::Unretained(drive_service_), |
| 398 next_link, | 398 next_link, |
| 399 base::Bind(&JobScheduler::OnGetFileListJobDone, | 399 base::Bind(&JobScheduler::OnGetFileListJobDone, |
| 400 weak_ptr_factory_.GetWeakPtr(), | 400 weak_ptr_factory_.GetWeakPtr(), |
| 401 new_job->job_info.job_id, | 401 new_job->job_info.job_id, |
| 402 callback)); | 402 callback)); |
| 403 new_job->abort_callback = CreateErrorRunCallback(callback); | 403 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 404 StartJob(new_job); | 404 StartJob(new_job); |
| 405 } | 405 } |
| 406 | 406 |
| 407 void JobScheduler::GetFileResource( | 407 void JobScheduler::GetFileResource( |
| 408 const std::string& resource_id, | 408 const std::string& resource_id, |
| 409 const ClientContext& context, | 409 const ClientContext& context, |
| 410 const google_apis::FileResourceCallback& callback) { | 410 const google_apis::FileResourceCallback& callback) { |
| 411 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 411 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 412 DCHECK(!callback.is_null()); | 412 DCHECK(!callback.is_null()); |
| 413 | 413 |
| 414 JobEntry* new_job = CreateNewJob(TYPE_GET_RESOURCE_ENTRY); | 414 JobEntry* new_job = CreateNewJob(TYPE_GET_RESOURCE_ENTRY); |
| 415 new_job->context = context; | 415 new_job->context = context; |
| 416 new_job->task = base::Bind( | 416 new_job->task = base::Bind( |
| 417 &DriveServiceInterface::GetFileResource, | 417 &DriveServiceInterface::GetFileResource, |
| 418 base::Unretained(drive_service_), | 418 base::Unretained(drive_service_), |
| 419 resource_id, | 419 resource_id, |
| 420 base::Bind(&JobScheduler::OnGetFileResourceJobDone, | 420 base::Bind(&JobScheduler::OnGetFileResourceJobDone, |
| 421 weak_ptr_factory_.GetWeakPtr(), | 421 weak_ptr_factory_.GetWeakPtr(), |
| 422 new_job->job_info.job_id, | 422 new_job->job_info.job_id, |
| 423 callback)); | 423 callback)); |
| 424 new_job->abort_callback = CreateErrorRunCallback(callback); | 424 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 425 StartJob(new_job); | 425 StartJob(new_job); |
| 426 } | 426 } |
| 427 | 427 |
| 428 void JobScheduler::GetShareUrl( | 428 void JobScheduler::GetShareUrl( |
| 429 const std::string& resource_id, | 429 const std::string& resource_id, |
| 430 const GURL& embed_origin, | 430 const GURL& embed_origin, |
| 431 const ClientContext& context, | 431 const ClientContext& context, |
| 432 const google_apis::GetShareUrlCallback& callback) { | 432 const google_apis::GetShareUrlCallback& callback) { |
| 433 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 433 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 434 DCHECK(!callback.is_null()); | 434 DCHECK(!callback.is_null()); |
| 435 | 435 |
| 436 JobEntry* new_job = CreateNewJob(TYPE_GET_SHARE_URL); | 436 JobEntry* new_job = CreateNewJob(TYPE_GET_SHARE_URL); |
| 437 new_job->context = context; | 437 new_job->context = context; |
| 438 new_job->task = base::Bind( | 438 new_job->task = base::Bind( |
| 439 &DriveServiceInterface::GetShareUrl, | 439 &DriveServiceInterface::GetShareUrl, |
| 440 base::Unretained(drive_service_), | 440 base::Unretained(drive_service_), |
| 441 resource_id, | 441 resource_id, |
| 442 embed_origin, | 442 embed_origin, |
| 443 base::Bind(&JobScheduler::OnGetShareUrlJobDone, | 443 base::Bind(&JobScheduler::OnGetShareUrlJobDone, |
| 444 weak_ptr_factory_.GetWeakPtr(), | 444 weak_ptr_factory_.GetWeakPtr(), |
| 445 new_job->job_info.job_id, | 445 new_job->job_info.job_id, |
| 446 callback)); | 446 callback)); |
| 447 new_job->abort_callback = CreateErrorRunCallback(callback); | 447 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 448 StartJob(new_job); | 448 StartJob(new_job); |
| 449 } | 449 } |
| 450 | 450 |
| 451 void JobScheduler::TrashResource( | 451 void JobScheduler::TrashResource( |
| 452 const std::string& resource_id, | 452 const std::string& resource_id, |
| 453 const ClientContext& context, | 453 const ClientContext& context, |
| 454 const google_apis::EntryActionCallback& callback) { | 454 const google_apis::EntryActionCallback& callback) { |
| 455 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 455 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 456 DCHECK(!callback.is_null()); | 456 DCHECK(!callback.is_null()); |
| 457 | 457 |
| 458 JobEntry* new_job = CreateNewJob(TYPE_TRASH_RESOURCE); | 458 JobEntry* new_job = CreateNewJob(TYPE_TRASH_RESOURCE); |
| 459 new_job->context = context; | 459 new_job->context = context; |
| 460 new_job->task = base::Bind( | 460 new_job->task = base::Bind( |
| 461 &DriveServiceInterface::TrashResource, | 461 &DriveServiceInterface::TrashResource, |
| 462 base::Unretained(drive_service_), | 462 base::Unretained(drive_service_), |
| 463 resource_id, | 463 resource_id, |
| 464 base::Bind(&JobScheduler::OnEntryActionJobDone, | 464 base::Bind(&JobScheduler::OnEntryActionJobDone, |
| 465 weak_ptr_factory_.GetWeakPtr(), | 465 weak_ptr_factory_.GetWeakPtr(), |
| 466 new_job->job_info.job_id, | 466 new_job->job_info.job_id, |
| 467 callback)); | 467 callback)); |
| 468 new_job->abort_callback = callback; | 468 new_job->abort_callback = callback; |
| 469 StartJob(new_job); | 469 StartJob(new_job); |
| 470 } | 470 } |
| 471 | 471 |
| 472 void JobScheduler::CopyResource( | 472 void JobScheduler::CopyResource( |
| 473 const std::string& resource_id, | 473 const std::string& resource_id, |
| 474 const std::string& parent_resource_id, | 474 const std::string& parent_resource_id, |
| 475 const std::string& new_title, | 475 const std::string& new_title, |
| 476 const base::Time& last_modified, | 476 const base::Time& last_modified, |
| 477 const google_apis::FileResourceCallback& callback) { | 477 const google_apis::FileResourceCallback& callback) { |
| 478 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 478 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 479 DCHECK(!callback.is_null()); | 479 DCHECK(!callback.is_null()); |
| 480 | 480 |
| 481 JobEntry* new_job = CreateNewJob(TYPE_COPY_RESOURCE); | 481 JobEntry* new_job = CreateNewJob(TYPE_COPY_RESOURCE); |
| 482 new_job->task = base::Bind( | 482 new_job->task = base::Bind( |
| 483 &DriveServiceInterface::CopyResource, | 483 &DriveServiceInterface::CopyResource, |
| 484 base::Unretained(drive_service_), | 484 base::Unretained(drive_service_), |
| 485 resource_id, | 485 resource_id, |
| 486 parent_resource_id, | 486 parent_resource_id, |
| 487 new_title, | 487 new_title, |
| 488 last_modified, | 488 last_modified, |
| 489 base::Bind(&JobScheduler::OnGetFileResourceJobDone, | 489 base::Bind(&JobScheduler::OnGetFileResourceJobDone, |
| 490 weak_ptr_factory_.GetWeakPtr(), | 490 weak_ptr_factory_.GetWeakPtr(), |
| 491 new_job->job_info.job_id, | 491 new_job->job_info.job_id, |
| 492 callback)); | 492 callback)); |
| 493 new_job->abort_callback = CreateErrorRunCallback(callback); | 493 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 494 StartJob(new_job); | 494 StartJob(new_job); |
| 495 } | 495 } |
| 496 | 496 |
| 497 void JobScheduler::UpdateResource( | 497 void JobScheduler::UpdateResource( |
| 498 const std::string& resource_id, | 498 const std::string& resource_id, |
| 499 const std::string& parent_resource_id, | 499 const std::string& parent_resource_id, |
| 500 const std::string& new_title, | 500 const std::string& new_title, |
| 501 const base::Time& last_modified, | 501 const base::Time& last_modified, |
| 502 const base::Time& last_viewed_by_me, | 502 const base::Time& last_viewed_by_me, |
| 503 const google_apis::drive::Properties& properties, | 503 const google_apis::drive::Properties& properties, |
| 504 const ClientContext& context, | 504 const ClientContext& context, |
| 505 const google_apis::FileResourceCallback& callback) { | 505 const google_apis::FileResourceCallback& callback) { |
| 506 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 506 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 507 DCHECK(!callback.is_null()); | 507 DCHECK(!callback.is_null()); |
| 508 | 508 |
| 509 JobEntry* new_job = CreateNewJob(TYPE_UPDATE_RESOURCE); | 509 JobEntry* new_job = CreateNewJob(TYPE_UPDATE_RESOURCE); |
| 510 new_job->context = context; | 510 new_job->context = context; |
| 511 new_job->task = base::Bind(&DriveServiceInterface::UpdateResource, | 511 new_job->task = base::Bind(&DriveServiceInterface::UpdateResource, |
| 512 base::Unretained(drive_service_), resource_id, | 512 base::Unretained(drive_service_), resource_id, |
| 513 parent_resource_id, new_title, last_modified, | 513 parent_resource_id, new_title, last_modified, |
| 514 last_viewed_by_me, properties, | 514 last_viewed_by_me, properties, |
| 515 base::Bind(&JobScheduler::OnGetFileResourceJobDone, | 515 base::Bind(&JobScheduler::OnGetFileResourceJobDone, |
| 516 weak_ptr_factory_.GetWeakPtr(), | 516 weak_ptr_factory_.GetWeakPtr(), |
| 517 new_job->job_info.job_id, callback)); | 517 new_job->job_info.job_id, callback)); |
| 518 new_job->abort_callback = CreateErrorRunCallback(callback); | 518 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 519 StartJob(new_job); | 519 StartJob(new_job); |
| 520 } | 520 } |
| 521 | 521 |
| 522 void JobScheduler::AddResourceToDirectory( | 522 void JobScheduler::AddResourceToDirectory( |
| 523 const std::string& parent_resource_id, | 523 const std::string& parent_resource_id, |
| 524 const std::string& resource_id, | 524 const std::string& resource_id, |
| 525 const google_apis::EntryActionCallback& callback) { | 525 const google_apis::EntryActionCallback& callback) { |
| 526 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 526 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 527 DCHECK(!callback.is_null()); | 527 DCHECK(!callback.is_null()); |
| 528 | 528 |
| 529 JobEntry* new_job = CreateNewJob(TYPE_ADD_RESOURCE_TO_DIRECTORY); | 529 JobEntry* new_job = CreateNewJob(TYPE_ADD_RESOURCE_TO_DIRECTORY); |
| 530 new_job->task = base::Bind( | 530 new_job->task = base::Bind( |
| 531 &DriveServiceInterface::AddResourceToDirectory, | 531 &DriveServiceInterface::AddResourceToDirectory, |
| 532 base::Unretained(drive_service_), | 532 base::Unretained(drive_service_), |
| 533 parent_resource_id, | 533 parent_resource_id, |
| 534 resource_id, | 534 resource_id, |
| 535 base::Bind(&JobScheduler::OnEntryActionJobDone, | 535 base::Bind(&JobScheduler::OnEntryActionJobDone, |
| 536 weak_ptr_factory_.GetWeakPtr(), | 536 weak_ptr_factory_.GetWeakPtr(), |
| 537 new_job->job_info.job_id, | 537 new_job->job_info.job_id, |
| 538 callback)); | 538 callback)); |
| 539 new_job->abort_callback = callback; | 539 new_job->abort_callback = callback; |
| 540 StartJob(new_job); | 540 StartJob(new_job); |
| 541 } | 541 } |
| 542 | 542 |
| 543 void JobScheduler::RemoveResourceFromDirectory( | 543 void JobScheduler::RemoveResourceFromDirectory( |
| 544 const std::string& parent_resource_id, | 544 const std::string& parent_resource_id, |
| 545 const std::string& resource_id, | 545 const std::string& resource_id, |
| 546 const ClientContext& context, | 546 const ClientContext& context, |
| 547 const google_apis::EntryActionCallback& callback) { | 547 const google_apis::EntryActionCallback& callback) { |
| 548 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 548 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 549 | 549 |
| 550 JobEntry* new_job = CreateNewJob(TYPE_REMOVE_RESOURCE_FROM_DIRECTORY); | 550 JobEntry* new_job = CreateNewJob(TYPE_REMOVE_RESOURCE_FROM_DIRECTORY); |
| 551 new_job->context = context; | 551 new_job->context = context; |
| 552 new_job->task = base::Bind( | 552 new_job->task = base::Bind( |
| 553 &DriveServiceInterface::RemoveResourceFromDirectory, | 553 &DriveServiceInterface::RemoveResourceFromDirectory, |
| 554 base::Unretained(drive_service_), | 554 base::Unretained(drive_service_), |
| 555 parent_resource_id, | 555 parent_resource_id, |
| 556 resource_id, | 556 resource_id, |
| 557 base::Bind(&JobScheduler::OnEntryActionJobDone, | 557 base::Bind(&JobScheduler::OnEntryActionJobDone, |
| 558 weak_ptr_factory_.GetWeakPtr(), | 558 weak_ptr_factory_.GetWeakPtr(), |
| 559 new_job->job_info.job_id, | 559 new_job->job_info.job_id, |
| 560 callback)); | 560 callback)); |
| 561 new_job->abort_callback = callback; | 561 new_job->abort_callback = callback; |
| 562 StartJob(new_job); | 562 StartJob(new_job); |
| 563 } | 563 } |
| 564 | 564 |
| 565 void JobScheduler::AddNewDirectory( | 565 void JobScheduler::AddNewDirectory( |
| 566 const std::string& parent_resource_id, | 566 const std::string& parent_resource_id, |
| 567 const std::string& directory_title, | 567 const std::string& directory_title, |
| 568 const DriveServiceInterface::AddNewDirectoryOptions& options, | 568 const DriveServiceInterface::AddNewDirectoryOptions& options, |
| 569 const ClientContext& context, | 569 const ClientContext& context, |
| 570 const google_apis::FileResourceCallback& callback) { | 570 const google_apis::FileResourceCallback& callback) { |
| 571 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 571 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 572 | 572 |
| 573 JobEntry* new_job = CreateNewJob(TYPE_ADD_NEW_DIRECTORY); | 573 JobEntry* new_job = CreateNewJob(TYPE_ADD_NEW_DIRECTORY); |
| 574 new_job->context = context; | 574 new_job->context = context; |
| 575 new_job->task = base::Bind( | 575 new_job->task = base::Bind( |
| 576 &DriveServiceInterface::AddNewDirectory, | 576 &DriveServiceInterface::AddNewDirectory, |
| 577 base::Unretained(drive_service_), | 577 base::Unretained(drive_service_), |
| 578 parent_resource_id, | 578 parent_resource_id, |
| 579 directory_title, | 579 directory_title, |
| 580 options, | 580 options, |
| 581 base::Bind(&JobScheduler::OnGetFileResourceJobDone, | 581 base::Bind(&JobScheduler::OnGetFileResourceJobDone, |
| 582 weak_ptr_factory_.GetWeakPtr(), | 582 weak_ptr_factory_.GetWeakPtr(), |
| 583 new_job->job_info.job_id, | 583 new_job->job_info.job_id, |
| 584 callback)); | 584 callback)); |
| 585 new_job->abort_callback = CreateErrorRunCallback(callback); | 585 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 586 StartJob(new_job); | 586 StartJob(new_job); |
| 587 } | 587 } |
| 588 | 588 |
| 589 JobID JobScheduler::DownloadFile( | 589 JobID JobScheduler::DownloadFile( |
| 590 const base::FilePath& virtual_path, | 590 const base::FilePath& virtual_path, |
| 591 int64 expected_file_size, | 591 int64 expected_file_size, |
| 592 const base::FilePath& local_cache_path, | 592 const base::FilePath& local_cache_path, |
| 593 const std::string& resource_id, | 593 const std::string& resource_id, |
| 594 const ClientContext& context, | 594 const ClientContext& context, |
| 595 const google_apis::DownloadActionCallback& download_action_callback, | 595 const google_apis::DownloadActionCallback& download_action_callback, |
| 596 const google_apis::GetContentCallback& get_content_callback) { | 596 const google_apis::GetContentCallback& get_content_callback) { |
| 597 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 597 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 598 | 598 |
| 599 // Temporary histogram for crbug.com/229650. | 599 // Temporary histogram for crbug.com/229650. |
| 600 CollectCopyHistogramSample("Drive.DownloadFromDriveFileSize", | 600 CollectCopyHistogramSample("Drive.DownloadFromDriveFileSize", |
| 601 expected_file_size); | 601 expected_file_size); |
| 602 | 602 |
| 603 JobEntry* new_job = CreateNewJob(TYPE_DOWNLOAD_FILE); | 603 JobEntry* new_job = CreateNewJob(TYPE_DOWNLOAD_FILE); |
| 604 new_job->job_info.file_path = virtual_path; | 604 new_job->job_info.file_path = virtual_path; |
| 605 new_job->job_info.num_total_bytes = expected_file_size; | 605 new_job->job_info.num_total_bytes = expected_file_size; |
| 606 new_job->context = context; | 606 new_job->context = context; |
| 607 new_job->task = base::Bind( | 607 new_job->task = base::Bind( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 624 | 624 |
| 625 void JobScheduler::UploadNewFile( | 625 void JobScheduler::UploadNewFile( |
| 626 const std::string& parent_resource_id, | 626 const std::string& parent_resource_id, |
| 627 const base::FilePath& drive_file_path, | 627 const base::FilePath& drive_file_path, |
| 628 const base::FilePath& local_file_path, | 628 const base::FilePath& local_file_path, |
| 629 const std::string& title, | 629 const std::string& title, |
| 630 const std::string& content_type, | 630 const std::string& content_type, |
| 631 const DriveUploader::UploadNewFileOptions& options, | 631 const DriveUploader::UploadNewFileOptions& options, |
| 632 const ClientContext& context, | 632 const ClientContext& context, |
| 633 const google_apis::FileResourceCallback& callback) { | 633 const google_apis::FileResourceCallback& callback) { |
| 634 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 634 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 635 | 635 |
| 636 JobEntry* new_job = CreateNewJob(TYPE_UPLOAD_NEW_FILE); | 636 JobEntry* new_job = CreateNewJob(TYPE_UPLOAD_NEW_FILE); |
| 637 new_job->job_info.file_path = drive_file_path; | 637 new_job->job_info.file_path = drive_file_path; |
| 638 new_job->context = context; | 638 new_job->context = context; |
| 639 | 639 |
| 640 GetFileSizeForJob( | 640 GetFileSizeForJob( |
| 641 blocking_task_runner_, local_file_path, | 641 blocking_task_runner_, local_file_path, |
| 642 base::Bind(&JobScheduler::OnGotFileSizeForJob, | 642 base::Bind(&JobScheduler::OnGotFileSizeForJob, |
| 643 weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id, | 643 weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id, |
| 644 "Drive.UploadToDriveFileSize")); | 644 "Drive.UploadToDriveFileSize")); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 668 } | 668 } |
| 669 | 669 |
| 670 void JobScheduler::UploadExistingFile( | 670 void JobScheduler::UploadExistingFile( |
| 671 const std::string& resource_id, | 671 const std::string& resource_id, |
| 672 const base::FilePath& drive_file_path, | 672 const base::FilePath& drive_file_path, |
| 673 const base::FilePath& local_file_path, | 673 const base::FilePath& local_file_path, |
| 674 const std::string& content_type, | 674 const std::string& content_type, |
| 675 const DriveUploader::UploadExistingFileOptions& options, | 675 const DriveUploader::UploadExistingFileOptions& options, |
| 676 const ClientContext& context, | 676 const ClientContext& context, |
| 677 const google_apis::FileResourceCallback& callback) { | 677 const google_apis::FileResourceCallback& callback) { |
| 678 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 678 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 679 | 679 |
| 680 JobEntry* new_job = CreateNewJob(TYPE_UPLOAD_EXISTING_FILE); | 680 JobEntry* new_job = CreateNewJob(TYPE_UPLOAD_EXISTING_FILE); |
| 681 new_job->job_info.file_path = drive_file_path; | 681 new_job->job_info.file_path = drive_file_path; |
| 682 new_job->context = context; | 682 new_job->context = context; |
| 683 | 683 |
| 684 GetFileSizeForJob( | 684 GetFileSizeForJob( |
| 685 blocking_task_runner_, local_file_path, | 685 blocking_task_runner_, local_file_path, |
| 686 base::Bind(&JobScheduler::OnGotFileSizeForJob, | 686 base::Bind(&JobScheduler::OnGotFileSizeForJob, |
| 687 weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id, | 687 weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id, |
| 688 "Drive.UploadToDriveFileSize")); | 688 "Drive.UploadToDriveFileSize")); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 708 new_job->task = base::Bind(&RunUploadExistingFile, uploader_.get(), params); | 708 new_job->task = base::Bind(&RunUploadExistingFile, uploader_.get(), params); |
| 709 new_job->abort_callback = CreateErrorRunCallback(callback); | 709 new_job->abort_callback = CreateErrorRunCallback(callback); |
| 710 StartJob(new_job); | 710 StartJob(new_job); |
| 711 } | 711 } |
| 712 | 712 |
| 713 void JobScheduler::AddPermission( | 713 void JobScheduler::AddPermission( |
| 714 const std::string& resource_id, | 714 const std::string& resource_id, |
| 715 const std::string& email, | 715 const std::string& email, |
| 716 google_apis::drive::PermissionRole role, | 716 google_apis::drive::PermissionRole role, |
| 717 const google_apis::EntryActionCallback& callback) { | 717 const google_apis::EntryActionCallback& callback) { |
| 718 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 718 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 719 DCHECK(!callback.is_null()); | 719 DCHECK(!callback.is_null()); |
| 720 | 720 |
| 721 JobEntry* new_job = CreateNewJob(TYPE_ADD_PERMISSION); | 721 JobEntry* new_job = CreateNewJob(TYPE_ADD_PERMISSION); |
| 722 new_job->task = base::Bind(&DriveServiceInterface::AddPermission, | 722 new_job->task = base::Bind(&DriveServiceInterface::AddPermission, |
| 723 base::Unretained(drive_service_), | 723 base::Unretained(drive_service_), |
| 724 resource_id, | 724 resource_id, |
| 725 email, | 725 email, |
| 726 role, | 726 role, |
| 727 base::Bind(&JobScheduler::OnEntryActionJobDone, | 727 base::Bind(&JobScheduler::OnEntryActionJobDone, |
| 728 weak_ptr_factory_.GetWeakPtr(), | 728 weak_ptr_factory_.GetWeakPtr(), |
| (...skipping 11 matching lines...) Expand all Loading... |
| 740 | 740 |
| 741 void JobScheduler::StartJob(JobEntry* job) { | 741 void JobScheduler::StartJob(JobEntry* job) { |
| 742 DCHECK(!job->task.is_null()); | 742 DCHECK(!job->task.is_null()); |
| 743 | 743 |
| 744 QueueJob(job->job_info.job_id); | 744 QueueJob(job->job_info.job_id); |
| 745 NotifyJobAdded(job->job_info); | 745 NotifyJobAdded(job->job_info); |
| 746 DoJobLoop(GetJobQueueType(job->job_info.job_type)); | 746 DoJobLoop(GetJobQueueType(job->job_info.job_type)); |
| 747 } | 747 } |
| 748 | 748 |
| 749 void JobScheduler::QueueJob(JobID job_id) { | 749 void JobScheduler::QueueJob(JobID job_id) { |
| 750 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 750 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 751 | 751 |
| 752 JobEntry* job_entry = job_map_.Lookup(job_id); | 752 JobEntry* job_entry = job_map_.Lookup(job_id); |
| 753 DCHECK(job_entry); | 753 DCHECK(job_entry); |
| 754 const JobInfo& job_info = job_entry->job_info; | 754 const JobInfo& job_info = job_entry->job_info; |
| 755 | 755 |
| 756 const QueueType queue_type = GetJobQueueType(job_info.job_type); | 756 const QueueType queue_type = GetJobQueueType(job_info.job_type); |
| 757 queue_[queue_type]->Push(job_id, job_entry->context.type); | 757 queue_[queue_type]->Push(job_id, job_entry->context.type); |
| 758 | 758 |
| 759 // Temporary histogram for crbug.com/229650. | 759 // Temporary histogram for crbug.com/229650. |
| 760 if (job_info.job_type == TYPE_DOWNLOAD_FILE || | 760 if (job_info.job_type == TYPE_DOWNLOAD_FILE || |
| (...skipping 12 matching lines...) Expand all Loading... |
| 773 const std::string retry_prefix = job_entry->retry_count > 0 ? | 773 const std::string retry_prefix = job_entry->retry_count > 0 ? |
| 774 base::StringPrintf(" (retry %d)", job_entry->retry_count) : ""; | 774 base::StringPrintf(" (retry %d)", job_entry->retry_count) : ""; |
| 775 logger_->Log(logging::LOG_INFO, | 775 logger_->Log(logging::LOG_INFO, |
| 776 "Job queued%s: %s - %s", | 776 "Job queued%s: %s - %s", |
| 777 retry_prefix.c_str(), | 777 retry_prefix.c_str(), |
| 778 job_info.ToString().c_str(), | 778 job_info.ToString().c_str(), |
| 779 GetQueueInfo(queue_type).c_str()); | 779 GetQueueInfo(queue_type).c_str()); |
| 780 } | 780 } |
| 781 | 781 |
| 782 void JobScheduler::DoJobLoop(QueueType queue_type) { | 782 void JobScheduler::DoJobLoop(QueueType queue_type) { |
| 783 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 783 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 784 | 784 |
| 785 const int accepted_priority = GetCurrentAcceptedPriority(queue_type); | 785 const int accepted_priority = GetCurrentAcceptedPriority(queue_type); |
| 786 | 786 |
| 787 // Abort all USER_INITAITED jobs when not accepted. | 787 // Abort all USER_INITAITED jobs when not accepted. |
| 788 if (accepted_priority < USER_INITIATED) { | 788 if (accepted_priority < USER_INITIATED) { |
| 789 std::vector<JobID> jobs; | 789 std::vector<JobID> jobs; |
| 790 queue_[queue_type]->GetQueuedJobs(USER_INITIATED, &jobs); | 790 queue_[queue_type]->GetQueuedJobs(USER_INITIATED, &jobs); |
| 791 for (size_t i = 0; i < jobs.size(); ++i) { | 791 for (size_t i = 0; i < jobs.size(); ++i) { |
| 792 JobEntry* job = job_map_.Lookup(jobs[i]); | 792 JobEntry* job = job_map_.Lookup(jobs[i]); |
| 793 DCHECK(job); | 793 DCHECK(job); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 824 | 824 |
| 825 UpdateWait(); | 825 UpdateWait(); |
| 826 | 826 |
| 827 logger_->Log(logging::LOG_INFO, | 827 logger_->Log(logging::LOG_INFO, |
| 828 "Job started: %s - %s", | 828 "Job started: %s - %s", |
| 829 job_info->ToString().c_str(), | 829 job_info->ToString().c_str(), |
| 830 GetQueueInfo(queue_type).c_str()); | 830 GetQueueInfo(queue_type).c_str()); |
| 831 } | 831 } |
| 832 | 832 |
| 833 int JobScheduler::GetCurrentAcceptedPriority(QueueType queue_type) { | 833 int JobScheduler::GetCurrentAcceptedPriority(QueueType queue_type) { |
| 834 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 834 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 835 | 835 |
| 836 const int kNoJobShouldRun = -1; | 836 const int kNoJobShouldRun = -1; |
| 837 | 837 |
| 838 // Should stop if Drive was disabled while running the fetch loop. | 838 // Should stop if Drive was disabled while running the fetch loop. |
| 839 if (pref_service_->GetBoolean(prefs::kDisableDrive)) | 839 if (pref_service_->GetBoolean(prefs::kDisableDrive)) |
| 840 return kNoJobShouldRun; | 840 return kNoJobShouldRun; |
| 841 | 841 |
| 842 // Should stop if the network is not online. | 842 // Should stop if the network is not online. |
| 843 if (net::NetworkChangeNotifier::IsOffline()) | 843 if (net::NetworkChangeNotifier::IsOffline()) |
| 844 return kNoJobShouldRun; | 844 return kNoJobShouldRun; |
| 845 | 845 |
| 846 // For the file queue, if it is on cellular network, only user initiated | 846 // For the file queue, if it is on cellular network, only user initiated |
| 847 // operations are allowed to start. | 847 // operations are allowed to start. |
| 848 if (queue_type == FILE_QUEUE && | 848 if (queue_type == FILE_QUEUE && |
| 849 pref_service_->GetBoolean(prefs::kDisableDriveOverCellular) && | 849 pref_service_->GetBoolean(prefs::kDisableDriveOverCellular) && |
| 850 net::NetworkChangeNotifier::IsConnectionCellular( | 850 net::NetworkChangeNotifier::IsConnectionCellular( |
| 851 net::NetworkChangeNotifier::GetConnectionType())) | 851 net::NetworkChangeNotifier::GetConnectionType())) |
| 852 return USER_INITIATED; | 852 return USER_INITIATED; |
| 853 | 853 |
| 854 // Otherwise, every operations including background tasks are allowed. | 854 // Otherwise, every operations including background tasks are allowed. |
| 855 return BACKGROUND; | 855 return BACKGROUND; |
| 856 } | 856 } |
| 857 | 857 |
| 858 void JobScheduler::UpdateWait() { | 858 void JobScheduler::UpdateWait() { |
| 859 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 859 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 860 | 860 |
| 861 if (disable_throttling_ || throttle_count_ == 0) | 861 if (disable_throttling_ || throttle_count_ == 0) |
| 862 return; | 862 return; |
| 863 | 863 |
| 864 // Exponential backoff: https://developers.google.com/drive/handle-errors. | 864 // Exponential backoff: https://developers.google.com/drive/handle-errors. |
| 865 base::TimeDelta delay = | 865 base::TimeDelta delay = |
| 866 base::TimeDelta::FromSeconds(1 << (throttle_count_ - 1)) + | 866 base::TimeDelta::FromSeconds(1 << (throttle_count_ - 1)) + |
| 867 base::TimeDelta::FromMilliseconds(base::RandInt(0, 1000)); | 867 base::TimeDelta::FromMilliseconds(base::RandInt(0, 1000)); |
| 868 VLOG(1) << "Throttling for " << delay.InMillisecondsF(); | 868 VLOG(1) << "Throttling for " << delay.InMillisecondsF(); |
| 869 | 869 |
| 870 wait_until_ = std::max(wait_until_, base::Time::Now() + delay); | 870 wait_until_ = std::max(wait_until_, base::Time::Now() + delay); |
| 871 } | 871 } |
| 872 | 872 |
| 873 bool JobScheduler::OnJobDone(JobID job_id, | 873 bool JobScheduler::OnJobDone(JobID job_id, |
| 874 google_apis::DriveApiErrorCode error) { | 874 google_apis::DriveApiErrorCode error) { |
| 875 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 875 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 876 | 876 |
| 877 JobEntry* job_entry = job_map_.Lookup(job_id); | 877 JobEntry* job_entry = job_map_.Lookup(job_id); |
| 878 DCHECK(job_entry); | 878 DCHECK(job_entry); |
| 879 JobInfo* job_info = &job_entry->job_info; | 879 JobInfo* job_info = &job_entry->job_info; |
| 880 QueueType queue_type = GetJobQueueType(job_info->job_type); | 880 QueueType queue_type = GetJobQueueType(job_info->job_type); |
| 881 queue_[queue_type]->MarkFinished(job_id); | 881 queue_[queue_type]->MarkFinished(job_id); |
| 882 | 882 |
| 883 const base::TimeDelta elapsed = base::Time::Now() - job_info->start_time; | 883 const base::TimeDelta elapsed = base::Time::Now() - job_info->start_time; |
| 884 bool success = (GDataToFileError(error) == FILE_ERROR_OK); | 884 bool success = (GDataToFileError(error) == FILE_ERROR_OK); |
| 885 logger_->Log(success ? logging::LOG_INFO : logging::LOG_WARNING, | 885 logger_->Log(success ? logging::LOG_INFO : logging::LOG_WARNING, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 926 weak_ptr_factory_.GetWeakPtr(), | 926 weak_ptr_factory_.GetWeakPtr(), |
| 927 queue_type)); | 927 queue_type)); |
| 928 return !should_retry; | 928 return !should_retry; |
| 929 } | 929 } |
| 930 | 930 |
| 931 void JobScheduler::OnGetFileListJobDone( | 931 void JobScheduler::OnGetFileListJobDone( |
| 932 JobID job_id, | 932 JobID job_id, |
| 933 const google_apis::FileListCallback& callback, | 933 const google_apis::FileListCallback& callback, |
| 934 google_apis::DriveApiErrorCode error, | 934 google_apis::DriveApiErrorCode error, |
| 935 scoped_ptr<google_apis::FileList> file_list) { | 935 scoped_ptr<google_apis::FileList> file_list) { |
| 936 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 936 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 937 DCHECK(!callback.is_null()); | 937 DCHECK(!callback.is_null()); |
| 938 | 938 |
| 939 if (OnJobDone(job_id, error)) | 939 if (OnJobDone(job_id, error)) |
| 940 callback.Run(error, file_list.Pass()); | 940 callback.Run(error, file_list.Pass()); |
| 941 } | 941 } |
| 942 | 942 |
| 943 void JobScheduler::OnGetChangeListJobDone( | 943 void JobScheduler::OnGetChangeListJobDone( |
| 944 JobID job_id, | 944 JobID job_id, |
| 945 const google_apis::ChangeListCallback& callback, | 945 const google_apis::ChangeListCallback& callback, |
| 946 google_apis::DriveApiErrorCode error, | 946 google_apis::DriveApiErrorCode error, |
| 947 scoped_ptr<google_apis::ChangeList> change_list) { | 947 scoped_ptr<google_apis::ChangeList> change_list) { |
| 948 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 948 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 949 DCHECK(!callback.is_null()); | 949 DCHECK(!callback.is_null()); |
| 950 | 950 |
| 951 if (OnJobDone(job_id, error)) | 951 if (OnJobDone(job_id, error)) |
| 952 callback.Run(error, change_list.Pass()); | 952 callback.Run(error, change_list.Pass()); |
| 953 } | 953 } |
| 954 | 954 |
| 955 void JobScheduler::OnGetFileResourceJobDone( | 955 void JobScheduler::OnGetFileResourceJobDone( |
| 956 JobID job_id, | 956 JobID job_id, |
| 957 const google_apis::FileResourceCallback& callback, | 957 const google_apis::FileResourceCallback& callback, |
| 958 google_apis::DriveApiErrorCode error, | 958 google_apis::DriveApiErrorCode error, |
| 959 scoped_ptr<google_apis::FileResource> entry) { | 959 scoped_ptr<google_apis::FileResource> entry) { |
| 960 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 960 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 961 DCHECK(!callback.is_null()); | 961 DCHECK(!callback.is_null()); |
| 962 | 962 |
| 963 if (OnJobDone(job_id, error)) | 963 if (OnJobDone(job_id, error)) |
| 964 callback.Run(error, entry.Pass()); | 964 callback.Run(error, entry.Pass()); |
| 965 } | 965 } |
| 966 | 966 |
| 967 void JobScheduler::OnGetAboutResourceJobDone( | 967 void JobScheduler::OnGetAboutResourceJobDone( |
| 968 JobID job_id, | 968 JobID job_id, |
| 969 const google_apis::AboutResourceCallback& callback, | 969 const google_apis::AboutResourceCallback& callback, |
| 970 google_apis::DriveApiErrorCode error, | 970 google_apis::DriveApiErrorCode error, |
| 971 scoped_ptr<google_apis::AboutResource> about_resource) { | 971 scoped_ptr<google_apis::AboutResource> about_resource) { |
| 972 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 972 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 973 DCHECK(!callback.is_null()); | 973 DCHECK(!callback.is_null()); |
| 974 | 974 |
| 975 if (OnJobDone(job_id, error)) | 975 if (OnJobDone(job_id, error)) |
| 976 callback.Run(error, about_resource.Pass()); | 976 callback.Run(error, about_resource.Pass()); |
| 977 } | 977 } |
| 978 | 978 |
| 979 void JobScheduler::OnGetShareUrlJobDone( | 979 void JobScheduler::OnGetShareUrlJobDone( |
| 980 JobID job_id, | 980 JobID job_id, |
| 981 const google_apis::GetShareUrlCallback& callback, | 981 const google_apis::GetShareUrlCallback& callback, |
| 982 google_apis::DriveApiErrorCode error, | 982 google_apis::DriveApiErrorCode error, |
| 983 const GURL& share_url) { | 983 const GURL& share_url) { |
| 984 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 984 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 985 DCHECK(!callback.is_null()); | 985 DCHECK(!callback.is_null()); |
| 986 | 986 |
| 987 if (OnJobDone(job_id, error)) | 987 if (OnJobDone(job_id, error)) |
| 988 callback.Run(error, share_url); | 988 callback.Run(error, share_url); |
| 989 } | 989 } |
| 990 | 990 |
| 991 void JobScheduler::OnGetAppListJobDone( | 991 void JobScheduler::OnGetAppListJobDone( |
| 992 JobID job_id, | 992 JobID job_id, |
| 993 const google_apis::AppListCallback& callback, | 993 const google_apis::AppListCallback& callback, |
| 994 google_apis::DriveApiErrorCode error, | 994 google_apis::DriveApiErrorCode error, |
| 995 scoped_ptr<google_apis::AppList> app_list) { | 995 scoped_ptr<google_apis::AppList> app_list) { |
| 996 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 996 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 997 DCHECK(!callback.is_null()); | 997 DCHECK(!callback.is_null()); |
| 998 | 998 |
| 999 if (OnJobDone(job_id, error)) | 999 if (OnJobDone(job_id, error)) |
| 1000 callback.Run(error, app_list.Pass()); | 1000 callback.Run(error, app_list.Pass()); |
| 1001 } | 1001 } |
| 1002 | 1002 |
| 1003 void JobScheduler::OnEntryActionJobDone( | 1003 void JobScheduler::OnEntryActionJobDone( |
| 1004 JobID job_id, | 1004 JobID job_id, |
| 1005 const google_apis::EntryActionCallback& callback, | 1005 const google_apis::EntryActionCallback& callback, |
| 1006 google_apis::DriveApiErrorCode error) { | 1006 google_apis::DriveApiErrorCode error) { |
| 1007 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1007 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1008 DCHECK(!callback.is_null()); | 1008 DCHECK(!callback.is_null()); |
| 1009 | 1009 |
| 1010 if (OnJobDone(job_id, error)) | 1010 if (OnJobDone(job_id, error)) |
| 1011 callback.Run(error); | 1011 callback.Run(error); |
| 1012 } | 1012 } |
| 1013 | 1013 |
| 1014 void JobScheduler::OnDownloadActionJobDone( | 1014 void JobScheduler::OnDownloadActionJobDone( |
| 1015 JobID job_id, | 1015 JobID job_id, |
| 1016 const google_apis::DownloadActionCallback& callback, | 1016 const google_apis::DownloadActionCallback& callback, |
| 1017 google_apis::DriveApiErrorCode error, | 1017 google_apis::DriveApiErrorCode error, |
| 1018 const base::FilePath& temp_file) { | 1018 const base::FilePath& temp_file) { |
| 1019 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1019 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1020 DCHECK(!callback.is_null()); | 1020 DCHECK(!callback.is_null()); |
| 1021 | 1021 |
| 1022 if (OnJobDone(job_id, error)) | 1022 if (OnJobDone(job_id, error)) |
| 1023 callback.Run(error, temp_file); | 1023 callback.Run(error, temp_file); |
| 1024 } | 1024 } |
| 1025 | 1025 |
| 1026 void JobScheduler::OnUploadCompletionJobDone( | 1026 void JobScheduler::OnUploadCompletionJobDone( |
| 1027 JobID job_id, | 1027 JobID job_id, |
| 1028 const ResumeUploadParams& resume_params, | 1028 const ResumeUploadParams& resume_params, |
| 1029 const google_apis::FileResourceCallback& callback, | 1029 const google_apis::FileResourceCallback& callback, |
| 1030 google_apis::DriveApiErrorCode error, | 1030 google_apis::DriveApiErrorCode error, |
| 1031 const GURL& upload_location, | 1031 const GURL& upload_location, |
| 1032 scoped_ptr<google_apis::FileResource> entry) { | 1032 scoped_ptr<google_apis::FileResource> entry) { |
| 1033 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1033 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1034 DCHECK(!callback.is_null()); | 1034 DCHECK(!callback.is_null()); |
| 1035 | 1035 |
| 1036 if (!upload_location.is_empty()) { | 1036 if (!upload_location.is_empty()) { |
| 1037 // If upload_location is available, update the task to resume the | 1037 // If upload_location is available, update the task to resume the |
| 1038 // upload process from the terminated point. | 1038 // upload process from the terminated point. |
| 1039 // When we need to retry, the error code should be HTTP_SERVICE_UNAVAILABLE | 1039 // When we need to retry, the error code should be HTTP_SERVICE_UNAVAILABLE |
| 1040 // so OnJobDone called below will be in charge to re-queue the job. | 1040 // so OnJobDone called below will be in charge to re-queue the job. |
| 1041 JobEntry* job_entry = job_map_.Lookup(job_id); | 1041 JobEntry* job_entry = job_map_.Lookup(job_id); |
| 1042 DCHECK(job_entry); | 1042 DCHECK(job_entry); |
| 1043 | 1043 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1060 callback.Run(error, entry.Pass()); | 1060 callback.Run(error, entry.Pass()); |
| 1061 } | 1061 } |
| 1062 | 1062 |
| 1063 void JobScheduler::OnResumeUploadFileDone( | 1063 void JobScheduler::OnResumeUploadFileDone( |
| 1064 JobID job_id, | 1064 JobID job_id, |
| 1065 const base::Callback<google_apis::CancelCallback()>& original_task, | 1065 const base::Callback<google_apis::CancelCallback()>& original_task, |
| 1066 const google_apis::FileResourceCallback& callback, | 1066 const google_apis::FileResourceCallback& callback, |
| 1067 google_apis::DriveApiErrorCode error, | 1067 google_apis::DriveApiErrorCode error, |
| 1068 const GURL& upload_location, | 1068 const GURL& upload_location, |
| 1069 scoped_ptr<google_apis::FileResource> entry) { | 1069 scoped_ptr<google_apis::FileResource> entry) { |
| 1070 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1070 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1071 DCHECK(!original_task.is_null()); | 1071 DCHECK(!original_task.is_null()); |
| 1072 DCHECK(!callback.is_null()); | 1072 DCHECK(!callback.is_null()); |
| 1073 | 1073 |
| 1074 if (upload_location.is_empty()) { | 1074 if (upload_location.is_empty()) { |
| 1075 // If upload_location is not available, we should discard it and stop trying | 1075 // If upload_location is not available, we should discard it and stop trying |
| 1076 // to resume. Restore the original task. | 1076 // to resume. Restore the original task. |
| 1077 JobEntry* job_entry = job_map_.Lookup(job_id); | 1077 JobEntry* job_entry = job_map_.Lookup(job_id); |
| 1078 DCHECK(job_entry); | 1078 DCHECK(job_entry); |
| 1079 job_entry->task = original_task; | 1079 job_entry->task = original_task; |
| 1080 } | 1080 } |
| 1081 | 1081 |
| 1082 if (OnJobDone(job_id, error)) | 1082 if (OnJobDone(job_id, error)) |
| 1083 callback.Run(error, entry.Pass()); | 1083 callback.Run(error, entry.Pass()); |
| 1084 } | 1084 } |
| 1085 | 1085 |
| 1086 void JobScheduler::UpdateProgress(JobID job_id, int64 progress, int64 total) { | 1086 void JobScheduler::UpdateProgress(JobID job_id, int64 progress, int64 total) { |
| 1087 JobEntry* job_entry = job_map_.Lookup(job_id); | 1087 JobEntry* job_entry = job_map_.Lookup(job_id); |
| 1088 DCHECK(job_entry); | 1088 DCHECK(job_entry); |
| 1089 | 1089 |
| 1090 job_entry->job_info.num_completed_bytes = progress; | 1090 job_entry->job_info.num_completed_bytes = progress; |
| 1091 if (total != -1) | 1091 if (total != -1) |
| 1092 job_entry->job_info.num_total_bytes = total; | 1092 job_entry->job_info.num_total_bytes = total; |
| 1093 NotifyJobUpdated(job_entry->job_info); | 1093 NotifyJobUpdated(job_entry->job_info); |
| 1094 } | 1094 } |
| 1095 | 1095 |
| 1096 void JobScheduler::OnConnectionTypeChanged( | 1096 void JobScheduler::OnConnectionTypeChanged( |
| 1097 net::NetworkChangeNotifier::ConnectionType type) { | 1097 net::NetworkChangeNotifier::ConnectionType type) { |
| 1098 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1098 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1099 | 1099 |
| 1100 // Resume the job loop. | 1100 // Resume the job loop. |
| 1101 // Note that we don't need to check the network connection status as it will | 1101 // Note that we don't need to check the network connection status as it will |
| 1102 // be checked in GetCurrentAcceptedPriority(). | 1102 // be checked in GetCurrentAcceptedPriority(). |
| 1103 for (int i = METADATA_QUEUE; i < NUM_QUEUES; ++i) | 1103 for (int i = METADATA_QUEUE; i < NUM_QUEUES; ++i) |
| 1104 DoJobLoop(static_cast<QueueType>(i)); | 1104 DoJobLoop(static_cast<QueueType>(i)); |
| 1105 } | 1105 } |
| 1106 | 1106 |
| 1107 void JobScheduler::OnGotFileSizeForJob(JobID job_id, | 1107 void JobScheduler::OnGotFileSizeForJob(JobID job_id, |
| 1108 const std::string& histogram_name, | 1108 const std::string& histogram_name, |
| 1109 int64* size) { | 1109 int64* size) { |
| 1110 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1110 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1111 if (*size == -1) | 1111 if (*size == -1) |
| 1112 return; | 1112 return; |
| 1113 | 1113 |
| 1114 // Temporary histogram for crbug.com/229650. | 1114 // Temporary histogram for crbug.com/229650. |
| 1115 CollectCopyHistogramSample(histogram_name, *size); | 1115 CollectCopyHistogramSample(histogram_name, *size); |
| 1116 | 1116 |
| 1117 JobEntry* const job_entry = job_map_.Lookup(job_id); | 1117 JobEntry* const job_entry = job_map_.Lookup(job_id); |
| 1118 if (!job_entry) | 1118 if (!job_entry) |
| 1119 return; | 1119 return; |
| 1120 | 1120 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1147 case TYPE_UPLOAD_NEW_FILE: | 1147 case TYPE_UPLOAD_NEW_FILE: |
| 1148 case TYPE_UPLOAD_EXISTING_FILE: | 1148 case TYPE_UPLOAD_EXISTING_FILE: |
| 1149 return FILE_QUEUE; | 1149 return FILE_QUEUE; |
| 1150 } | 1150 } |
| 1151 NOTREACHED(); | 1151 NOTREACHED(); |
| 1152 return FILE_QUEUE; | 1152 return FILE_QUEUE; |
| 1153 } | 1153 } |
| 1154 | 1154 |
| 1155 void JobScheduler::AbortNotRunningJob(JobEntry* job, | 1155 void JobScheduler::AbortNotRunningJob(JobEntry* job, |
| 1156 google_apis::DriveApiErrorCode error) { | 1156 google_apis::DriveApiErrorCode error) { |
| 1157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1157 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1158 | 1158 |
| 1159 const base::TimeDelta elapsed = base::Time::Now() - job->job_info.start_time; | 1159 const base::TimeDelta elapsed = base::Time::Now() - job->job_info.start_time; |
| 1160 const QueueType queue_type = GetJobQueueType(job->job_info.job_type); | 1160 const QueueType queue_type = GetJobQueueType(job->job_info.job_type); |
| 1161 logger_->Log(logging::LOG_INFO, | 1161 logger_->Log(logging::LOG_INFO, |
| 1162 "Job aborted: %s => %s (elapsed time: %sms) - %s", | 1162 "Job aborted: %s => %s (elapsed time: %sms) - %s", |
| 1163 job->job_info.ToString().c_str(), | 1163 job->job_info.ToString().c_str(), |
| 1164 DriveApiErrorCodeToString(error).c_str(), | 1164 DriveApiErrorCodeToString(error).c_str(), |
| 1165 base::Int64ToString(elapsed.InMilliseconds()).c_str(), | 1165 base::Int64ToString(elapsed.InMilliseconds()).c_str(), |
| 1166 GetQueueInfo(queue_type).c_str()); | 1166 GetQueueInfo(queue_type).c_str()); |
| 1167 | 1167 |
| 1168 base::Callback<void(google_apis::DriveApiErrorCode)> callback = | 1168 base::Callback<void(google_apis::DriveApiErrorCode)> callback = |
| 1169 job->abort_callback; | 1169 job->abort_callback; |
| 1170 queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job->job_info.job_id); | 1170 queue_[GetJobQueueType(job->job_info.job_type)]->Remove(job->job_info.job_id); |
| 1171 NotifyJobDone(job->job_info, error); | 1171 NotifyJobDone(job->job_info, error); |
| 1172 job_map_.Remove(job->job_info.job_id); | 1172 job_map_.Remove(job->job_info.job_id); |
| 1173 base::MessageLoopProxy::current()->PostTask(FROM_HERE, | 1173 base::MessageLoopProxy::current()->PostTask(FROM_HERE, |
| 1174 base::Bind(callback, error)); | 1174 base::Bind(callback, error)); |
| 1175 } | 1175 } |
| 1176 | 1176 |
| 1177 void JobScheduler::NotifyJobAdded(const JobInfo& job_info) { | 1177 void JobScheduler::NotifyJobAdded(const JobInfo& job_info) { |
| 1178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1178 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1179 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobAdded(job_info)); | 1179 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobAdded(job_info)); |
| 1180 } | 1180 } |
| 1181 | 1181 |
| 1182 void JobScheduler::NotifyJobDone(const JobInfo& job_info, | 1182 void JobScheduler::NotifyJobDone(const JobInfo& job_info, |
| 1183 google_apis::DriveApiErrorCode error) { | 1183 google_apis::DriveApiErrorCode error) { |
| 1184 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1184 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1185 FOR_EACH_OBSERVER(JobListObserver, observer_list_, | 1185 FOR_EACH_OBSERVER(JobListObserver, observer_list_, |
| 1186 OnJobDone(job_info, GDataToFileError(error))); | 1186 OnJobDone(job_info, GDataToFileError(error))); |
| 1187 } | 1187 } |
| 1188 | 1188 |
| 1189 void JobScheduler::NotifyJobUpdated(const JobInfo& job_info) { | 1189 void JobScheduler::NotifyJobUpdated(const JobInfo& job_info) { |
| 1190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1190 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1191 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobUpdated(job_info)); | 1191 FOR_EACH_OBSERVER(JobListObserver, observer_list_, OnJobUpdated(job_info)); |
| 1192 } | 1192 } |
| 1193 | 1193 |
| 1194 std::string JobScheduler::GetQueueInfo(QueueType type) const { | 1194 std::string JobScheduler::GetQueueInfo(QueueType type) const { |
| 1195 return QueueTypeToString(type) + " " + queue_[type]->ToString(); | 1195 return QueueTypeToString(type) + " " + queue_[type]->ToString(); |
| 1196 } | 1196 } |
| 1197 | 1197 |
| 1198 // static | 1198 // static |
| 1199 std::string JobScheduler::QueueTypeToString(QueueType type) { | 1199 std::string JobScheduler::QueueTypeToString(QueueType type) { |
| 1200 switch (type) { | 1200 switch (type) { |
| 1201 case METADATA_QUEUE: | 1201 case METADATA_QUEUE: |
| 1202 return "METADATA_QUEUE"; | 1202 return "METADATA_QUEUE"; |
| 1203 case FILE_QUEUE: | 1203 case FILE_QUEUE: |
| 1204 return "FILE_QUEUE"; | 1204 return "FILE_QUEUE"; |
| 1205 case NUM_QUEUES: | 1205 case NUM_QUEUES: |
| 1206 break; // This value is just a sentinel. Should never be used. | 1206 break; // This value is just a sentinel. Should never be used. |
| 1207 } | 1207 } |
| 1208 NOTREACHED(); | 1208 NOTREACHED(); |
| 1209 return ""; | 1209 return ""; |
| 1210 } | 1210 } |
| 1211 | 1211 |
| 1212 } // namespace drive | 1212 } // namespace drive |
| OLD | NEW |