| 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 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/debug/trace_event.h" | 12 #include "base/debug/trace_event.h" |
| 13 #include "base/file_util.h" | 13 #include "base/file_util.h" |
| 14 #include "base/location.h" | 14 #include "base/location.h" |
| 15 #include "base/memory/weak_ptr.h" | 15 #include "base/memory/weak_ptr.h" |
| 16 #include "base/message_loop_proxy.h" | 16 #include "base/message_loop_proxy.h" |
| 17 #include "base/utf_string_conversions.h" | 17 #include "base/utf_string_conversions.h" |
| 18 #include "base/values.h" | 18 #include "base/values.h" |
| 19 #include "chrome/browser/extensions/extension_service.h" | 19 #include "chrome/browser/extensions/extension_service.h" |
| 20 #include "chrome/browser/extensions/extension_system.h" | 20 #include "chrome/browser/extensions/extension_system.h" |
| 21 #include "chrome/browser/google_apis/drive_notification_manager.h" | 21 #include "chrome/browser/google_apis/drive_notification_manager.h" |
| 22 #include "chrome/browser/google_apis/drive_notification_manager_factory.h" | 22 #include "chrome/browser/google_apis/drive_notification_manager_factory.h" |
| 23 #include "chrome/browser/profiles/profile.h" | 23 #include "chrome/browser/profiles/profile.h" |
| 24 #include "chrome/browser/sync_file_system/conflict_resolution_policy.h" | 24 #include "chrome/browser/sync_file_system/conflict_resolution_policy.h" |
| 25 #include "chrome/browser/sync_file_system/drive_file_sync_client.h" | 25 #include "chrome/browser/sync_file_system/drive_file_sync_client.h" |
| 26 #include "chrome/browser/sync_file_system/drive_file_sync_util.h" | 26 #include "chrome/browser/sync_file_system/drive_file_sync_util.h" |
| 27 #include "chrome/browser/sync_file_system/drive_metadata_store.h" | 27 #include "chrome/browser/sync_file_system/drive_metadata_store.h" |
| 28 #include "chrome/browser/sync_file_system/file_status_observer.h" | 28 #include "chrome/browser/sync_file_system/file_status_observer.h" |
| 29 #include "chrome/browser/sync_file_system/remote_change_processor.h" | 29 #include "chrome/browser/sync_file_system/remote_change_processor.h" |
| 30 #include "chrome/browser/sync_file_system/remote_sync_operation_resolver.h" |
| 30 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" | 31 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" |
| 31 #include "chrome/common/extensions/extension.h" | 32 #include "chrome/common/extensions/extension.h" |
| 32 #include "content/public/browser/browser_thread.h" | 33 #include "content/public/browser/browser_thread.h" |
| 33 #include "extensions/common/constants.h" | 34 #include "extensions/common/constants.h" |
| 34 #include "webkit/fileapi/file_system_url.h" | 35 #include "webkit/fileapi/file_system_url.h" |
| 35 #include "webkit/fileapi/syncable/sync_file_metadata.h" | 36 #include "webkit/fileapi/syncable/sync_file_metadata.h" |
| 36 #include "webkit/fileapi/syncable/sync_file_type.h" | 37 #include "webkit/fileapi/syncable/sync_file_type.h" |
| 37 #include "webkit/fileapi/syncable/syncable_file_system_util.h" | 38 #include "webkit/fileapi/syncable/syncable_file_system_util.h" |
| 38 | 39 |
| 39 using fileapi::FileSystemURL; | 40 using fileapi::FileSystemURL; |
| (...skipping 1441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1481 | 1482 |
| 1482 bool missing_db_entry = (status != SYNC_STATUS_OK); | 1483 bool missing_db_entry = (status != SYNC_STATUS_OK); |
| 1483 if (missing_db_entry) { | 1484 if (missing_db_entry) { |
| 1484 param->drive_metadata.set_resource_id(param->remote_change.resource_id); | 1485 param->drive_metadata.set_resource_id(param->remote_change.resource_id); |
| 1485 param->drive_metadata.set_md5_checksum(std::string()); | 1486 param->drive_metadata.set_md5_checksum(std::string()); |
| 1486 param->drive_metadata.set_conflicted(false); | 1487 param->drive_metadata.set_conflicted(false); |
| 1487 param->drive_metadata.set_to_be_fetched(false); | 1488 param->drive_metadata.set_to_be_fetched(false); |
| 1488 } | 1489 } |
| 1489 bool missing_local_file = (metadata.file_type == SYNC_FILE_TYPE_UNKNOWN); | 1490 bool missing_local_file = (metadata.file_type == SYNC_FILE_TYPE_UNKNOWN); |
| 1490 | 1491 |
| 1491 RemoteSyncOperationType operation = | 1492 RemoteSyncOperationResolver::RemoteSyncOperationType operation = |
| 1492 ResolveRemoteSyncOperationType(remote_file_change, param.get(), | 1493 RemoteSyncOperationResolver::Resolve(remote_file_change, |
| 1493 local_changes, missing_local_file); | 1494 local_changes, |
| 1495 param->local_metadata.file_type, |
| 1496 param->drive_metadata.conflicted()); |
| 1494 | 1497 |
| 1495 DVLOG(1) << "ProcessRemoteChange for " << url.DebugString() | 1498 DVLOG(1) << "ProcessRemoteChange for " << url.DebugString() |
| 1496 << (param->drive_metadata.conflicted() ? " (conflicted)" : " ") | 1499 << (param->drive_metadata.conflicted() ? " (conflicted)" : " ") |
| 1497 << (missing_local_file ? " (missing local file)" : " ") | 1500 << (missing_local_file ? " (missing local file)" : " ") |
| 1498 << " remote_change: " << remote_file_change.DebugString() | 1501 << " remote_change: " << remote_file_change.DebugString() |
| 1499 << " ==> operation: " << operation; | 1502 << " ==> operation: " << operation; |
| 1500 | 1503 |
| 1501 switch (operation) { | 1504 switch (operation) { |
| 1502 case REMOTE_SYNC_OPERATION_ADD_FILE: | 1505 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_ADD_FILE: |
| 1503 param->sync_action = SYNC_ACTION_ADDED; | 1506 param->sync_action = SYNC_ACTION_ADDED; |
| 1504 DownloadForRemoteSync(param.Pass()); | 1507 DownloadForRemoteSync(param.Pass()); |
| 1505 return; | 1508 return; |
| 1506 case REMOTE_SYNC_OPERATION_UPDATE_FILE: | 1509 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_ADD_DIRECTORY: |
| 1510 // TODO(nhiroki): support directory operations (http://crbug.com/161442). |
| 1511 NOTIMPLEMENTED(); |
| 1512 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); |
| 1513 return; |
| 1514 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_UPDATE_FILE: |
| 1507 param->sync_action = SYNC_ACTION_UPDATED; | 1515 param->sync_action = SYNC_ACTION_UPDATED; |
| 1508 DownloadForRemoteSync(param.Pass()); | 1516 DownloadForRemoteSync(param.Pass()); |
| 1509 return; | 1517 return; |
| 1510 case REMOTE_SYNC_OPERATION_DELETE_FILE: { | 1518 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_DELETE_FILE: { |
| 1511 param->sync_action = SYNC_ACTION_DELETED; | 1519 param->sync_action = SYNC_ACTION_DELETED; |
| 1512 const FileChange& file_change = remote_file_change; | 1520 const FileChange& file_change = remote_file_change; |
| 1513 remote_change_processor_->ApplyRemoteChange( | 1521 remote_change_processor_->ApplyRemoteChange( |
| 1514 file_change, base::FilePath(), url, | 1522 file_change, base::FilePath(), url, |
| 1515 base::Bind(&DriveFileSyncService::DidApplyRemoteChange, AsWeakPtr(), | 1523 base::Bind(&DriveFileSyncService::DidApplyRemoteChange, AsWeakPtr(), |
| 1516 base::Passed(¶m))); | 1524 base::Passed(¶m))); |
| 1517 return; | 1525 return; |
| 1518 } | 1526 } |
| 1519 case REMOTE_SYNC_OPERATION_NONE: | 1527 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_DELETE_DIRECTORY: |
| 1528 // TODO(nhiroki): support directory operations (http://crbug.com/161442). |
| 1529 NOTIMPLEMENTED(); |
| 1530 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); |
| 1531 return; |
| 1532 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_NONE: |
| 1520 param->sync_action = SYNC_ACTION_NONE; | 1533 param->sync_action = SYNC_ACTION_NONE; |
| 1521 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK); | 1534 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK); |
| 1522 return; | 1535 return; |
| 1523 case REMOTE_SYNC_OPERATION_CONFLICT: | 1536 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_CONFLICT: |
| 1524 HandleConflictForRemoteSync(param.Pass(), base::Time(), SYNC_STATUS_OK); | 1537 HandleConflictForRemoteSync(param.Pass(), base::Time(), SYNC_STATUS_OK); |
| 1525 return; | 1538 return; |
| 1526 case REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL: | 1539 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL: |
| 1527 ResolveConflictToLocalForRemoteSync(param.Pass()); | 1540 ResolveConflictToLocalForRemoteSync(param.Pass()); |
| 1528 return; | 1541 return; |
| 1529 case REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE: { | 1542 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE: { |
| 1530 const FileSystemURL& url = param->remote_change.url; | 1543 const FileSystemURL& url = param->remote_change.url; |
| 1531 param->drive_metadata.set_conflicted(false); | 1544 param->drive_metadata.set_conflicted(false); |
| 1532 param->drive_metadata.set_to_be_fetched(true); | 1545 param->drive_metadata.set_to_be_fetched(true); |
| 1533 metadata_store_->UpdateEntry( | 1546 metadata_store_->UpdateEntry( |
| 1534 url, drive_metadata, base::Bind(&EmptyStatusCallback)); | 1547 url, drive_metadata, base::Bind(&EmptyStatusCallback)); |
| 1535 param->sync_action = SYNC_ACTION_ADDED; | 1548 param->sync_action = SYNC_ACTION_ADDED; |
| 1536 DownloadForRemoteSync(param.Pass()); | 1549 DownloadForRemoteSync(param.Pass()); |
| 1537 return; | 1550 return; |
| 1538 } | 1551 } |
| 1539 case REMOTE_SYNC_OPERATION_DELETE_METADATA: | 1552 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_DELETE_METADATA: |
| 1540 param->sync_action = SYNC_ACTION_NONE; | 1553 param->sync_action = SYNC_ACTION_NONE; |
| 1541 if (missing_db_entry) | 1554 if (missing_db_entry) |
| 1542 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK); | 1555 CompleteRemoteSync(param.Pass(), SYNC_STATUS_OK); |
| 1543 else | 1556 else |
| 1544 DeleteMetadataForRemoteSync(param.Pass()); | 1557 DeleteMetadataForRemoteSync(param.Pass()); |
| 1545 return; | 1558 return; |
| 1546 case REMOTE_SYNC_OPERATION_FAIL: | 1559 case RemoteSyncOperationResolver::REMOTE_SYNC_OPERATION_FAIL: |
| 1547 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); | 1560 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); |
| 1548 return; | 1561 return; |
| 1549 } | 1562 } |
| 1550 NOTREACHED(); | 1563 NOTREACHED(); |
| 1551 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); | 1564 AbortRemoteSync(param.Pass(), SYNC_STATUS_FAILED); |
| 1552 } | 1565 } |
| 1553 | 1566 |
| 1554 DriveFileSyncService::RemoteSyncOperationType | |
| 1555 DriveFileSyncService::ResolveRemoteSyncOperationType( | |
| 1556 const FileChange& remote_file_change, | |
| 1557 ProcessRemoteChangeParam* param, | |
| 1558 const FileChangeList& local_changes, | |
| 1559 bool missing_local_file) { | |
| 1560 if (param->drive_metadata.conflicted()) { | |
| 1561 switch (remote_file_change.change()) { | |
| 1562 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | |
| 1563 return missing_local_file ? REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE | |
| 1564 : REMOTE_SYNC_OPERATION_CONFLICT; | |
| 1565 case FileChange::FILE_CHANGE_DELETE: | |
| 1566 return missing_local_file ? REMOTE_SYNC_OPERATION_DELETE_METADATA | |
| 1567 : REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; | |
| 1568 } | |
| 1569 } | |
| 1570 | |
| 1571 if (remote_file_change.IsAddOrUpdate()) { | |
| 1572 if (local_changes.empty()) | |
| 1573 return missing_local_file ? REMOTE_SYNC_OPERATION_ADD_FILE | |
| 1574 : REMOTE_SYNC_OPERATION_UPDATE_FILE; | |
| 1575 switch (local_changes.list().back().change()) { | |
| 1576 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | |
| 1577 return REMOTE_SYNC_OPERATION_CONFLICT; | |
| 1578 case FileChange::FILE_CHANGE_DELETE: | |
| 1579 return REMOTE_SYNC_OPERATION_ADD_FILE; | |
| 1580 } | |
| 1581 } | |
| 1582 | |
| 1583 DCHECK(remote_file_change.IsDelete()); | |
| 1584 if (local_changes.empty()) | |
| 1585 return missing_local_file ? REMOTE_SYNC_OPERATION_DELETE_METADATA | |
| 1586 : REMOTE_SYNC_OPERATION_DELETE_FILE; | |
| 1587 switch (local_changes.list().back().change()) { | |
| 1588 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | |
| 1589 return REMOTE_SYNC_OPERATION_NONE; | |
| 1590 case FileChange::FILE_CHANGE_DELETE: | |
| 1591 return REMOTE_SYNC_OPERATION_DELETE_METADATA; | |
| 1592 } | |
| 1593 NOTREACHED(); | |
| 1594 return REMOTE_SYNC_OPERATION_FAIL; | |
| 1595 } | |
| 1596 | |
| 1597 void DriveFileSyncService::DidResolveConflictToLocalChange( | 1567 void DriveFileSyncService::DidResolveConflictToLocalChange( |
| 1598 scoped_ptr<ProcessRemoteChangeParam> param, | 1568 scoped_ptr<ProcessRemoteChangeParam> param, |
| 1599 SyncStatusCode status) { | 1569 SyncStatusCode status) { |
| 1600 if (status != SYNC_STATUS_OK) { | 1570 if (status != SYNC_STATUS_OK) { |
| 1601 DCHECK_NE(SYNC_STATUS_HAS_CONFLICT, status); | 1571 DCHECK_NE(SYNC_STATUS_HAS_CONFLICT, status); |
| 1602 AbortRemoteSync(param.Pass(), status); | 1572 AbortRemoteSync(param.Pass(), status); |
| 1603 return; | 1573 return; |
| 1604 } | 1574 } |
| 1605 | 1575 |
| 1606 const FileSystemURL& url = param->remote_change.url; | 1576 const FileSystemURL& url = param->remote_change.url; |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1947 return false; | 1917 return false; |
| 1948 | 1918 |
| 1949 // Drop any change if the change has unknown resource id. | 1919 // Drop any change if the change has unknown resource id. |
| 1950 if (!remote_resource_id.empty() && | 1920 if (!remote_resource_id.empty() && |
| 1951 !local_resource_id.empty() && | 1921 !local_resource_id.empty() && |
| 1952 remote_resource_id != local_resource_id) | 1922 remote_resource_id != local_resource_id) |
| 1953 return false; | 1923 return false; |
| 1954 | 1924 |
| 1955 FileChange file_change(CreateFileChange(is_deleted)); | 1925 FileChange file_change(CreateFileChange(is_deleted)); |
| 1956 | 1926 |
| 1927 if (is_deleted) { |
| 1928 // Determine a file type of the deleted change by local metadata. |
| 1929 if (!remote_resource_id.empty() && |
| 1930 !local_resource_id.empty() && |
| 1931 remote_resource_id == local_resource_id) { |
| 1932 DCHECK_EQ(DriveMetadata::RESOURCE_TYPE_FILE, metadata.type()); |
| 1933 file_change = FileChange(FileChange::FILE_CHANGE_DELETE, |
| 1934 SYNC_FILE_TYPE_FILE); |
| 1935 } |
| 1936 } |
| 1937 |
| 1957 if (is_deleted && has_db_entry) { | 1938 if (is_deleted && has_db_entry) { |
| 1958 metadata.set_resource_id(std::string()); | 1939 metadata.set_resource_id(std::string()); |
| 1959 metadata_store_->UpdateEntry(url, metadata, | 1940 metadata_store_->UpdateEntry(url, metadata, |
| 1960 base::Bind(&EmptyStatusCallback)); | 1941 base::Bind(&EmptyStatusCallback)); |
| 1961 } | 1942 } |
| 1962 | 1943 |
| 1963 // Do not return in this block. These changes should be done together. | 1944 // Do not return in this block. These changes should be done together. |
| 1964 { | 1945 { |
| 1965 if (overridden_queue_item != pending_changes_.end()) | 1946 if (overridden_queue_item != pending_changes_.end()) |
| 1966 pending_changes_.erase(overridden_queue_item); | 1947 pending_changes_.erase(overridden_queue_item); |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2358 pending_batch_sync_origins_.insert(origin); | 2339 pending_batch_sync_origins_.insert(origin); |
| 2359 } | 2340 } |
| 2360 callback.Run(status, resource_id); | 2341 callback.Run(status, resource_id); |
| 2361 } | 2342 } |
| 2362 | 2343 |
| 2363 std::string DriveFileSyncService::sync_root_resource_id() { | 2344 std::string DriveFileSyncService::sync_root_resource_id() { |
| 2364 return metadata_store_->sync_root_directory(); | 2345 return metadata_store_->sync_root_directory(); |
| 2365 } | 2346 } |
| 2366 | 2347 |
| 2367 } // namespace sync_file_system | 2348 } // namespace sync_file_system |
| OLD | NEW |