| 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/chromeos/drive/sync/entry_update_performer.h" | 5 #include "chrome/browser/chromeos/drive/sync/entry_update_performer.h" |
| 6 | 6 |
| 7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "chrome/browser/chromeos/drive/change_list_loader.h" | 9 #include "chrome/browser/chromeos/drive/change_list_loader.h" |
| 10 #include "chrome/browser/chromeos/drive/drive.pb.h" | 10 #include "chrome/browser/chromeos/drive/drive.pb.h" |
| 11 #include "chrome/browser/chromeos/drive/file_cache.h" | 11 #include "chrome/browser/chromeos/drive/file_cache.h" |
| 12 #include "chrome/browser/chromeos/drive/file_system/operation_observer.h" | 12 #include "chrome/browser/chromeos/drive/file_system/operation_observer.h" |
| 13 #include "chrome/browser/chromeos/drive/file_system_util.h" | 13 #include "chrome/browser/chromeos/drive/file_system_util.h" |
| 14 #include "chrome/browser/chromeos/drive/job_scheduler.h" | 14 #include "chrome/browser/chromeos/drive/job_scheduler.h" |
| 15 #include "chrome/browser/chromeos/drive/resource_metadata.h" | 15 #include "chrome/browser/chromeos/drive/resource_metadata.h" |
| 16 #include "chrome/browser/chromeos/drive/sync/entry_revert_performer.h" | 16 #include "chrome/browser/chromeos/drive/sync/entry_revert_performer.h" |
| 17 #include "chrome/browser/chromeos/drive/sync/remove_performer.h" | 17 #include "chrome/browser/chromeos/drive/sync/remove_performer.h" |
| 18 #include "content/public/browser/browser_thread.h" | 18 #include "content/public/browser/browser_thread.h" |
| 19 #include "google_apis/drive/drive_api_parser.h" |
| 19 #include "google_apis/drive/gdata_wapi_parser.h" | 20 #include "google_apis/drive/gdata_wapi_parser.h" |
| 20 | 21 |
| 21 using content::BrowserThread; | 22 using content::BrowserThread; |
| 22 | 23 |
| 23 namespace drive { | 24 namespace drive { |
| 24 namespace internal { | 25 namespace internal { |
| 25 | 26 |
| 26 struct EntryUpdatePerformer::LocalState { | 27 struct EntryUpdatePerformer::LocalState { |
| 27 LocalState() : should_content_update(false) { | 28 LocalState() : should_content_update(false) { |
| 28 } | 29 } |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 if (error != FILE_ERROR_OK) | 111 if (error != FILE_ERROR_OK) |
| 111 return error; | 112 return error; |
| 112 break; | 113 break; |
| 113 } | 114 } |
| 114 return FILE_ERROR_OK; | 115 return FILE_ERROR_OK; |
| 115 } | 116 } |
| 116 | 117 |
| 117 FileError FinishUpdate(ResourceMetadata* metadata, | 118 FileError FinishUpdate(ResourceMetadata* metadata, |
| 118 FileCache* cache, | 119 FileCache* cache, |
| 119 const std::string& local_id, | 120 const std::string& local_id, |
| 120 scoped_ptr<google_apis::ResourceEntry> resource_entry, | 121 scoped_ptr<google_apis::FileResource> file_resource, |
| 121 base::FilePath* changed_directory) { | 122 base::FilePath* changed_directory) { |
| 122 // When creating new entries, update check may add a new entry with the same | 123 // When creating new entries, update check may add a new entry with the same |
| 123 // resource ID before us. If such an entry exists, remove it. | 124 // resource ID before us. If such an entry exists, remove it. |
| 124 std::string existing_local_id; | 125 std::string existing_local_id; |
| 125 FileError error = metadata->GetIdByResourceId( | 126 FileError error = metadata->GetIdByResourceId( |
| 126 resource_entry->resource_id(), &existing_local_id); | 127 file_resource->file_id(), &existing_local_id); |
| 127 switch (error) { | 128 switch (error) { |
| 128 case FILE_ERROR_OK: | 129 case FILE_ERROR_OK: |
| 129 if (existing_local_id != local_id) { | 130 if (existing_local_id != local_id) { |
| 130 base::FilePath existing_entry_path; | 131 base::FilePath existing_entry_path; |
| 131 error = metadata->GetFilePath(existing_local_id, &existing_entry_path); | 132 error = metadata->GetFilePath(existing_local_id, &existing_entry_path); |
| 132 if (error != FILE_ERROR_OK) | 133 if (error != FILE_ERROR_OK) |
| 133 return error; | 134 return error; |
| 134 error = metadata->RemoveEntry(existing_local_id); | 135 error = metadata->RemoveEntry(existing_local_id); |
| 135 if (error != FILE_ERROR_OK) | 136 if (error != FILE_ERROR_OK) |
| 136 return error; | 137 return error; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 152 switch (entry.metadata_edit_state()) { | 153 switch (entry.metadata_edit_state()) { |
| 153 case ResourceEntry::CLEAN: // Nothing to do. | 154 case ResourceEntry::CLEAN: // Nothing to do. |
| 154 case ResourceEntry::DIRTY: // Entry was edited again during the update. | 155 case ResourceEntry::DIRTY: // Entry was edited again during the update. |
| 155 break; | 156 break; |
| 156 | 157 |
| 157 case ResourceEntry::SYNCING: | 158 case ResourceEntry::SYNCING: |
| 158 entry.set_metadata_edit_state(ResourceEntry::CLEAN); | 159 entry.set_metadata_edit_state(ResourceEntry::CLEAN); |
| 159 break; | 160 break; |
| 160 } | 161 } |
| 161 if (!entry.file_info().is_directory()) | 162 if (!entry.file_info().is_directory()) |
| 162 entry.mutable_file_specific_info()->set_md5(resource_entry->file_md5()); | 163 entry.mutable_file_specific_info()->set_md5(file_resource->md5_checksum()); |
| 163 entry.set_resource_id(resource_entry->resource_id()); | 164 entry.set_resource_id(file_resource->file_id()); |
| 164 error = metadata->RefreshEntry(entry); | 165 error = metadata->RefreshEntry(entry); |
| 165 if (error != FILE_ERROR_OK) | 166 if (error != FILE_ERROR_OK) |
| 166 return error; | 167 return error; |
| 167 | 168 |
| 168 // Clear dirty bit unless the file has been edited during update. | 169 // Clear dirty bit unless the file has been edited during update. |
| 169 if (entry.file_specific_info().cache_state().is_dirty() && | 170 if (entry.file_specific_info().cache_state().is_dirty() && |
| 170 entry.file_specific_info().cache_state().md5() == | 171 entry.file_specific_info().cache_state().md5() == |
| 171 entry.file_specific_info().md5()) { | 172 entry.file_specific_info().md5()) { |
| 172 error = cache->ClearDirty(local_id); | 173 error = cache->ClearDirty(local_id); |
| 173 if (error != FILE_ERROR_OK) | 174 if (error != FILE_ERROR_OK) |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 context, callback, local_state->entry.local_id(), | 346 context, callback, local_state->entry.local_id(), |
| 346 base::Passed(scoped_ptr<base::ScopedClosureRunner>()))); | 347 base::Passed(scoped_ptr<base::ScopedClosureRunner>()))); |
| 347 } | 348 } |
| 348 | 349 |
| 349 void EntryUpdatePerformer::UpdateEntryAfterUpdateResource( | 350 void EntryUpdatePerformer::UpdateEntryAfterUpdateResource( |
| 350 const ClientContext& context, | 351 const ClientContext& context, |
| 351 const FileOperationCallback& callback, | 352 const FileOperationCallback& callback, |
| 352 const std::string& local_id, | 353 const std::string& local_id, |
| 353 scoped_ptr<base::ScopedClosureRunner> loader_lock, | 354 scoped_ptr<base::ScopedClosureRunner> loader_lock, |
| 354 google_apis::GDataErrorCode status, | 355 google_apis::GDataErrorCode status, |
| 355 scoped_ptr<google_apis::ResourceEntry> resource_entry) { | 356 scoped_ptr<google_apis::FileResource> entry) { |
| 356 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 357 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 357 DCHECK(!callback.is_null()); | 358 DCHECK(!callback.is_null()); |
| 358 | 359 |
| 359 if (status == google_apis::HTTP_FORBIDDEN) { | 360 if (status == google_apis::HTTP_FORBIDDEN) { |
| 360 // Editing this entry is not allowed, revert local changes. | 361 // Editing this entry is not allowed, revert local changes. |
| 361 entry_revert_performer_->RevertEntry(local_id, context, callback); | 362 entry_revert_performer_->RevertEntry(local_id, context, callback); |
| 362 return; | 363 return; |
| 363 } | 364 } |
| 364 | 365 |
| 365 FileError error = GDataToFileError(status); | 366 FileError error = GDataToFileError(status); |
| 366 if (error != FILE_ERROR_OK) { | 367 if (error != FILE_ERROR_OK) { |
| 367 callback.Run(error); | 368 callback.Run(error); |
| 368 return; | 369 return; |
| 369 } | 370 } |
| 370 | 371 |
| 371 base::FilePath* changed_directory = new base::FilePath; | 372 base::FilePath* changed_directory = new base::FilePath; |
| 372 base::PostTaskAndReplyWithResult( | 373 base::PostTaskAndReplyWithResult( |
| 373 blocking_task_runner_.get(), | 374 blocking_task_runner_.get(), |
| 374 FROM_HERE, | 375 FROM_HERE, |
| 375 base::Bind(&FinishUpdate, | 376 base::Bind(&FinishUpdate, |
| 376 metadata_, cache_, local_id, base::Passed(&resource_entry), | 377 metadata_, cache_, local_id, base::Passed(&entry), |
| 377 changed_directory), | 378 changed_directory), |
| 378 base::Bind(&EntryUpdatePerformer::UpdateEntryAfterFinish, | 379 base::Bind(&EntryUpdatePerformer::UpdateEntryAfterFinish, |
| 379 weak_ptr_factory_.GetWeakPtr(), callback, | 380 weak_ptr_factory_.GetWeakPtr(), callback, |
| 380 base::Owned(changed_directory))); | 381 base::Owned(changed_directory))); |
| 381 } | 382 } |
| 382 | 383 |
| 383 void EntryUpdatePerformer::UpdateEntryAfterFinish( | 384 void EntryUpdatePerformer::UpdateEntryAfterFinish( |
| 384 const FileOperationCallback& callback, | 385 const FileOperationCallback& callback, |
| 385 const base::FilePath* changed_directory, | 386 const base::FilePath* changed_directory, |
| 386 FileError error) { | 387 FileError error) { |
| 387 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 388 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 388 DCHECK(!callback.is_null()); | 389 DCHECK(!callback.is_null()); |
| 389 | 390 |
| 390 if (!changed_directory->empty()) | 391 if (!changed_directory->empty()) |
| 391 observer_->OnDirectoryChangedByOperation(*changed_directory); | 392 observer_->OnDirectoryChangedByOperation(*changed_directory); |
| 392 callback.Run(error); | 393 callback.Run(error); |
| 393 } | 394 } |
| 394 | 395 |
| 395 } // namespace internal | 396 } // namespace internal |
| 396 } // namespace drive | 397 } // namespace drive |
| OLD | NEW |