1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h"
8 #include "base/location.h"
9 #include "chrome/browser/drive/drive_api_util.h"
10 #include "chrome/browser/drive/drive_service_interface.h"
11 #include "chrome/browser/google_apis/drive_api_parser.h"
12 #include "chrome/browser/google_apis/gdata_wapi_parser.h"
13 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
14 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
15 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h"
16 #include "chrome/browser/sync_file_system/logger.h"
17 #include "chrome/browser/sync_file_system/syncable_file_system_util.h"
19 namespace sync_file_system {
20 namespace drive_backend {
24 scoped_ptr<google_apis::ChangeResource> ConvertResourceEntryToChangeResource(
25 const google_apis::ResourceEntry& entry) {
26 scoped_ptr<google_apis::ChangeResource> out(new google_apis::ChangeResource);
27 out->set_file_id(entry.resource_id());
29 out->set_file(drive::util::ConvertResourceEntryToFileResource(entry));
30 out->set_change_id(entry.changestamp());
31 out->set_deleted(entry.deleted());
38 ListChangesTask::ListChangesTask(SyncEngineContext* sync_context)
39 : sync_context_(sync_context),
40 weak_ptr_factory_(this) {
43 ListChangesTask::~ListChangesTask() {
46 void ListChangesTask::Run(const SyncStatusCallback& callback) {
47 if (!metadata_database() || !drive_service()) {
48 util::Log(logging::LOG_ERROR, FROM_HERE, "Failed to get required sercive.");
49 RunSoon(FROM_HERE, base::Bind(callback, SYNC_STATUS_FAILED));
53 drive_service()->GetChangeList(
54 metadata_database()->GetLargestChangeID() + 1,
55 base::Bind(&ListChangesTask::DidListChanges,
56 weak_ptr_factory_.GetWeakPtr(), callback));
59 void ListChangesTask::DidListChanges(
60 const SyncStatusCallback& callback,
61 google_apis::GDataErrorCode error,
62 scoped_ptr<google_apis::ResourceList> resource_list) {
63 if (error != google_apis::HTTP_SUCCESS) {
64 util::Log(logging::LOG_ERROR, FROM_HERE, "Failed to fetch change list.");
65 callback.Run(SYNC_STATUS_NETWORK_ERROR);
69 change_list_.reserve(change_list_.size() + resource_list->entries().size());
70 for (size_t i = 0; i < resource_list->entries().size(); ++i) {
71 change_list_.push_back(ConvertResourceEntryToChangeResource(
72 *resource_list->entries()[i]).release());
75 // TODO(tzik): http://crbug.com/310964
76 // This may take long time to run in single task. Run this as a background
79 if (resource_list->GetNextFeedURL(&next_feed)) {
80 drive_service()->GetRemainingChangeList(
83 &ListChangesTask::DidListChanges,
84 weak_ptr_factory_.GetWeakPtr(),
89 metadata_database()->UpdateByChangeList(
90 resource_list->largest_changestamp(),
91 change_list_.Pass(), callback);
94 MetadataDatabase* ListChangesTask::metadata_database() {
95 return sync_context_->GetMetadataDatabase();
98 drive::DriveServiceInterface* ListChangesTask::drive_service() {
99 return sync_context_->GetDriveService();
102 } // namespace drive_backend
103 } // namespace sync_file_system