Index: chrome/browser/chromeos/drive/change_list_loader.cc |
diff --git a/chrome/browser/chromeos/drive/change_list_loader.cc b/chrome/browser/chromeos/drive/change_list_loader.cc |
index 28029795b20d7d065ac386af50e8ae895f811da6..a534ffd2a93de30087d7a7ad1a3e81226a45e8e4 100644 |
--- a/chrome/browser/chromeos/drive/change_list_loader.cc |
+++ b/chrome/browser/chromeos/drive/change_list_loader.cc |
@@ -180,6 +180,8 @@ void ChangeListLoader::LoadFromServerIfNeededAfterGetAbout( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
DCHECK(refreshing_); |
+ DCHECK_EQ(util::GDataToDriveFileError(status) == DRIVE_FILE_OK, |
+ about_resource.get() != NULL); |
int64 remote_changestamp = 0; |
if (util::GDataToDriveFileError(status) == DRIVE_FILE_OK) { |
@@ -193,18 +195,20 @@ void ChangeListLoader::LoadFromServerIfNeededAfterGetAbout( |
weak_ptr_factory_.GetWeakPtr(), |
directory_fetch_info, |
callback, |
- remote_changestamp)); |
+ base::Passed(&about_resource))); |
} |
void ChangeListLoader::CompareChangestampsAndLoadIfNeeded( |
const DirectoryFetchInfo& directory_fetch_info, |
const FileOperationCallback& callback, |
- int64 remote_changestamp, |
+ scoped_ptr<google_apis::AboutResource> about_resource, |
int64 local_changestamp) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
DCHECK(refreshing_); |
+ int64 remote_changestamp = |
+ about_resource ? about_resource->largest_change_id() : 0; |
if (remote_changestamp > 0 && local_changestamp >= remote_changestamp) { |
if (local_changestamp > remote_changestamp) { |
LOG(WARNING) << "Cached client feed is fresher than server, client = " |
@@ -219,12 +223,18 @@ void ChangeListLoader::CompareChangestampsAndLoadIfNeeded( |
} |
int64 start_changestamp = local_changestamp > 0 ? local_changestamp + 1 : 0; |
+ if (start_changestamp == 0 && !about_resource.get()) { |
+ // Full update needs AboutResource. If this is a full update, we should just |
+ // give up. |
+ callback.Run(DRIVE_FILE_ERROR_FAILED); |
+ return; |
+ } |
if (directory_fetch_info.empty()) { |
// If the caller is not interested in a particular directory, just start |
// loading the change list. |
- LoadChangeListFromServer(start_changestamp, |
- remote_changestamp, |
+ LoadChangeListFromServer(about_resource.Pass(), |
+ start_changestamp, |
callback); |
} else if (directory_fetch_info.changestamp() < remote_changestamp) { |
// If the caller is interested in a particular directory, and the |
@@ -239,8 +249,8 @@ void ChangeListLoader::CompareChangestampsAndLoadIfNeeded( |
base::Bind(&ChangeListLoader::StartLoadChangeListFromServer, |
weak_ptr_factory_.GetWeakPtr(), |
directory_fetch_info, |
+ base::Passed(&about_resource), |
start_changestamp, |
- remote_changestamp, |
callback)); |
} else { |
// The directory is up-to-date, hence there is no need to load. |
@@ -249,8 +259,8 @@ void ChangeListLoader::CompareChangestampsAndLoadIfNeeded( |
} |
void ChangeListLoader::LoadChangeListFromServer( |
+ scoped_ptr<google_apis::AboutResource> about_resource, |
int64 start_changestamp, |
- int64 remote_changestamp, |
const FileOperationCallback& callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
@@ -262,15 +272,15 @@ void ChangeListLoader::LoadChangeListFromServer( |
load_params.Pass(), |
base::Bind(&ChangeListLoader::UpdateMetadataFromFeedAfterLoadFromServer, |
weak_ptr_factory_.GetWeakPtr(), |
+ base::Passed(&about_resource), |
start_changestamp != 0, // is_delta_feed |
- remote_changestamp, |
callback)); |
} |
void ChangeListLoader::StartLoadChangeListFromServer( |
const DirectoryFetchInfo& directory_fetch_info, |
+ scoped_ptr<google_apis::AboutResource> about_resource, |
int64 start_changestamp, |
- int64 remote_changestamp, |
const FileOperationCallback& callback, |
DriveFileError error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -283,14 +293,15 @@ void ChangeListLoader::StartLoadChangeListFromServer( |
<< "; Start loading the change list"; |
// Stop passing |callback| as it's just consumed. |
LoadChangeListFromServer( |
+ about_resource.Pass(), |
start_changestamp, |
- remote_changestamp, |
base::Bind(&util::EmptyFileOperationCallback)); |
} else { |
// The directory fast-fetch failed, but the change list loading may |
// succeed. Keep passing |callback| so it's run after the change list |
// loading is complete. |
- LoadChangeListFromServer(start_changestamp, remote_changestamp, callback); |
+ LoadChangeListFromServer( |
+ about_resource.Pass(), start_changestamp, callback); |
} |
} |
@@ -445,8 +456,8 @@ void ChangeListLoader::SearchFromServer( |
} |
void ChangeListLoader::UpdateMetadataFromFeedAfterLoadFromServer( |
+ scoped_ptr<google_apis::AboutResource> about_resource, |
bool is_delta_feed, |
- int64 feed_changestamp, |
const FileOperationCallback& callback, |
const ScopedVector<google_apis::ResourceList>& feed_list, |
DriveFileError error) { |
@@ -459,9 +470,9 @@ void ChangeListLoader::UpdateMetadataFromFeedAfterLoadFromServer( |
return; |
} |
- UpdateFromFeed(feed_list, |
+ UpdateFromFeed(about_resource.Pass(), |
+ feed_list, |
is_delta_feed, |
- feed_changestamp, |
base::Bind(&ChangeListLoader::OnUpdateFromFeed, |
weak_ptr_factory_.GetWeakPtr(), |
!loaded(), // is_initial_load |
@@ -694,9 +705,9 @@ void ChangeListLoader::SaveFileSystem() { |
} |
void ChangeListLoader::UpdateFromFeed( |
+ scoped_ptr<google_apis::AboutResource> about_resource, |
const ScopedVector<google_apis::ResourceList>& feed_list, |
bool is_delta_feed, |
- int64 root_feed_changestamp, |
const base::Closure& update_finished_callback) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!update_finished_callback.is_null()); |
@@ -708,9 +719,9 @@ void ChangeListLoader::UpdateFromFeed( |
const bool should_notify_changed_directories = is_delta_feed; |
change_list_processor_->ApplyFeeds( |
+ about_resource.Pass(), |
feed_list, |
is_delta_feed, |
- root_feed_changestamp, |
base::Bind(&ChangeListLoader::NotifyDirectoryChangedAfterApplyFeed, |
weak_ptr_factory_.GetWeakPtr(), |
should_notify_changed_directories, |