| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_CLIENT_H_ | |
| 6 #define CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_CLIENT_H_ | |
| 7 | |
| 8 #include <map> | |
| 9 #include <string> | |
| 10 #include <vector> | |
| 11 | |
| 12 #include "base/callback.h" | |
| 13 #include "base/memory/scoped_ptr.h" | |
| 14 #include "base/memory/weak_ptr.h" | |
| 15 #include "base/threading/thread_checker.h" | |
| 16 #include "base/time/time.h" | |
| 17 #include "components/drive/file_errors.h" | |
| 18 #include "components/drive/job_scheduler.h" | |
| 19 #include "components/drive/resource_metadata.h" | |
| 20 | |
| 21 namespace base { | |
| 22 class SequencedTaskRunner; | |
| 23 } | |
| 24 | |
| 25 namespace drive { | |
| 26 | |
| 27 class FileCacheEntry; | |
| 28 class JobScheduler; | |
| 29 class ResourceEntry; | |
| 30 struct ClientContext; | |
| 31 | |
| 32 namespace file_system { | |
| 33 class DownloadOperation; | |
| 34 class OperationDelegate; | |
| 35 } | |
| 36 | |
| 37 namespace internal { | |
| 38 | |
| 39 class ChangeListLoader; | |
| 40 class EntryUpdatePerformer; | |
| 41 class FileCache; | |
| 42 class LoaderController; | |
| 43 class ResourceMetadata; | |
| 44 | |
| 45 // The SyncClient is used to synchronize pinned files on Drive and the | |
| 46 // cache on the local drive. | |
| 47 // | |
| 48 // If the user logs out before fetching of the pinned files is complete, this | |
| 49 // client resumes fetching operations next time the user logs in, based on | |
| 50 // the states left in the cache. | |
| 51 class SyncClient { | |
| 52 public: | |
| 53 SyncClient(base::SequencedTaskRunner* blocking_task_runner, | |
| 54 file_system::OperationDelegate* delegate, | |
| 55 JobScheduler* scheduler, | |
| 56 ResourceMetadata* metadata, | |
| 57 FileCache* cache, | |
| 58 LoaderController* loader_controller, | |
| 59 const base::FilePath& temporary_file_directory); | |
| 60 virtual ~SyncClient(); | |
| 61 | |
| 62 // Adds a fetch task. | |
| 63 void AddFetchTask(const std::string& local_id); | |
| 64 | |
| 65 // Removes a fetch task. | |
| 66 void RemoveFetchTask(const std::string& local_id); | |
| 67 | |
| 68 // Adds a update task. | |
| 69 void AddUpdateTask(const ClientContext& context, const std::string& local_id); | |
| 70 | |
| 71 // Waits for the update task to complete and runs the callback. | |
| 72 // Returns false if no task is found for the spcecified ID. | |
| 73 bool WaitForUpdateTaskToComplete(const std::string& local_id, | |
| 74 const FileOperationCallback& callback); | |
| 75 | |
| 76 // Starts processing the backlog (i.e. pinned-but-not-filed files and | |
| 77 // dirty-but-not-uploaded files). Kicks off retrieval of the local | |
| 78 // IDs of these files, and then starts the sync loop. | |
| 79 void StartProcessingBacklog(); | |
| 80 | |
| 81 // Starts checking the existing pinned files to see if these are | |
| 82 // up-to-date. If stale files are detected, the local IDs of these files | |
| 83 // are added and the sync loop is started. | |
| 84 void StartCheckingExistingPinnedFiles(); | |
| 85 | |
| 86 // Sets a delay for testing. | |
| 87 void set_delay_for_testing(const base::TimeDelta& delay) { | |
| 88 delay_ = delay; | |
| 89 } | |
| 90 | |
| 91 private: | |
| 92 // Types of sync tasks. | |
| 93 enum SyncType { | |
| 94 FETCH, // Fetch a file from the Drive server. | |
| 95 UPDATE, // Updates an entry's metadata or content on the Drive server. | |
| 96 }; | |
| 97 | |
| 98 // States of sync tasks. | |
| 99 enum SyncState { | |
| 100 SUSPENDED, // Task is currently inactive. | |
| 101 PENDING, // Task is going to run. | |
| 102 RUNNING, // Task is running. | |
| 103 }; | |
| 104 | |
| 105 typedef std::pair<SyncType, std::string> SyncTaskKey; | |
| 106 | |
| 107 struct SyncTask { | |
| 108 SyncTask(); | |
| 109 ~SyncTask(); | |
| 110 SyncState state; | |
| 111 ClientContext context; | |
| 112 base::Callback<base::Closure(const ClientContext& context)> task; | |
| 113 bool should_run_again; | |
| 114 base::Closure cancel_closure; | |
| 115 std::vector<SyncTaskKey> dependent_tasks; | |
| 116 std::vector<FileOperationCallback> waiting_callbacks; | |
| 117 }; | |
| 118 | |
| 119 typedef std::map<SyncTaskKey, SyncTask> SyncTasks; | |
| 120 | |
| 121 // Performs a FETCH task. | |
| 122 base::Closure PerformFetchTask(const std::string& local_id, | |
| 123 const ClientContext& context); | |
| 124 | |
| 125 // Adds a FETCH task. | |
| 126 void AddFetchTaskInternal(const std::string& local_id, | |
| 127 const base::TimeDelta& delay); | |
| 128 | |
| 129 // Performs a UPDATE task. | |
| 130 base::Closure PerformUpdateTask(const std::string& local_id, | |
| 131 const ClientContext& context); | |
| 132 | |
| 133 // Adds a UPDATE task. | |
| 134 void AddUpdateTaskInternal(const ClientContext& context, | |
| 135 const std::string& local_id, | |
| 136 const base::TimeDelta& delay); | |
| 137 | |
| 138 // Adds the given task. If the same task is found, does nothing. | |
| 139 void AddTask(const SyncTasks::key_type& key, | |
| 140 const SyncTask& task, | |
| 141 const base::TimeDelta& delay); | |
| 142 | |
| 143 // Called when a task is ready to start. | |
| 144 void StartTask(const SyncTasks::key_type& key); | |
| 145 void StartTaskAfterGetParentResourceEntry(const SyncTasks::key_type& key, | |
| 146 const ResourceEntry* parent, | |
| 147 FileError error); | |
| 148 | |
| 149 // Called when the local IDs of files in the backlog are obtained. | |
| 150 void OnGetLocalIdsOfBacklog(const std::vector<std::string>* to_fetch, | |
| 151 const std::vector<std::string>* to_update); | |
| 152 | |
| 153 // Adds fetch tasks. | |
| 154 void AddFetchTasks(const std::vector<std::string>* local_ids); | |
| 155 | |
| 156 // Called when a task is completed. | |
| 157 void OnTaskComplete(SyncType type, | |
| 158 const std::string& local_id, | |
| 159 FileError error); | |
| 160 | |
| 161 // Called when the file for |local_id| is fetched. | |
| 162 void OnFetchFileComplete(const std::string& local_id, | |
| 163 FileError error, | |
| 164 const base::FilePath& local_path, | |
| 165 scoped_ptr<ResourceEntry> entry); | |
| 166 | |
| 167 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; | |
| 168 file_system::OperationDelegate* operation_delegate_; | |
| 169 ResourceMetadata* metadata_; | |
| 170 FileCache* cache_; | |
| 171 | |
| 172 // Used to fetch pinned files. | |
| 173 scoped_ptr<file_system::DownloadOperation> download_operation_; | |
| 174 | |
| 175 // Used to update entry metadata. | |
| 176 scoped_ptr<EntryUpdatePerformer> entry_update_performer_; | |
| 177 | |
| 178 // Sync tasks to be processed. | |
| 179 SyncTasks tasks_; | |
| 180 | |
| 181 // The delay is used for delaying processing tasks in AddTask(). | |
| 182 base::TimeDelta delay_; | |
| 183 | |
| 184 // The delay is used for delaying retry of tasks on server errors. | |
| 185 base::TimeDelta long_delay_; | |
| 186 | |
| 187 base::ThreadChecker thread_checker_; | |
| 188 | |
| 189 // Note: This should remain the last member so it'll be destroyed and | |
| 190 // invalidate its weak pointers before any other members are destroyed. | |
| 191 base::WeakPtrFactory<SyncClient> weak_ptr_factory_; | |
| 192 | |
| 193 DISALLOW_COPY_AND_ASSIGN(SyncClient); | |
| 194 }; | |
| 195 | |
| 196 } // namespace internal | |
| 197 } // namespace drive | |
| 198 | |
| 199 #endif // CHROME_BROWSER_CHROMEOS_DRIVE_SYNC_CLIENT_H_ | |
| OLD | NEW |