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_revert_performer.h" | 5 #include "chrome/browser/chromeos/drive/sync/entry_revert_performer.h" |
6 | 6 |
7 #include "chrome/browser/chromeos/drive/drive.pb.h" | 7 #include "chrome/browser/chromeos/drive/drive.pb.h" |
| 8 #include "chrome/browser/chromeos/drive/file_system/operation_observer.h" |
8 #include "chrome/browser/chromeos/drive/job_scheduler.h" | 9 #include "chrome/browser/chromeos/drive/job_scheduler.h" |
9 #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" | 10 #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" |
10 #include "chrome/browser/chromeos/drive/resource_metadata.h" | 11 #include "chrome/browser/chromeos/drive/resource_metadata.h" |
11 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
12 | 13 |
13 using content::BrowserThread; | 14 using content::BrowserThread; |
14 | 15 |
15 namespace drive { | 16 namespace drive { |
16 namespace internal { | 17 namespace internal { |
17 namespace { | 18 namespace { |
18 | 19 |
19 FileError FinishRevert(ResourceMetadata* metadata, | 20 FileError FinishRevert(ResourceMetadata* metadata, |
20 const std::string& local_id, | 21 const std::string& local_id, |
21 google_apis::GDataErrorCode status, | 22 google_apis::GDataErrorCode status, |
22 scoped_ptr<google_apis::ResourceEntry> resource_entry) { | 23 scoped_ptr<google_apis::ResourceEntry> resource_entry, |
23 FileError error = GDataToFileError(status); | 24 std::set<base::FilePath>* changed_directories) { |
24 if (error == FILE_ERROR_NOT_FOUND) | |
25 return metadata->RemoveEntry(local_id); | |
26 | |
27 if (error != FILE_ERROR_OK) | |
28 return error; | |
29 | |
30 ResourceEntry entry; | 25 ResourceEntry entry; |
31 std::string parent_resource_id; | 26 std::string parent_resource_id; |
32 if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id)) | 27 FileError error = GDataToFileError(status); |
33 return FILE_ERROR_NOT_A_FILE; | 28 switch (error) { |
| 29 case FILE_ERROR_OK: |
| 30 if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id)) |
| 31 return FILE_ERROR_NOT_A_FILE; |
| 32 break; |
34 | 33 |
35 if (entry.deleted()) | 34 case FILE_ERROR_NOT_FOUND: |
36 return metadata->RemoveEntry(local_id); | 35 entry.set_deleted(true); |
| 36 break; |
37 | 37 |
38 std::string parent_local_id; | 38 default: |
39 error = metadata->GetIdByResourceId(parent_resource_id, &parent_local_id); | 39 return error; |
40 if (error != FILE_ERROR_OK) | 40 } |
41 return error; | |
42 | 41 |
43 entry.set_local_id(local_id); | 42 const base::FilePath original_path = metadata->GetFilePath(local_id); |
44 entry.set_parent_local_id(parent_local_id); | |
45 | 43 |
46 return metadata->RefreshEntry(entry); | 44 if (entry.deleted()) { |
| 45 error = metadata->RemoveEntry(local_id); |
| 46 if (error != FILE_ERROR_OK) |
| 47 return error; |
| 48 |
| 49 changed_directories->insert(original_path.DirName()); |
| 50 } else { |
| 51 std::string parent_local_id; |
| 52 error = metadata->GetIdByResourceId(parent_resource_id, &parent_local_id); |
| 53 if (error != FILE_ERROR_OK) |
| 54 return error; |
| 55 |
| 56 entry.set_local_id(local_id); |
| 57 entry.set_parent_local_id(parent_local_id); |
| 58 error = metadata->RefreshEntry(entry); |
| 59 if (error != FILE_ERROR_OK) |
| 60 return error; |
| 61 |
| 62 changed_directories->insert(metadata->GetFilePath(entry.parent_local_id())); |
| 63 changed_directories->insert(original_path.DirName()); |
| 64 } |
| 65 return FILE_ERROR_OK; |
47 } | 66 } |
48 | 67 |
49 } // namespace | 68 } // namespace |
50 | 69 |
51 EntryRevertPerformer::EntryRevertPerformer( | 70 EntryRevertPerformer::EntryRevertPerformer( |
52 base::SequencedTaskRunner* blocking_task_runner, | 71 base::SequencedTaskRunner* blocking_task_runner, |
| 72 file_system::OperationObserver* observer, |
53 JobScheduler* scheduler, | 73 JobScheduler* scheduler, |
54 ResourceMetadata* metadata) | 74 ResourceMetadata* metadata) |
55 : blocking_task_runner_(blocking_task_runner), | 75 : blocking_task_runner_(blocking_task_runner), |
| 76 observer_(observer), |
56 scheduler_(scheduler), | 77 scheduler_(scheduler), |
57 metadata_(metadata), | 78 metadata_(metadata), |
58 weak_ptr_factory_(this) { | 79 weak_ptr_factory_(this) { |
59 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
60 } | 81 } |
61 | 82 |
62 EntryRevertPerformer::~EntryRevertPerformer() { | 83 EntryRevertPerformer::~EntryRevertPerformer() { |
63 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 84 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
64 } | 85 } |
65 | 86 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 base::Bind(&EntryRevertPerformer::RevertEntryAfterGetResourceEntry, | 119 base::Bind(&EntryRevertPerformer::RevertEntryAfterGetResourceEntry, |
99 weak_ptr_factory_.GetWeakPtr(), callback, entry->local_id())); | 120 weak_ptr_factory_.GetWeakPtr(), callback, entry->local_id())); |
100 } | 121 } |
101 | 122 |
102 void EntryRevertPerformer::RevertEntryAfterGetResourceEntry( | 123 void EntryRevertPerformer::RevertEntryAfterGetResourceEntry( |
103 const FileOperationCallback& callback, | 124 const FileOperationCallback& callback, |
104 const std::string& local_id, | 125 const std::string& local_id, |
105 google_apis::GDataErrorCode status, | 126 google_apis::GDataErrorCode status, |
106 scoped_ptr<google_apis::ResourceEntry> resource_entry) { | 127 scoped_ptr<google_apis::ResourceEntry> resource_entry) { |
107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 128 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 129 DCHECK(!callback.is_null()); |
108 | 130 |
109 // TODO(hashimoto): Notify OnDirectoryChanged event for affected directories. | 131 std::set<base::FilePath>* changed_directories = new std::set<base::FilePath>; |
110 base::PostTaskAndReplyWithResult( | 132 base::PostTaskAndReplyWithResult( |
111 blocking_task_runner_.get(), | 133 blocking_task_runner_.get(), |
112 FROM_HERE, | 134 FROM_HERE, |
113 base::Bind(&FinishRevert, metadata_, local_id, status, | 135 base::Bind(&FinishRevert, metadata_, local_id, status, |
114 base::Passed(&resource_entry)), | 136 base::Passed(&resource_entry), changed_directories), |
115 callback); | 137 base::Bind(&EntryRevertPerformer::RevertEntryAfterFinishRevert, |
| 138 weak_ptr_factory_.GetWeakPtr(), callback, |
| 139 base::Owned(changed_directories))); |
| 140 } |
| 141 |
| 142 void EntryRevertPerformer::RevertEntryAfterFinishRevert( |
| 143 const FileOperationCallback& callback, |
| 144 const std::set<base::FilePath>* changed_directories, |
| 145 FileError error) { |
| 146 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 147 DCHECK(!callback.is_null()); |
| 148 |
| 149 for (std::set<base::FilePath>::const_iterator it = |
| 150 changed_directories->begin(); it != changed_directories->end(); ++it) |
| 151 observer_->OnDirectoryChangedByOperation(*it); |
| 152 |
| 153 callback.Run(error); |
116 } | 154 } |
117 | 155 |
118 } // namespace internal | 156 } // namespace internal |
119 } // namespace drive | 157 } // namespace drive |
OLD | NEW |