Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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_file_sync_service.h" | 5 #include "chrome/browser/sync_file_system/drive_file_sync_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 145 std::string description_; | 145 std::string description_; |
| 146 | 146 |
| 147 DISALLOW_COPY_AND_ASSIGN(TaskToken); | 147 DISALLOW_COPY_AND_ASSIGN(TaskToken); |
| 148 }; | 148 }; |
| 149 | 149 |
| 150 void DriveFileSyncService::OnInvalidatorStateChange( | 150 void DriveFileSyncService::OnInvalidatorStateChange( |
| 151 syncer::InvalidatorState state) { | 151 syncer::InvalidatorState state) { |
| 152 SetPushNotificationEnabled(state); | 152 SetPushNotificationEnabled(state); |
| 153 } | 153 } |
| 154 | 154 |
| 155 void DriveFileSyncService::SetPushNotificationEnabled( | |
|
tzik
2013/02/19 09:09:01
Could you rebase for this reordering?
calvinlo
2013/02/20 04:04:30
Done.
| |
| 156 syncer::InvalidatorState state) { | |
| 157 push_notification_enabled_ = (state == syncer::INVALIDATIONS_ENABLED); | |
| 158 if (!push_notification_enabled_) | |
| 159 return; | |
| 160 | |
| 161 // Push notifications are enabled so reset polling timer. | |
| 162 UpdatePollingDelay(kPollingDelaySecondsWithNotification); | |
| 163 } | |
| 164 | |
| 165 void DriveFileSyncService::OnIncomingInvalidation( | 155 void DriveFileSyncService::OnIncomingInvalidation( |
| 166 const syncer::ObjectIdInvalidationMap& invalidation_map) { | 156 const syncer::ObjectIdInvalidationMap& invalidation_map) { |
| 167 DCHECK(push_notification_enabled_); | 157 DCHECK(push_notification_enabled_); |
| 168 DCHECK_EQ(1U, invalidation_map.size()); | 158 DCHECK_EQ(1U, invalidation_map.size()); |
| 169 const invalidation::ObjectId object_id( | 159 const invalidation::ObjectId object_id( |
| 170 ipc::invalidation::ObjectSource::COSMO_CHANGELOG, | 160 ipc::invalidation::ObjectSource::COSMO_CHANGELOG, |
| 171 kDriveInvalidationObjectId); | 161 kDriveInvalidationObjectId); |
| 172 DCHECK_EQ(1U, invalidation_map.count(object_id)); | 162 DCHECK_EQ(1U, invalidation_map.count(object_id)); |
| 173 | 163 |
| 174 may_have_unfetched_changes_ = true; | 164 may_have_unfetched_changes_ = true; |
| 175 MaybeStartFetchChanges(); | 165 MaybeStartFetchChanges(); |
| 176 } | 166 } |
| 177 | 167 |
| 178 struct DriveFileSyncService::ProcessRemoteChangeParam { | 168 struct DriveFileSyncService::ProcessRemoteChangeParam { |
| 179 scoped_ptr<TaskToken> token; | 169 scoped_ptr<TaskToken> token; |
| 180 RemoteChangeProcessor* processor; | 170 RemoteChangeProcessor* processor; |
| 181 RemoteChange remote_change; | 171 RemoteChange remote_change; |
| 182 fileapi::SyncFileCallback callback; | 172 fileapi::SyncFileCallback callback; |
| 183 | 173 |
| 184 DriveMetadata drive_metadata; | 174 DriveMetadata drive_metadata; |
| 185 bool metadata_updated; | 175 bool metadata_updated; |
| 186 base::FilePath temporary_file_path; | 176 base::FilePath temporary_file_path; |
| 187 std::string md5_checksum; | 177 std::string md5_checksum; |
| 188 fileapi::SyncAction sync_action; | 178 SyncAction sync_action; |
| 189 bool clear_local_changes; | 179 bool clear_local_changes; |
| 190 | 180 |
| 191 ProcessRemoteChangeParam(scoped_ptr<TaskToken> token, | 181 ProcessRemoteChangeParam(scoped_ptr<TaskToken> token, |
| 192 RemoteChangeProcessor* processor, | 182 RemoteChangeProcessor* processor, |
| 193 const RemoteChange& remote_change, | 183 const RemoteChange& remote_change, |
| 194 const fileapi::SyncFileCallback& callback) | 184 const fileapi::SyncFileCallback& callback) |
| 195 : token(token.Pass()), | 185 : token(token.Pass()), |
| 196 processor(processor), | 186 processor(processor), |
| 197 remote_change(remote_change), | 187 remote_change(remote_change), |
| 198 callback(callback), | 188 callback(callback), |
| 199 metadata_updated(false), | 189 metadata_updated(false), |
| 200 sync_action(fileapi::SYNC_ACTION_NONE), | 190 sync_action(SYNC_ACTION_NONE), |
| 201 clear_local_changes(true) { | 191 clear_local_changes(true) { |
| 202 } | 192 } |
| 203 }; | 193 }; |
| 204 | 194 |
| 205 DriveFileSyncService::ChangeQueueItem::ChangeQueueItem() | 195 DriveFileSyncService::ChangeQueueItem::ChangeQueueItem() |
| 206 : changestamp(0), | 196 : changestamp(0), |
| 207 sync_type(REMOTE_SYNC_TYPE_INCREMENTAL) { | 197 sync_type(REMOTE_SYNC_TYPE_INCREMENTAL) { |
| 208 } | 198 } |
| 209 | 199 |
| 210 DriveFileSyncService::ChangeQueueItem::ChangeQueueItem( | 200 DriveFileSyncService::ChangeQueueItem::ChangeQueueItem( |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 612 metadata.set_md5_checksum(std::string()); | 602 metadata.set_md5_checksum(std::string()); |
| 613 } | 603 } |
| 614 metadata.set_conflicted(true); | 604 metadata.set_conflicted(true); |
| 615 metadata.set_to_be_fetched(false); | 605 metadata.set_to_be_fetched(false); |
| 616 metadata_store_->UpdateEntry( | 606 metadata_store_->UpdateEntry( |
| 617 url, metadata, | 607 url, metadata, |
| 618 base::Bind(&DriveFileSyncService::DidApplyLocalChange, | 608 base::Bind(&DriveFileSyncService::DidApplyLocalChange, |
| 619 AsWeakPtr(), base::Passed(&token), url, | 609 AsWeakPtr(), base::Passed(&token), url, |
| 620 google_apis::HTTP_CONFLICT, callback)); | 610 google_apis::HTTP_CONFLICT, callback)); |
| 621 NotifyObserversFileStatusChanged(url, | 611 NotifyObserversFileStatusChanged(url, |
| 622 fileapi::SYNC_FILE_STATUS_CONFLICTING, | 612 SYNC_FILE_STATUS_CONFLICTING, |
| 623 fileapi::SYNC_ACTION_NONE, | 613 SYNC_ACTION_NONE, |
| 624 fileapi::SYNC_DIRECTION_NONE); | 614 SYNC_DIRECTION_NONE); |
| 625 return; | 615 return; |
| 626 } | 616 } |
| 627 case LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE: { | 617 case LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE: { |
| 628 // Mark the file as to-be-fetched. | 618 // Mark the file as to-be-fetched. |
| 629 DriveMetadata metadata; | 619 DriveMetadata metadata; |
| 630 const fileapi::SyncStatusCode status = | 620 const fileapi::SyncStatusCode status = |
| 631 metadata_store_->ReadEntry(url, &metadata); | 621 metadata_store_->ReadEntry(url, &metadata); |
| 632 DCHECK_EQ(fileapi::SYNC_STATUS_OK, status); | 622 DCHECK_EQ(fileapi::SYNC_STATUS_OK, status); |
| 633 metadata.set_conflicted(false); | 623 metadata.set_conflicted(false); |
| 634 metadata.set_to_be_fetched(true); | 624 metadata.set_to_be_fetched(true); |
| (...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1191 DriveMetadata metadata; | 1181 DriveMetadata metadata; |
| 1192 metadata.set_resource_id(resource_id); | 1182 metadata.set_resource_id(resource_id); |
| 1193 metadata.set_md5_checksum(file_md5); | 1183 metadata.set_md5_checksum(file_md5); |
| 1194 metadata.set_conflicted(false); | 1184 metadata.set_conflicted(false); |
| 1195 metadata.set_to_be_fetched(false); | 1185 metadata.set_to_be_fetched(false); |
| 1196 metadata_store_->UpdateEntry( | 1186 metadata_store_->UpdateEntry( |
| 1197 url, metadata, | 1187 url, metadata, |
| 1198 base::Bind(&DriveFileSyncService::DidApplyLocalChange, | 1188 base::Bind(&DriveFileSyncService::DidApplyLocalChange, |
| 1199 AsWeakPtr(), base::Passed(&token), url, error, callback)); | 1189 AsWeakPtr(), base::Passed(&token), url, error, callback)); |
| 1200 NotifyObserversFileStatusChanged(url, | 1190 NotifyObserversFileStatusChanged(url, |
| 1201 fileapi::SYNC_FILE_STATUS_SYNCED, | 1191 SYNC_FILE_STATUS_SYNCED, |
| 1202 fileapi::SYNC_ACTION_ADDED, | 1192 SYNC_ACTION_ADDED, |
| 1203 fileapi::SYNC_DIRECTION_LOCAL_TO_REMOTE); | 1193 SYNC_DIRECTION_LOCAL_TO_REMOTE); |
| 1204 return; | 1194 return; |
| 1205 } | 1195 } |
| 1206 FinalizeLocalSync(token.Pass(), callback, | 1196 FinalizeLocalSync(token.Pass(), callback, |
| 1207 GDataErrorCodeToSyncStatusCodeWrapper(error)); | 1197 GDataErrorCodeToSyncStatusCodeWrapper(error)); |
| 1208 } | 1198 } |
| 1209 | 1199 |
| 1210 void DriveFileSyncService::DidUploadExistingFileForLocalSync( | 1200 void DriveFileSyncService::DidUploadExistingFileForLocalSync( |
| 1211 scoped_ptr<TaskToken> token, | 1201 scoped_ptr<TaskToken> token, |
| 1212 const fileapi::FileSystemURL& url, | 1202 const fileapi::FileSystemURL& url, |
| 1213 const fileapi::SyncStatusCallback& callback, | 1203 const fileapi::SyncStatusCallback& callback, |
| 1214 google_apis::GDataErrorCode error, | 1204 google_apis::GDataErrorCode error, |
| 1215 const std::string& resource_id, | 1205 const std::string& resource_id, |
| 1216 const std::string& file_md5) { | 1206 const std::string& file_md5) { |
| 1217 switch (error) { | 1207 switch (error) { |
| 1218 case google_apis::HTTP_SUCCESS: { | 1208 case google_apis::HTTP_SUCCESS: { |
| 1219 DriveMetadata metadata; | 1209 DriveMetadata metadata; |
| 1220 metadata.set_resource_id(resource_id); | 1210 metadata.set_resource_id(resource_id); |
| 1221 metadata.set_md5_checksum(file_md5); | 1211 metadata.set_md5_checksum(file_md5); |
| 1222 metadata.set_conflicted(false); | 1212 metadata.set_conflicted(false); |
| 1223 metadata.set_to_be_fetched(false); | 1213 metadata.set_to_be_fetched(false); |
| 1224 metadata_store_->UpdateEntry( | 1214 metadata_store_->UpdateEntry( |
| 1225 url, metadata, | 1215 url, metadata, |
| 1226 base::Bind(&DriveFileSyncService::DidApplyLocalChange, | 1216 base::Bind(&DriveFileSyncService::DidApplyLocalChange, |
| 1227 AsWeakPtr(), base::Passed(&token), url, error, callback)); | 1217 AsWeakPtr(), base::Passed(&token), url, error, callback)); |
| 1228 NotifyObserversFileStatusChanged(url, | 1218 NotifyObserversFileStatusChanged(url, |
| 1229 fileapi::SYNC_FILE_STATUS_SYNCED, | 1219 SYNC_FILE_STATUS_SYNCED, |
| 1230 fileapi::SYNC_ACTION_UPDATED, | 1220 SYNC_ACTION_UPDATED, |
| 1231 fileapi::SYNC_DIRECTION_LOCAL_TO_REMOTE); | 1221 SYNC_DIRECTION_LOCAL_TO_REMOTE); |
| 1232 return; | 1222 return; |
| 1233 } | 1223 } |
| 1234 case google_apis::HTTP_CONFLICT: { | 1224 case google_apis::HTTP_CONFLICT: { |
| 1235 // Mark the file as conflicted. | 1225 // Mark the file as conflicted. |
| 1236 DriveMetadata metadata; | 1226 DriveMetadata metadata; |
| 1237 const fileapi::SyncStatusCode status = | 1227 const fileapi::SyncStatusCode status = |
| 1238 metadata_store_->ReadEntry(url, &metadata); | 1228 metadata_store_->ReadEntry(url, &metadata); |
| 1239 DCHECK_EQ(fileapi::SYNC_STATUS_OK, status); | 1229 DCHECK_EQ(fileapi::SYNC_STATUS_OK, status); |
| 1240 metadata.set_conflicted(true); | 1230 metadata.set_conflicted(true); |
| 1241 metadata.set_to_be_fetched(false); | 1231 metadata.set_to_be_fetched(false); |
| 1242 metadata_store_->UpdateEntry( | 1232 metadata_store_->UpdateEntry( |
| 1243 url, metadata, | 1233 url, metadata, |
| 1244 base::Bind(&DriveFileSyncService::DidApplyLocalChange, | 1234 base::Bind(&DriveFileSyncService::DidApplyLocalChange, |
| 1245 AsWeakPtr(), base::Passed(&token), url, error, callback)); | 1235 AsWeakPtr(), base::Passed(&token), url, error, callback)); |
| 1246 NotifyObserversFileStatusChanged(url, | 1236 NotifyObserversFileStatusChanged(url, |
| 1247 fileapi::SYNC_FILE_STATUS_CONFLICTING, | 1237 SYNC_FILE_STATUS_CONFLICTING, |
| 1248 fileapi::SYNC_ACTION_NONE, | 1238 SYNC_ACTION_NONE, |
| 1249 fileapi::SYNC_DIRECTION_NONE); | 1239 SYNC_DIRECTION_NONE); |
| 1250 return; | 1240 return; |
| 1251 } | 1241 } |
| 1252 case google_apis::HTTP_NOT_MODIFIED: { | 1242 case google_apis::HTTP_NOT_MODIFIED: { |
| 1253 DidApplyLocalChange(token.Pass(), url, google_apis::HTTP_SUCCESS, | 1243 DidApplyLocalChange(token.Pass(), url, google_apis::HTTP_SUCCESS, |
| 1254 callback, fileapi::SYNC_STATUS_OK); | 1244 callback, fileapi::SYNC_STATUS_OK); |
| 1255 return; | 1245 return; |
| 1256 } | 1246 } |
| 1257 default: { | 1247 default: { |
| 1258 const fileapi::SyncStatusCode status = | 1248 const fileapi::SyncStatusCode status = |
| 1259 GDataErrorCodeToSyncStatusCodeWrapper(error); | 1249 GDataErrorCodeToSyncStatusCodeWrapper(error); |
| 1260 DCHECK_NE(fileapi::SYNC_STATUS_OK, status); | 1250 DCHECK_NE(fileapi::SYNC_STATUS_OK, status); |
| 1261 FinalizeLocalSync(token.Pass(), callback, status); | 1251 FinalizeLocalSync(token.Pass(), callback, status); |
| 1262 return; | 1252 return; |
| 1263 } | 1253 } |
| 1264 } | 1254 } |
| 1265 } | 1255 } |
| 1266 | 1256 |
| 1267 void DriveFileSyncService::DidDeleteFileForLocalSync( | 1257 void DriveFileSyncService::DidDeleteFileForLocalSync( |
| 1268 scoped_ptr<TaskToken> token, | 1258 scoped_ptr<TaskToken> token, |
| 1269 const fileapi::FileSystemURL& url, | 1259 const fileapi::FileSystemURL& url, |
| 1270 const fileapi::SyncStatusCallback& callback, | 1260 const fileapi::SyncStatusCallback& callback, |
| 1271 google_apis::GDataErrorCode error) { | 1261 google_apis::GDataErrorCode error) { |
| 1272 switch (error) { | 1262 switch (error) { |
| 1273 case google_apis::HTTP_SUCCESS: { | 1263 case google_apis::HTTP_SUCCESS: { |
| 1274 metadata_store_->DeleteEntry( | 1264 metadata_store_->DeleteEntry( |
| 1275 url, | 1265 url, |
| 1276 base::Bind(&DriveFileSyncService::DidApplyLocalChange, | 1266 base::Bind(&DriveFileSyncService::DidApplyLocalChange, |
| 1277 AsWeakPtr(), base::Passed(&token), url, error, callback)); | 1267 AsWeakPtr(), base::Passed(&token), url, error, callback)); |
| 1278 NotifyObserversFileStatusChanged(url, | 1268 NotifyObserversFileStatusChanged(url, |
| 1279 fileapi::SYNC_FILE_STATUS_SYNCED, | 1269 SYNC_FILE_STATUS_SYNCED, |
| 1280 fileapi::SYNC_ACTION_DELETED, | 1270 SYNC_ACTION_DELETED, |
| 1281 fileapi::SYNC_DIRECTION_LOCAL_TO_REMOTE); | 1271 SYNC_DIRECTION_LOCAL_TO_REMOTE); |
| 1282 return; | 1272 return; |
| 1283 } | 1273 } |
| 1284 case google_apis::HTTP_PRECONDITION: | 1274 case google_apis::HTTP_PRECONDITION: |
| 1285 // FALLTHROUGH | 1275 // FALLTHROUGH |
| 1286 case google_apis::HTTP_CONFLICT: { | 1276 case google_apis::HTTP_CONFLICT: { |
| 1287 // Mark the file as conflicted. | 1277 // Mark the file as conflicted. |
| 1288 DriveMetadata metadata; | 1278 DriveMetadata metadata; |
| 1289 const fileapi::SyncStatusCode status = | 1279 const fileapi::SyncStatusCode status = |
| 1290 metadata_store_->ReadEntry(url, &metadata); | 1280 metadata_store_->ReadEntry(url, &metadata); |
| 1291 DCHECK_EQ(fileapi::SYNC_STATUS_OK, status); | 1281 DCHECK_EQ(fileapi::SYNC_STATUS_OK, status); |
| 1292 metadata.set_conflicted(true); | 1282 metadata.set_conflicted(true); |
| 1293 metadata.set_to_be_fetched(false); | 1283 metadata.set_to_be_fetched(false); |
| 1294 metadata_store_->UpdateEntry( | 1284 metadata_store_->UpdateEntry( |
| 1295 url, metadata, | 1285 url, metadata, |
| 1296 base::Bind(&DriveFileSyncService::DidApplyLocalChange, | 1286 base::Bind(&DriveFileSyncService::DidApplyLocalChange, |
| 1297 AsWeakPtr(), base::Passed(&token), url, error, callback)); | 1287 AsWeakPtr(), base::Passed(&token), url, error, callback)); |
| 1298 NotifyObserversFileStatusChanged(url, | 1288 NotifyObserversFileStatusChanged(url, |
| 1299 fileapi::SYNC_FILE_STATUS_CONFLICTING, | 1289 SYNC_FILE_STATUS_CONFLICTING, |
| 1300 fileapi::SYNC_ACTION_NONE, | 1290 SYNC_ACTION_NONE, |
| 1301 fileapi::SYNC_DIRECTION_NONE); | 1291 SYNC_DIRECTION_NONE); |
| 1302 return; | 1292 return; |
| 1303 } | 1293 } |
| 1304 default: { | 1294 default: { |
| 1305 const fileapi::SyncStatusCode status = | 1295 const fileapi::SyncStatusCode status = |
| 1306 GDataErrorCodeToSyncStatusCodeWrapper(error); | 1296 GDataErrorCodeToSyncStatusCodeWrapper(error); |
| 1307 DCHECK_NE(fileapi::SYNC_STATUS_OK, status); | 1297 DCHECK_NE(fileapi::SYNC_STATUS_OK, status); |
| 1308 FinalizeLocalSync(token.Pass(), callback, status); | 1298 FinalizeLocalSync(token.Pass(), callback, status); |
| 1309 return; | 1299 return; |
| 1310 } | 1300 } |
| 1311 } | 1301 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1349 << (missing_local_file ? " (missing local file)" : " ") | 1339 << (missing_local_file ? " (missing local file)" : " ") |
| 1350 << " remote_change: " << remote_file_change.DebugString() | 1340 << " remote_change: " << remote_file_change.DebugString() |
| 1351 << " ==> operation: ResolveConflictToRemoteChange"; | 1341 << " ==> operation: ResolveConflictToRemoteChange"; |
| 1352 | 1342 |
| 1353 const fileapi::FileSystemURL& url = param->remote_change.url; | 1343 const fileapi::FileSystemURL& url = param->remote_change.url; |
| 1354 param->drive_metadata.set_conflicted(false); | 1344 param->drive_metadata.set_conflicted(false); |
| 1355 param->drive_metadata.set_to_be_fetched(true); | 1345 param->drive_metadata.set_to_be_fetched(true); |
| 1356 metadata_store_->UpdateEntry( | 1346 metadata_store_->UpdateEntry( |
| 1357 url, drive_metadata, base::Bind(&EmptyStatusCallback)); | 1347 url, drive_metadata, base::Bind(&EmptyStatusCallback)); |
| 1358 | 1348 |
| 1359 param->sync_action = fileapi::SYNC_ACTION_ADDED; | 1349 param->sync_action = SYNC_ACTION_ADDED; |
| 1360 DownloadForRemoteSync(param.Pass()); | 1350 DownloadForRemoteSync(param.Pass()); |
| 1361 return; | 1351 return; |
| 1362 } | 1352 } |
| 1363 | 1353 |
| 1364 DCHECK(remote_file_change.IsDelete()); | 1354 DCHECK(remote_file_change.IsDelete()); |
| 1365 param->sync_action = fileapi::SYNC_ACTION_NONE; | 1355 param->sync_action = SYNC_ACTION_NONE; |
| 1366 DeleteMetadataForRemoteSync(param.Pass()); | 1356 DeleteMetadataForRemoteSync(param.Pass()); |
| 1367 return; | 1357 return; |
| 1368 } | 1358 } |
| 1369 | 1359 |
| 1370 DCHECK(!missing_local_file); | 1360 DCHECK(!missing_local_file); |
| 1371 if (remote_file_change.IsAddOrUpdate()) { | 1361 if (remote_file_change.IsAddOrUpdate()) { |
| 1372 param->sync_action = fileapi::SYNC_ACTION_NONE; | 1362 param->sync_action = SYNC_ACTION_NONE; |
| 1373 param->drive_metadata.set_conflicted(true); | 1363 param->drive_metadata.set_conflicted(true); |
| 1374 param->drive_metadata.set_to_be_fetched(false); | 1364 param->drive_metadata.set_to_be_fetched(false); |
| 1375 | 1365 |
| 1376 metadata_store_->UpdateEntry( | 1366 metadata_store_->UpdateEntry( |
| 1377 url, drive_metadata, | 1367 url, drive_metadata, |
| 1378 base::Bind(&DriveFileSyncService::CompleteRemoteSync, AsWeakPtr(), | 1368 base::Bind(&DriveFileSyncService::CompleteRemoteSync, AsWeakPtr(), |
| 1379 base::Passed(¶m))); | 1369 base::Passed(¶m))); |
| 1380 return; | 1370 return; |
| 1381 } | 1371 } |
| 1382 | 1372 |
| 1383 DCHECK(remote_file_change.IsDelete()); | 1373 DCHECK(remote_file_change.IsDelete()); |
| 1384 DVLOG(1) << "ProcessRemoteChange for " << url.DebugString() | 1374 DVLOG(1) << "ProcessRemoteChange for " << url.DebugString() |
| 1385 << (param->drive_metadata.conflicted() ? " (conflicted)" : " ") | 1375 << (param->drive_metadata.conflicted() ? " (conflicted)" : " ") |
| 1386 << (missing_local_file ? " (missing local file)" : " ") | 1376 << (missing_local_file ? " (missing local file)" : " ") |
| 1387 << " remote_change: " << remote_file_change.DebugString() | 1377 << " remote_change: " << remote_file_change.DebugString() |
| 1388 << " ==> operation: ResolveConflictToLocalChange"; | 1378 << " ==> operation: ResolveConflictToLocalChange"; |
| 1389 | 1379 |
| 1390 param->sync_action = fileapi::SYNC_ACTION_NONE; | 1380 param->sync_action = SYNC_ACTION_NONE; |
| 1391 param->clear_local_changes = false; | 1381 param->clear_local_changes = false; |
| 1392 | 1382 |
| 1393 RemoteChangeProcessor* processor = param->processor; | 1383 RemoteChangeProcessor* processor = param->processor; |
| 1394 processor->RecordFakeLocalChange( | 1384 processor->RecordFakeLocalChange( |
| 1395 url, | 1385 url, |
| 1396 fileapi::FileChange(fileapi::FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 1386 fileapi::FileChange(fileapi::FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 1397 fileapi::SYNC_FILE_TYPE_FILE), | 1387 fileapi::SYNC_FILE_TYPE_FILE), |
| 1398 base::Bind(&DriveFileSyncService::DidResolveConflictToLocalChange, | 1388 base::Bind(&DriveFileSyncService::DidResolveConflictToLocalChange, |
| 1399 AsWeakPtr(), base::Passed(¶m))); | 1389 AsWeakPtr(), base::Passed(¶m))); |
| 1400 return; | 1390 return; |
| 1401 } | 1391 } |
| 1402 | 1392 |
| 1403 DCHECK(!param->drive_metadata.conflicted()); | 1393 DCHECK(!param->drive_metadata.conflicted()); |
| 1404 if (remote_file_change.IsAddOrUpdate()) { | 1394 if (remote_file_change.IsAddOrUpdate()) { |
| 1405 if (local_changes.empty()) { | 1395 if (local_changes.empty()) { |
| 1406 if (missing_local_file) { | 1396 if (missing_local_file) { |
| 1407 param->sync_action = fileapi::SYNC_ACTION_ADDED; | 1397 param->sync_action = SYNC_ACTION_ADDED; |
| 1408 DownloadForRemoteSync(param.Pass()); | 1398 DownloadForRemoteSync(param.Pass()); |
| 1409 return; | 1399 return; |
| 1410 } | 1400 } |
| 1411 | 1401 |
| 1412 DCHECK(!missing_local_file); | 1402 DCHECK(!missing_local_file); |
| 1413 param->sync_action = fileapi::SYNC_ACTION_UPDATED; | 1403 param->sync_action = SYNC_ACTION_UPDATED; |
| 1414 DownloadForRemoteSync(param.Pass()); | 1404 DownloadForRemoteSync(param.Pass()); |
| 1415 return; | 1405 return; |
| 1416 } | 1406 } |
| 1417 | 1407 |
| 1418 DCHECK(!local_changes.empty()); | 1408 DCHECK(!local_changes.empty()); |
| 1419 if (local_changes.list().back().IsAddOrUpdate()) { | 1409 if (local_changes.list().back().IsAddOrUpdate()) { |
| 1420 param->drive_metadata.set_conflicted(true); | 1410 param->drive_metadata.set_conflicted(true); |
| 1421 param->drive_metadata.set_to_be_fetched(false); | 1411 param->drive_metadata.set_to_be_fetched(false); |
| 1422 | 1412 |
| 1423 metadata_store_->UpdateEntry( | 1413 metadata_store_->UpdateEntry( |
| 1424 url, drive_metadata, | 1414 url, drive_metadata, |
| 1425 base::Bind(&DriveFileSyncService::CompleteRemoteSync, AsWeakPtr(), | 1415 base::Bind(&DriveFileSyncService::CompleteRemoteSync, AsWeakPtr(), |
| 1426 base::Passed(¶m))); | 1416 base::Passed(¶m))); |
| 1427 NotifyObserversFileStatusChanged(url, | 1417 NotifyObserversFileStatusChanged(url, |
| 1428 fileapi::SYNC_FILE_STATUS_CONFLICTING, | 1418 SYNC_FILE_STATUS_CONFLICTING, |
| 1429 fileapi::SYNC_ACTION_NONE, | 1419 SYNC_ACTION_NONE, |
| 1430 fileapi::SYNC_DIRECTION_NONE); | 1420 SYNC_DIRECTION_NONE); |
| 1431 return; | 1421 return; |
| 1432 } | 1422 } |
| 1433 | 1423 |
| 1434 DCHECK(local_changes.list().back().IsDelete()); | 1424 DCHECK(local_changes.list().back().IsDelete()); |
| 1435 param->sync_action = fileapi::SYNC_ACTION_ADDED; | 1425 param->sync_action = SYNC_ACTION_ADDED; |
| 1436 DownloadForRemoteSync(param.Pass()); | 1426 DownloadForRemoteSync(param.Pass()); |
| 1437 return; | 1427 return; |
| 1438 } | 1428 } |
| 1439 | 1429 |
| 1440 DCHECK(remote_file_change.IsDelete()); | 1430 DCHECK(remote_file_change.IsDelete()); |
| 1441 if (local_changes.empty()) { | 1431 if (local_changes.empty()) { |
| 1442 if (missing_local_file) { | 1432 if (missing_local_file) { |
| 1443 param->sync_action = fileapi::SYNC_ACTION_NONE; | 1433 param->sync_action = SYNC_ACTION_NONE; |
| 1444 if (missing_db_entry) | 1434 if (missing_db_entry) |
| 1445 CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK); | 1435 CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK); |
| 1446 else | 1436 else |
| 1447 DeleteMetadataForRemoteSync(param.Pass()); | 1437 DeleteMetadataForRemoteSync(param.Pass()); |
| 1448 return; | 1438 return; |
| 1449 } | 1439 } |
| 1450 DCHECK(!missing_local_file); | 1440 DCHECK(!missing_local_file); |
| 1451 param->sync_action = fileapi::SYNC_ACTION_DELETED; | 1441 param->sync_action = SYNC_ACTION_DELETED; |
| 1452 | 1442 |
| 1453 const fileapi::FileChange& file_change = remote_file_change; | 1443 const fileapi::FileChange& file_change = remote_file_change; |
| 1454 param->processor->ApplyRemoteChange( | 1444 param->processor->ApplyRemoteChange( |
| 1455 file_change, base::FilePath(), url, | 1445 file_change, base::FilePath(), url, |
| 1456 base::Bind(&DriveFileSyncService::DidApplyRemoteChange, AsWeakPtr(), | 1446 base::Bind(&DriveFileSyncService::DidApplyRemoteChange, AsWeakPtr(), |
| 1457 base::Passed(¶m))); | 1447 base::Passed(¶m))); |
| 1458 return; | 1448 return; |
| 1459 } | 1449 } |
| 1460 | 1450 |
| 1461 DCHECK(!local_changes.empty()); | 1451 DCHECK(!local_changes.empty()); |
| 1462 if (local_changes.list().back().IsAddOrUpdate()) { | 1452 if (local_changes.list().back().IsAddOrUpdate()) { |
| 1463 param->sync_action = fileapi::SYNC_ACTION_NONE; | 1453 param->sync_action = SYNC_ACTION_NONE; |
| 1464 CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK); | 1454 CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK); |
| 1465 return; | 1455 return; |
| 1466 } | 1456 } |
| 1467 | 1457 |
| 1468 DCHECK(local_changes.list().back().IsDelete()); | 1458 DCHECK(local_changes.list().back().IsDelete()); |
| 1469 param->sync_action = fileapi::SYNC_ACTION_NONE; | 1459 param->sync_action = SYNC_ACTION_NONE; |
| 1470 if (missing_db_entry) | 1460 if (missing_db_entry) |
| 1471 CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK); | 1461 CompleteRemoteSync(param.Pass(), fileapi::SYNC_STATUS_OK); |
| 1472 else | 1462 else |
| 1473 DeleteMetadataForRemoteSync(param.Pass()); | 1463 DeleteMetadataForRemoteSync(param.Pass()); |
| 1474 } | 1464 } |
| 1475 | 1465 |
| 1476 void DriveFileSyncService::DidResolveConflictToLocalChange( | 1466 void DriveFileSyncService::DidResolveConflictToLocalChange( |
| 1477 scoped_ptr<ProcessRemoteChangeParam> param, | 1467 scoped_ptr<ProcessRemoteChangeParam> param, |
| 1478 fileapi::SyncStatusCode status) { | 1468 fileapi::SyncStatusCode status) { |
| 1479 if (status != fileapi::SYNC_STATUS_OK) { | 1469 if (status != fileapi::SYNC_STATUS_OK) { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1523 temporary_file_path, | 1513 temporary_file_path, |
| 1524 base::Bind(&DriveFileSyncService::DidDownloadFileForRemoteSync, | 1514 base::Bind(&DriveFileSyncService::DidDownloadFileForRemoteSync, |
| 1525 AsWeakPtr(), base::Passed(¶m))); | 1515 AsWeakPtr(), base::Passed(¶m))); |
| 1526 } | 1516 } |
| 1527 | 1517 |
| 1528 void DriveFileSyncService::DidDownloadFileForRemoteSync( | 1518 void DriveFileSyncService::DidDownloadFileForRemoteSync( |
| 1529 scoped_ptr<ProcessRemoteChangeParam> param, | 1519 scoped_ptr<ProcessRemoteChangeParam> param, |
| 1530 google_apis::GDataErrorCode error, | 1520 google_apis::GDataErrorCode error, |
| 1531 const std::string& md5_checksum) { | 1521 const std::string& md5_checksum) { |
| 1532 if (error == google_apis::HTTP_NOT_MODIFIED) { | 1522 if (error == google_apis::HTTP_NOT_MODIFIED) { |
| 1533 param->sync_action = fileapi::SYNC_ACTION_NONE; | 1523 param->sync_action = SYNC_ACTION_NONE; |
| 1534 DidApplyRemoteChange(param.Pass(), fileapi::SYNC_STATUS_OK); | 1524 DidApplyRemoteChange(param.Pass(), fileapi::SYNC_STATUS_OK); |
| 1535 return; | 1525 return; |
| 1536 } | 1526 } |
| 1537 | 1527 |
| 1538 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); | 1528 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCodeWrapper(error); |
| 1539 if (status != fileapi::SYNC_STATUS_OK) { | 1529 if (status != fileapi::SYNC_STATUS_OK) { |
| 1540 AbortRemoteSync(param.Pass(), status); | 1530 AbortRemoteSync(param.Pass(), status); |
| 1541 return; | 1531 return; |
| 1542 } | 1532 } |
| 1543 | 1533 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1644 AsWeakPtr(), base::Passed(¶m), status)); | 1634 AsWeakPtr(), base::Passed(¶m), status)); |
| 1645 return; | 1635 return; |
| 1646 } | 1636 } |
| 1647 | 1637 |
| 1648 if (!param->temporary_file_path.empty()) | 1638 if (!param->temporary_file_path.empty()) |
| 1649 DeleteTemporaryFile(param->temporary_file_path); | 1639 DeleteTemporaryFile(param->temporary_file_path); |
| 1650 NotifyTaskDone(status, param->token.Pass()); | 1640 NotifyTaskDone(status, param->token.Pass()); |
| 1651 if (status == fileapi::SYNC_STATUS_HAS_CONFLICT || | 1641 if (status == fileapi::SYNC_STATUS_HAS_CONFLICT || |
| 1652 param->drive_metadata.conflicted()) { | 1642 param->drive_metadata.conflicted()) { |
| 1653 NotifyObserversFileStatusChanged(param->remote_change.url, | 1643 NotifyObserversFileStatusChanged(param->remote_change.url, |
| 1654 fileapi::SYNC_FILE_STATUS_CONFLICTING, | 1644 SYNC_FILE_STATUS_CONFLICTING, |
| 1655 fileapi::SYNC_ACTION_NONE, | 1645 SYNC_ACTION_NONE, |
| 1656 fileapi::SYNC_DIRECTION_NONE); | 1646 SYNC_DIRECTION_NONE); |
| 1657 } else if (status == fileapi::SYNC_STATUS_OK && | 1647 } else if (status == fileapi::SYNC_STATUS_OK && |
| 1658 param->sync_action != fileapi::SYNC_ACTION_NONE) { | 1648 param->sync_action != SYNC_ACTION_NONE) { |
| 1659 NotifyObserversFileStatusChanged(param->remote_change.url, | 1649 NotifyObserversFileStatusChanged(param->remote_change.url, |
| 1660 fileapi::SYNC_FILE_STATUS_SYNCED, | 1650 SYNC_FILE_STATUS_SYNCED, |
| 1661 param->sync_action, | 1651 param->sync_action, |
| 1662 fileapi::SYNC_DIRECTION_REMOTE_TO_LOCAL); | 1652 SYNC_DIRECTION_REMOTE_TO_LOCAL); |
| 1663 } | 1653 } |
| 1664 param->callback.Run(status, param->remote_change.url); | 1654 param->callback.Run(status, param->remote_change.url); |
| 1665 } | 1655 } |
| 1666 | 1656 |
| 1667 bool DriveFileSyncService::AppendRemoteChange( | 1657 bool DriveFileSyncService::AppendRemoteChange( |
| 1668 const GURL& origin, | 1658 const GURL& origin, |
| 1669 const google_apis::ResourceEntry& entry, | 1659 const google_apis::ResourceEntry& entry, |
| 1670 int64 changestamp, | 1660 int64 changestamp, |
| 1671 RemoteSyncType sync_type) { | 1661 RemoteSyncType sync_type) { |
| 1672 // TODO(tzik): Normalize the path here. | 1662 // TODO(tzik): Normalize the path here. |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1799 if (found_url == origin_to_changes_map_.end()) | 1789 if (found_url == origin_to_changes_map_.end()) |
| 1800 return false; | 1790 return false; |
| 1801 const PathToChangeMap& path_to_change = found_url->second; | 1791 const PathToChangeMap& path_to_change = found_url->second; |
| 1802 PathToChangeMap::const_iterator found_path = path_to_change.find(url.path()); | 1792 PathToChangeMap::const_iterator found_path = path_to_change.find(url.path()); |
| 1803 if (found_path == path_to_change.end()) | 1793 if (found_path == path_to_change.end()) |
| 1804 return false; | 1794 return false; |
| 1805 *change = found_path->second; | 1795 *change = found_path->second; |
| 1806 return true; | 1796 return true; |
| 1807 } | 1797 } |
| 1808 | 1798 |
| 1799 fileapi::SyncStatusCode | |
| 1800 DriveFileSyncService::GDataErrorCodeToSyncStatusCodeWrapper( | |
| 1801 google_apis::GDataErrorCode error) const { | |
| 1802 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | |
| 1803 if (status != fileapi::SYNC_STATUS_OK && !sync_client_->IsAuthenticated()) | |
| 1804 return fileapi::SYNC_STATUS_AUTHENTICATION_FAILED; | |
| 1805 return status; | |
| 1806 } | |
| 1807 | |
| 1809 void DriveFileSyncService::MaybeStartFetchChanges() { | 1808 void DriveFileSyncService::MaybeStartFetchChanges() { |
| 1810 if (!token_ || GetCurrentState() == REMOTE_SERVICE_DISABLED) { | 1809 if (!token_ || GetCurrentState() == REMOTE_SERVICE_DISABLED) { |
| 1811 // If another task is already running or the service is disabled | 1810 // If another task is already running or the service is disabled |
| 1812 // just return here. | 1811 // just return here. |
| 1813 // Note that token_ should be already non-null if this is called | 1812 // Note that token_ should be already non-null if this is called |
| 1814 // from NotifyTaskDone(). | 1813 // from NotifyTaskDone(). |
| 1815 return; | 1814 return; |
| 1816 } | 1815 } |
| 1817 | 1816 |
| 1818 // If we have pending_batch_sync_origins, try starting the batch sync. | 1817 // If we have pending_batch_sync_origins, try starting the batch sync. |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1922 if ((*itr)->href().GetOrigin() != resource_link.GetOrigin() || | 1921 if ((*itr)->href().GetOrigin() != resource_link.GetOrigin() || |
| 1923 (*itr)->href().path() != resource_link.path()) | 1922 (*itr)->href().path() != resource_link.path()) |
| 1924 continue; | 1923 continue; |
| 1925 | 1924 |
| 1926 *origin_out = origin; | 1925 *origin_out = origin; |
| 1927 return true; | 1926 return true; |
| 1928 } | 1927 } |
| 1929 return false; | 1928 return false; |
| 1930 } | 1929 } |
| 1931 | 1930 |
| 1932 // Register for Google Drive invalidation notifications through XMPP. | |
| 1933 void DriveFileSyncService::RegisterDriveNotifications() { | |
| 1934 // Push notification registration might have already occurred if called from | |
| 1935 // a different extension. | |
| 1936 if (push_notification_registered_) { | |
| 1937 return; | |
| 1938 } | |
| 1939 | |
| 1940 ProfileSyncService* profile_sync_service = | |
| 1941 ProfileSyncServiceFactory::GetForProfile(profile_); | |
| 1942 if (!profile_sync_service) { | |
| 1943 return; | |
| 1944 } | |
| 1945 | |
| 1946 profile_sync_service->RegisterInvalidationHandler(this); | |
| 1947 syncer::ObjectIdSet ids; | |
| 1948 ids.insert(invalidation::ObjectId( | |
| 1949 ipc::invalidation::ObjectSource::COSMO_CHANGELOG, | |
| 1950 kDriveInvalidationObjectId)); | |
| 1951 profile_sync_service->UpdateRegisteredInvalidationIds(this, ids); | |
| 1952 push_notification_registered_ = true; | |
| 1953 SetPushNotificationEnabled(profile_sync_service->GetInvalidatorState()); | |
| 1954 } | |
| 1955 | |
| 1956 void DriveFileSyncService::SchedulePolling() { | 1931 void DriveFileSyncService::SchedulePolling() { |
| 1957 if (polling_timer_.IsRunning() || | 1932 if (polling_timer_.IsRunning() || |
| 1958 polling_delay_seconds_ < 0 || | 1933 polling_delay_seconds_ < 0 || |
| 1959 GetCurrentState() == REMOTE_SERVICE_DISABLED) | 1934 GetCurrentState() == REMOTE_SERVICE_DISABLED) |
| 1960 return; | 1935 return; |
| 1961 | 1936 |
| 1962 DVLOG(1) << "Polling scheduled" | 1937 DVLOG(1) << "Polling scheduled" |
| 1963 << " (delay:" << polling_delay_seconds_ << "s)"; | 1938 << " (delay:" << polling_delay_seconds_ << "s)"; |
| 1964 | 1939 |
| 1965 polling_timer_.Start( | 1940 polling_timer_.Start( |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1994 | 1969 |
| 1995 int64 old_delay = polling_delay_seconds_; | 1970 int64 old_delay = polling_delay_seconds_; |
| 1996 | 1971 |
| 1997 // Push notifications off. | 1972 // Push notifications off. |
| 1998 polling_delay_seconds_ = std::min(new_delay_sec, kMaximumPollingDelaySeconds); | 1973 polling_delay_seconds_ = std::min(new_delay_sec, kMaximumPollingDelaySeconds); |
| 1999 | 1974 |
| 2000 if (polling_delay_seconds_ < old_delay) | 1975 if (polling_delay_seconds_ < old_delay) |
| 2001 polling_timer_.Stop(); | 1976 polling_timer_.Stop(); |
| 2002 } | 1977 } |
| 2003 | 1978 |
| 2004 fileapi::SyncStatusCode | 1979 // Register for Google Drive invalidation notifications through XMPP. |
| 2005 DriveFileSyncService::GDataErrorCodeToSyncStatusCodeWrapper( | 1980 void DriveFileSyncService::RegisterDriveNotifications() { |
| 2006 google_apis::GDataErrorCode error) const { | 1981 // Push notification registration might have already occurred if called from |
| 2007 fileapi::SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error); | 1982 // a different extension. |
| 2008 if (status != fileapi::SYNC_STATUS_OK && !sync_client_->IsAuthenticated()) | 1983 if (push_notification_registered_) { |
| 2009 return fileapi::SYNC_STATUS_AUTHENTICATION_FAILED; | 1984 return; |
| 2010 return status; | 1985 } |
| 1986 | |
| 1987 ProfileSyncService* profile_sync_service = | |
| 1988 ProfileSyncServiceFactory::GetForProfile(profile_); | |
| 1989 if (!profile_sync_service) { | |
| 1990 return; | |
| 1991 } | |
| 1992 | |
| 1993 profile_sync_service->RegisterInvalidationHandler(this); | |
| 1994 syncer::ObjectIdSet ids; | |
| 1995 ids.insert(invalidation::ObjectId( | |
| 1996 ipc::invalidation::ObjectSource::COSMO_CHANGELOG, | |
| 1997 kDriveInvalidationObjectId)); | |
| 1998 profile_sync_service->UpdateRegisteredInvalidationIds(this, ids); | |
| 1999 push_notification_registered_ = true; | |
| 2000 SetPushNotificationEnabled(profile_sync_service->GetInvalidatorState()); | |
| 2001 } | |
| 2002 | |
| 2003 void DriveFileSyncService::SetPushNotificationEnabled( | |
| 2004 syncer::InvalidatorState state) { | |
| 2005 push_notification_enabled_ = (state == syncer::INVALIDATIONS_ENABLED); | |
| 2006 if (!push_notification_enabled_) | |
| 2007 return; | |
| 2008 | |
| 2009 // Push notifications are enabled so reset polling timer. | |
| 2010 UpdatePollingDelay(kPollingDelaySecondsWithNotification); | |
| 2011 } | 2011 } |
| 2012 | 2012 |
| 2013 void DriveFileSyncService::NotifyObserversFileStatusChanged( | 2013 void DriveFileSyncService::NotifyObserversFileStatusChanged( |
| 2014 const fileapi::FileSystemURL& url, | 2014 const fileapi::FileSystemURL& url, |
| 2015 fileapi::SyncFileStatus sync_status, | 2015 SyncFileStatus sync_status, |
| 2016 fileapi::SyncAction action_taken, | 2016 SyncAction action_taken, |
| 2017 fileapi::SyncDirection direction) { | 2017 SyncDirection direction) { |
| 2018 if (sync_status != fileapi::SYNC_FILE_STATUS_SYNCED) { | 2018 if (sync_status != SYNC_FILE_STATUS_SYNCED) { |
| 2019 DCHECK_EQ(fileapi::SYNC_ACTION_NONE, action_taken); | 2019 DCHECK_EQ(SYNC_ACTION_NONE, action_taken); |
| 2020 DCHECK_EQ(fileapi::SYNC_DIRECTION_NONE, direction); | 2020 DCHECK_EQ(SYNC_DIRECTION_NONE, direction); |
| 2021 } | 2021 } |
| 2022 | 2022 |
| 2023 FOR_EACH_OBSERVER( | 2023 FOR_EACH_OBSERVER( |
| 2024 FileStatusObserver, file_status_observers_, | 2024 FileStatusObserver, file_status_observers_, |
| 2025 OnFileStatusChanged(url, sync_status, action_taken, direction)); | 2025 OnFileStatusChanged(url, sync_status, action_taken, direction)); |
| 2026 } | 2026 } |
| 2027 | 2027 |
| 2028 } // namespace sync_file_system | 2028 } // namespace sync_file_system |
| OLD | NEW |