| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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/local_file_change_tracker.h" | 5 #include "chrome/browser/sync_file_system/local/local_file_change_tracker.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 | 8 |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 DCHECK(changes); | 143 DCHECK(changes); |
| 144 changes->clear(); | 144 changes->clear(); |
| 145 FileChangeMap::iterator found = changes_.find(url); | 145 FileChangeMap::iterator found = changes_.find(url); |
| 146 if (found == changes_.end()) | 146 if (found == changes_.end()) |
| 147 return; | 147 return; |
| 148 *changes = found->second.change_list; | 148 *changes = found->second.change_list; |
| 149 } | 149 } |
| 150 | 150 |
| 151 void LocalFileChangeTracker::ClearChangesForURL(const FileSystemURL& url) { | 151 void LocalFileChangeTracker::ClearChangesForURL(const FileSystemURL& url) { |
| 152 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); | 152 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
| 153 // TODO(nhiroki): propagate the error code (see http://crbug.com/152127). | |
| 154 ClearDirtyOnDatabase(url); | 153 ClearDirtyOnDatabase(url); |
| 155 | 154 mirror_changes_.erase(url); |
| 156 FileChangeMap::iterator found = changes_.find(url); | 155 FileChangeMap::iterator found = changes_.find(url); |
| 157 if (found == changes_.end()) | 156 if (found == changes_.end()) |
| 158 return; | 157 return; |
| 159 change_seqs_.erase(found->second.change_seq); | 158 change_seqs_.erase(found->second.change_seq); |
| 160 changes_.erase(found); | 159 changes_.erase(found); |
| 161 UpdateNumChanges(); | 160 UpdateNumChanges(); |
| 162 } | 161 } |
| 163 | 162 |
| 163 void LocalFileChangeTracker::CreateFreshMirrorForURL( |
| 164 const fileapi::FileSystemURL& url) { |
| 165 DCHECK(!ContainsKey(mirror_changes_, url)); |
| 166 mirror_changes_[url] = ChangeInfo(); |
| 167 } |
| 168 |
| 169 void LocalFileChangeTracker::RemoveMirrorAndCommitChangesForURL( |
| 170 const fileapi::FileSystemURL& url) { |
| 171 FileChangeMap::iterator found = mirror_changes_.find(url); |
| 172 if (found == mirror_changes_.end()) |
| 173 return; |
| 174 mirror_changes_.erase(found); |
| 175 |
| 176 if (ContainsKey(changes_, url)) |
| 177 MarkDirtyOnDatabase(url); |
| 178 else |
| 179 ClearDirtyOnDatabase(url); |
| 180 UpdateNumChanges(); |
| 181 } |
| 182 |
| 183 void LocalFileChangeTracker::ResetToMirrorAndCommitChangesForURL( |
| 184 const fileapi::FileSystemURL& url) { |
| 185 FileChangeMap::iterator found = mirror_changes_.find(url); |
| 186 if (found == mirror_changes_.end() || found->second.change_list.empty()) { |
| 187 ClearChangesForURL(url); |
| 188 return; |
| 189 } |
| 190 const ChangeInfo& info = found->second; |
| 191 change_seqs_[info.change_seq] = url; |
| 192 changes_[url] = info; |
| 193 RemoveMirrorAndCommitChangesForURL(url); |
| 194 } |
| 195 |
| 164 SyncStatusCode LocalFileChangeTracker::Initialize( | 196 SyncStatusCode LocalFileChangeTracker::Initialize( |
| 165 FileSystemContext* file_system_context) { | 197 FileSystemContext* file_system_context) { |
| 166 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); | 198 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
| 167 DCHECK(!initialized_); | 199 DCHECK(!initialized_); |
| 168 DCHECK(file_system_context); | 200 DCHECK(file_system_context); |
| 169 | 201 |
| 170 SyncStatusCode status = CollectLastDirtyChanges(file_system_context); | 202 SyncStatusCode status = CollectLastDirtyChanges(file_system_context); |
| 171 if (status == SYNC_STATUS_OK) | 203 if (status == SYNC_STATUS_OK) |
| 172 initialized_ = true; | 204 initialized_ = true; |
| 173 return status; | 205 return status; |
| 174 } | 206 } |
| 175 | 207 |
| 176 void LocalFileChangeTracker::UpdateNumChanges() { | 208 void LocalFileChangeTracker::UpdateNumChanges() { |
| 177 base::AutoLock lock(num_changes_lock_); | 209 base::AutoLock lock(num_changes_lock_); |
| 178 num_changes_ = static_cast<int64>(change_seqs_.size()); | 210 num_changes_ = static_cast<int64>(change_seqs_.size()); |
| 179 } | 211 } |
| 180 | 212 |
| 181 void LocalFileChangeTracker::GetAllChangedURLs(FileSystemURLSet* urls) { | 213 void LocalFileChangeTracker::GetAllChangedURLs(FileSystemURLSet* urls) { |
| 182 std::deque<FileSystemURL> url_deque; | 214 std::deque<FileSystemURL> url_deque; |
| 183 GetNextChangedURLs(&url_deque, 0); | 215 GetNextChangedURLs(&url_deque, 0); |
| 184 urls->clear(); | 216 urls->clear(); |
| 185 urls->insert(url_deque.begin(), url_deque.end()); | 217 urls->insert(url_deque.begin(), url_deque.end()); |
| 186 } | 218 } |
| 187 | 219 |
| 188 void LocalFileChangeTracker::DropAllChanges() { | 220 void LocalFileChangeTracker::DropAllChanges() { |
| 189 changes_.clear(); | 221 changes_.clear(); |
| 190 change_seqs_.clear(); | 222 change_seqs_.clear(); |
| 223 mirror_changes_.clear(); |
| 191 } | 224 } |
| 192 | 225 |
| 193 SyncStatusCode LocalFileChangeTracker::MarkDirtyOnDatabase( | 226 SyncStatusCode LocalFileChangeTracker::MarkDirtyOnDatabase( |
| 194 const FileSystemURL& url) { | 227 const FileSystemURL& url) { |
| 195 std::string serialized_url; | 228 std::string serialized_url; |
| 196 if (!SerializeSyncableFileSystemURL(url, &serialized_url)) | 229 if (!SerializeSyncableFileSystemURL(url, &serialized_url)) |
| 197 return SYNC_FILE_ERROR_INVALID_URL; | 230 return SYNC_FILE_ERROR_INVALID_URL; |
| 198 | 231 |
| 199 return tracker_db_->MarkDirty(serialized_url); | 232 return tracker_db_->MarkDirty(serialized_url); |
| 200 } | 233 } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 LOG(WARNING) << "Failed to access local file."; | 304 LOG(WARNING) << "Failed to access local file."; |
| 272 break; | 305 break; |
| 273 } | 306 } |
| 274 } | 307 } |
| 275 return SYNC_STATUS_OK; | 308 return SYNC_STATUS_OK; |
| 276 } | 309 } |
| 277 | 310 |
| 278 void LocalFileChangeTracker::RecordChange( | 311 void LocalFileChangeTracker::RecordChange( |
| 279 const FileSystemURL& url, const FileChange& change) { | 312 const FileSystemURL& url, const FileChange& change) { |
| 280 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); | 313 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
| 281 ChangeInfo& info = changes_[url]; | 314 int change_seq = current_change_seq_++; |
| 282 if (info.change_seq >= 0) | 315 RecordChangeToChangeMaps(url, change, change_seq, &changes_, &change_seqs_); |
| 283 change_seqs_.erase(info.change_seq); | 316 if (ContainsKey(mirror_changes_, url)) |
| 284 info.change_list.Update(change); | 317 RecordChangeToChangeMaps(url, change, change_seq, &mirror_changes_, NULL); |
| 285 if (info.change_list.empty()) { | |
| 286 changes_.erase(url); | |
| 287 UpdateNumChanges(); | |
| 288 return; | |
| 289 } | |
| 290 info.change_seq = current_change_seq_++; | |
| 291 change_seqs_[info.change_seq] = url; | |
| 292 UpdateNumChanges(); | 318 UpdateNumChanges(); |
| 293 } | 319 } |
| 294 | 320 |
| 321 void LocalFileChangeTracker::RecordChangeToChangeMaps( |
| 322 const FileSystemURL& url, |
| 323 const FileChange& change, |
| 324 int new_change_seq, |
| 325 FileChangeMap* changes, |
| 326 ChangeSeqMap* change_seqs) { |
| 327 ChangeInfo& info = (*changes)[url]; |
| 328 if (info.change_seq >= 0 && change_seqs) |
| 329 change_seqs->erase(info.change_seq); |
| 330 info.change_list.Update(change); |
| 331 if (info.change_list.empty()) { |
| 332 changes->erase(url); |
| 333 return; |
| 334 } |
| 335 info.change_seq = new_change_seq; |
| 336 if (change_seqs) |
| 337 (*change_seqs)[info.change_seq] = url; |
| 338 } |
| 339 |
| 295 // TrackerDB ------------------------------------------------------------------- | 340 // TrackerDB ------------------------------------------------------------------- |
| 296 | 341 |
| 297 LocalFileChangeTracker::TrackerDB::TrackerDB(const base::FilePath& base_path) | 342 LocalFileChangeTracker::TrackerDB::TrackerDB(const base::FilePath& base_path) |
| 298 : base_path_(base_path), | 343 : base_path_(base_path), |
| 299 db_status_(SYNC_STATUS_OK) {} | 344 db_status_(SYNC_STATUS_OK) {} |
| 300 | 345 |
| 301 SyncStatusCode LocalFileChangeTracker::TrackerDB::Init( | 346 SyncStatusCode LocalFileChangeTracker::TrackerDB::Init( |
| 302 RecoveryOption recovery_option) { | 347 RecoveryOption recovery_option) { |
| 303 if (db_.get() && db_status_ == SYNC_STATUS_OK) | 348 if (db_.get() && db_status_ == SYNC_STATUS_OK) |
| 304 return SYNC_STATUS_OK; | 349 return SYNC_STATUS_OK; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 db_.reset(); | 465 db_.reset(); |
| 421 return db_status_; | 466 return db_status_; |
| 422 } | 467 } |
| 423 dirty_files->push(url); | 468 dirty_files->push(url); |
| 424 iter->Next(); | 469 iter->Next(); |
| 425 } | 470 } |
| 426 return SYNC_STATUS_OK; | 471 return SYNC_STATUS_OK; |
| 427 } | 472 } |
| 428 | 473 |
| 429 } // namespace sync_file_system | 474 } // namespace sync_file_system |
| OLD | NEW |