OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" | 5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.
h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "chrome/browser/drive/drive_api_service.h" | 10 #include "chrome/browser/drive/drive_api_service.h" |
11 #include "chrome/browser/drive/drive_api_util.h" | 11 #include "chrome/browser/drive/drive_api_util.h" |
12 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" | 12 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.
h" |
13 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" | 13 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h" |
14 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 14 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
15 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" | 15 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" |
| 16 #include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h" |
| 17 #include "chrome/browser/sync_file_system/drive_backend/sync_task_token.h" |
16 #include "chrome/browser/sync_file_system/logger.h" | 18 #include "chrome/browser/sync_file_system/logger.h" |
17 #include "google_apis/drive/drive_api_parser.h" | 19 #include "google_apis/drive/drive_api_parser.h" |
18 #include "google_apis/drive/gdata_wapi_parser.h" | 20 #include "google_apis/drive/gdata_wapi_parser.h" |
19 | 21 |
20 namespace sync_file_system { | 22 namespace sync_file_system { |
21 namespace drive_backend { | 23 namespace drive_backend { |
22 | 24 |
23 namespace { | 25 namespace { |
24 | 26 |
25 //////////////////////////////////////////////////////////////////////////////// | 27 //////////////////////////////////////////////////////////////////////////////// |
26 // Functions below are for wrapping the access to legacy GData WAPI classes. | 28 // Functions below are for wrapping the access to legacy GData WAPI classes. |
27 | 29 |
28 bool IsDeleted(const google_apis::ResourceEntry& entry) { | |
29 return entry.deleted(); | |
30 } | |
31 | |
32 bool HasNoParents(const google_apis::ResourceEntry& entry) { | 30 bool HasNoParents(const google_apis::ResourceEntry& entry) { |
33 return !entry.GetLinkByType(google_apis::Link::LINK_PARENT); | 31 return !entry.GetLinkByType(google_apis::Link::LINK_PARENT); |
34 } | 32 } |
35 | 33 |
36 bool HasFolderAsParent(const google_apis::ResourceEntry& entry, | 34 bool HasFolderAsParent(const google_apis::ResourceEntry& entry, |
37 const std::string& parent_id) { | 35 const std::string& parent_id) { |
38 const ScopedVector<google_apis::Link>& links = entry.links(); | 36 const ScopedVector<google_apis::Link>& links = entry.links(); |
39 for (ScopedVector<google_apis::Link>::const_iterator itr = links.begin(); | 37 for (ScopedVector<google_apis::Link>::const_iterator itr = links.begin(); |
40 itr != links.end(); ++itr) { | 38 itr != links.end(); ++itr) { |
41 const google_apis::Link& link = **itr; | 39 const google_apis::Link& link = **itr; |
42 if (link.type() != google_apis::Link::LINK_PARENT) | 40 if (link.type() != google_apis::Link::LINK_PARENT) |
43 continue; | 41 continue; |
44 if (drive::util::ExtractResourceIdFromUrl(link.href()) == parent_id) | 42 if (drive::util::ExtractResourceIdFromUrl(link.href()) == parent_id) |
45 return true; | 43 return true; |
46 } | 44 } |
47 return false; | 45 return false; |
48 } | 46 } |
49 | 47 |
50 bool LessOnCreationTime(const google_apis::ResourceEntry& left, | 48 bool LessOnCreationTime(const google_apis::ResourceEntry& left, |
51 const google_apis::ResourceEntry& right) { | 49 const google_apis::ResourceEntry& right) { |
52 return left.published_time() < right.published_time(); | 50 return left.published_time() < right.published_time(); |
53 } | 51 } |
54 | 52 |
55 // Posts a request to continue listing. Returns false if the list doesn't need | 53 typedef base::Callback<void(scoped_ptr<SyncTaskToken> token, |
56 // listing anymore. | 54 google_apis::GDataErrorCode error, |
57 bool GetRemainingFileList( | 55 scoped_ptr<google_apis::ResourceList> resources)> |
58 google_apis::CancelCallback* cancel_callback, | 56 TokenAndResourceListCallback; |
59 drive::DriveServiceInterface* api_service, | |
60 const google_apis::ResourceList& resource_list, | |
61 const google_apis::GetResourceListCallback& callback) { | |
62 GURL next_url; | |
63 if (!resource_list.GetNextFeedURL(&next_url)) | |
64 return false; | |
65 | |
66 *cancel_callback = api_service->GetRemainingFileList(next_url, callback); | |
67 return true; | |
68 } | |
69 | |
70 std::string GetID(const google_apis::ResourceEntry& entry) { | |
71 return entry.resource_id(); | |
72 } | |
73 | 57 |
74 ScopedVector<google_apis::FileResource> ConvertResourceEntriesToFileResources( | 58 ScopedVector<google_apis::FileResource> ConvertResourceEntriesToFileResources( |
75 const ScopedVector<google_apis::ResourceEntry>& entries) { | 59 const ScopedVector<google_apis::ResourceEntry>& entries) { |
76 ScopedVector<google_apis::FileResource> resources; | 60 ScopedVector<google_apis::FileResource> resources; |
77 for (ScopedVector<google_apis::ResourceEntry>::const_iterator itr = | 61 for (ScopedVector<google_apis::ResourceEntry>::const_iterator itr = |
78 entries.begin(); | 62 entries.begin(); |
79 itr != entries.end(); | 63 itr != entries.end(); |
80 ++itr) { | 64 ++itr) { |
81 resources.push_back( | 65 resources.push_back( |
82 drive::util::ConvertResourceEntryToFileResource( | 66 drive::util::ConvertResourceEntryToFileResource( |
(...skipping 23 matching lines...) Expand all Loading... |
106 weak_ptr_factory_(this) { | 90 weak_ptr_factory_(this) { |
107 DCHECK(task_runner); | 91 DCHECK(task_runner); |
108 DCHECK(drive_service_); | 92 DCHECK(drive_service_); |
109 } | 93 } |
110 | 94 |
111 SyncEngineInitializer::~SyncEngineInitializer() { | 95 SyncEngineInitializer::~SyncEngineInitializer() { |
112 if (!cancel_callback_.is_null()) | 96 if (!cancel_callback_.is_null()) |
113 cancel_callback_.Run(); | 97 cancel_callback_.Run(); |
114 } | 98 } |
115 | 99 |
116 void SyncEngineInitializer::RunSequential(const SyncStatusCallback& callback) { | 100 void SyncEngineInitializer::Run(scoped_ptr<SyncTaskToken> token) { |
117 util::Log(logging::LOG_VERBOSE, FROM_HERE, "[Initialize] Start."); | 101 util::Log(logging::LOG_VERBOSE, FROM_HERE, "[Initialize] Start."); |
118 | 102 |
119 // The metadata seems to have been already initialized. Just return with OK. | 103 // The metadata seems to have been already initialized. Just return with OK. |
120 if (sync_context_ && sync_context_->GetMetadataDatabase()) { | 104 if (sync_context_ && sync_context_->GetMetadataDatabase()) { |
121 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 105 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
122 "[Initialize] Already initialized."); | 106 "[Initialize] Already initialized."); |
123 callback.Run(SYNC_STATUS_OK); | 107 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
124 return; | 108 return; |
125 } | 109 } |
126 | 110 |
127 MetadataDatabase::Create( | 111 MetadataDatabase::Create( |
128 task_runner_.get(), database_path_, env_override_, | 112 task_runner_.get(), database_path_, env_override_, |
129 base::Bind(&SyncEngineInitializer::DidCreateMetadataDatabase, | 113 base::Bind(&SyncEngineInitializer::DidCreateMetadataDatabase, |
130 weak_ptr_factory_.GetWeakPtr(), callback)); | 114 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
131 } | 115 } |
132 | 116 |
133 scoped_ptr<MetadataDatabase> SyncEngineInitializer::PassMetadataDatabase() { | 117 scoped_ptr<MetadataDatabase> SyncEngineInitializer::PassMetadataDatabase() { |
134 return metadata_database_.Pass(); | 118 return metadata_database_.Pass(); |
135 } | 119 } |
136 | 120 |
137 void SyncEngineInitializer::DidCreateMetadataDatabase( | 121 void SyncEngineInitializer::DidCreateMetadataDatabase( |
138 const SyncStatusCallback& callback, | 122 scoped_ptr<SyncTaskToken> token, |
139 SyncStatusCode status, | 123 SyncStatusCode status, |
140 scoped_ptr<MetadataDatabase> instance) { | 124 scoped_ptr<MetadataDatabase> instance) { |
141 if (status != SYNC_STATUS_OK) { | 125 if (status != SYNC_STATUS_OK) { |
142 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 126 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
143 "[Initialize] Failed to initialize MetadataDatabase."); | 127 "[Initialize] Failed to initialize MetadataDatabase."); |
144 callback.Run(status); | 128 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
145 return; | 129 return; |
146 } | 130 } |
147 | 131 |
148 DCHECK(instance); | 132 DCHECK(instance); |
149 metadata_database_ = instance.Pass(); | 133 metadata_database_ = instance.Pass(); |
150 if (metadata_database_->HasSyncRoot()) { | 134 if (metadata_database_->HasSyncRoot()) { |
151 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 135 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
152 "[Initialize] Found local cache of sync-root."); | 136 "[Initialize] Found local cache of sync-root."); |
153 callback.Run(SYNC_STATUS_OK); | 137 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
154 return; | 138 return; |
155 } | 139 } |
156 | 140 |
157 GetAboutResource(callback); | 141 GetAboutResource(token.Pass()); |
158 } | 142 } |
159 | 143 |
160 void SyncEngineInitializer::GetAboutResource( | 144 void SyncEngineInitializer::GetAboutResource( |
161 const SyncStatusCallback& callback) { | 145 scoped_ptr<SyncTaskToken> token) { |
162 set_used_network(true); | 146 set_used_network(true); |
163 drive_service_->GetAboutResource( | 147 drive_service_->GetAboutResource( |
164 base::Bind(&SyncEngineInitializer::DidGetAboutResource, | 148 base::Bind(&SyncEngineInitializer::DidGetAboutResource, |
165 weak_ptr_factory_.GetWeakPtr(), callback)); | 149 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
166 } | 150 } |
167 | 151 |
168 void SyncEngineInitializer::DidGetAboutResource( | 152 void SyncEngineInitializer::DidGetAboutResource( |
169 const SyncStatusCallback& callback, | 153 scoped_ptr<SyncTaskToken> token, |
170 google_apis::GDataErrorCode error, | 154 google_apis::GDataErrorCode error, |
171 scoped_ptr<google_apis::AboutResource> about_resource) { | 155 scoped_ptr<google_apis::AboutResource> about_resource) { |
172 cancel_callback_.Reset(); | 156 cancel_callback_.Reset(); |
173 | 157 |
174 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 158 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
175 if (status != SYNC_STATUS_OK) { | 159 if (status != SYNC_STATUS_OK) { |
176 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 160 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
177 "[Initialize] Failed to get AboutResource."); | 161 "[Initialize] Failed to get AboutResource."); |
178 callback.Run(status); | 162 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
179 return; | 163 return; |
180 } | 164 } |
181 | 165 |
182 DCHECK(about_resource); | 166 DCHECK(about_resource); |
183 root_folder_id_ = about_resource->root_folder_id(); | 167 root_folder_id_ = about_resource->root_folder_id(); |
184 largest_change_id_ = about_resource->largest_change_id(); | 168 largest_change_id_ = about_resource->largest_change_id(); |
185 | 169 |
186 DCHECK(!root_folder_id_.empty()); | 170 DCHECK(!root_folder_id_.empty()); |
187 FindSyncRoot(callback); | 171 FindSyncRoot(token.Pass()); |
188 } | 172 } |
189 | 173 |
190 void SyncEngineInitializer::FindSyncRoot(const SyncStatusCallback& callback) { | 174 void SyncEngineInitializer::FindSyncRoot(scoped_ptr<SyncTaskToken> token) { |
191 if (find_sync_root_retry_count_++ >= kMaxRetry) { | 175 if (find_sync_root_retry_count_++ >= kMaxRetry) { |
192 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 176 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
193 "[Initialize] Reached max retry count."); | 177 "[Initialize] Reached max retry count."); |
194 callback.Run(SYNC_STATUS_FAILED); | 178 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
195 return; | 179 return; |
196 } | 180 } |
197 | 181 |
198 set_used_network(true); | 182 set_used_network(true); |
199 cancel_callback_ = drive_service_->SearchByTitle( | 183 cancel_callback_ = drive_service_->SearchByTitle( |
200 kSyncRootFolderTitle, | 184 kSyncRootFolderTitle, |
201 std::string(), // parent_folder_id | 185 std::string(), // parent_folder_id |
202 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, | 186 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
203 weak_ptr_factory_.GetWeakPtr(), | 187 weak_ptr_factory_.GetWeakPtr(), |
204 callback)); | 188 base::Passed(&token))); |
205 } | 189 } |
206 | 190 |
207 void SyncEngineInitializer::DidFindSyncRoot( | 191 void SyncEngineInitializer::DidFindSyncRoot( |
208 const SyncStatusCallback& callback, | 192 scoped_ptr<SyncTaskToken> token, |
209 google_apis::GDataErrorCode error, | 193 google_apis::GDataErrorCode error, |
210 scoped_ptr<google_apis::ResourceList> resource_list) { | 194 scoped_ptr<google_apis::ResourceList> resource_list) { |
211 cancel_callback_.Reset(); | 195 cancel_callback_.Reset(); |
212 | 196 |
213 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 197 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
214 if (status != SYNC_STATUS_OK) { | 198 if (status != SYNC_STATUS_OK) { |
215 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 199 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
216 "[Initialize] Failed to find sync root."); | 200 "[Initialize] Failed to find sync root."); |
217 callback.Run(status); | 201 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
218 return; | 202 return; |
219 } | 203 } |
220 | 204 |
221 if (!resource_list) { | 205 if (!resource_list) { |
222 NOTREACHED(); | 206 NOTREACHED(); |
223 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 207 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
224 "[Initialize] Got invalid resource list."); | 208 "[Initialize] Got invalid resource list."); |
225 callback.Run(SYNC_STATUS_FAILED); | 209 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
226 return; | 210 return; |
227 } | 211 } |
228 | 212 |
229 ScopedVector<google_apis::ResourceEntry>* entries = | 213 ScopedVector<google_apis::ResourceEntry>* entries = |
230 resource_list->mutable_entries(); | 214 resource_list->mutable_entries(); |
231 for (ScopedVector<google_apis::ResourceEntry>::iterator itr = | 215 for (ScopedVector<google_apis::ResourceEntry>::iterator itr = |
232 entries->begin(); | 216 entries->begin(); |
233 itr != entries->end(); ++itr) { | 217 itr != entries->end(); ++itr) { |
234 google_apis::ResourceEntry* entry = *itr; | 218 google_apis::ResourceEntry* entry = *itr; |
235 | 219 |
236 // Ignore deleted folder. | 220 // Ignore deleted folder. |
237 if (IsDeleted(*entry)) | 221 if (entry->deleted()) |
238 continue; | 222 continue; |
239 | 223 |
240 // Pick an orphaned folder or a direct child of the root folder and | 224 // Pick an orphaned folder or a direct child of the root folder and |
241 // ignore others. | 225 // ignore others. |
242 DCHECK(!root_folder_id_.empty()); | 226 DCHECK(!root_folder_id_.empty()); |
243 if (!HasNoParents(*entry) && !HasFolderAsParent(*entry, root_folder_id_)) | 227 if (!HasNoParents(*entry) && !HasFolderAsParent(*entry, root_folder_id_)) |
244 continue; | 228 continue; |
245 | 229 |
246 if (!sync_root_folder_ || LessOnCreationTime(*entry, *sync_root_folder_)) { | 230 if (!sync_root_folder_ || LessOnCreationTime(*entry, *sync_root_folder_)) { |
247 sync_root_folder_.reset(entry); | 231 sync_root_folder_.reset(entry); |
248 *itr = NULL; | 232 *itr = NULL; |
249 } | 233 } |
250 } | 234 } |
251 | 235 |
252 set_used_network(true); | 236 set_used_network(true); |
253 // If there are more results, retrieve them. | 237 // If there are more results, retrieve them. |
254 if (GetRemainingFileList( | 238 GURL next_url; |
255 &cancel_callback_, | 239 if (resource_list->GetNextFeedURL(&next_url)) { |
256 drive_service_, *resource_list, | 240 cancel_callback_ = drive_service_->GetRemainingFileList( |
257 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, | 241 next_url, |
258 weak_ptr_factory_.GetWeakPtr(), | 242 base::Bind(&SyncEngineInitializer::DidFindSyncRoot, |
259 callback))) | 243 weak_ptr_factory_.GetWeakPtr(), |
| 244 base::Passed(&token))); |
260 return; | 245 return; |
| 246 } |
261 | 247 |
262 if (!sync_root_folder_) { | 248 if (!sync_root_folder_) { |
263 CreateSyncRoot(callback); | 249 CreateSyncRoot(token.Pass()); |
264 return; | 250 return; |
265 } | 251 } |
266 | 252 |
267 if (!HasNoParents(*sync_root_folder_)) { | 253 if (!HasNoParents(*sync_root_folder_)) { |
268 DetachSyncRoot(callback); | 254 DetachSyncRoot(token.Pass()); |
269 return; | 255 return; |
270 } | 256 } |
271 | 257 |
272 ListAppRootFolders(callback); | 258 ListAppRootFolders(token.Pass()); |
273 } | 259 } |
274 | 260 |
275 void SyncEngineInitializer::CreateSyncRoot(const SyncStatusCallback& callback) { | 261 void SyncEngineInitializer::CreateSyncRoot(scoped_ptr<SyncTaskToken> token) { |
276 DCHECK(!sync_root_folder_); | 262 DCHECK(!sync_root_folder_); |
277 set_used_network(true); | 263 set_used_network(true); |
278 cancel_callback_ = drive_service_->AddNewDirectory( | 264 cancel_callback_ = drive_service_->AddNewDirectory( |
279 root_folder_id_, kSyncRootFolderTitle, | 265 root_folder_id_, kSyncRootFolderTitle, |
280 drive::DriveServiceInterface::AddNewDirectoryOptions(), | 266 drive::DriveServiceInterface::AddNewDirectoryOptions(), |
281 base::Bind(&SyncEngineInitializer::DidCreateSyncRoot, | 267 base::Bind(&SyncEngineInitializer::DidCreateSyncRoot, |
282 weak_ptr_factory_.GetWeakPtr(), | 268 weak_ptr_factory_.GetWeakPtr(), |
283 callback)); | 269 base::Passed(&token))); |
284 } | 270 } |
285 | 271 |
286 void SyncEngineInitializer::DidCreateSyncRoot( | 272 void SyncEngineInitializer::DidCreateSyncRoot( |
287 const SyncStatusCallback& callback, | 273 scoped_ptr<SyncTaskToken> token, |
288 google_apis::GDataErrorCode error, | 274 google_apis::GDataErrorCode error, |
289 scoped_ptr<google_apis::ResourceEntry> entry) { | 275 scoped_ptr<google_apis::ResourceEntry> entry) { |
290 DCHECK(!sync_root_folder_); | 276 DCHECK(!sync_root_folder_); |
291 cancel_callback_.Reset(); | 277 cancel_callback_.Reset(); |
292 | 278 |
293 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 279 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
294 if (status != SYNC_STATUS_OK) { | 280 if (status != SYNC_STATUS_OK) { |
295 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 281 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
296 "[Initialize] Failed to create sync root."); | 282 "[Initialize] Failed to create sync root."); |
297 callback.Run(status); | 283 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
298 return; | 284 return; |
299 } | 285 } |
300 | 286 |
301 FindSyncRoot(callback); | 287 FindSyncRoot(token.Pass()); |
302 } | 288 } |
303 | 289 |
304 void SyncEngineInitializer::DetachSyncRoot(const SyncStatusCallback& callback) { | 290 void SyncEngineInitializer::DetachSyncRoot(scoped_ptr<SyncTaskToken> token) { |
305 DCHECK(sync_root_folder_); | 291 DCHECK(sync_root_folder_); |
306 set_used_network(true); | 292 set_used_network(true); |
307 cancel_callback_ = drive_service_->RemoveResourceFromDirectory( | 293 cancel_callback_ = drive_service_->RemoveResourceFromDirectory( |
308 root_folder_id_, GetID(*sync_root_folder_), | 294 root_folder_id_, sync_root_folder_->resource_id(), |
309 base::Bind(&SyncEngineInitializer::DidDetachSyncRoot, | 295 base::Bind(&SyncEngineInitializer::DidDetachSyncRoot, |
310 weak_ptr_factory_.GetWeakPtr(), | 296 weak_ptr_factory_.GetWeakPtr(), |
311 callback)); | 297 base::Passed(&token))); |
312 } | 298 } |
313 | 299 |
314 void SyncEngineInitializer::DidDetachSyncRoot( | 300 void SyncEngineInitializer::DidDetachSyncRoot( |
315 const SyncStatusCallback& callback, | 301 scoped_ptr<SyncTaskToken> token, |
316 google_apis::GDataErrorCode error) { | 302 google_apis::GDataErrorCode error) { |
317 cancel_callback_.Reset(); | 303 cancel_callback_.Reset(); |
318 | 304 |
319 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 305 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
320 if (status != SYNC_STATUS_OK) { | 306 if (status != SYNC_STATUS_OK) { |
321 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 307 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
322 "[Initialize] Failed to detach sync root."); | 308 "[Initialize] Failed to detach sync root."); |
323 callback.Run(status); | 309 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
324 return; | 310 return; |
325 } | 311 } |
326 | 312 |
327 ListAppRootFolders(callback); | 313 ListAppRootFolders(token.Pass()); |
328 } | 314 } |
329 | 315 |
330 void SyncEngineInitializer::ListAppRootFolders( | 316 void SyncEngineInitializer::ListAppRootFolders( |
331 const SyncStatusCallback& callback) { | 317 scoped_ptr<SyncTaskToken> token) { |
332 DCHECK(sync_root_folder_); | 318 DCHECK(sync_root_folder_); |
333 set_used_network(true); | 319 set_used_network(true); |
334 cancel_callback_ = drive_service_->GetResourceListInDirectory( | 320 cancel_callback_ = drive_service_->GetResourceListInDirectory( |
335 GetID(*sync_root_folder_), | 321 sync_root_folder_->resource_id(), |
336 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, | 322 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
337 weak_ptr_factory_.GetWeakPtr(), | 323 weak_ptr_factory_.GetWeakPtr(), |
338 callback)); | 324 base::Passed(&token))); |
339 } | 325 } |
340 | 326 |
341 void SyncEngineInitializer::DidListAppRootFolders( | 327 void SyncEngineInitializer::DidListAppRootFolders( |
342 const SyncStatusCallback& callback, | 328 scoped_ptr<SyncTaskToken> token, |
343 google_apis::GDataErrorCode error, | 329 google_apis::GDataErrorCode error, |
344 scoped_ptr<google_apis::ResourceList> resource_list) { | 330 scoped_ptr<google_apis::ResourceList> resource_list) { |
345 cancel_callback_.Reset(); | 331 cancel_callback_.Reset(); |
346 | 332 |
347 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 333 SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); |
348 if (status != SYNC_STATUS_OK) { | 334 if (status != SYNC_STATUS_OK) { |
349 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 335 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
350 "[Initialize] Failed to get initial app-root folders."); | 336 "[Initialize] Failed to get initial app-root folders."); |
351 callback.Run(status); | 337 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
352 return; | 338 return; |
353 } | 339 } |
354 | 340 |
355 if (!resource_list) { | 341 if (!resource_list) { |
356 NOTREACHED(); | 342 NOTREACHED(); |
357 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 343 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
358 "[Initialize] Got invalid initial app-root list."); | 344 "[Initialize] Got invalid initial app-root list."); |
359 callback.Run(SYNC_STATUS_FAILED); | 345 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_FAILED); |
360 return; | 346 return; |
361 } | 347 } |
362 | 348 |
363 ScopedVector<google_apis::ResourceEntry>* new_entries = | 349 ScopedVector<google_apis::ResourceEntry>* new_entries = |
364 resource_list->mutable_entries(); | 350 resource_list->mutable_entries(); |
365 app_root_folders_.insert(app_root_folders_.end(), | 351 app_root_folders_.insert(app_root_folders_.end(), |
366 new_entries->begin(), new_entries->end()); | 352 new_entries->begin(), new_entries->end()); |
367 new_entries->weak_clear(); | 353 new_entries->weak_clear(); |
368 | 354 |
369 set_used_network(true); | 355 set_used_network(true); |
370 if (GetRemainingFileList( | 356 GURL next_url; |
371 &cancel_callback_, | 357 if (resource_list->GetNextFeedURL(&next_url)) { |
372 drive_service_, | 358 cancel_callback_ = drive_service_->GetRemainingFileList( |
373 *resource_list, | 359 next_url, |
374 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, | 360 base::Bind(&SyncEngineInitializer::DidListAppRootFolders, |
375 weak_ptr_factory_.GetWeakPtr(), callback))) | 361 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
376 return; | 362 return; |
| 363 } |
377 | 364 |
378 PopulateDatabase(callback); | 365 PopulateDatabase(token.Pass()); |
379 } | 366 } |
380 | 367 |
381 void SyncEngineInitializer::PopulateDatabase( | 368 void SyncEngineInitializer::PopulateDatabase( |
382 const SyncStatusCallback& callback) { | 369 scoped_ptr<SyncTaskToken> token) { |
383 DCHECK(sync_root_folder_); | 370 DCHECK(sync_root_folder_); |
384 metadata_database_->PopulateInitialData( | 371 metadata_database_->PopulateInitialData( |
385 largest_change_id_, | 372 largest_change_id_, |
386 *drive::util::ConvertResourceEntryToFileResource( | 373 *drive::util::ConvertResourceEntryToFileResource( |
387 *sync_root_folder_), | 374 *sync_root_folder_), |
388 ConvertResourceEntriesToFileResources(app_root_folders_), | 375 ConvertResourceEntriesToFileResources(app_root_folders_), |
389 base::Bind(&SyncEngineInitializer::DidPopulateDatabase, | 376 base::Bind(&SyncEngineInitializer::DidPopulateDatabase, |
390 weak_ptr_factory_.GetWeakPtr(), | 377 weak_ptr_factory_.GetWeakPtr(), base::Passed(&token))); |
391 callback)); | |
392 } | 378 } |
393 | 379 |
394 void SyncEngineInitializer::DidPopulateDatabase( | 380 void SyncEngineInitializer::DidPopulateDatabase( |
395 const SyncStatusCallback& callback, | 381 scoped_ptr<SyncTaskToken> token, |
396 SyncStatusCode status) { | 382 SyncStatusCode status) { |
397 if (status != SYNC_STATUS_OK) { | 383 if (status != SYNC_STATUS_OK) { |
398 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 384 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
399 "[Initialize] Failed to populate initial data" | 385 "[Initialize] Failed to populate initial data" |
400 " to MetadataDatabase."); | 386 " to MetadataDatabase."); |
401 callback.Run(status); | 387 SyncTaskManager::NotifyTaskDone(token.Pass(), status); |
402 return; | 388 return; |
403 } | 389 } |
404 | 390 |
405 util::Log(logging::LOG_VERBOSE, FROM_HERE, | 391 util::Log(logging::LOG_VERBOSE, FROM_HERE, |
406 "[Initialize] Completed successfully."); | 392 "[Initialize] Completed successfully."); |
407 callback.Run(SYNC_STATUS_OK); | 393 SyncTaskManager::NotifyTaskDone(token.Pass(), SYNC_STATUS_OK); |
408 } | 394 } |
409 | 395 |
410 } // namespace drive_backend | 396 } // namespace drive_backend |
411 } // namespace sync_file_system | 397 } // namespace sync_file_system |
OLD | NEW |