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 |