| 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 |