Index: chrome/browser/chromeos/drive/change_list_loader.h |
diff --git a/chrome/browser/chromeos/drive/change_list_loader.h b/chrome/browser/chromeos/drive/change_list_loader.h |
index 3715c860fecb323235890f5175ac08da4110caa8..c5c193882b5ede63597b5f2048469cb1c5271d57 100644 |
--- a/chrome/browser/chromeos/drive/change_list_loader.h |
+++ b/chrome/browser/chromeos/drive/change_list_loader.h |
@@ -85,37 +85,46 @@ class AboutResourceLoader { |
return cached_about_resource_.get(); |
} |
- // Gets the about resource from the cache or the server. If the cache is |
- // availlavle, just runs |callback| with the cached about resource. If not, |
- // calls |UpdateAboutResource| passing |callback|. |
+ // Gets the 'latest' about resource and asynchronously runs |callback|. I.e., |
+ // 1) If the last call to UpdateAboutResource call is in-flight, wait for it. |
+ // 2) Otherwise, if the resource is cached, just returns the cached value. |
+ // 3) If neither of the above hold, queries the API server by calling |
+ // |UpdateAboutResource|. |
void GetAboutResource(const google_apis::AboutResourceCallback& callback); |
// Gets the about resource from the server, and caches it if successful. This |
// function calls JobScheduler::GetAboutResource internally. The cache will be |
// used in |GetAboutResource|. |
- void UpdateAboutResource( |
- const google_apis::AboutResourceCallback& callback); |
+ void UpdateAboutResource(const google_apis::AboutResourceCallback& callback); |
private: |
// Part of UpdateAboutResource(). |
// This function should be called when the latest about resource is being |
- // fetched from the server. The retrieved about resoure is cloned, and one is |
- // cached and the other is passed to |callback|. |
+ // fetched from the server. The retrieved about resource is cloned, and one is |
+ // cached and the other is passed to callbacks associated with |task_id|. |
void UpdateAboutResourceAfterGetAbout( |
- const google_apis::AboutResourceCallback& callback, |
+ int task_id, |
google_apis::GDataErrorCode status, |
scoped_ptr<google_apis::AboutResource> about_resource); |
JobScheduler* scheduler_; |
scoped_ptr<google_apis::AboutResource> cached_about_resource_; |
+ |
+ // Identifier to denote the latest UpdateAboutResource call. |
+ int current_update_task_id_; |
+ // Mapping from each UpdateAboutResource task ID to the corresponding |
+ // callbacks. Note that there will be multiple callbacks for a single task |
+ // when GetAboutResource is called before the task completes. |
+ std::map<int, std::vector<google_apis::AboutResourceCallback> > |
+ pending_callbacks_; |
+ |
base::WeakPtrFactory<AboutResourceLoader> weak_ptr_factory_; |
DISALLOW_COPY_AND_ASSIGN(AboutResourceLoader); |
}; |
// ChangeListLoader is used to load the change list, the full resource list, |
-// and directory contents, from WAPI (codename for Documents List API) |
-// or Google Drive API. The class also updates the resource metadata with |
-// the change list loaded from the server. |
+// and directory contents, from Google Drive API. The class also updates the |
+// resource metadata with the change list loaded from the server. |
// |
// Note that the difference between "resource list" and "change list" is |
// subtle hence the two words are often used interchangeably. To be precise, |