Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(157)

Side by Side Diff: chrome/browser/sync_file_system/drive_file_sync_service.cc

Issue 12304015: Migrated sync_file_status, sync_action and sync_direction from fileapi:: namespace to sync_file_sys… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Revised TODOs Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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(&param))); 1369 base::Passed(&param)));
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(&param))); 1389 AsWeakPtr(), base::Passed(&param)));
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(&param))); 1416 base::Passed(&param)));
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(&param))); 1447 base::Passed(&param)));
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
1523 temporary_file_path, 1513 temporary_file_path,
1524 base::Bind(&DriveFileSyncService::DidDownloadFileForRemoteSync, 1514 base::Bind(&DriveFileSyncService::DidDownloadFileForRemoteSync,
1525 AsWeakPtr(), base::Passed(&param))); 1515 AsWeakPtr(), base::Passed(&param)));
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
1644 AsWeakPtr(), base::Passed(&param), status)); 1634 AsWeakPtr(), base::Passed(&param), 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698