| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/local_sync_operation_resolver.h" | 5 #include "chrome/browser/sync_file_system/local_sync_operation_resolver.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" | 8 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" |
| 9 | 9 |
| 10 namespace sync_file_system { | 10 namespace sync_file_system { |
| 11 | 11 |
| 12 LocalSyncOperationType LocalSyncOperationResolver::Resolve( | 12 LocalSyncOperationType LocalSyncOperationResolver::Resolve( |
| 13 const FileChange& local_file_change, | 13 const FileChange& local_file_change, |
| 14 bool has_remote_change, | 14 const FileChange* remote_file_change, |
| 15 const FileChange& remote_file_change, | 15 const DriveMetadata* drive_metadata) { |
| 16 DriveMetadata* drive_metadata) { | |
| 17 // Invalid combination should never happen. | 16 // Invalid combination should never happen. |
| 18 if (has_remote_change && remote_file_change.IsTypeUnknown()) | 17 if (remote_file_change && remote_file_change->IsTypeUnknown()) |
| 19 return LOCAL_SYNC_OPERATION_FAIL; | 18 return LOCAL_SYNC_OPERATION_FAIL; |
| 20 | 19 |
| 21 bool is_conflicting = false; | 20 bool is_conflicting = false; |
| 22 SyncFileType remote_file_type_in_metadata = SYNC_FILE_TYPE_UNKNOWN; | 21 SyncFileType remote_file_type_in_metadata = SYNC_FILE_TYPE_UNKNOWN; |
| 23 if (drive_metadata != NULL) { | 22 if (drive_metadata) { |
| 24 is_conflicting = drive_metadata->conflicted(); | 23 is_conflicting = drive_metadata->conflicted(); |
| 25 if (drive_metadata->type() == | 24 if (drive_metadata->type() == |
| 26 DriveMetadata_ResourceType_RESOURCE_TYPE_FILE) | 25 DriveMetadata_ResourceType_RESOURCE_TYPE_FILE) |
| 27 remote_file_type_in_metadata = SYNC_FILE_TYPE_FILE; | 26 remote_file_type_in_metadata = SYNC_FILE_TYPE_FILE; |
| 28 else | 27 else |
| 29 remote_file_type_in_metadata = SYNC_FILE_TYPE_DIRECTORY; | 28 remote_file_type_in_metadata = SYNC_FILE_TYPE_DIRECTORY; |
| 30 } | 29 } |
| 31 | 30 |
| 32 switch (local_file_change.change()) { | 31 switch (local_file_change.change()) { |
| 33 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | 32 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| 34 switch (local_file_change.file_type()) { | 33 switch (local_file_change.file_type()) { |
| 35 case SYNC_FILE_TYPE_FILE: | 34 case SYNC_FILE_TYPE_FILE: |
| 36 return is_conflicting | 35 return is_conflicting |
| 37 ? ResolveForAddOrUpdateFileInConflict(has_remote_change, | 36 ? ResolveForAddOrUpdateFileInConflict(remote_file_change) |
| 38 remote_file_change) | 37 : ResolveForAddOrUpdateFile(remote_file_change, |
| 39 : ResolveForAddOrUpdateFile(has_remote_change, | |
| 40 remote_file_change, | |
| 41 remote_file_type_in_metadata); | 38 remote_file_type_in_metadata); |
| 42 case SYNC_FILE_TYPE_DIRECTORY: | 39 case SYNC_FILE_TYPE_DIRECTORY: |
| 43 return is_conflicting | 40 return is_conflicting |
| 44 ? ResolveForAddDirectoryInConflict(has_remote_change, | 41 ? ResolveForAddDirectoryInConflict() |
| 45 remote_file_change) | 42 : ResolveForAddDirectory(remote_file_change, |
| 46 : ResolveForAddDirectory(has_remote_change, | |
| 47 remote_file_change, | |
| 48 remote_file_type_in_metadata); | 43 remote_file_type_in_metadata); |
| 49 case SYNC_FILE_TYPE_UNKNOWN: | 44 case SYNC_FILE_TYPE_UNKNOWN: |
| 50 NOTREACHED(); | 45 NOTREACHED(); |
| 51 return LOCAL_SYNC_OPERATION_FAIL; | 46 return LOCAL_SYNC_OPERATION_FAIL; |
| 52 } | 47 } |
| 53 case FileChange::FILE_CHANGE_DELETE: | 48 case FileChange::FILE_CHANGE_DELETE: |
| 54 switch (local_file_change.file_type()) { | 49 switch (local_file_change.file_type()) { |
| 55 case SYNC_FILE_TYPE_FILE: | 50 case SYNC_FILE_TYPE_FILE: |
| 56 return is_conflicting | 51 return is_conflicting |
| 57 ? ResolveForDeleteFileInConflict(has_remote_change, | 52 ? ResolveForDeleteFileInConflict(remote_file_change) |
| 58 remote_file_change) | 53 : ResolveForDeleteFile(remote_file_change, |
| 59 : ResolveForDeleteFile(has_remote_change, | |
| 60 remote_file_change, | |
| 61 remote_file_type_in_metadata); | 54 remote_file_type_in_metadata); |
| 62 case SYNC_FILE_TYPE_DIRECTORY: | 55 case SYNC_FILE_TYPE_DIRECTORY: |
| 63 return is_conflicting | 56 return is_conflicting |
| 64 ? ResolveForDeleteDirectoryInConflict(has_remote_change, | 57 ? ResolveForDeleteDirectoryInConflict(remote_file_change) |
| 65 remote_file_change) | 58 : ResolveForDeleteDirectory(remote_file_change, |
| 66 : ResolveForDeleteDirectory(has_remote_change, | |
| 67 remote_file_change, | |
| 68 remote_file_type_in_metadata); | 59 remote_file_type_in_metadata); |
| 69 case SYNC_FILE_TYPE_UNKNOWN: | 60 case SYNC_FILE_TYPE_UNKNOWN: |
| 70 NOTREACHED(); | 61 NOTREACHED(); |
| 71 return LOCAL_SYNC_OPERATION_FAIL; | 62 return LOCAL_SYNC_OPERATION_FAIL; |
| 72 } | 63 } |
| 73 } | 64 } |
| 74 NOTREACHED(); | 65 NOTREACHED(); |
| 75 return LOCAL_SYNC_OPERATION_FAIL; | 66 return LOCAL_SYNC_OPERATION_FAIL; |
| 76 } | 67 } |
| 77 | 68 |
| 78 LocalSyncOperationType LocalSyncOperationResolver::ResolveForAddOrUpdateFile( | 69 LocalSyncOperationType LocalSyncOperationResolver::ResolveForAddOrUpdateFile( |
| 79 bool has_remote_change, | 70 const FileChange* remote_file_change, |
| 80 const FileChange& remote_file_change, | |
| 81 SyncFileType remote_file_type_in_metadata) { | 71 SyncFileType remote_file_type_in_metadata) { |
| 82 if (!has_remote_change) { | 72 if (!remote_file_change) { |
| 83 switch (remote_file_type_in_metadata) { | 73 switch (remote_file_type_in_metadata) { |
| 84 case SYNC_FILE_TYPE_UNKNOWN: | 74 case SYNC_FILE_TYPE_UNKNOWN: |
| 85 // Remote file or directory may not exist. | 75 // Remote file or directory may not exist. |
| 86 return LOCAL_SYNC_OPERATION_ADD_FILE; | 76 return LOCAL_SYNC_OPERATION_ADD_FILE; |
| 87 case SYNC_FILE_TYPE_FILE: | 77 case SYNC_FILE_TYPE_FILE: |
| 88 return LOCAL_SYNC_OPERATION_UPDATE_FILE; | 78 return LOCAL_SYNC_OPERATION_UPDATE_FILE; |
| 89 case SYNC_FILE_TYPE_DIRECTORY: | 79 case SYNC_FILE_TYPE_DIRECTORY: |
| 90 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 80 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 91 } | 81 } |
| 92 } | 82 } |
| 93 | 83 |
| 94 switch (remote_file_change.change()) { | 84 switch (remote_file_change->change()) { |
| 95 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | 85 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| 96 if (remote_file_change.IsFile()) | 86 if (remote_file_change->IsFile()) |
| 97 return LOCAL_SYNC_OPERATION_CONFLICT; | 87 return LOCAL_SYNC_OPERATION_CONFLICT; |
| 98 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 88 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 99 case FileChange::FILE_CHANGE_DELETE: | 89 case FileChange::FILE_CHANGE_DELETE: |
| 100 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; | 90 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| 101 } | 91 } |
| 102 | 92 |
| 103 NOTREACHED(); | 93 NOTREACHED(); |
| 104 return LOCAL_SYNC_OPERATION_FAIL; | 94 return LOCAL_SYNC_OPERATION_FAIL; |
| 105 } | 95 } |
| 106 | 96 |
| 107 LocalSyncOperationType | 97 LocalSyncOperationType |
| 108 LocalSyncOperationResolver::ResolveForAddOrUpdateFileInConflict( | 98 LocalSyncOperationResolver::ResolveForAddOrUpdateFileInConflict( |
| 109 bool has_remote_change, | 99 const FileChange* remote_file_change) { |
| 110 const FileChange& remote_file_change) { | 100 if (!remote_file_change) |
| 111 if (!has_remote_change) | |
| 112 return LOCAL_SYNC_OPERATION_CONFLICT; | 101 return LOCAL_SYNC_OPERATION_CONFLICT; |
| 113 switch (remote_file_change.change()) { | 102 switch (remote_file_change->change()) { |
| 114 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | 103 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| 115 if (remote_file_change.IsFile()) | 104 if (remote_file_change->IsFile()) |
| 116 return LOCAL_SYNC_OPERATION_CONFLICT; | 105 return LOCAL_SYNC_OPERATION_CONFLICT; |
| 117 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 106 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 118 case FileChange::FILE_CHANGE_DELETE: | 107 case FileChange::FILE_CHANGE_DELETE: |
| 119 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; | 108 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| 120 } | 109 } |
| 121 NOTREACHED(); | 110 NOTREACHED(); |
| 122 return LOCAL_SYNC_OPERATION_FAIL; | 111 return LOCAL_SYNC_OPERATION_FAIL; |
| 123 } | 112 } |
| 124 | 113 |
| 125 LocalSyncOperationType LocalSyncOperationResolver::ResolveForAddDirectory( | 114 LocalSyncOperationType LocalSyncOperationResolver::ResolveForAddDirectory( |
| 126 bool has_remote_change, | 115 const FileChange* remote_file_change, |
| 127 const FileChange& remote_file_change, | |
| 128 SyncFileType remote_file_type_in_metadata) { | 116 SyncFileType remote_file_type_in_metadata) { |
| 129 if (!has_remote_change) { | 117 if (!remote_file_change) { |
| 130 switch (remote_file_type_in_metadata) { | 118 switch (remote_file_type_in_metadata) { |
| 131 case SYNC_FILE_TYPE_UNKNOWN: | 119 case SYNC_FILE_TYPE_UNKNOWN: |
| 132 // Remote file or directory may not exist. | 120 // Remote file or directory may not exist. |
| 133 return LOCAL_SYNC_OPERATION_ADD_DIRECTORY; | 121 return LOCAL_SYNC_OPERATION_ADD_DIRECTORY; |
| 134 case SYNC_FILE_TYPE_FILE: | 122 case SYNC_FILE_TYPE_FILE: |
| 135 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; | 123 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| 136 case SYNC_FILE_TYPE_DIRECTORY: | 124 case SYNC_FILE_TYPE_DIRECTORY: |
| 137 return LOCAL_SYNC_OPERATION_NONE; | 125 return LOCAL_SYNC_OPERATION_NONE; |
| 138 } | 126 } |
| 139 } | 127 } |
| 140 | 128 |
| 141 switch (remote_file_change.change()) { | 129 switch (remote_file_change->change()) { |
| 142 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | 130 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| 143 if (remote_file_change.IsFile()) | 131 if (remote_file_change->IsFile()) |
| 144 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; | 132 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| 145 return LOCAL_SYNC_OPERATION_NONE; | 133 return LOCAL_SYNC_OPERATION_NONE; |
| 146 case FileChange::FILE_CHANGE_DELETE: | 134 case FileChange::FILE_CHANGE_DELETE: |
| 147 if (remote_file_change.IsFile()) | 135 if (remote_file_change->IsFile()) |
| 148 return LOCAL_SYNC_OPERATION_ADD_DIRECTORY; | 136 return LOCAL_SYNC_OPERATION_ADD_DIRECTORY; |
| 149 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; | 137 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| 150 } | 138 } |
| 151 | 139 |
| 152 NOTREACHED(); | 140 NOTREACHED(); |
| 153 return LOCAL_SYNC_OPERATION_FAIL; | 141 return LOCAL_SYNC_OPERATION_FAIL; |
| 154 } | 142 } |
| 155 | 143 |
| 156 LocalSyncOperationType | 144 LocalSyncOperationType |
| 157 LocalSyncOperationResolver::ResolveForAddDirectoryInConflict( | 145 LocalSyncOperationResolver::ResolveForAddDirectoryInConflict() { |
| 158 bool has_remote_change, | |
| 159 const FileChange& remote_file_change) { | |
| 160 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; | 146 return LOCAL_SYNC_OPERATION_RESOLVE_TO_LOCAL; |
| 161 } | 147 } |
| 162 | 148 |
| 163 LocalSyncOperationType LocalSyncOperationResolver::ResolveForDeleteFile( | 149 LocalSyncOperationType LocalSyncOperationResolver::ResolveForDeleteFile( |
| 164 bool has_remote_change, | 150 const FileChange* remote_file_change, |
| 165 const FileChange& remote_file_change, | |
| 166 SyncFileType remote_file_type_in_metadata) { | 151 SyncFileType remote_file_type_in_metadata) { |
| 167 if (!has_remote_change) { | 152 if (!remote_file_change) { |
| 168 switch (remote_file_type_in_metadata) { | 153 switch (remote_file_type_in_metadata) { |
| 169 case SYNC_FILE_TYPE_UNKNOWN: | 154 case SYNC_FILE_TYPE_UNKNOWN: |
| 170 // Remote file or directory may not exist. | 155 // Remote file or directory may not exist. |
| 171 return LOCAL_SYNC_OPERATION_NONE; | 156 return LOCAL_SYNC_OPERATION_NONE; |
| 172 case SYNC_FILE_TYPE_FILE: | 157 case SYNC_FILE_TYPE_FILE: |
| 173 return LOCAL_SYNC_OPERATION_DELETE_FILE; | 158 return LOCAL_SYNC_OPERATION_DELETE_FILE; |
| 174 case SYNC_FILE_TYPE_DIRECTORY: | 159 case SYNC_FILE_TYPE_DIRECTORY: |
| 175 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 160 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 176 } | 161 } |
| 177 } | 162 } |
| 178 | 163 |
| 179 switch (remote_file_change.change()) { | 164 switch (remote_file_change->change()) { |
| 180 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | 165 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| 181 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 166 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 182 case FileChange::FILE_CHANGE_DELETE: | 167 case FileChange::FILE_CHANGE_DELETE: |
| 183 return LOCAL_SYNC_OPERATION_DELETE_METADATA; | 168 return LOCAL_SYNC_OPERATION_DELETE_METADATA; |
| 184 } | 169 } |
| 185 | 170 |
| 186 NOTREACHED(); | 171 NOTREACHED(); |
| 187 return LOCAL_SYNC_OPERATION_FAIL; | 172 return LOCAL_SYNC_OPERATION_FAIL; |
| 188 } | 173 } |
| 189 | 174 |
| 190 LocalSyncOperationType | 175 LocalSyncOperationType |
| 191 LocalSyncOperationResolver::ResolveForDeleteFileInConflict( | 176 LocalSyncOperationResolver::ResolveForDeleteFileInConflict( |
| 192 bool has_remote_change, | 177 const FileChange* remote_file_change) { |
| 193 const FileChange& remote_file_change) { | 178 if (!remote_file_change) |
| 194 if (!has_remote_change) | |
| 195 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 179 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 196 switch (remote_file_change.change()) { | 180 switch (remote_file_change->change()) { |
| 197 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | 181 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| 198 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 182 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 199 case FileChange::FILE_CHANGE_DELETE: | 183 case FileChange::FILE_CHANGE_DELETE: |
| 200 return LOCAL_SYNC_OPERATION_DELETE_METADATA; | 184 return LOCAL_SYNC_OPERATION_DELETE_METADATA; |
| 201 } | 185 } |
| 202 NOTREACHED(); | 186 NOTREACHED(); |
| 203 return LOCAL_SYNC_OPERATION_FAIL; | 187 return LOCAL_SYNC_OPERATION_FAIL; |
| 204 } | 188 } |
| 205 | 189 |
| 206 LocalSyncOperationType LocalSyncOperationResolver::ResolveForDeleteDirectory( | 190 LocalSyncOperationType LocalSyncOperationResolver::ResolveForDeleteDirectory( |
| 207 bool has_remote_change, | 191 const FileChange* remote_file_change, |
| 208 const FileChange& remote_file_change, | |
| 209 SyncFileType remote_file_type_in_metadata) { | 192 SyncFileType remote_file_type_in_metadata) { |
| 210 if (!has_remote_change) { | 193 if (!remote_file_change) { |
| 211 switch (remote_file_type_in_metadata) { | 194 switch (remote_file_type_in_metadata) { |
| 212 case SYNC_FILE_TYPE_UNKNOWN: | 195 case SYNC_FILE_TYPE_UNKNOWN: |
| 213 // Remote file or dircetory may not exist. | 196 // Remote file or dircetory may not exist. |
| 214 return LOCAL_SYNC_OPERATION_NONE; | 197 return LOCAL_SYNC_OPERATION_NONE; |
| 215 case SYNC_FILE_TYPE_FILE: | 198 case SYNC_FILE_TYPE_FILE: |
| 216 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 199 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 217 case SYNC_FILE_TYPE_DIRECTORY: | 200 case SYNC_FILE_TYPE_DIRECTORY: |
| 218 return LOCAL_SYNC_OPERATION_DELETE_DIRECTORY; | 201 return LOCAL_SYNC_OPERATION_DELETE_DIRECTORY; |
| 219 } | 202 } |
| 220 } | 203 } |
| 221 | 204 |
| 222 switch (remote_file_change.change()) { | 205 switch (remote_file_change->change()) { |
| 223 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | 206 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| 224 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 207 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 225 case FileChange::FILE_CHANGE_DELETE: | 208 case FileChange::FILE_CHANGE_DELETE: |
| 226 return LOCAL_SYNC_OPERATION_DELETE_METADATA; | 209 return LOCAL_SYNC_OPERATION_DELETE_METADATA; |
| 227 } | 210 } |
| 228 | 211 |
| 229 NOTREACHED(); | 212 NOTREACHED(); |
| 230 return LOCAL_SYNC_OPERATION_FAIL; | 213 return LOCAL_SYNC_OPERATION_FAIL; |
| 231 } | 214 } |
| 232 | 215 |
| 233 LocalSyncOperationType | 216 LocalSyncOperationType |
| 234 LocalSyncOperationResolver::ResolveForDeleteDirectoryInConflict( | 217 LocalSyncOperationResolver::ResolveForDeleteDirectoryInConflict( |
| 235 bool has_remote_change, | 218 const FileChange* remote_file_change) { |
| 236 const FileChange& remote_file_change) { | 219 if (!remote_file_change) |
| 237 if (!has_remote_change) | |
| 238 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 220 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 239 switch (remote_file_change.change()) { | 221 switch (remote_file_change->change()) { |
| 240 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | 222 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: |
| 241 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; | 223 return LOCAL_SYNC_OPERATION_RESOLVE_TO_REMOTE; |
| 242 case FileChange::FILE_CHANGE_DELETE: | 224 case FileChange::FILE_CHANGE_DELETE: |
| 243 return LOCAL_SYNC_OPERATION_DELETE_METADATA; | 225 return LOCAL_SYNC_OPERATION_DELETE_METADATA; |
| 244 } | 226 } |
| 245 NOTREACHED(); | 227 NOTREACHED(); |
| 246 return LOCAL_SYNC_OPERATION_FAIL; | 228 return LOCAL_SYNC_OPERATION_FAIL; |
| 247 } | 229 } |
| 248 | 230 |
| 249 } // namespace sync_file_system | 231 } // namespace sync_file_system |
| OLD | NEW |