OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/file_system/remove_operation.h" | 5 #include "chrome/browser/chromeos/drive/file_system/remove_operation.h" |
6 | 6 |
7 #include "base/sequenced_task_runner.h" | 7 #include "base/sequenced_task_runner.h" |
8 #include "chrome/browser/chromeos/drive/drive.pb.h" | 8 #include "chrome/browser/chromeos/drive/drive.pb.h" |
9 #include "chrome/browser/chromeos/drive/file_cache.h" | 9 #include "chrome/browser/chromeos/drive/file_cache.h" |
10 #include "chrome/browser/chromeos/drive/file_change.h" | |
10 #include "chrome/browser/chromeos/drive/file_system/operation_observer.h" | 11 #include "chrome/browser/chromeos/drive/file_system/operation_observer.h" |
11 #include "chrome/browser/chromeos/drive/file_system_util.h" | 12 #include "chrome/browser/chromeos/drive/file_system_util.h" |
12 #include "chrome/browser/chromeos/drive/resource_metadata.h" | 13 #include "chrome/browser/chromeos/drive/resource_metadata.h" |
13 #include "content/public/browser/browser_thread.h" | 14 #include "content/public/browser/browser_thread.h" |
14 | 15 |
15 using content::BrowserThread; | 16 using content::BrowserThread; |
16 | 17 |
17 namespace drive { | 18 namespace drive { |
18 namespace file_system { | 19 namespace file_system { |
19 | 20 |
20 namespace { | 21 namespace { |
21 | 22 |
22 // Removes cache file and moves the metadata entry to the trash. | 23 // Removes cache file and moves the metadata entry to the trash. |
23 FileError UpdateLocalState(internal::ResourceMetadata* metadata, | 24 FileError UpdateLocalState(internal::ResourceMetadata* metadata, |
24 internal::FileCache* cache, | 25 internal::FileCache* cache, |
25 const base::FilePath& path, | 26 const base::FilePath& path, |
26 bool is_recursive, | 27 bool is_recursive, |
27 std::string* local_id, | 28 std::string* local_id, |
28 base::FilePath* changed_directory_path) { | 29 base::FilePath* changed_path) { |
29 FileError error = metadata->GetIdByPath(path, local_id); | 30 FileError error = metadata->GetIdByPath(path, local_id); |
30 if (error != FILE_ERROR_OK) | 31 if (error != FILE_ERROR_OK) |
31 return error; | 32 return error; |
32 | 33 |
33 ResourceEntry entry; | 34 ResourceEntry entry; |
34 error = metadata->GetResourceEntryById(*local_id, &entry); | 35 error = metadata->GetResourceEntryById(*local_id, &entry); |
35 if (error != FILE_ERROR_OK) | 36 if (error != FILE_ERROR_OK) |
36 return error; | 37 return error; |
37 | 38 |
38 if (entry.file_info().is_directory() && !is_recursive) { | 39 if (entry.file_info().is_directory() && !is_recursive) { |
39 // Check emptiness of the directory. | 40 // Check emptiness of the directory. |
40 ResourceEntryVector entries; | 41 ResourceEntryVector entries; |
41 error = metadata->ReadDirectoryByPath(path, &entries); | 42 error = metadata->ReadDirectoryByPath(path, &entries); |
42 if (error != FILE_ERROR_OK) | 43 if (error != FILE_ERROR_OK) |
43 return error; | 44 return error; |
44 if (!entries.empty()) | 45 if (!entries.empty()) |
45 return FILE_ERROR_NOT_EMPTY; | 46 return FILE_ERROR_NOT_EMPTY; |
46 } | 47 } |
47 | 48 |
48 error = cache->Remove(*local_id); | 49 error = cache->Remove(*local_id); |
49 if (error != FILE_ERROR_OK) | 50 if (error != FILE_ERROR_OK) |
50 return error; | 51 return error; |
51 | 52 |
52 *changed_directory_path = path.DirName(); | 53 *changed_path = path; |
53 | 54 |
54 // Move to the trash. | 55 // Move to the trash. |
55 entry.set_parent_local_id(util::kDriveTrashDirLocalId); | 56 entry.set_parent_local_id(util::kDriveTrashDirLocalId); |
56 return metadata->RefreshEntry(entry); | 57 return metadata->RefreshEntry(entry); |
57 } | 58 } |
58 | 59 |
59 } // namespace | 60 } // namespace |
60 | 61 |
61 RemoveOperation::RemoveOperation( | 62 RemoveOperation::RemoveOperation( |
62 base::SequencedTaskRunner* blocking_task_runner, | 63 base::SequencedTaskRunner* blocking_task_runner, |
(...skipping 12 matching lines...) Expand all Loading... | |
75 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 76 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
76 } | 77 } |
77 | 78 |
78 void RemoveOperation::Remove(const base::FilePath& path, | 79 void RemoveOperation::Remove(const base::FilePath& path, |
79 bool is_recursive, | 80 bool is_recursive, |
80 const FileOperationCallback& callback) { | 81 const FileOperationCallback& callback) { |
81 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 82 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
82 DCHECK(!callback.is_null()); | 83 DCHECK(!callback.is_null()); |
83 | 84 |
84 std::string* local_id = new std::string; | 85 std::string* local_id = new std::string; |
85 base::FilePath* changed_directory_path = new base::FilePath; | 86 base::FilePath* changed_path = new base::FilePath; |
86 base::PostTaskAndReplyWithResult( | 87 base::PostTaskAndReplyWithResult( |
87 blocking_task_runner_.get(), | 88 blocking_task_runner_.get(), |
88 FROM_HERE, | 89 FROM_HERE, |
89 base::Bind(&UpdateLocalState, | 90 base::Bind(&UpdateLocalState, |
90 metadata_, | 91 metadata_, |
91 cache_, | 92 cache_, |
92 path, | 93 path, |
93 is_recursive, | 94 is_recursive, |
94 local_id, | 95 local_id, |
95 changed_directory_path), | 96 changed_path), |
96 base::Bind(&RemoveOperation::RemoveAfterUpdateLocalState, | 97 base::Bind(&RemoveOperation::RemoveAfterUpdateLocalState, |
97 weak_ptr_factory_.GetWeakPtr(), | 98 weak_ptr_factory_.GetWeakPtr(), |
98 callback, | 99 callback, |
99 base::Owned(local_id), | 100 base::Owned(local_id), |
100 base::Owned(changed_directory_path))); | 101 base::Owned(changed_path))); |
101 } | 102 } |
102 | 103 |
103 void RemoveOperation::RemoveAfterUpdateLocalState( | 104 void RemoveOperation::RemoveAfterUpdateLocalState( |
104 const FileOperationCallback& callback, | 105 const FileOperationCallback& callback, |
105 const std::string* local_id, | 106 const std::string* local_id, |
106 const base::FilePath* changed_directory_path, | 107 const base::FilePath* changed_path, |
107 FileError error) { | 108 FileError error) { |
108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 109 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
109 DCHECK(!callback.is_null()); | 110 DCHECK(!callback.is_null()); |
110 | 111 |
111 if (error == FILE_ERROR_OK) { | 112 ResourceEntry entry; |
112 observer_->OnDirectoryChangedByOperation(*changed_directory_path); | 113 FileError error2 = metadata_->GetResourceEntryById(*local_id, &entry); |
kinaba
2014/06/23 05:37:43
this is violating thread restriction (metadata mus
yoshiki
2014/06/24 02:02:22
Done.
| |
113 observer_->OnEntryUpdatedByOperation(*local_id); | 114 DCHECK(error2 == FILE_ERROR_OK); |
115 | |
116 if (!changed_path->empty()) { | |
117 FileChange changed_file; | |
118 changed_file.Update(*changed_path, entry, FileChange::DELETE); | |
119 if (error == FILE_ERROR_OK) { | |
120 observer_->OnDirectoryChangedByOperation(changed_file); | |
121 observer_->OnEntryUpdatedByOperation(*local_id); | |
122 } | |
114 } | 123 } |
115 | 124 |
116 callback.Run(error); | 125 callback.Run(error); |
117 } | 126 } |
118 | 127 |
119 } // namespace file_system | 128 } // namespace file_system |
120 } // namespace drive | 129 } // namespace drive |
OLD | NEW |