OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 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/create_directory_operation.h
" | 5 #include "chrome/browser/chromeos/drive/file_system/create_directory_operation.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/file_system/operation_observer.h" |
9 #include "chrome/browser/chromeos/drive/file_system_util.h" | 9 #include "chrome/browser/chromeos/drive/file_system_util.h" |
10 #include "chrome/browser/chromeos/drive/job_scheduler.h" | 10 #include "chrome/browser/chromeos/drive/job_scheduler.h" |
11 #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" | 11 #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" |
12 #include "chrome/browser/google_apis/gdata_errorcode.h" | 12 #include "chrome/browser/google_apis/gdata_errorcode.h" |
13 #include "chrome/browser/google_apis/gdata_wapi_parser.h" | 13 #include "chrome/browser/google_apis/gdata_wapi_parser.h" |
14 #include "content/public/browser/browser_thread.h" | 14 #include "content/public/browser/browser_thread.h" |
15 | 15 |
16 using content::BrowserThread; | 16 using content::BrowserThread; |
17 | 17 |
18 namespace drive { | 18 namespace drive { |
19 namespace file_system { | 19 namespace file_system { |
20 | 20 |
21 namespace { | 21 namespace { |
22 | 22 |
23 // Part of CreateDirectoryRecursively(). Adds an |entry| for new directory | 23 // Part of CreateDirectoryRecursively(). Adds an |entry| for new directory |
24 // to |metadata|, and return the status. If succeeded, |file_path| will store | 24 // to |metadata|, and return the status. If succeeded, |file_path| will store |
25 // the path to the result file. | 25 // the path to the result file. |
26 FileError UpdateLocalStateForCreateDirectoryRecursively( | 26 FileError UpdateLocalStateForCreateDirectoryRecursively( |
27 internal::ResourceMetadata* metadata, | 27 internal::ResourceMetadata* metadata, |
28 const ResourceEntry& entry, | 28 scoped_ptr<google_apis::ResourceEntry> resource_entry, |
29 base::FilePath* file_path) { | 29 base::FilePath* file_path) { |
30 DCHECK(metadata); | 30 DCHECK(metadata); |
31 DCHECK(file_path); | 31 DCHECK(file_path); |
32 | 32 |
| 33 ResourceEntry entry; |
| 34 std::string parent_resource_id; |
| 35 if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id)) |
| 36 return FILE_ERROR_NOT_A_FILE; |
| 37 |
| 38 std::string parent_local_id; |
| 39 FileError result = metadata->GetIdByResourceId(parent_resource_id, |
| 40 &parent_local_id); |
| 41 if (result != FILE_ERROR_OK) |
| 42 return result; |
| 43 entry.set_parent_local_id(parent_local_id); |
| 44 |
33 std::string local_id; | 45 std::string local_id; |
34 FileError result = metadata->AddEntry(entry, &local_id); | 46 result = metadata->AddEntry(entry, &local_id); |
35 // Depending on timing, a metadata may be updated by change list already. | 47 // Depending on timing, a metadata may be updated by change list already. |
36 // So, FILE_ERROR_EXISTS is not an error. | 48 // So, FILE_ERROR_EXISTS is not an error. |
37 if (result == FILE_ERROR_EXISTS) | 49 if (result == FILE_ERROR_EXISTS) |
38 result = metadata->GetIdByResourceId(entry.resource_id(), &local_id); | 50 result = metadata->GetIdByResourceId(entry.resource_id(), &local_id); |
39 | 51 |
40 if (result == FILE_ERROR_OK) | 52 if (result == FILE_ERROR_OK) |
41 *file_path = metadata->GetFilePath(local_id); | 53 *file_path = metadata->GetFilePath(local_id); |
42 | 54 |
43 return result; | 55 return result; |
44 } | 56 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 ResourceEntry* entry) { | 107 ResourceEntry* entry) { |
96 DCHECK(metadata); | 108 DCHECK(metadata); |
97 DCHECK(entry); | 109 DCHECK(entry); |
98 | 110 |
99 std::vector<base::FilePath::StringType> components; | 111 std::vector<base::FilePath::StringType> components; |
100 directory_path.GetComponents(&components); | 112 directory_path.GetComponents(&components); |
101 | 113 |
102 if (components.empty() || components[0] != util::kDriveGrandRootDirName) | 114 if (components.empty() || components[0] != util::kDriveGrandRootDirName) |
103 return base::FilePath(); | 115 return base::FilePath(); |
104 | 116 |
105 std::string resource_id = util::kDriveGrandRootSpecialResourceId; | 117 std::string local_id = util::kDriveGrandRootSpecialResourceId; |
106 for (size_t i = 1; i < components.size(); ++i) { | 118 for (size_t i = 1; i < components.size(); ++i) { |
107 std::string child_resource_id = | 119 std::string child_local_id = metadata->GetChildId(local_id, components[i]); |
108 metadata->GetChildResourceId(resource_id, components[i]); | 120 if (child_local_id.empty()) |
109 if (child_resource_id.empty()) | |
110 break; | 121 break; |
111 resource_id = child_resource_id; | 122 local_id = child_local_id; |
112 } | 123 } |
113 | 124 |
114 FileError error = metadata->GetResourceEntryById(resource_id, entry); | 125 FileError error = metadata->GetResourceEntryById(local_id, entry); |
115 DCHECK_EQ(FILE_ERROR_OK, error); | 126 DCHECK_EQ(FILE_ERROR_OK, error); |
116 | 127 |
117 if (!entry->file_info().is_directory()) | 128 if (!entry->file_info().is_directory()) |
118 return base::FilePath(); | 129 return base::FilePath(); |
119 | 130 |
120 return metadata->GetFilePath(resource_id); | 131 return metadata->GetFilePath(local_id); |
121 } | 132 } |
122 | 133 |
123 void CreateDirectoryOperation::CreateDirectoryAfterGetExistingDeepestDirectory( | 134 void CreateDirectoryOperation::CreateDirectoryAfterGetExistingDeepestDirectory( |
124 const base::FilePath& directory_path, | 135 const base::FilePath& directory_path, |
125 bool is_exclusive, | 136 bool is_exclusive, |
126 bool is_recursive, | 137 bool is_recursive, |
127 const FileOperationCallback& callback, | 138 const FileOperationCallback& callback, |
128 ResourceEntry* existing_deepest_directory_entry, | 139 ResourceEntry* existing_deepest_directory_entry, |
129 const base::FilePath& existing_deepest_directory_path) { | 140 const base::FilePath& existing_deepest_directory_path) { |
130 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 scoped_ptr<google_apis::ResourceEntry> resource_entry) { | 198 scoped_ptr<google_apis::ResourceEntry> resource_entry) { |
188 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 199 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
189 DCHECK(!callback.is_null()); | 200 DCHECK(!callback.is_null()); |
190 | 201 |
191 FileError error = GDataToFileError(gdata_error); | 202 FileError error = GDataToFileError(gdata_error); |
192 if (error != FILE_ERROR_OK) { | 203 if (error != FILE_ERROR_OK) { |
193 callback.Run(error); | 204 callback.Run(error); |
194 return; | 205 return; |
195 } | 206 } |
196 DCHECK(resource_entry); | 207 DCHECK(resource_entry); |
197 | 208 const std::string& resource_id = resource_entry->resource_id(); |
198 ResourceEntry entry; | |
199 std::string parent_resource_id; | |
200 if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id)) { | |
201 callback.Run(FILE_ERROR_NOT_A_FILE); | |
202 return; | |
203 } | |
204 | |
205 // TODO(hashimoto): Resolve local ID before use. crbug.com/260514 | |
206 entry.set_parent_local_id(parent_resource_id); | |
207 | 209 |
208 // Note that the created directory may be renamed inside | 210 // Note that the created directory may be renamed inside |
209 // ResourceMetadata::AddEntry due to name confliction. | 211 // ResourceMetadata::AddEntry due to name confliction. |
210 // What we actually need here is the new created path (not the path we try | 212 // What we actually need here is the new created path (not the path we try |
211 // to create). | 213 // to create). |
212 base::FilePath* file_path = new base::FilePath; | 214 base::FilePath* file_path = new base::FilePath; |
213 base::PostTaskAndReplyWithResult( | 215 base::PostTaskAndReplyWithResult( |
214 blocking_task_runner_.get(), | 216 blocking_task_runner_.get(), |
215 FROM_HERE, | 217 FROM_HERE, |
216 base::Bind(&UpdateLocalStateForCreateDirectoryRecursively, | 218 base::Bind(&UpdateLocalStateForCreateDirectoryRecursively, |
217 metadata_, | 219 metadata_, |
218 entry, | 220 base::Passed(&resource_entry), |
219 file_path), | 221 file_path), |
220 base::Bind(&CreateDirectoryOperation:: | 222 base::Bind(&CreateDirectoryOperation:: |
221 CreateDirectoryRecursivelyAfterUpdateLocalState, | 223 CreateDirectoryRecursivelyAfterUpdateLocalState, |
222 weak_ptr_factory_.GetWeakPtr(), | 224 weak_ptr_factory_.GetWeakPtr(), |
223 resource_entry->resource_id(), | 225 resource_id, |
224 remaining_path, | 226 remaining_path, |
225 callback, | 227 callback, |
226 base::Owned(file_path))); | 228 base::Owned(file_path))); |
227 } | 229 } |
228 | 230 |
229 void CreateDirectoryOperation::CreateDirectoryRecursivelyAfterUpdateLocalState( | 231 void CreateDirectoryOperation::CreateDirectoryRecursivelyAfterUpdateLocalState( |
230 const std::string& resource_id, | 232 const std::string& resource_id, |
231 const base::FilePath& remaining_path, | 233 const base::FilePath& remaining_path, |
232 const FileOperationCallback& callback, | 234 const FileOperationCallback& callback, |
233 base::FilePath* file_path, | 235 base::FilePath* file_path, |
(...skipping 13 matching lines...) Expand all Loading... |
247 callback.Run(FILE_ERROR_OK); | 249 callback.Run(FILE_ERROR_OK); |
248 return; | 250 return; |
249 } | 251 } |
250 | 252 |
251 // Create descendant directories. | 253 // Create descendant directories. |
252 CreateDirectoryRecursively(resource_id, remaining_path, callback); | 254 CreateDirectoryRecursively(resource_id, remaining_path, callback); |
253 } | 255 } |
254 | 256 |
255 } // namespace file_system | 257 } // namespace file_system |
256 } // namespace drive | 258 } // namespace drive |
OLD | NEW |