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/remote_to_local_syncer.h
" | 5 #include "chrome/browser/sync_file_system/drive_backend/remote_to_local_syncer.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/location.h" | 9 #include "base/location.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 tracker.tracker_id(), &path)) | 32 tracker.tracker_id(), &path)) |
33 return false; | 33 return false; |
34 | 34 |
35 GURL origin = | 35 GURL origin = |
36 extensions::Extension::GetBaseURLFromExtensionId(tracker.app_id()); | 36 extensions::Extension::GetBaseURLFromExtensionId(tracker.app_id()); |
37 *url = sync_file_system::CreateSyncableFileSystemURL(origin, path); | 37 *url = sync_file_system::CreateSyncableFileSystemURL(origin, path); |
38 | 38 |
39 return true; | 39 return true; |
40 } | 40 } |
41 | 41 |
| 42 bool HasFolderAsParent(const FileDetails& details, |
| 43 const std::string& folder_id) { |
| 44 for (int i = 0; i < details.parent_folder_ids_size(); ++i) { |
| 45 if (details.parent_folder_ids(i) == folder_id) |
| 46 return true; |
| 47 } |
| 48 return false; |
| 49 } |
| 50 |
| 51 bool HasDisabledAppRoot(MetadataDatabase* database, |
| 52 const FileTracker& tracker) { |
| 53 DCHECK(tracker.active()); |
| 54 FileTracker app_root_tracker; |
| 55 if (database->FindAppRootTracker(tracker.app_id(), &app_root_tracker)) { |
| 56 DCHECK(app_root_tracker.tracker_kind() == TRACKER_KIND_APP_ROOT || |
| 57 app_root_tracker.tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT); |
| 58 return app_root_tracker.tracker_kind() == TRACKER_KIND_DISABLED_APP_ROOT; |
| 59 } |
| 60 return false; |
| 61 } |
| 62 |
| 63 scoped_ptr<FileMetadata> GetFileMetadata(MetadataDatabase* database, |
| 64 const std::string& file_id) { |
| 65 scoped_ptr<FileMetadata> metadata(new FileMetadata); |
| 66 if (!database->FindFileByFileID(file_id, metadata.get())) |
| 67 metadata.reset(); |
| 68 return metadata.Pass(); |
| 69 } |
| 70 |
42 } // namespace | 71 } // namespace |
43 | 72 |
44 RemoteToLocalSyncer::RemoteToLocalSyncer(SyncEngineContext* sync_context, | 73 RemoteToLocalSyncer::RemoteToLocalSyncer(SyncEngineContext* sync_context, |
45 int priorities) | 74 int priorities) |
46 : sync_context_(sync_context), | 75 : sync_context_(sync_context), |
47 priorities_(priorities), | 76 priorities_(priorities), |
48 missing_remote_details_(false), | |
49 missing_synced_details_(false), | |
50 deleted_remote_details_(false), | |
51 deleted_synced_details_(false), | |
52 title_changed_(false), | |
53 content_changed_(false), | |
54 needs_folder_listing_(false), | |
55 missing_parent_(false), | |
56 sync_root_modification_(false), | |
57 weak_ptr_factory_(this) { | 77 weak_ptr_factory_(this) { |
58 } | 78 } |
59 | 79 |
60 RemoteToLocalSyncer::~RemoteToLocalSyncer() { | 80 RemoteToLocalSyncer::~RemoteToLocalSyncer() { |
61 NOTIMPLEMENTED(); | 81 NOTIMPLEMENTED(); |
62 } | 82 } |
63 | 83 |
64 void RemoteToLocalSyncer::Run(const SyncStatusCallback& callback) { | 84 void RemoteToLocalSyncer::Run(const SyncStatusCallback& callback) { |
65 if (priorities_ & PRIORITY_NORMAL) { | 85 if (priorities_ & PRIORITY_NORMAL) { |
66 if (metadata_database()->GetNormalPriorityDirtyTracker(&dirty_tracker_)) { | 86 dirty_tracker_ = make_scoped_ptr(new FileTracker); |
| 87 if (metadata_database()->GetNormalPriorityDirtyTracker( |
| 88 dirty_tracker_.get())) { |
67 ResolveRemoteChange(callback); | 89 ResolveRemoteChange(callback); |
68 return; | 90 return; |
69 } | 91 } |
70 } | 92 } |
71 | 93 |
72 if (priorities_ & PRIORITY_LOW) { | 94 if (priorities_ & PRIORITY_LOW) { |
73 if (metadata_database()->GetLowPriorityDirtyTracker(&dirty_tracker_)) { | 95 dirty_tracker_ = make_scoped_ptr(new FileTracker); |
| 96 if (metadata_database()->GetLowPriorityDirtyTracker(dirty_tracker_.get())) { |
74 ResolveRemoteChange(callback); | 97 ResolveRemoteChange(callback); |
75 return; | 98 return; |
76 } | 99 } |
77 } | 100 } |
78 | 101 |
79 base::MessageLoopProxy::current()->PostTask( | 102 base::MessageLoopProxy::current()->PostTask( |
80 FROM_HERE, | 103 FROM_HERE, |
81 base::Bind(callback, SYNC_STATUS_NO_CHANGE_TO_SYNC)); | 104 base::Bind(callback, SYNC_STATUS_NO_CHANGE_TO_SYNC)); |
82 } | 105 } |
83 | 106 |
84 void RemoteToLocalSyncer::AnalyzeCurrentDirtyTracker() { | |
85 if (!metadata_database()->FindFileByFileID( | |
86 dirty_tracker_.file_id(), &remote_metadata_)) { | |
87 missing_remote_details_ = true; | |
88 return; | |
89 } | |
90 missing_remote_details_ = false; | |
91 | |
92 if (dirty_tracker_.has_synced_details() && | |
93 !dirty_tracker_.synced_details().title().empty()) { // Just in case | |
94 missing_synced_details_ = true; | |
95 return; | |
96 } | |
97 missing_synced_details_ = false; | |
98 | |
99 const FileDetails& synced_details = dirty_tracker_.synced_details(); | |
100 const FileDetails& remote_details = remote_metadata_.details(); | |
101 | |
102 deleted_remote_details_ = remote_details.deleted(); | |
103 deleted_synced_details_ = synced_details.deleted(); | |
104 title_changed_ = synced_details.title() != remote_details.title(); | |
105 | |
106 switch (dirty_tracker_.synced_details().file_kind()) { | |
107 case FILE_KIND_UNSUPPORTED: | |
108 break; | |
109 case FILE_KIND_FILE: | |
110 content_changed_ = synced_details.md5() != remote_details.md5(); | |
111 break; | |
112 case FILE_KIND_FOLDER: | |
113 needs_folder_listing_ = dirty_tracker_.needs_folder_listing(); | |
114 break; | |
115 } | |
116 | |
117 bool unknown_parent = !metadata_database()->FindTrackerByTrackerID( | |
118 dirty_tracker_.parent_tracker_id(), &parent_tracker_); | |
119 if (unknown_parent) { | |
120 DCHECK_EQ(metadata_database()->GetSyncRootTrackerID(), | |
121 dirty_tracker_.tracker_id()); | |
122 sync_root_modification_ = true; | |
123 } else { | |
124 missing_parent_ = true; | |
125 std::string parent_folder_id = parent_tracker_.file_id(); | |
126 for (int i = 0; i < remote_details.parent_folder_ids_size(); ++i) { | |
127 if (remote_details.parent_folder_ids(i) == parent_folder_id) { | |
128 missing_parent_ = false; | |
129 break; | |
130 } | |
131 } | |
132 } | |
133 } | |
134 | |
135 void RemoteToLocalSyncer::ResolveRemoteChange( | 107 void RemoteToLocalSyncer::ResolveRemoteChange( |
136 const SyncStatusCallback& callback) { | 108 const SyncStatusCallback& callback) { |
137 AnalyzeCurrentDirtyTracker(); | 109 DCHECK(dirty_tracker_); |
| 110 remote_metadata_ = GetFileMetadata( |
| 111 metadata_database(), dirty_tracker_->file_id()); |
138 | 112 |
139 if (missing_remote_details_) { | 113 if (!remote_metadata_ || !remote_metadata_->has_details()) { |
140 GetRemoteResource(callback); | 114 if (remote_metadata_ && !remote_metadata_->has_details()) { |
| 115 LOG(ERROR) << "Missing details of a remote file: " |
| 116 << remote_metadata_->file_id(); |
| 117 NOTREACHED(); |
| 118 } |
| 119 HandleMissingRemoteMetadata(callback); |
141 return; | 120 return; |
142 } | 121 } |
143 | 122 |
144 if (missing_synced_details_) { | 123 DCHECK(remote_metadata_); |
145 if (deleted_remote_details_) { | 124 DCHECK(remote_metadata_->has_details()); |
| 125 const FileDetails& remote_details = remote_metadata_->details(); |
| 126 |
| 127 if (!dirty_tracker_->active() || |
| 128 HasDisabledAppRoot(metadata_database(), *dirty_tracker_)) { |
| 129 HandleInactiveTracker(callback); |
| 130 return; |
| 131 } |
| 132 DCHECK(dirty_tracker_->active()); |
| 133 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 134 |
| 135 if (!dirty_tracker_->has_synced_details() || |
| 136 dirty_tracker_->synced_details().deleted()) { |
| 137 if (remote_details.deleted()) { |
| 138 if (dirty_tracker_->has_synced_details() && |
| 139 dirty_tracker_->synced_details().deleted()) { |
| 140 // This should be handled by MetadataDatabase. |
| 141 // MetadataDatabase should drop a tracker that marked as deleted if |
| 142 // corresponding file metadata is marked as deleted. |
| 143 LOG(ERROR) << "Found a stray deleted tracker: " |
| 144 << dirty_tracker_->file_id(); |
| 145 NOTREACHED(); |
| 146 } |
146 SyncCompleted(callback); | 147 SyncCompleted(callback); |
147 return; | 148 return; |
148 } | 149 } |
149 HandleNewFile(callback); | 150 DCHECK(!remote_details.deleted()); |
150 return; | |
151 } | |
152 | 151 |
153 if (!dirty_tracker_.active()) { | 152 if (remote_details.file_kind() == FILE_KIND_UNSUPPORTED) { |
154 HandleOfflineSolvable(callback); | 153 // All unsupported file must be inactive. |
155 return; | 154 LOG(ERROR) << "Found an unsupported active file: " |
156 } | 155 << remote_metadata_->file_id(); |
| 156 NOTREACHED(); |
| 157 callback.Run(SYNC_STATUS_FAILED); |
| 158 return; |
| 159 } |
| 160 DCHECK(remote_details.file_kind() == FILE_KIND_FILE || |
| 161 remote_details.file_kind() == FILE_KIND_FOLDER); |
157 | 162 |
158 if (deleted_synced_details_) { | 163 if (remote_details.file_kind() == FILE_KIND_FILE) { |
159 if (deleted_remote_details_) { | 164 HandleNewFile(callback); |
160 SyncCompleted(callback); | |
161 return; | 165 return; |
162 } | 166 } |
163 | 167 |
164 HandleNewFile(callback); | 168 DCHECK(remote_details.file_kind() == FILE_KIND_FOLDER); |
| 169 HandleNewFolder(callback); |
165 return; | 170 return; |
166 } | 171 } |
| 172 DCHECK(dirty_tracker_->has_synced_details()); |
| 173 DCHECK(!dirty_tracker_->synced_details().deleted()); |
| 174 const FileDetails& synced_details = dirty_tracker_->synced_details(); |
167 | 175 |
168 if (deleted_remote_details_) { | 176 if (remote_details.deleted()) { |
169 HandleDeletion(callback); | 177 HandleDeletion(callback); |
170 return; | 178 return; |
171 } | 179 } |
172 | 180 |
173 if (title_changed_) { | 181 // Most of remote_details field is valid from here. |
| 182 DCHECK(!remote_details.deleted()); |
| 183 |
| 184 if (synced_details.file_kind() != remote_details.file_kind()) { |
| 185 LOG(ERROR) << "Found type mismatch between remote and local file: " |
| 186 << dirty_tracker_->file_id() |
| 187 << " type: (local) " << synced_details.file_kind() |
| 188 << " vs (remote) " << remote_details.file_kind(); |
| 189 NOTREACHED(); |
| 190 callback.Run(SYNC_STATUS_FAILED); |
| 191 return; |
| 192 } |
| 193 DCHECK_EQ(synced_details.file_kind(), remote_details.file_kind()); |
| 194 |
| 195 if (synced_details.file_kind() == FILE_KIND_UNSUPPORTED) { |
| 196 LOG(ERROR) << "Found an unsupported active file: " |
| 197 << remote_metadata_->file_id(); |
| 198 NOTREACHED(); |
| 199 callback.Run(SYNC_STATUS_FAILED); |
| 200 return; |
| 201 } |
| 202 DCHECK(remote_details.file_kind() == FILE_KIND_FILE || |
| 203 remote_details.file_kind() == FILE_KIND_FOLDER); |
| 204 |
| 205 if (synced_details.title() != remote_details.title()) { |
174 HandleRename(callback); | 206 HandleRename(callback); |
175 return; | 207 return; |
176 } | 208 } |
| 209 DCHECK_EQ(synced_details.title(), remote_details.title()); |
177 | 210 |
178 if (content_changed_) { | 211 if (dirty_tracker_->tracker_id() != |
179 HandleContentUpdate(callback); | 212 metadata_database()->GetSyncRootTrackerID()) { |
180 return; | 213 FileTracker parent_tracker; |
| 214 if (!metadata_database()->FindTrackerByTrackerID( |
| 215 dirty_tracker_->parent_tracker_id(), &parent_tracker)) { |
| 216 LOG(ERROR) << "Missing parent tracker for a non sync-root tracker: " |
| 217 << dirty_tracker_->file_id(); |
| 218 NOTREACHED(); |
| 219 callback.Run(SYNC_STATUS_FAILED); |
| 220 return; |
| 221 } |
| 222 |
| 223 if (!HasFolderAsParent(remote_details, parent_tracker.file_id())) { |
| 224 HandleReorganize(callback); |
| 225 return; |
| 226 } |
181 } | 227 } |
182 | 228 |
183 if (needs_folder_listing_) { | 229 if (synced_details.file_kind() == FILE_KIND_FILE) { |
184 ListFolderContent(callback); | 230 if (synced_details.md5() != remote_details.md5()) { |
185 return; | 231 HandleContentUpdate(callback); |
186 } | 232 return; |
187 | 233 } |
188 if (missing_parent_) { | 234 } else { |
189 HandleReorganize(callback); | 235 DCHECK_EQ(FILE_KIND_FOLDER, synced_details.file_kind()); |
190 return; | 236 if (dirty_tracker_->needs_folder_listing()) { |
| 237 HandleFolderContentListing(callback); |
| 238 return; |
| 239 } |
191 } | 240 } |
192 | 241 |
193 HandleOfflineSolvable(callback); | 242 HandleOfflineSolvable(callback); |
194 } | 243 } |
195 | 244 |
196 void RemoteToLocalSyncer::GetRemoteResource( | 245 void RemoteToLocalSyncer::HandleMissingRemoteMetadata( |
197 const SyncStatusCallback& callback) { | 246 const SyncStatusCallback& callback) { |
| 247 DCHECK(dirty_tracker_); |
| 248 |
198 drive_service()->GetResourceEntry( | 249 drive_service()->GetResourceEntry( |
199 dirty_tracker_.file_id(), | 250 dirty_tracker_->file_id(), |
200 base::Bind(&RemoteToLocalSyncer::DidGetRemoteResource, | 251 base::Bind(&RemoteToLocalSyncer::DidGetRemoteMetadata, |
201 weak_ptr_factory_.GetWeakPtr(), | 252 weak_ptr_factory_.GetWeakPtr(), |
202 callback, | 253 callback, |
203 metadata_database()->GetLargestKnownChangeID())); | 254 metadata_database()->GetLargestKnownChangeID())); |
204 } | 255 } |
205 | 256 |
206 void RemoteToLocalSyncer::DidGetRemoteResource( | 257 void RemoteToLocalSyncer::DidGetRemoteMetadata( |
207 const SyncStatusCallback& callback, | 258 const SyncStatusCallback& callback, |
208 int64 change_id, | 259 int64 change_id, |
209 google_apis::GDataErrorCode error, | 260 google_apis::GDataErrorCode error, |
210 scoped_ptr<google_apis::ResourceEntry> entry) { | 261 scoped_ptr<google_apis::ResourceEntry> entry) { |
211 metadata_database()->UpdateByFileResource( | 262 metadata_database()->UpdateByFileResource( |
212 change_id, | 263 change_id, |
213 *drive::util::ConvertResourceEntryToFileResource(*entry), | 264 *drive::util::ConvertResourceEntryToFileResource(*entry), |
214 callback); | 265 base::Bind(&RemoteToLocalSyncer::DidUpdateDatabaseForRemoteMetadata, |
| 266 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 267 } |
| 268 |
| 269 void RemoteToLocalSyncer::DidUpdateDatabaseForRemoteMetadata( |
| 270 const SyncStatusCallback& callback, |
| 271 SyncStatusCode status) { |
| 272 if (status != SYNC_STATUS_OK) { |
| 273 callback.Run(status); |
| 274 return; |
| 275 } |
| 276 SyncCompleted(callback); |
| 277 } |
| 278 |
| 279 void RemoteToLocalSyncer::HandleInactiveTracker( |
| 280 const SyncStatusCallback& callback) { |
| 281 DCHECK(dirty_tracker_); |
| 282 DCHECK(!dirty_tracker_->active() || |
| 283 HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 284 |
| 285 DCHECK(remote_metadata_); |
| 286 DCHECK(remote_metadata_->has_details()); |
| 287 |
| 288 NOTIMPLEMENTED(); |
| 289 callback.Run(SYNC_STATUS_FAILED); |
| 290 } |
| 291 |
| 292 void RemoteToLocalSyncer::HandleNewFile( |
| 293 const SyncStatusCallback& callback) { |
| 294 DCHECK(dirty_tracker_); |
| 295 DCHECK(dirty_tracker_->active()); |
| 296 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 297 DCHECK(!dirty_tracker_->has_synced_details() || |
| 298 dirty_tracker_->synced_details().deleted()); |
| 299 |
| 300 DCHECK(remote_metadata_); |
| 301 DCHECK(remote_metadata_->has_details()); |
| 302 DCHECK(!remote_metadata_->details().deleted()); |
| 303 DCHECK_EQ(FILE_KIND_FILE, remote_metadata_->details().file_kind()); |
| 304 |
| 305 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForNewFile, |
| 306 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 307 } |
| 308 |
| 309 void RemoteToLocalSyncer::DidPrepareForNewFile( |
| 310 const SyncStatusCallback& callback, |
| 311 SyncStatusCode status) { |
| 312 NOTIMPLEMENTED(); |
| 313 callback.Run(SYNC_STATUS_FAILED); |
| 314 } |
| 315 |
| 316 void RemoteToLocalSyncer::HandleNewFolder(const SyncStatusCallback& callback) { |
| 317 DCHECK(dirty_tracker_); |
| 318 DCHECK(dirty_tracker_->active()); |
| 319 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 320 |
| 321 DCHECK(remote_metadata_); |
| 322 DCHECK(remote_metadata_->has_details()); |
| 323 DCHECK(!remote_metadata_->details().deleted()); |
| 324 DCHECK_EQ(FILE_KIND_FOLDER, remote_metadata_->details().file_kind()); |
| 325 |
| 326 NOTIMPLEMENTED(); |
| 327 callback.Run(SYNC_STATUS_FAILED); |
215 } | 328 } |
216 | 329 |
217 void RemoteToLocalSyncer::HandleDeletion( | 330 void RemoteToLocalSyncer::HandleDeletion( |
218 const SyncStatusCallback& callback) { | 331 const SyncStatusCallback& callback) { |
| 332 DCHECK(dirty_tracker_); |
| 333 DCHECK(dirty_tracker_->active()); |
| 334 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 335 DCHECK(dirty_tracker_->has_synced_details()); |
| 336 DCHECK(!dirty_tracker_->synced_details().deleted()); |
| 337 |
| 338 DCHECK(remote_metadata_); |
| 339 DCHECK(remote_metadata_->has_details()); |
| 340 DCHECK(remote_metadata_->details().deleted()); |
| 341 |
219 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForDeletion, | 342 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForDeletion, |
220 weak_ptr_factory_.GetWeakPtr(), callback)); | 343 weak_ptr_factory_.GetWeakPtr(), callback)); |
221 } | 344 } |
222 | 345 |
223 void RemoteToLocalSyncer::DidPrepareForDeletion( | 346 void RemoteToLocalSyncer::DidPrepareForDeletion( |
224 const SyncStatusCallback& callback, | 347 const SyncStatusCallback& callback, |
225 SyncStatusCode status) { | 348 SyncStatusCode status) { |
226 if (status != SYNC_STATUS_OK) { | 349 if (status != SYNC_STATUS_OK) { |
227 callback.Run(status); | 350 callback.Run(status); |
228 return; | 351 return; |
229 } | 352 } |
230 | 353 |
231 if (local_changes_.empty()) { | 354 if (local_changes_.empty()) { |
232 DeleteLocalFile(callback); | 355 DeleteLocalFile(callback); |
233 return; | 356 return; |
234 } | 357 } |
235 | 358 |
236 // File is locally deleted or locally updated. | 359 // File is locally deleted or locally updated. |
237 SyncCompleted(callback); | 360 SyncCompleted(callback); |
238 } | 361 } |
239 | 362 |
240 void RemoteToLocalSyncer::HandleNewFile( | 363 void RemoteToLocalSyncer::HandleRename( |
241 const SyncStatusCallback& callback) { | 364 const SyncStatusCallback& callback) { |
242 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForNewFile, | 365 DCHECK(dirty_tracker_); |
243 weak_ptr_factory_.GetWeakPtr(), callback)); | 366 DCHECK(dirty_tracker_->active()); |
| 367 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 368 DCHECK(dirty_tracker_->has_synced_details()); |
| 369 DCHECK(!dirty_tracker_->synced_details().deleted()); |
| 370 |
| 371 DCHECK(remote_metadata_); |
| 372 DCHECK(remote_metadata_->has_details()); |
| 373 DCHECK(!remote_metadata_->details().deleted()); |
| 374 |
| 375 DCHECK_EQ(dirty_tracker_->synced_details().file_kind(), |
| 376 remote_metadata_->details().file_kind()); |
| 377 DCHECK_NE(dirty_tracker_->synced_details().title(), |
| 378 remote_metadata_->details().title()); |
| 379 |
| 380 NOTIMPLEMENTED(); |
| 381 callback.Run(SYNC_STATUS_FAILED); |
244 } | 382 } |
245 | 383 |
246 void RemoteToLocalSyncer::DidPrepareForNewFile( | 384 void RemoteToLocalSyncer::HandleReorganize( |
247 const SyncStatusCallback& callback, | 385 const SyncStatusCallback& callback) { |
248 SyncStatusCode status) { | 386 DCHECK(dirty_tracker_); |
| 387 DCHECK(dirty_tracker_->active()); |
| 388 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 389 DCHECK(dirty_tracker_->has_synced_details()); |
| 390 DCHECK(!dirty_tracker_->synced_details().deleted()); |
| 391 |
| 392 DCHECK(remote_metadata_); |
| 393 DCHECK(remote_metadata_->has_details()); |
| 394 DCHECK(!remote_metadata_->details().deleted()); |
| 395 |
249 NOTIMPLEMENTED(); | 396 NOTIMPLEMENTED(); |
250 callback.Run(SYNC_STATUS_FAILED); | 397 callback.Run(SYNC_STATUS_FAILED); |
251 } | 398 } |
252 | 399 |
253 void RemoteToLocalSyncer::HandleContentUpdate( | 400 void RemoteToLocalSyncer::HandleContentUpdate( |
254 const SyncStatusCallback& callback) { | 401 const SyncStatusCallback& callback) { |
| 402 DCHECK(dirty_tracker_); |
| 403 DCHECK(dirty_tracker_->active()); |
| 404 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 405 DCHECK(dirty_tracker_->has_synced_details()); |
| 406 DCHECK(!dirty_tracker_->synced_details().deleted()); |
| 407 DCHECK_EQ(FILE_KIND_FILE, dirty_tracker_->synced_details().file_kind()); |
| 408 |
| 409 DCHECK(remote_metadata_); |
| 410 DCHECK(remote_metadata_->has_details()); |
| 411 DCHECK(!remote_metadata_->details().deleted()); |
| 412 |
| 413 DCHECK_NE(dirty_tracker_->synced_details().md5(), |
| 414 remote_metadata_->details().md5()); |
| 415 |
255 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForContentUpdate, | 416 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForContentUpdate, |
256 weak_ptr_factory_.GetWeakPtr(), callback)); | 417 weak_ptr_factory_.GetWeakPtr(), callback)); |
257 } | 418 } |
258 | 419 |
259 void RemoteToLocalSyncer::DidPrepareForContentUpdate( | 420 void RemoteToLocalSyncer::DidPrepareForContentUpdate( |
260 const SyncStatusCallback& callback, | 421 const SyncStatusCallback& callback, |
261 SyncStatusCode status) { | 422 SyncStatusCode status) { |
262 NOTIMPLEMENTED(); | 423 NOTIMPLEMENTED(); |
263 callback.Run(SYNC_STATUS_FAILED); | 424 callback.Run(SYNC_STATUS_FAILED); |
264 } | 425 } |
265 | 426 |
266 void RemoteToLocalSyncer::ListFolderContent( | 427 void RemoteToLocalSyncer::HandleFolderContentListing( |
267 const SyncStatusCallback& callback) { | 428 const SyncStatusCallback& callback) { |
| 429 DCHECK(dirty_tracker_); |
| 430 DCHECK(dirty_tracker_->active()); |
| 431 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 432 DCHECK(dirty_tracker_->has_synced_details()); |
| 433 DCHECK(!dirty_tracker_->synced_details().deleted()); |
| 434 DCHECK_EQ(FILE_KIND_FOLDER, dirty_tracker_->synced_details().file_kind()); |
| 435 DCHECK(dirty_tracker_->needs_folder_listing()); |
| 436 |
| 437 DCHECK(remote_metadata_); |
| 438 DCHECK(remote_metadata_->has_details()); |
| 439 DCHECK(!remote_metadata_->details().deleted()); |
| 440 |
268 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForFolderListing, | 441 Prepare(base::Bind(&RemoteToLocalSyncer::DidPrepareForFolderListing, |
269 weak_ptr_factory_.GetWeakPtr(), callback)); | 442 weak_ptr_factory_.GetWeakPtr(), callback)); |
270 } | 443 } |
271 | 444 |
272 void RemoteToLocalSyncer::DidPrepareForFolderListing( | 445 void RemoteToLocalSyncer::DidPrepareForFolderListing( |
273 const SyncStatusCallback& callback, | 446 const SyncStatusCallback& callback, |
274 SyncStatusCode status) { | 447 SyncStatusCode status) { |
275 NOTIMPLEMENTED(); | 448 NOTIMPLEMENTED(); |
276 callback.Run(SYNC_STATUS_FAILED); | 449 callback.Run(SYNC_STATUS_FAILED); |
277 } | 450 } |
278 | 451 |
279 void RemoteToLocalSyncer::HandleRename( | |
280 const SyncStatusCallback& callback) { | |
281 NOTIMPLEMENTED(); | |
282 callback.Run(SYNC_STATUS_FAILED); | |
283 } | |
284 | |
285 void RemoteToLocalSyncer::HandleReorganize( | |
286 const SyncStatusCallback& callback) { | |
287 NOTIMPLEMENTED(); | |
288 callback.Run(SYNC_STATUS_FAILED); | |
289 } | |
290 | |
291 void RemoteToLocalSyncer::HandleOfflineSolvable( | 452 void RemoteToLocalSyncer::HandleOfflineSolvable( |
292 const SyncStatusCallback& callback) { | 453 const SyncStatusCallback& callback) { |
| 454 DCHECK(dirty_tracker_); |
| 455 DCHECK(dirty_tracker_->active()); |
| 456 DCHECK(!HasDisabledAppRoot(metadata_database(), *dirty_tracker_)); |
| 457 DCHECK(dirty_tracker_->has_synced_details()); |
| 458 DCHECK(!dirty_tracker_->synced_details().deleted()); |
| 459 |
| 460 DCHECK((dirty_tracker_->synced_details().file_kind() == FILE_KIND_FOLDER && |
| 461 !dirty_tracker_->needs_folder_listing()) || |
| 462 (dirty_tracker_->synced_details().file_kind() == FILE_KIND_FILE && |
| 463 dirty_tracker_->synced_details().md5() == |
| 464 remote_metadata_->details().md5())); |
| 465 |
| 466 DCHECK(remote_metadata_); |
| 467 DCHECK(remote_metadata_->has_details()); |
| 468 DCHECK(!remote_metadata_->details().deleted()); |
| 469 |
293 NOTIMPLEMENTED(); | 470 NOTIMPLEMENTED(); |
294 callback.Run(SYNC_STATUS_FAILED); | 471 callback.Run(SYNC_STATUS_FAILED); |
295 } | 472 } |
296 | 473 |
297 void RemoteToLocalSyncer::SyncCompleted( | 474 void RemoteToLocalSyncer::SyncCompleted( |
298 const SyncStatusCallback& callback) { | 475 const SyncStatusCallback& callback) { |
299 NOTIMPLEMENTED(); | 476 NOTIMPLEMENTED(); |
300 callback.Run(SYNC_STATUS_FAILED); | 477 callback.Run(SYNC_STATUS_FAILED); |
301 | 478 |
302 // TODO(tzik): Clear dirty mark of the |dirty_tracker|, report operation log | 479 // TODO(tzik): Clear dirty mark of the |dirty_tracker|, report operation log |
303 // the observer. | 480 // the observer. |
304 } | 481 } |
305 | 482 |
306 void RemoteToLocalSyncer::Prepare(const SyncStatusCallback& callback) { | 483 void RemoteToLocalSyncer::Prepare(const SyncStatusCallback& callback) { |
307 bool should_success = BuildFileSystemURL( | 484 bool should_success = BuildFileSystemURL( |
308 metadata_database(), dirty_tracker_, &url_); | 485 metadata_database(), *dirty_tracker_, &url_); |
309 DCHECK(should_success); | 486 DCHECK(should_success); |
310 remote_change_processor()->PrepareForProcessRemoteChange( | 487 remote_change_processor()->PrepareForProcessRemoteChange( |
311 url_, | 488 url_, |
312 base::Bind(&RemoteToLocalSyncer::DidPrepare, | 489 base::Bind(&RemoteToLocalSyncer::DidPrepare, |
313 weak_ptr_factory_.GetWeakPtr(), | 490 weak_ptr_factory_.GetWeakPtr(), |
314 callback)); | 491 callback)); |
315 } | 492 } |
316 | 493 |
317 void RemoteToLocalSyncer::DidPrepare(const SyncStatusCallback& callback, | 494 void RemoteToLocalSyncer::DidPrepare(const SyncStatusCallback& callback, |
318 SyncStatusCode status, | 495 SyncStatusCode status, |
319 const SyncFileMetadata& local_metadata, | 496 const SyncFileMetadata& local_metadata, |
320 const FileChangeList& local_changes) { | 497 const FileChangeList& local_changes) { |
321 if (status != SYNC_STATUS_OK) { | 498 if (status != SYNC_STATUS_OK) { |
322 callback.Run(status); | 499 callback.Run(status); |
323 return; | 500 return; |
324 } | 501 } |
325 | 502 |
326 local_metadata_ = local_metadata; | 503 local_metadata_ = local_metadata; |
327 local_changes_ = local_changes; | 504 local_changes_ = local_changes; |
328 | 505 |
329 callback.Run(status); | 506 callback.Run(status); |
330 } | 507 } |
331 | 508 |
332 void RemoteToLocalSyncer::DeleteLocalFile(const SyncStatusCallback& callback) { | 509 void RemoteToLocalSyncer::DeleteLocalFile(const SyncStatusCallback& callback) { |
333 if (sync_root_modification_) { | 510 if (dirty_tracker_->tracker_id() == |
| 511 metadata_database()->GetSyncRootTrackerID()) { |
334 // TODO(tzik): Sync-root is deleted. Needs special handling. | 512 // TODO(tzik): Sync-root is deleted. Needs special handling. |
335 NOTIMPLEMENTED(); | 513 NOTIMPLEMENTED(); |
336 callback.Run(SYNC_STATUS_FAILED); | 514 callback.Run(SYNC_STATUS_FAILED); |
337 return; | 515 return; |
338 } | 516 } |
339 | 517 |
340 if (dirty_tracker_.tracker_kind() == TRACKER_KIND_APP_ROOT) { | 518 if (dirty_tracker_->tracker_kind() == TRACKER_KIND_APP_ROOT) { |
341 // TODO(tzik): Active app-root is deleted. Needs special handling. | 519 // TODO(tzik): Active app-root is deleted. Needs special handling. |
342 NOTIMPLEMENTED(); | 520 NOTIMPLEMENTED(); |
343 callback.Run(SYNC_STATUS_FAILED); | 521 callback.Run(SYNC_STATUS_FAILED); |
344 return; | 522 return; |
345 } | 523 } |
346 | 524 |
347 remote_change_processor()->ApplyRemoteChange( | 525 remote_change_processor()->ApplyRemoteChange( |
348 FileChange(FileChange::FILE_CHANGE_DELETE, SYNC_FILE_TYPE_UNKNOWN), | 526 FileChange(FileChange::FILE_CHANGE_DELETE, SYNC_FILE_TYPE_UNKNOWN), |
349 base::FilePath(), | 527 base::FilePath(), |
350 url_, | 528 url_, |
(...skipping 20 matching lines...) Expand all Loading... |
371 return sync_context_->GetMetadataDatabase(); | 549 return sync_context_->GetMetadataDatabase(); |
372 } | 550 } |
373 | 551 |
374 RemoteChangeProcessor* RemoteToLocalSyncer::remote_change_processor() { | 552 RemoteChangeProcessor* RemoteToLocalSyncer::remote_change_processor() { |
375 DCHECK(sync_context_->GetRemoteChangeProcessor()); | 553 DCHECK(sync_context_->GetRemoteChangeProcessor()); |
376 return sync_context_->GetRemoteChangeProcessor(); | 554 return sync_context_->GetRemoteChangeProcessor(); |
377 } | 555 } |
378 | 556 |
379 } // namespace drive_backend | 557 } // namespace drive_backend |
380 } // namespace sync_file_system | 558 } // namespace sync_file_system |
OLD | NEW |