diff options
author | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-29 22:32:51 +0000 |
---|---|---|
committer | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-29 22:32:51 +0000 |
commit | b9c0bae4d6f9518a0641ffa7f5e650057016cf10 (patch) | |
tree | a0150bcd93ba3ed75e036bcffd359740f33b544b | |
parent | d5166d1ba7e08b440ae3150e65e8cce198a404e3 (diff) | |
download | chromium_src-b9c0bae4d6f9518a0641ffa7f5e650057016cf10.zip chromium_src-b9c0bae4d6f9518a0641ffa7f5e650057016cf10.tar.gz chromium_src-b9c0bae4d6f9518a0641ffa7f5e650057016cf10.tar.bz2 |
drive: Change DriveServiceInterface::GetChangeList's callback type to ChangeListCallback
Move ConvertChangeListToResourceList() call to the callers' side.
Replace ChangeList::set_items() with mutable_items() to efficiently handle data received from the server.
BUG=231125
TEST=unit_tests
Review URL: https://codereview.chromium.org/309463002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@273626 0039d316-1c4b-4281-b951-d872f2087c98
19 files changed, 201 insertions, 189 deletions
diff --git a/chrome/browser/chromeos/drive/job_scheduler.cc b/chrome/browser/chromeos/drive/job_scheduler.cc index 615178e..9ad7886 100644 --- a/chrome/browser/chromeos/drive/job_scheduler.cc +++ b/chrome/browser/chromeos/drive/job_scheduler.cc @@ -10,6 +10,7 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "chrome/browser/chromeos/drive/file_system_util.h" +#include "chrome/browser/drive/drive_api_util.h" #include "chrome/browser/drive/event_logger.h" #include "chrome/common/pref_names.h" #include "content/public/browser/browser_thread.h" @@ -334,7 +335,7 @@ void JobScheduler::GetChangeList( &DriveServiceInterface::GetChangeList, base::Unretained(drive_service_), start_changestamp, - base::Bind(&JobScheduler::OnGetResourceListJobDone, + base::Bind(&JobScheduler::OnGetChangeListJobDone, weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id, callback)); @@ -353,7 +354,7 @@ void JobScheduler::GetRemainingChangeList( &DriveServiceInterface::GetRemainingChangeList, base::Unretained(drive_service_), next_link, - base::Bind(&JobScheduler::OnGetResourceListJobDone, + base::Bind(&JobScheduler::OnGetChangeListJobDone, weak_ptr_factory_.GetWeakPtr(), new_job->job_info.job_id, callback)); @@ -898,6 +899,22 @@ bool JobScheduler::OnJobDone(JobID job_id, google_apis::GDataErrorCode error) { return !should_retry; } +void JobScheduler::OnGetChangeListJobDone( + JobID job_id, + const google_apis::GetResourceListCallback& callback, + google_apis::GDataErrorCode error, + scoped_ptr<google_apis::ChangeList> change_list) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); + DCHECK(!callback.is_null()); + + if (OnJobDone(job_id, error)) { + callback.Run(error, change_list ? + util::ConvertChangeListToResourceList(*change_list) : + scoped_ptr<google_apis::ResourceList>()); + + } +} + void JobScheduler::OnGetResourceListJobDone( JobID job_id, const google_apis::GetResourceListCallback& callback, diff --git a/chrome/browser/chromeos/drive/job_scheduler.h b/chrome/browser/chromeos/drive/job_scheduler.h index 1078287..e1d0ff6 100644 --- a/chrome/browser/chromeos/drive/job_scheduler.h +++ b/chrome/browser/chromeos/drive/job_scheduler.h @@ -275,6 +275,13 @@ class JobScheduler // Retries the job if needed and returns false. Otherwise returns true. bool OnJobDone(JobID job_id, google_apis::GDataErrorCode error); + // Callback for job finishing with a ChangeListCallback. + void OnGetChangeListJobDone( + JobID job_id, + const google_apis::GetResourceListCallback& callback, + google_apis::GDataErrorCode error, + scoped_ptr<google_apis::ChangeList> change_list); + // Callback for job finishing with a GetResourceListCallback. void OnGetResourceListJobDone( JobID job_id, diff --git a/chrome/browser/drive/drive_api_service.cc b/chrome/browser/drive/drive_api_service.cc index 017dc1a..4df202d 100644 --- a/chrome/browser/drive/drive_api_service.cc +++ b/chrome/browser/drive/drive_api_service.cc @@ -31,6 +31,7 @@ using google_apis::AuthStatusCallback; using google_apis::AuthorizeAppCallback; using google_apis::CancelCallback; using google_apis::ChangeList; +using google_apis::ChangeListCallback; using google_apis::DownloadActionCallback; using google_apis::EntryActionCallback; using google_apis::FileList; @@ -185,35 +186,6 @@ void ConvertFileListToResourceListOnBlockingPoolAndRun( base::Bind(&DidConvertToResourceListOnBlockingPool, callback)); } -// Thin adapter of ConvertChangeListToResourceList. -scoped_ptr<ResourceList> ConvertChangeListToResourceList( - scoped_ptr<ChangeList> change_list) { - return util::ConvertChangeListToResourceList(*change_list); -} - -// Converts the FileList value to ResourceList on blocking pool and runs -// |callback| on the UI thread. -void ConvertChangeListToResourceListOnBlockingPoolAndRun( - scoped_refptr<base::TaskRunner> blocking_task_runner, - const GetResourceListCallback& callback, - GDataErrorCode error, - scoped_ptr<ChangeList> value) { - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - DCHECK(!callback.is_null()); - - if (!value) { - callback.Run(error, scoped_ptr<ResourceList>()); - return; - } - - // Convert the value on blocking pool. - base::PostTaskAndReplyWithResult( - blocking_task_runner.get(), - FROM_HERE, - base::Bind(&ConvertChangeListToResourceList, base::Passed(&value)), - base::Bind(&DidConvertToResourceListOnBlockingPool, callback)); -} - // Converts the FileResource value to ResourceEntry for upload range request, // and runs |callback| on the UI thread. void ConvertFileResourceToResourceEntryForUploadRangeAndRun( @@ -435,14 +407,12 @@ CancelCallback DriveAPIService::SearchByTitle( CancelCallback DriveAPIService::GetChangeList( int64 start_changestamp, - const GetResourceListCallback& callback) { + const ChangeListCallback& callback) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(!callback.is_null()); ChangesListRequest* request = new ChangesListRequest( - sender_.get(), url_generator_, - base::Bind(&ConvertChangeListToResourceListOnBlockingPoolAndRun, - blocking_task_runner_, callback)); + sender_.get(), url_generator_, callback); request->set_max_results(kMaxNumFilesResourcePerRequest); request->set_start_change_id(start_changestamp); request->set_fields(kChangeListFields); @@ -451,15 +421,13 @@ CancelCallback DriveAPIService::GetChangeList( CancelCallback DriveAPIService::GetRemainingChangeList( const GURL& next_link, - const GetResourceListCallback& callback) { + const ChangeListCallback& callback) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(!next_link.is_empty()); DCHECK(!callback.is_null()); ChangesListNextPageRequest* request = new ChangesListNextPageRequest( - sender_.get(), - base::Bind(&ConvertChangeListToResourceListOnBlockingPoolAndRun, - blocking_task_runner_, callback)); + sender_.get(), callback); request->set_next_link(next_link); request->set_fields(kChangeListFields); return sender_->StartRequestWithRetry(request); diff --git a/chrome/browser/drive/drive_api_service.h b/chrome/browser/drive/drive_api_service.h index a43fe05..cc4c49a 100644 --- a/chrome/browser/drive/drive_api_service.h +++ b/chrome/browser/drive/drive_api_service.h @@ -88,10 +88,10 @@ class DriveAPIService : public DriveServiceInterface, const google_apis::GetResourceListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetChangeList( int64 start_changestamp, - const google_apis::GetResourceListCallback& callback) OVERRIDE; + const google_apis::ChangeListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetRemainingChangeList( const GURL& next_link, - const google_apis::GetResourceListCallback& callback) OVERRIDE; + const google_apis::ChangeListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetRemainingFileList( const GURL& next_link, const google_apis::GetResourceListCallback& callback) OVERRIDE; diff --git a/chrome/browser/drive/drive_service_interface.h b/chrome/browser/drive/drive_service_interface.h index 1b393d6..ae46e6b 100644 --- a/chrome/browser/drive/drive_service_interface.h +++ b/chrome/browser/drive/drive_service_interface.h @@ -198,9 +198,9 @@ class DriveServiceInterface { // |callback| must not be null. virtual google_apis::CancelCallback GetChangeList( int64 start_changestamp, - const google_apis::GetResourceListCallback& callback) = 0; + const google_apis::ChangeListCallback& callback) = 0; - // The result of GetChangeList() and GetAllResourceList() may be paged. + // The result of GetChangeList() may be paged. // In such a case, a next link to fetch remaining result is returned. // The page token can be used for this method. |callback| will be called upon // completion. @@ -208,12 +208,12 @@ class DriveServiceInterface { // |next_link| must not be empty. |callback| must not be null. virtual google_apis::CancelCallback GetRemainingChangeList( const GURL& next_link, - const google_apis::GetResourceListCallback& callback) = 0; + const google_apis::ChangeListCallback& callback) = 0; - // The result of GetResourceListInDirectory(), Search() and SearchByTitle() - // may be paged. In such a case, a next link to fetch remaining result is - // returned. The page token can be used for this method. |callback| will be - // called upon completion. + // The result of GetAllResourceList(), GetResourceListInDirectory(), Search() + // and SearchByTitle() may be paged. In such a case, a next link to fetch + // remaining result is returned. The page token can be used for this method. + // |callback| will be called upon completion. // // |next_link| must not be empty. |callback| must not be null. virtual google_apis::CancelCallback GetRemainingFileList( diff --git a/chrome/browser/drive/dummy_drive_service.cc b/chrome/browser/drive/dummy_drive_service.cc index 1528c15..0094ddf 100644 --- a/chrome/browser/drive/dummy_drive_service.cc +++ b/chrome/browser/drive/dummy_drive_service.cc @@ -12,6 +12,7 @@ using google_apis::AppListCallback; using google_apis::AuthStatusCallback; using google_apis::AuthorizeAppCallback; using google_apis::CancelCallback; +using google_apis::ChangeListCallback; using google_apis::DownloadActionCallback; using google_apis::EntryActionCallback; using google_apis::GetContentCallback; @@ -74,11 +75,11 @@ CancelCallback DummyDriveService::SearchByTitle( CancelCallback DummyDriveService::GetChangeList( int64 start_changestamp, - const GetResourceListCallback& callback) { return CancelCallback(); } + const ChangeListCallback& callback) { return CancelCallback(); } CancelCallback DummyDriveService::GetRemainingChangeList( const GURL& next_link, - const GetResourceListCallback& callback) { return CancelCallback(); } + const ChangeListCallback& callback) { return CancelCallback(); } CancelCallback DummyDriveService::GetRemainingFileList( const GURL& next_link, diff --git a/chrome/browser/drive/dummy_drive_service.h b/chrome/browser/drive/dummy_drive_service.h index ce6ee94..9882cdda 100644 --- a/chrome/browser/drive/dummy_drive_service.h +++ b/chrome/browser/drive/dummy_drive_service.h @@ -44,10 +44,10 @@ class DummyDriveService : public DriveServiceInterface { const google_apis::GetResourceListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetChangeList( int64 start_changestamp, - const google_apis::GetResourceListCallback& callback) OVERRIDE; + const google_apis::ChangeListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetRemainingChangeList( const GURL& next_link, - const google_apis::GetResourceListCallback& callback) OVERRIDE; + const google_apis::ChangeListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetRemainingFileList( const GURL& next_link, const google_apis::GetResourceListCallback& callback) OVERRIDE; diff --git a/chrome/browser/drive/fake_drive_service.cc b/chrome/browser/drive/fake_drive_service.cc index 971b7c4..2c87fe6 100644 --- a/chrome/browser/drive/fake_drive_service.cc +++ b/chrome/browser/drive/fake_drive_service.cc @@ -33,6 +33,8 @@ using google_apis::AppListCallback; using google_apis::AuthStatusCallback; using google_apis::AuthorizeAppCallback; using google_apis::CancelCallback; +using google_apis::ChangeList; +using google_apis::ChangeListCallback; using google_apis::ChangeResource; using google_apis::DownloadActionCallback; using google_apis::EntryActionCallback; @@ -70,7 +72,7 @@ namespace { // - Phrases quoted by double/single quotes // - AND search for multiple words/phrases segmented by space // - Limited attribute search. Only "title:" is supported. -bool EntryMatchWithQuery(const ResourceEntry& entry, +bool EntryMatchWithQuery(const ChangeResource& entry, const std::string& query) { base::StringTokenizer tokenizer(query, " "); tokenizer.set_quote_chars("\"'"); @@ -94,7 +96,8 @@ bool EntryMatchWithQuery(const ResourceEntry& entry, if (!key.empty() && key != "title") return false; // Search query in the title. - if (entry.title().find(value) == std::string::npos) + if (!entry.file() || + entry.file()->title().find(value) == std::string::npos) return false; } return true; @@ -120,6 +123,14 @@ void EntryActionCallbackAdapter( callback.Run(error); } +void GetResourceListCallbackAdapter(const GetResourceListCallback& callback, + GDataErrorCode error, + scoped_ptr<ChangeList> change_list) { + callback.Run(error, change_list ? + util::ConvertChangeListToResourceList(*change_list) : + scoped_ptr<ResourceList>()); +} + } // namespace struct FakeDriveService::EntryInfo { @@ -275,7 +286,8 @@ CancelCallback FakeDriveService::GetAllResourceList( 0, // start offset default_max_results_, &resource_list_load_count_, - callback); + base::Bind(&GetResourceListCallbackAdapter, + callback)); return CancelCallback(); } @@ -292,7 +304,8 @@ CancelCallback FakeDriveService::GetResourceListInDirectory( 0, // start offset default_max_results_, &directory_load_count_, - callback); + base::Bind(&GetResourceListCallbackAdapter, + callback)); return CancelCallback(); } @@ -309,7 +322,8 @@ CancelCallback FakeDriveService::Search( 0, // start offset default_max_results_, NULL, - callback); + base::Bind(&GetResourceListCallbackAdapter, + callback)); return CancelCallback(); } @@ -329,13 +343,14 @@ CancelCallback FakeDriveService::SearchByTitle( 0, // start offset default_max_results_, NULL, - callback); + base::Bind(&GetResourceListCallbackAdapter, + callback)); return CancelCallback(); } CancelCallback FakeDriveService::GetChangeList( int64 start_changestamp, - const GetResourceListCallback& callback) { + const ChangeListCallback& callback) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(!callback.is_null()); @@ -351,7 +366,7 @@ CancelCallback FakeDriveService::GetChangeList( CancelCallback FakeDriveService::GetRemainingChangeList( const GURL& next_link, - const GetResourceListCallback& callback) { + const ChangeListCallback& callback) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(!next_link.is_empty()); DCHECK(!callback.is_null()); @@ -404,7 +419,8 @@ CancelCallback FakeDriveService::GetRemainingFileList( DCHECK(!next_link.is_empty()); DCHECK(!callback.is_null()); - return GetRemainingChangeList(next_link, callback); + return GetRemainingChangeList( + next_link, base::Bind(&GetResourceListCallbackAdapter, callback)); } CancelCallback FakeDriveService::GetResourceEntry( @@ -1376,24 +1392,23 @@ void FakeDriveService::GetResourceListInternal( int start_offset, int max_results, int* load_counter, - const GetResourceListCallback& callback) { + const ChangeListCallback& callback) { if (offline_) { base::MessageLoop::current()->PostTask( FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION, - base::Passed(scoped_ptr<ResourceList>()))); + base::Passed(scoped_ptr<ChangeList>()))); return; } // Filter out entries per parameters like |directory_resource_id| and // |search_query|. - ScopedVector<ResourceEntry> entries; + ScopedVector<ChangeResource> entries; int num_entries_matched = 0; for (EntryInfoMap::iterator it = entries_.begin(); it != entries_.end(); ++it) { - scoped_ptr<ResourceEntry> entry = - util::ConvertChangeResourceToResourceEntry(it->second->change_resource); + const ChangeResource& entry = it->second->change_resource; bool should_exclude = false; // If |directory_resource_id| is set, exclude the entry if it's not in @@ -1401,13 +1416,9 @@ void FakeDriveService::GetResourceListInternal( if (!directory_resource_id.empty()) { // Get the parent resource ID of the entry. std::string parent_resource_id; - const google_apis::Link* parent_link = - entry->GetLinkByType(Link::LINK_PARENT); - if (parent_link) { - parent_resource_id = - net::UnescapeURLComponent(parent_link->href().ExtractFileName(), - net::UnescapeRule::URL_SPECIAL_CHARS); - } + if (entry.file() && !entry.file()->parents().empty()) + parent_resource_id = entry.file()->parents()[0].file_id(); + if (directory_resource_id != parent_resource_id) should_exclude = true; } @@ -1415,7 +1426,7 @@ void FakeDriveService::GetResourceListInternal( // If |search_query| is set, exclude the entry if it does not contain the // search query in the title. if (!should_exclude && !search_query.empty() && - !EntryMatchWithQuery(*entry, search_query)) { + !EntryMatchWithQuery(entry, search_query)) { should_exclude = true; } @@ -1423,12 +1434,14 @@ void FakeDriveService::GetResourceListInternal( // changestamp is older than |largest_changestamp|. // See https://developers.google.com/google-apps/documents-list/ // #retrieving_all_changes_since_a_given_changestamp - if (start_changestamp > 0 && entry->changestamp() < start_changestamp) + if (start_changestamp > 0 && entry.change_id() < start_changestamp) should_exclude = true; // If the caller requests other list than change list by specifying // zero-|start_changestamp|, exclude deleted entry from the result. - if (!start_changestamp && entry->deleted()) + const bool deleted = entry.is_deleted() || + (entry.file() && entry.file()->labels().is_trashed()); + if (!start_changestamp && deleted) should_exclude = true; // The entry matched the criteria for inclusion. @@ -1441,14 +1454,23 @@ void FakeDriveService::GetResourceListInternal( if (start_offset > 0 && num_entries_matched <= start_offset) should_exclude = true; - if (!should_exclude) - entries.push_back(entry.release()); + if (!should_exclude) { + scoped_ptr<ChangeResource> entry_copied(new ChangeResource); + entry_copied->set_change_id(entry.change_id()); + entry_copied->set_file_id(entry.file_id()); + entry_copied->set_deleted(entry.is_deleted()); + if (entry.file()) { + entry_copied->set_file( + make_scoped_ptr(new FileResource(*entry.file()))); + } + entry_copied->set_modification_date(entry.modification_date()); + entries.push_back(entry_copied.release()); + } } - scoped_ptr<ResourceList> resource_list(new ResourceList); + scoped_ptr<ChangeList> change_list(new ChangeList); if (start_changestamp > 0 && start_offset == 0) { - resource_list->set_largest_changestamp( - about_resource_->largest_change_id()); + change_list->set_largest_change_id(about_resource_->largest_change_id()); } // If |max_results| is set, trim the entries if the number exceeded the max @@ -1477,18 +1499,15 @@ void FakeDriveService::GetResourceListInternal( next_url, "parent", directory_resource_id); } - Link* link = new Link; - link->set_type(Link::LINK_NEXT); - link->set_href(next_url); - resource_list->mutable_links()->push_back(link); + change_list->set_next_link(next_url); } - resource_list->set_entries(entries.Pass()); + *change_list->mutable_items() = entries.Pass(); if (load_counter) *load_counter += 1; base::MessageLoop::current()->PostTask( FROM_HERE, - base::Bind(callback, HTTP_SUCCESS, base::Passed(&resource_list))); + base::Bind(callback, HTTP_SUCCESS, base::Passed(&change_list))); } GURL FakeDriveService::GetNewUploadSessionUrl() { diff --git a/chrome/browser/drive/fake_drive_service.h b/chrome/browser/drive/fake_drive_service.h index 738c621..eb0d8ec 100644 --- a/chrome/browser/drive/fake_drive_service.h +++ b/chrome/browser/drive/fake_drive_service.h @@ -130,10 +130,10 @@ class FakeDriveService : public DriveServiceInterface { const google_apis::GetResourceListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetChangeList( int64 start_changestamp, - const google_apis::GetResourceListCallback& callback) OVERRIDE; + const google_apis::ChangeListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetRemainingChangeList( const GURL& next_link, - const google_apis::GetResourceListCallback& callback) OVERRIDE; + const google_apis::ChangeListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetRemainingFileList( const GURL& next_link, const google_apis::GetResourceListCallback& callback) OVERRIDE; @@ -311,7 +311,7 @@ class FakeDriveService : public DriveServiceInterface { int start_offset, int max_results, int* load_counter, - const google_apis::GetResourceListCallback& callback); + const google_apis::ChangeListCallback& callback); // Returns new upload session URL. GURL GetNewUploadSessionUrl(); diff --git a/chrome/browser/drive/fake_drive_service_unittest.cc b/chrome/browser/drive/fake_drive_service_unittest.cc index e592323..9e050c7 100644 --- a/chrome/browser/drive/fake_drive_service_unittest.cc +++ b/chrome/browser/drive/fake_drive_service_unittest.cc @@ -24,6 +24,8 @@ using google_apis::AboutResource; using google_apis::AppList; +using google_apis::ChangeList; +using google_apis::ChangeResource; using google_apis::GDATA_NO_CONNECTION; using google_apis::GDATA_OTHER_ERROR; using google_apis::GDataErrorCode; @@ -374,19 +376,19 @@ TEST_F(FakeDriveServiceTest, GetChangeList_NoNewEntries) { ASSERT_TRUE(test_util::SetUpTestEntries(&fake_service_)); GDataErrorCode error = GDATA_OTHER_ERROR; - scoped_ptr<ResourceList> resource_list; + scoped_ptr<ChangeList> change_list; fake_service_.GetChangeList( fake_service_.about_resource().largest_change_id() + 1, - test_util::CreateCopyResultCallback(&error, &resource_list)); + test_util::CreateCopyResultCallback(&error, &change_list)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(HTTP_SUCCESS, error); - ASSERT_TRUE(resource_list); + ASSERT_TRUE(change_list); EXPECT_EQ(fake_service_.about_resource().largest_change_id(), - resource_list->largest_changestamp()); + change_list->largest_change_id()); // This should be empty as the latest changestamp was passed to // GetResourceList(), hence there should be no new entries. - EXPECT_EQ(0U, resource_list->entries().size()); + EXPECT_EQ(0U, change_list->items().size()); // It's considered loaded even if the result is empty. EXPECT_EQ(1, fake_service_.change_list_load_count()); } @@ -402,19 +404,20 @@ TEST_F(FakeDriveServiceTest, GetChangeList_WithNewEntry) { // Get the resource list newer than old_largest_change_id. GDataErrorCode error = GDATA_OTHER_ERROR; - scoped_ptr<ResourceList> resource_list; + scoped_ptr<ChangeList> change_list; fake_service_.GetChangeList( old_largest_change_id + 1, - test_util::CreateCopyResultCallback(&error, &resource_list)); + test_util::CreateCopyResultCallback(&error, &change_list)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(HTTP_SUCCESS, error); - ASSERT_TRUE(resource_list); + ASSERT_TRUE(change_list); EXPECT_EQ(fake_service_.about_resource().largest_change_id(), - resource_list->largest_changestamp()); + change_list->largest_change_id()); // The result should only contain the newly created directory. - ASSERT_EQ(1U, resource_list->entries().size()); - EXPECT_EQ("new directory", resource_list->entries()[0]->title()); + ASSERT_EQ(1U, change_list->items().size()); + ASSERT_TRUE(change_list->items()[0]->file()); + EXPECT_EQ("new directory", change_list->items()[0]->file()->title()); EXPECT_EQ(1, fake_service_.change_list_load_count()); } @@ -423,14 +426,14 @@ TEST_F(FakeDriveServiceTest, GetChangeList_Offline) { fake_service_.set_offline(true); GDataErrorCode error = GDATA_OTHER_ERROR; - scoped_ptr<ResourceList> resource_list; + scoped_ptr<ChangeList> change_list; fake_service_.GetChangeList( 654321, // start_changestamp - test_util::CreateCopyResultCallback(&error, &resource_list)); + test_util::CreateCopyResultCallback(&error, &change_list)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(GDATA_NO_CONNECTION, error); - EXPECT_FALSE(resource_list); + EXPECT_FALSE(change_list); } TEST_F(FakeDriveServiceTest, GetChangeList_DeletedEntry) { @@ -449,22 +452,22 @@ TEST_F(FakeDriveServiceTest, GetChangeList_DeletedEntry) { // Get the resource list newer than old_largest_change_id. error = GDATA_OTHER_ERROR; - scoped_ptr<ResourceList> resource_list; + scoped_ptr<ChangeList> change_list; fake_service_.GetChangeList( old_largest_change_id + 1, - test_util::CreateCopyResultCallback(&error, &resource_list)); + test_util::CreateCopyResultCallback(&error, &change_list)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(HTTP_SUCCESS, error); - ASSERT_TRUE(resource_list); + ASSERT_TRUE(change_list); EXPECT_EQ(fake_service_.about_resource().largest_change_id(), - resource_list->largest_changestamp()); + change_list->largest_change_id()); // The result should only contain the deleted file. - ASSERT_EQ(1U, resource_list->entries().size()); - const ResourceEntry& entry = *resource_list->entries()[0]; - EXPECT_EQ("file:2_file_resource_id", entry.resource_id()); - EXPECT_TRUE(entry.title().empty()); - EXPECT_TRUE(entry.deleted()); + ASSERT_EQ(1U, change_list->items().size()); + const ChangeResource& item = *change_list->items()[0]; + EXPECT_EQ("file:2_file_resource_id", item.file_id()); + EXPECT_FALSE(item.file()); + EXPECT_TRUE(item.is_deleted()); EXPECT_EQ(1, fake_service_.change_list_load_count()); } @@ -483,25 +486,26 @@ TEST_F(FakeDriveServiceTest, GetChangeList_TrashedEntry) { // Get the resource list newer than old_largest_change_id. error = GDATA_OTHER_ERROR; - scoped_ptr<ResourceList> resource_list; + scoped_ptr<ChangeList> change_list; fake_service_.GetChangeList( old_largest_change_id + 1, - test_util::CreateCopyResultCallback(&error, &resource_list)); + test_util::CreateCopyResultCallback(&error, &change_list)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(HTTP_SUCCESS, error); - ASSERT_TRUE(resource_list); + ASSERT_TRUE(change_list); EXPECT_EQ(fake_service_.about_resource().largest_change_id(), - resource_list->largest_changestamp()); + change_list->largest_change_id()); // The result should only contain the trashed file. - ASSERT_EQ(1U, resource_list->entries().size()); - const ResourceEntry& entry = *resource_list->entries()[0]; - EXPECT_EQ("file:2_file_resource_id", entry.resource_id()); - EXPECT_TRUE(entry.deleted()); + ASSERT_EQ(1U, change_list->items().size()); + const ChangeResource& item = *change_list->items()[0]; + EXPECT_EQ("file:2_file_resource_id", item.file_id()); + ASSERT_TRUE(item.file()); + EXPECT_TRUE(item.file()->labels().is_trashed()); EXPECT_EQ(1, fake_service_.change_list_load_count()); } -TEST_F(FakeDriveServiceTest, GetRemainingChangeList_GetAllResourceList) { +TEST_F(FakeDriveServiceTest, GetRemainingFileList_GetAllResourceList) { ASSERT_TRUE(test_util::SetUpTestEntries(&fake_service_)); fake_service_.set_default_max_results(6); @@ -528,7 +532,7 @@ TEST_F(FakeDriveServiceTest, GetRemainingChangeList_GetAllResourceList) { error = GDATA_OTHER_ERROR; resource_list.reset(); - fake_service_.GetRemainingChangeList( + fake_service_.GetRemainingFileList( next_url, test_util::CreateCopyResultCallback(&error, &resource_list)); base::RunLoop().RunUntilIdle(); @@ -546,7 +550,7 @@ TEST_F(FakeDriveServiceTest, GetRemainingChangeList_GetAllResourceList) { error = GDATA_OTHER_ERROR; resource_list.reset(); - fake_service_.GetRemainingChangeList( + fake_service_.GetRemainingFileList( next_url, test_util::CreateCopyResultCallback(&error, &resource_list)); base::RunLoop().RunUntilIdle(); @@ -669,56 +673,51 @@ TEST_F(FakeDriveServiceTest, GetRemainingChangeList_GetChangeList) { } GDataErrorCode error = GDATA_OTHER_ERROR; - scoped_ptr<ResourceList> resource_list; + scoped_ptr<ChangeList> change_list; fake_service_.GetChangeList( old_largest_change_id + 1, // start_changestamp - test_util::CreateCopyResultCallback(&error, &resource_list)); + test_util::CreateCopyResultCallback(&error, &change_list)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(HTTP_SUCCESS, error); - ASSERT_TRUE(resource_list); + ASSERT_TRUE(change_list); // Do some sanity check. // The number of results is 5 entries. Thus, it should split into three // chunks: 2, 2 and then 1. - EXPECT_EQ(2U, resource_list->entries().size()); + EXPECT_EQ(2U, change_list->items().size()); EXPECT_EQ(1, fake_service_.change_list_load_count()); // Second page loading. - const google_apis::Link* next_link = - resource_list->GetLinkByType(Link::LINK_NEXT); - ASSERT_TRUE(next_link); - // Keep the next url before releasing the |resource_list|. - GURL next_url(next_link->href()); + // Keep the next url before releasing the |change_list|. + GURL next_url = change_list->next_link(); error = GDATA_OTHER_ERROR; - resource_list.reset(); + change_list.reset(); fake_service_.GetRemainingChangeList( next_url, - test_util::CreateCopyResultCallback(&error, &resource_list)); + test_util::CreateCopyResultCallback(&error, &change_list)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(HTTP_SUCCESS, error); - ASSERT_TRUE(resource_list); + ASSERT_TRUE(change_list); - EXPECT_EQ(2U, resource_list->entries().size()); + EXPECT_EQ(2U, change_list->items().size()); EXPECT_EQ(1, fake_service_.change_list_load_count()); // Third page loading. - next_link = resource_list->GetLinkByType(Link::LINK_NEXT); - ASSERT_TRUE(next_link); - next_url = GURL(next_link->href()); + next_url = change_list->next_link(); error = GDATA_OTHER_ERROR; - resource_list.reset(); + change_list.reset(); fake_service_.GetRemainingChangeList( next_url, - test_util::CreateCopyResultCallback(&error, &resource_list)); + test_util::CreateCopyResultCallback(&error, &change_list)); base::RunLoop().RunUntilIdle(); EXPECT_EQ(HTTP_SUCCESS, error); - ASSERT_TRUE(resource_list); + ASSERT_TRUE(change_list); - EXPECT_EQ(1U, resource_list->entries().size()); + EXPECT_EQ(1U, change_list->items().size()); EXPECT_EQ(1, fake_service_.change_list_load_count()); } diff --git a/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.cc b/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.cc index 0afa45c..39ce2d4 100644 --- a/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.cc +++ b/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.cc @@ -111,7 +111,7 @@ google_apis::CancelCallback DriveServiceOnWorker::GetAboutResource( google_apis::CancelCallback DriveServiceOnWorker::GetChangeList( int64 start_changestamp, - const google_apis::GetResourceListCallback& callback) { + const google_apis::ChangeListCallback& callback) { ui_task_runner_->PostTask( FROM_HERE, base::Bind(&DriveServiceWrapper::GetChangeList, @@ -127,7 +127,7 @@ google_apis::CancelCallback DriveServiceOnWorker::GetChangeList( google_apis::CancelCallback DriveServiceOnWorker::GetRemainingChangeList( const GURL& next_link, - const google_apis::GetResourceListCallback& callback) { + const google_apis::ChangeListCallback& callback) { ui_task_runner_->PostTask( FROM_HERE, base::Bind(&DriveServiceWrapper::GetRemainingChangeList, diff --git a/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.h b/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.h index 82f988a..66b8a9e 100644 --- a/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.h +++ b/chrome/browser/sync_file_system/drive_backend/drive_service_on_worker.h @@ -54,11 +54,11 @@ class DriveServiceOnWorker : public drive::DriveServiceInterface { virtual google_apis::CancelCallback GetChangeList( int64 start_changestamp, - const google_apis::GetResourceListCallback& callback) OVERRIDE; + const google_apis::ChangeListCallback& callback) OVERRIDE; virtual google_apis::CancelCallback GetRemainingChangeList( const GURL& next_link, - const google_apis::GetResourceListCallback& callback) OVERRIDE; + const google_apis::ChangeListCallback& callback) OVERRIDE; virtual std::string GetRootResourceId() const OVERRIDE; diff --git a/chrome/browser/sync_file_system/drive_backend/drive_service_wrapper.cc b/chrome/browser/sync_file_system/drive_backend/drive_service_wrapper.cc index d0facd0..24f4476 100644 --- a/chrome/browser/sync_file_system/drive_backend/drive_service_wrapper.cc +++ b/chrome/browser/sync_file_system/drive_backend/drive_service_wrapper.cc @@ -58,13 +58,13 @@ void DriveServiceWrapper::GetAboutResource( void DriveServiceWrapper::GetChangeList( int64 start_changestamp, - const google_apis::GetResourceListCallback& callback) { + const google_apis::ChangeListCallback& callback) { drive_service_->GetChangeList(start_changestamp, callback); } void DriveServiceWrapper::GetRemainingChangeList( const GURL& next_link, - const google_apis::GetResourceListCallback& callback) { + const google_apis::ChangeListCallback& callback) { drive_service_->GetRemainingChangeList(next_link, callback); } diff --git a/chrome/browser/sync_file_system/drive_backend/drive_service_wrapper.h b/chrome/browser/sync_file_system/drive_backend/drive_service_wrapper.h index 75b27cb..1c2efde 100644 --- a/chrome/browser/sync_file_system/drive_backend/drive_service_wrapper.h +++ b/chrome/browser/sync_file_system/drive_backend/drive_service_wrapper.h @@ -42,11 +42,11 @@ class DriveServiceWrapper : public base::SupportsWeakPtr<DriveServiceWrapper> { void GetChangeList( int64 start_changestamp, - const google_apis::GetResourceListCallback& callback); + const google_apis::ChangeListCallback& callback); void GetRemainingChangeList( const GURL& next_link, - const google_apis::GetResourceListCallback& callback); + const google_apis::ChangeListCallback& callback); void GetRemainingFileList( const GURL& next_link, diff --git a/chrome/browser/sync_file_system/drive_backend/list_changes_task.cc b/chrome/browser/sync_file_system/drive_backend/list_changes_task.cc index 0b97960..3197a1c 100644 --- a/chrome/browser/sync_file_system/drive_backend/list_changes_task.cc +++ b/chrome/browser/sync_file_system/drive_backend/list_changes_task.cc @@ -7,7 +7,6 @@ #include "base/bind.h" #include "base/format_macros.h" #include "base/location.h" -#include "chrome/browser/drive/drive_api_util.h" #include "chrome/browser/drive/drive_service_interface.h" #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" @@ -23,22 +22,6 @@ namespace sync_file_system { namespace drive_backend { -namespace { - -scoped_ptr<google_apis::ChangeResource> ConvertResourceEntryToChangeResource( - const google_apis::ResourceEntry& entry) { - scoped_ptr<google_apis::ChangeResource> out(new google_apis::ChangeResource); - out->set_file_id(entry.resource_id()); - if (!entry.deleted()) - out->set_file(drive::util::ConvertResourceEntryToFileResource(entry)); - out->set_change_id(entry.changestamp()); - out->set_deleted(entry.deleted()); - - return out.Pass(); -} - -} // namespace - ListChangesTask::ListChangesTask(SyncEngineContext* sync_context) : sync_context_(sync_context), weak_ptr_factory_(this) { @@ -76,7 +59,7 @@ void ListChangesTask::StartListing(scoped_ptr<SyncTaskToken> token) { void ListChangesTask::DidListChanges( scoped_ptr<SyncTaskToken> token, google_apis::GDataErrorCode error, - scoped_ptr<google_apis::ResourceList> resource_list) { + scoped_ptr<google_apis::ChangeList> change_list) { SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); if (status != SYNC_STATUS_OK) { util::Log(logging::LOG_VERBOSE, FROM_HERE, @@ -86,7 +69,7 @@ void ListChangesTask::DidListChanges( return; } - if (!resource_list) { + if (!change_list) { NOTREACHED(); util::Log(logging::LOG_VERBOSE, FROM_HERE, "[Changes] Got invalid change list."); @@ -95,16 +78,16 @@ void ListChangesTask::DidListChanges( return; } - change_list_.reserve(change_list_.size() + resource_list->entries().size()); - for (size_t i = 0; i < resource_list->entries().size(); ++i) { - change_list_.push_back(ConvertResourceEntryToChangeResource( - *resource_list->entries()[i]).release()); - } + std::vector<google_apis::ChangeResource*> changes; + change_list->mutable_items()->release(&changes); + + change_list_.reserve(change_list_.size() + changes.size()); + for (size_t i = 0; i < changes.size(); ++i) + change_list_.push_back(changes[i]); - GURL next_feed; - if (resource_list->GetNextFeedURL(&next_feed)) { + if (!change_list->next_link().is_empty()) { drive_service()->GetRemainingChangeList( - next_feed, + change_list->next_link(), base::Bind( &ListChangesTask::DidListChanges, weak_ptr_factory_.GetWeakPtr(), @@ -126,7 +109,7 @@ void ListChangesTask::DidListChanges( blocking_factor.Pass(), base::Bind(&ListChangesTask::CheckInChangeList, weak_ptr_factory_.GetWeakPtr(), - resource_list->largest_changestamp())); + change_list->largest_change_id())); } void ListChangesTask::CheckInChangeList(int64 largest_change_id, diff --git a/chrome/browser/sync_file_system/drive_backend/list_changes_task.h b/chrome/browser/sync_file_system/drive_backend/list_changes_task.h index 272e788..c594ba3 100644 --- a/chrome/browser/sync_file_system/drive_backend/list_changes_task.h +++ b/chrome/browser/sync_file_system/drive_backend/list_changes_task.h @@ -16,8 +16,8 @@ class DriveServiceInterface; } namespace google_apis { +class ChangeList; class ChangeResource; -class ResourceList; } namespace sync_file_system { @@ -37,7 +37,7 @@ class ListChangesTask : public SyncTask { void StartListing(scoped_ptr<SyncTaskToken> token); void DidListChanges(scoped_ptr<SyncTaskToken> token, google_apis::GDataErrorCode error, - scoped_ptr<google_apis::ResourceList> resource_list); + scoped_ptr<google_apis::ChangeList> change_list); void CheckInChangeList(int64 largest_change_id, scoped_ptr<SyncTaskToken> token); diff --git a/chrome/browser/sync_file_system/drive_backend_v1/api_util.cc b/chrome/browser/sync_file_system/drive_backend_v1/api_util.cc index 2ec9791..62c579f 100644 --- a/chrome/browser/sync_file_system/drive_backend_v1/api_util.cc +++ b/chrome/browser/sync_file_system/drive_backend_v1/api_util.cc @@ -480,7 +480,7 @@ void APIUtil::ListChanges(int64 start_changestamp, drive_service_->GetChangeList( start_changestamp, - base::Bind(&APIUtil::DidGetResourceList, AsWeakPtr(), callback)); + base::Bind(&APIUtil::DidGetChangeList, AsWeakPtr(), callback)); } void APIUtil::ContinueListing(const GURL& next_link, @@ -675,6 +675,24 @@ void APIUtil::OnConnectionTypeChanged( CancelAllUploads(google_apis::GDATA_NO_CONNECTION); } +void APIUtil::DidGetChangeList( + const ResourceListCallback& callback, + google_apis::GDataErrorCode error, + scoped_ptr<google_apis::ChangeList> change_list) { + DCHECK(CalledOnValidThread()); + + if (error != google_apis::HTTP_SUCCESS) { + DVLOG(2) << "Error on listing changes: " << error; + callback.Run(error, scoped_ptr<google_apis::ResourceList>()); + return; + } + + DVLOG(2) << "Got change list"; + DCHECK(change_list); + callback.Run(error, + drive::util::ConvertChangeListToResourceList(*change_list)); +} + void APIUtil::DidGetResourceList( const ResourceListCallback& callback, google_apis::GDataErrorCode error, diff --git a/chrome/browser/sync_file_system/drive_backend_v1/api_util.h b/chrome/browser/sync_file_system/drive_backend_v1/api_util.h index 42180ed..200d852 100644 --- a/chrome/browser/sync_file_system/drive_backend_v1/api_util.h +++ b/chrome/browser/sync_file_system/drive_backend_v1/api_util.h @@ -158,6 +158,10 @@ class APIUtil : public APIUtilInterface, const std::string& sync_root_resource_id, google_apis::GDataErrorCode error); + void DidGetChangeList(const ResourceListCallback& callback, + google_apis::GDataErrorCode error, + scoped_ptr<google_apis::ChangeList> change_list); + void DidGetResourceList(const ResourceListCallback& callback, google_apis::GDataErrorCode error, scoped_ptr<google_apis::ResourceList> resource_list); diff --git a/google_apis/drive/drive_api_parser.h b/google_apis/drive/drive_api_parser.h index 2700dbc..babb4cd 100644 --- a/google_apis/drive/drive_api_parser.h +++ b/google_apis/drive/drive_api_parser.h @@ -601,13 +601,11 @@ class FileList { // Returns a set of files in this list. const ScopedVector<FileResource>& items() const { return items_; } + ScopedVector<FileResource>* mutable_items() { return &items_; } void set_next_link(const GURL& next_link) { next_link_ = next_link; } - void set_items(ScopedVector<FileResource> items) { - items_ = items.Pass(); - } private: friend class DriveAPIParserTest; @@ -715,6 +713,7 @@ class ChangeList { // Returns a set of changes in this list. const ScopedVector<ChangeResource>& items() const { return items_; } + ScopedVector<ChangeResource>* mutable_items() { return &items_; } void set_next_link(const GURL& next_link) { next_link_ = next_link; @@ -722,9 +721,6 @@ class ChangeList { void set_largest_change_id(int64 largest_change_id) { largest_change_id_ = largest_change_id; } - void set_items(ScopedVector<ChangeResource> items) { - items_ = items.Pass(); - } private: friend class DriveAPIParserTest; |