| 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/change_list_loader.h" | 5 #include "chrome/browser/chromeos/drive/change_list_loader.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 return; | 202 return; |
| 203 | 203 |
| 204 std::vector<base::Closure> tasks; | 204 std::vector<base::Closure> tasks; |
| 205 tasks.swap(pending_tasks_); | 205 tasks.swap(pending_tasks_); |
| 206 for (size_t i = 0; i < tasks.size(); ++i) | 206 for (size_t i = 0; i < tasks.size(); ++i) |
| 207 tasks[i].Run(); | 207 tasks[i].Run(); |
| 208 } | 208 } |
| 209 | 209 |
| 210 AboutResourceLoader::AboutResourceLoader(JobScheduler* scheduler) | 210 AboutResourceLoader::AboutResourceLoader(JobScheduler* scheduler) |
| 211 : scheduler_(scheduler), | 211 : scheduler_(scheduler), |
| 212 current_update_task_id_(-1), |
| 212 weak_ptr_factory_(this) { | 213 weak_ptr_factory_(this) { |
| 213 } | 214 } |
| 214 | 215 |
| 215 AboutResourceLoader::~AboutResourceLoader() {} | 216 AboutResourceLoader::~AboutResourceLoader() {} |
| 216 | 217 |
| 217 void AboutResourceLoader::GetAboutResource( | 218 void AboutResourceLoader::GetAboutResource( |
| 218 const google_apis::AboutResourceCallback& callback) { | 219 const google_apis::AboutResourceCallback& callback) { |
| 219 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 220 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 220 DCHECK(!callback.is_null()); | 221 DCHECK(!callback.is_null()); |
| 221 | 222 |
| 223 // If the latest UpdateAboutResource task is still running. Wait for it, |
| 224 if (pending_callbacks_.count(current_update_task_id_)) { |
| 225 pending_callbacks_[current_update_task_id_].push_back(callback); |
| 226 return; |
| 227 } |
| 228 |
| 222 if (cached_about_resource_) { | 229 if (cached_about_resource_) { |
| 223 base::MessageLoopProxy::current()->PostTask( | 230 base::MessageLoopProxy::current()->PostTask( |
| 224 FROM_HERE, | 231 FROM_HERE, |
| 225 base::Bind( | 232 base::Bind( |
| 226 callback, | 233 callback, |
| 227 google_apis::HTTP_NO_CONTENT, | 234 google_apis::HTTP_NO_CONTENT, |
| 228 base::Passed(scoped_ptr<google_apis::AboutResource>( | 235 base::Passed(scoped_ptr<google_apis::AboutResource>( |
| 229 new google_apis::AboutResource(*cached_about_resource_))))); | 236 new google_apis::AboutResource(*cached_about_resource_))))); |
| 230 } else { | 237 } else { |
| 231 UpdateAboutResource(callback); | 238 UpdateAboutResource(callback); |
| 232 } | 239 } |
| 233 } | 240 } |
| 234 | 241 |
| 235 void AboutResourceLoader::UpdateAboutResource( | 242 void AboutResourceLoader::UpdateAboutResource( |
| 236 const google_apis::AboutResourceCallback& callback) { | 243 const google_apis::AboutResourceCallback& callback) { |
| 237 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 244 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 238 DCHECK(!callback.is_null()); | 245 DCHECK(!callback.is_null()); |
| 239 | 246 |
| 247 ++current_update_task_id_; |
| 248 pending_callbacks_[current_update_task_id_].push_back(callback); |
| 249 |
| 240 scheduler_->GetAboutResource( | 250 scheduler_->GetAboutResource( |
| 241 base::Bind(&AboutResourceLoader::UpdateAboutResourceAfterGetAbout, | 251 base::Bind(&AboutResourceLoader::UpdateAboutResourceAfterGetAbout, |
| 242 weak_ptr_factory_.GetWeakPtr(), | 252 weak_ptr_factory_.GetWeakPtr(), |
| 243 callback)); | 253 current_update_task_id_)); |
| 244 } | 254 } |
| 245 | 255 |
| 246 void AboutResourceLoader::UpdateAboutResourceAfterGetAbout( | 256 void AboutResourceLoader::UpdateAboutResourceAfterGetAbout( |
| 247 const google_apis::AboutResourceCallback& callback, | 257 int task_id, |
| 248 google_apis::GDataErrorCode status, | 258 google_apis::GDataErrorCode status, |
| 249 scoped_ptr<google_apis::AboutResource> about_resource) { | 259 scoped_ptr<google_apis::AboutResource> about_resource) { |
| 250 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 260 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 251 DCHECK(!callback.is_null()); | |
| 252 FileError error = GDataToFileError(status); | 261 FileError error = GDataToFileError(status); |
| 253 | 262 |
| 254 if (error == FILE_ERROR_OK) { | 263 const std::vector<google_apis::AboutResourceCallback> callbacks = |
| 255 if (cached_about_resource_ && | 264 pending_callbacks_[task_id]; |
| 256 cached_about_resource_->largest_change_id() > | 265 pending_callbacks_.erase(task_id); |
| 257 about_resource->largest_change_id()) { | |
| 258 LOG(WARNING) << "Local cached about resource is fresher than server, " | |
| 259 << "local = " << cached_about_resource_->largest_change_id() | |
| 260 << ", server = " << about_resource->largest_change_id(); | |
| 261 } | |
| 262 | 266 |
| 263 cached_about_resource_.reset( | 267 if (error != FILE_ERROR_OK) { |
| 264 new google_apis::AboutResource(*about_resource)); | 268 for (size_t i = 0; i < callbacks.size(); ++i) |
| 269 callbacks[i].Run(status, scoped_ptr<google_apis::AboutResource>()); |
| 270 return; |
| 265 } | 271 } |
| 266 | 272 |
| 267 callback.Run(status, about_resource.Pass()); | 273 // Updates the cache when the resource is successfully obtained. |
| 274 if (cached_about_resource_ && |
| 275 cached_about_resource_->largest_change_id() > |
| 276 about_resource->largest_change_id()) { |
| 277 LOG(WARNING) << "Local cached about resource is fresher than server, " |
| 278 << "local = " << cached_about_resource_->largest_change_id() |
| 279 << ", server = " << about_resource->largest_change_id(); |
| 280 } |
| 281 cached_about_resource_.reset(new google_apis::AboutResource(*about_resource)); |
| 282 |
| 283 for (size_t i = 0; i < callbacks.size(); ++i) { |
| 284 callbacks[i].Run( |
| 285 status, |
| 286 make_scoped_ptr(new google_apis::AboutResource(*about_resource))); |
| 287 } |
| 268 } | 288 } |
| 269 | 289 |
| 270 ChangeListLoader::ChangeListLoader( | 290 ChangeListLoader::ChangeListLoader( |
| 271 EventLogger* logger, | 291 EventLogger* logger, |
| 272 base::SequencedTaskRunner* blocking_task_runner, | 292 base::SequencedTaskRunner* blocking_task_runner, |
| 273 ResourceMetadata* resource_metadata, | 293 ResourceMetadata* resource_metadata, |
| 274 JobScheduler* scheduler, | 294 JobScheduler* scheduler, |
| 275 AboutResourceLoader* about_resource_loader, | 295 AboutResourceLoader* about_resource_loader, |
| 276 LoaderController* loader_controller) | 296 LoaderController* loader_controller) |
| 277 : logger_(logger), | 297 : logger_(logger), |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 | 550 |
| 531 OnChangeListLoadComplete(error); | 551 OnChangeListLoadComplete(error); |
| 532 | 552 |
| 533 FOR_EACH_OBSERVER(ChangeListLoaderObserver, | 553 FOR_EACH_OBSERVER(ChangeListLoaderObserver, |
| 534 observers_, | 554 observers_, |
| 535 OnLoadFromServerComplete()); | 555 OnLoadFromServerComplete()); |
| 536 } | 556 } |
| 537 | 557 |
| 538 } // namespace internal | 558 } // namespace internal |
| 539 } // namespace drive | 559 } // namespace drive |
| OLD | NEW |