Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/sync_file_system/remote_sync_operation_resolver.h" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 | |
| 9 namespace sync_file_system { | |
| 10 | |
| 11 namespace { | |
| 12 | |
| 13 bool IsValidCombination(const FileChangeList& local_changes, | |
| 14 SyncFileType local_file_type, | |
| 15 bool is_conflicting) { | |
| 16 if (local_changes.empty()) { | |
| 17 return !(is_conflicting && local_file_type != SYNC_FILE_TYPE_FILE); | |
|
kinuko
2013/04/25 14:07:54
Can you add a comment:
// We never leave director
nhiroki
2013/04/26 06:04:00
Done.
| |
| 18 } | |
| 19 switch (local_file_type) { | |
| 20 case SYNC_FILE_TYPE_UNKNOWN: | |
| 21 return local_changes.back().IsDelete(); | |
| 22 case SYNC_FILE_TYPE_FILE: | |
| 23 case SYNC_FILE_TYPE_DIRECTORY: | |
| 24 return !local_changes.back().IsDelete() && | |
| 25 local_changes.back().file_type() == local_file_type; | |
| 26 } | |
| 27 return false; | |
| 28 } | |
| 29 | |
| 30 } // namespace | |
| 31 | |
| 32 RemoteSyncOperationType | |
| 33 RemoteSyncOperationResolver::Resolve(const FileChange& remote_file_change, | |
| 34 const FileChangeList& local_changes, | |
| 35 SyncFileType local_file_type, | |
| 36 bool is_conflicting) { | |
| 37 switch (remote_file_change.change()) { | |
| 38 case FileChange::FILE_CHANGE_ADD_OR_UPDATE: | |
| 39 switch (remote_file_change.file_type()) { | |
| 40 case SYNC_FILE_TYPE_FILE: | |
| 41 return is_conflicting | |
| 42 ? ResolveForAddOrUpdateFileInConflict(local_changes, | |
| 43 local_file_type) | |
| 44 : ResolveForAddOrUpdateFile(local_changes, local_file_type); | |
| 45 case SYNC_FILE_TYPE_DIRECTORY: | |
| 46 return is_conflicting | |
| 47 ? ResolveForAddDirectoryInConflict(local_changes, local_file_type) | |
| 48 : ResolveForAddDirectory(local_changes, local_file_type); | |
| 49 case SYNC_FILE_TYPE_UNKNOWN: | |
| 50 NOTREACHED(); | |
| 51 return REMOTE_SYNC_OPERATION_FAIL; | |
| 52 } | |
| 53 break; | |
| 54 case FileChange::FILE_CHANGE_DELETE: | |
| 55 switch (remote_file_change.file_type()) { | |
| 56 case SYNC_FILE_TYPE_FILE: | |
| 57 return is_conflicting | |
| 58 ? ResolveForDeleteFileInConflict(local_changes, local_file_type) | |
| 59 : ResolveForDeleteFile(local_changes, local_file_type); | |
| 60 case SYNC_FILE_TYPE_DIRECTORY: | |
| 61 return is_conflicting | |
| 62 ? ResolveForDeleteDirectoryInConflict(local_changes, | |
| 63 local_file_type) | |
| 64 : ResolveForDeleteDirectory(local_changes, local_file_type); | |
| 65 case SYNC_FILE_TYPE_UNKNOWN: | |
| 66 NOTREACHED(); | |
| 67 return REMOTE_SYNC_OPERATION_FAIL; | |
| 68 } | |
| 69 break; | |
| 70 } | |
| 71 NOTREACHED(); | |
| 72 return REMOTE_SYNC_OPERATION_FAIL; | |
| 73 } | |
| 74 | |
| 75 RemoteSyncOperationType | |
| 76 RemoteSyncOperationResolver::ResolveForAddOrUpdateFile( | |
| 77 const FileChangeList& local_changes, | |
| 78 SyncFileType local_file_type) { | |
| 79 // Invalid combination should never happen. | |
| 80 if (!IsValidCombination(local_changes, local_file_type, false)) | |
| 81 return REMOTE_SYNC_OPERATION_FAIL; | |
| 82 | |
| 83 switch (local_file_type) { | |
| 84 case SYNC_FILE_TYPE_UNKNOWN: | |
| 85 return REMOTE_SYNC_OPERATION_ADD_FILE; | |
| 86 case SYNC_FILE_TYPE_FILE: | |
| 87 if (local_changes.empty()) | |
| 88 return REMOTE_SYNC_OPERATION_UPDATE_FILE; | |
| 89 return REMOTE_SYNC_OPERATION_CONFLICT; | |
| 90 case SYNC_FILE_TYPE_DIRECTORY: | |
| 91 // Currently we always prioritize directories over files. | |
| 92 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; | |
| 93 } | |
| 94 return REMOTE_SYNC_OPERATION_FAIL; | |
| 95 } | |
| 96 | |
| 97 RemoteSyncOperationType | |
| 98 RemoteSyncOperationResolver::ResolveForAddOrUpdateFileInConflict( | |
| 99 const FileChangeList& local_changes, | |
| 100 SyncFileType local_file_type) { | |
| 101 // Invalid combination should never happen. | |
| 102 if (!IsValidCombination(local_changes, local_file_type, true)) | |
| 103 return REMOTE_SYNC_OPERATION_FAIL; | |
| 104 | |
| 105 switch (local_file_type) { | |
| 106 case SYNC_FILE_TYPE_UNKNOWN: | |
| 107 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; | |
| 108 case SYNC_FILE_TYPE_FILE: | |
| 109 return REMOTE_SYNC_OPERATION_CONFLICT; | |
| 110 case SYNC_FILE_TYPE_DIRECTORY: | |
| 111 // We never leave directory entry in a conflicting state. | |
| 112 return REMOTE_SYNC_OPERATION_FAIL; | |
|
kinuko
2013/04/25 14:07:54
It could be valid when we have local changes-- wha
nhiroki
2013/04/26 06:04:00
Oh... yes, it's correct. Sorry for wrong fixing. D
| |
| 113 } | |
| 114 return REMOTE_SYNC_OPERATION_FAIL; | |
| 115 } | |
| 116 | |
| 117 RemoteSyncOperationType | |
| 118 RemoteSyncOperationResolver::ResolveForAddDirectory( | |
| 119 const FileChangeList& local_changes, | |
| 120 SyncFileType local_file_type) { | |
| 121 // Invalid combination should never happen. | |
| 122 if (!IsValidCombination(local_changes, local_file_type, false)) | |
| 123 return REMOTE_SYNC_OPERATION_FAIL; | |
| 124 | |
| 125 switch (local_file_type) { | |
| 126 case SYNC_FILE_TYPE_UNKNOWN: | |
| 127 if (local_changes.empty()) | |
| 128 return REMOTE_SYNC_OPERATION_ADD_DIRECTORY; | |
| 129 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; | |
| 130 case SYNC_FILE_TYPE_FILE: | |
| 131 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; | |
| 132 case SYNC_FILE_TYPE_DIRECTORY: | |
| 133 return REMOTE_SYNC_OPERATION_NONE; | |
| 134 } | |
| 135 return REMOTE_SYNC_OPERATION_FAIL; | |
| 136 } | |
| 137 | |
| 138 RemoteSyncOperationType | |
| 139 RemoteSyncOperationResolver::ResolveForAddDirectoryInConflict( | |
| 140 const FileChangeList& local_changes, | |
| 141 SyncFileType local_file_type) { | |
| 142 // Invalid combination should never happen. | |
| 143 if (!IsValidCombination(local_changes, local_file_type, true)) | |
| 144 return REMOTE_SYNC_OPERATION_FAIL; | |
| 145 | |
| 146 switch (local_file_type) { | |
| 147 case SYNC_FILE_TYPE_UNKNOWN: | |
| 148 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; | |
| 149 case SYNC_FILE_TYPE_FILE: | |
| 150 return REMOTE_SYNC_OPERATION_RESOLVE_TO_REMOTE; | |
| 151 case SYNC_FILE_TYPE_DIRECTORY: | |
| 152 // We never leave directory entry in a conflicting state. | |
| 153 return REMOTE_SYNC_OPERATION_FAIL; | |
|
kinuko
2013/04/25 14:07:54
ditto. We just need to clear the conflicting flag
nhiroki
2013/04/26 06:04:00
It'd be ok to return RESOLVE_TO_LOCAL to clear the
| |
| 154 } | |
| 155 return REMOTE_SYNC_OPERATION_FAIL; | |
| 156 } | |
| 157 | |
| 158 RemoteSyncOperationType | |
| 159 RemoteSyncOperationResolver::ResolveForDeleteFile( | |
| 160 const FileChangeList& local_changes, | |
| 161 SyncFileType local_file_type) { | |
| 162 // Invalid combination should never happen. | |
| 163 if (!IsValidCombination(local_changes, local_file_type, false)) | |
| 164 return REMOTE_SYNC_OPERATION_FAIL; | |
| 165 | |
| 166 switch (local_file_type) { | |
| 167 case SYNC_FILE_TYPE_UNKNOWN: | |
| 168 if (local_changes.empty()) | |
| 169 return REMOTE_SYNC_OPERATION_DELETE_METADATA; | |
| 170 return REMOTE_SYNC_OPERATION_NONE; | |
|
kinuko
2013/04/25 14:07:54
DELETE_METADATA in either case?
nhiroki
2013/04/26 06:04:00
Done.
| |
| 171 case SYNC_FILE_TYPE_FILE: | |
| 172 if (local_changes.empty()) | |
| 173 return REMOTE_SYNC_OPERATION_DELETE_FILE; | |
| 174 return REMOTE_SYNC_OPERATION_NONE; | |
| 175 case SYNC_FILE_TYPE_DIRECTORY: | |
| 176 return REMOTE_SYNC_OPERATION_NONE; | |
| 177 } | |
| 178 return REMOTE_SYNC_OPERATION_FAIL; | |
| 179 } | |
| 180 | |
| 181 RemoteSyncOperationType | |
| 182 RemoteSyncOperationResolver::ResolveForDeleteFileInConflict( | |
| 183 const FileChangeList& local_changes, | |
| 184 SyncFileType local_file_type) { | |
| 185 // Invalid combination should never happen. | |
| 186 if (!IsValidCombination(local_changes, local_file_type, true)) | |
| 187 return REMOTE_SYNC_OPERATION_FAIL; | |
| 188 | |
| 189 switch (local_file_type) { | |
| 190 case SYNC_FILE_TYPE_UNKNOWN: | |
| 191 return REMOTE_SYNC_OPERATION_DELETE_METADATA; | |
| 192 case SYNC_FILE_TYPE_FILE: | |
| 193 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; | |
| 194 case SYNC_FILE_TYPE_DIRECTORY: | |
| 195 // We never leave directory entry in a conflicting state. | |
| 196 return REMOTE_SYNC_OPERATION_FAIL; | |
|
kinuko
2013/04/25 14:07:54
ditto. RESOLVE_TO_LOCAL?
nhiroki
2013/04/26 06:04:00
Done.
| |
| 197 } | |
| 198 return REMOTE_SYNC_OPERATION_FAIL; | |
| 199 } | |
| 200 | |
| 201 RemoteSyncOperationType | |
| 202 RemoteSyncOperationResolver::ResolveForDeleteDirectory( | |
| 203 const FileChangeList& local_changes, | |
| 204 SyncFileType local_file_type) { | |
| 205 // Invalid combination should never happen. | |
| 206 if (!IsValidCombination(local_changes, local_file_type, false)) | |
| 207 return REMOTE_SYNC_OPERATION_FAIL; | |
| 208 | |
| 209 switch (local_file_type) { | |
| 210 case SYNC_FILE_TYPE_UNKNOWN: | |
| 211 return REMOTE_SYNC_OPERATION_NONE; | |
| 212 case SYNC_FILE_TYPE_FILE: | |
| 213 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; | |
| 214 case SYNC_FILE_TYPE_DIRECTORY: | |
| 215 if (local_changes.empty()) | |
| 216 return REMOTE_SYNC_OPERATION_DELETE_DIRECTORY; | |
| 217 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; | |
| 218 } | |
| 219 return REMOTE_SYNC_OPERATION_FAIL; | |
| 220 } | |
| 221 | |
| 222 RemoteSyncOperationType | |
| 223 RemoteSyncOperationResolver::ResolveForDeleteDirectoryInConflict( | |
| 224 const FileChangeList& local_changes, | |
| 225 SyncFileType local_file_type) { | |
| 226 // Invalid combination should never happen. | |
| 227 if (!IsValidCombination(local_changes, local_file_type, true)) | |
| 228 return REMOTE_SYNC_OPERATION_FAIL; | |
| 229 | |
| 230 switch (local_file_type) { | |
| 231 case SYNC_FILE_TYPE_UNKNOWN: | |
| 232 return REMOTE_SYNC_OPERATION_DELETE_METADATA; | |
| 233 case SYNC_FILE_TYPE_FILE: | |
| 234 return REMOTE_SYNC_OPERATION_RESOLVE_TO_LOCAL; | |
| 235 case SYNC_FILE_TYPE_DIRECTORY: | |
| 236 // We never leave directory entry in a conflicting state. | |
| 237 return REMOTE_SYNC_OPERATION_FAIL; | |
|
kinuko
2013/04/25 14:07:54
ditto. RESOLVE_TO_LOCAL?
nhiroki
2013/04/26 06:04:00
Done.
| |
| 238 } | |
| 239 return REMOTE_SYNC_OPERATION_FAIL; | |
| 240 } | |
| 241 | |
| 242 } // namespace sync_file_system | |
| OLD | NEW |