- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / drive_backend / list_changes_task.cc
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.
4
5 #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h"
6
7 #include "base/bind.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"
18
19 namespace sync_file_system {
20 namespace drive_backend {
21
22 namespace {
23
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());
28   if (!entry.deleted())
29     out->set_file(drive::util::ConvertResourceEntryToFileResource(entry));
30   out->set_change_id(entry.changestamp());
31   out->set_deleted(entry.deleted());
32
33   return out.Pass();
34 }
35
36 }  // namespace
37
38 ListChangesTask::ListChangesTask(SyncEngineContext* sync_context)
39     : sync_context_(sync_context),
40       weak_ptr_factory_(this) {
41 }
42
43 ListChangesTask::~ListChangesTask() {
44 }
45
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));
50     return;
51   }
52
53   drive_service()->GetChangeList(
54       metadata_database()->GetLargestChangeID() + 1,
55       base::Bind(&ListChangesTask::DidListChanges,
56                  weak_ptr_factory_.GetWeakPtr(), callback));
57 }
58
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);
66     return;
67   }
68
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());
73   }
74
75   // TODO(tzik): http://crbug.com/310964
76   // This may take long time to run in single task.  Run this as a background
77   // task.
78   GURL next_feed;
79   if (resource_list->GetNextFeedURL(&next_feed)) {
80     drive_service()->GetRemainingChangeList(
81         next_feed,
82         base::Bind(
83             &ListChangesTask::DidListChanges,
84             weak_ptr_factory_.GetWeakPtr(),
85             callback));
86     return;
87   }
88
89   metadata_database()->UpdateByChangeList(
90       resource_list->largest_changestamp(),
91       change_list_.Pass(), callback);
92 }
93
94 MetadataDatabase* ListChangesTask::metadata_database() {
95   return sync_context_->GetMetadataDatabase();
96 }
97
98 drive::DriveServiceInterface* ListChangesTask::drive_service() {
99   return sync_context_->GetDriveService();
100 }
101
102 }  // namespace drive_backend
103 }  // namespace sync_file_system