OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "webkit/fileapi/file_system_file_util_proxy.h" | 5 #include "webkit/fileapi/file_system_file_util_proxy.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop_proxy.h" | 8 #include "base/message_loop_proxy.h" |
9 #include "webkit/fileapi/file_system_context.h" | 9 #include "webkit/fileapi/file_system_context.h" |
10 #include "webkit/fileapi/file_system_file_util.h" | 10 #include "webkit/fileapi/file_system_file_util.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 origin_message_loop_proxy_->PostTask( | 64 origin_message_loop_proxy_->PostTask( |
65 FROM_HERE, base::Bind(&MessageLoopRelay::RunCallback, this)); | 65 FROM_HERE, base::Bind(&MessageLoopRelay::RunCallback, this)); |
66 } | 66 } |
67 | 67 |
68 scoped_refptr<base::MessageLoopProxy> origin_message_loop_proxy_; | 68 scoped_refptr<base::MessageLoopProxy> origin_message_loop_proxy_; |
69 base::PlatformFileError error_code_; | 69 base::PlatformFileError error_code_; |
70 fileapi::FileSystemOperationContext context_; | 70 fileapi::FileSystemOperationContext context_; |
71 fileapi::FileSystemFileUtil* file_util_; | 71 fileapi::FileSystemFileUtil* file_util_; |
72 }; | 72 }; |
73 | 73 |
74 class RelayCreateOrOpen : public MessageLoopRelay { | |
75 public: | |
76 RelayCreateOrOpen( | |
77 const fileapi::FileSystemOperationContext& context, | |
78 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | |
79 const FilePath& file_path, | |
80 int file_flags, | |
81 const fileapi::FileSystemFileUtilProxy::CreateOrOpenCallback& callback) | |
82 : MessageLoopRelay(context), | |
83 message_loop_proxy_(message_loop_proxy), | |
84 file_path_(file_path), | |
85 file_flags_(file_flags), | |
86 callback_(callback), | |
87 file_handle_(base::kInvalidPlatformFileValue), | |
88 created_(false) { | |
89 DCHECK_EQ(false, callback.is_null()); | |
90 } | |
91 | |
92 protected: | |
93 virtual ~RelayCreateOrOpen() { | |
94 if (file_handle_ != base::kInvalidPlatformFileValue) | |
95 fileapi::FileSystemFileUtilProxy::Close( | |
96 *context(), message_loop_proxy_, file_handle_, | |
97 fileapi::FileSystemFileUtilProxy::StatusCallback()); | |
98 } | |
99 | |
100 virtual void RunWork() { | |
101 set_error_code(file_util()->CreateOrOpen( | |
102 context(), file_path_, file_flags_, &file_handle_, &created_)); | |
103 } | |
104 | |
105 virtual void RunCallback() { | |
106 callback_.Run(error_code(), base::PassPlatformFile(&file_handle_), | |
107 created_); | |
108 } | |
109 | |
110 private: | |
111 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; | |
112 FilePath file_path_; | |
113 int file_flags_; | |
114 fileapi::FileSystemFileUtilProxy::CreateOrOpenCallback callback_; | |
115 base::PlatformFile file_handle_; | |
116 bool created_; | |
117 }; | |
118 | |
119 class RelayWithStatusCallback : public MessageLoopRelay { | |
120 public: | |
121 RelayWithStatusCallback( | |
122 const fileapi::FileSystemOperationContext& context, | |
123 const fileapi::FileSystemFileUtilProxy::StatusCallback& callback) | |
124 : MessageLoopRelay(context), | |
125 callback_(callback) { | |
126 // It is OK for callback to be NULL. | |
127 } | |
128 | |
129 protected: | |
130 virtual void RunCallback() { | |
131 // The caller may not have been interested in the result. | |
132 if (!callback_.is_null()) | |
133 callback_.Run(error_code()); | |
134 } | |
135 | |
136 private: | |
137 fileapi::FileSystemFileUtilProxy::StatusCallback callback_; | |
138 }; | |
139 | |
140 class RelayClose : public RelayWithStatusCallback { | |
141 public: | |
142 RelayClose(const fileapi::FileSystemOperationContext& context, | |
143 base::PlatformFile file_handle, | |
144 const fileapi::FileSystemFileUtilProxy::StatusCallback& callback) | |
145 : RelayWithStatusCallback(context, callback), | |
146 file_handle_(file_handle) { | |
147 } | |
148 | |
149 protected: | |
150 virtual void RunWork() { | |
151 set_error_code(file_util()->Close(context(), file_handle_)); | |
152 } | |
153 | |
154 private: | |
155 base::PlatformFile file_handle_; | |
156 }; | |
157 | |
158 class RelayEnsureFileExists : public MessageLoopRelay { | 74 class RelayEnsureFileExists : public MessageLoopRelay { |
159 public: | 75 public: |
160 RelayEnsureFileExists( | 76 RelayEnsureFileExists( |
161 const fileapi::FileSystemOperationContext& context, | 77 const fileapi::FileSystemOperationContext& context, |
162 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | 78 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, |
163 const FilePath& file_path, | 79 const FilePath& file_path, |
164 const fileapi::FileSystemFileUtilProxy::EnsureFileExistsCallback& | 80 const fileapi::FileSystemFileUtilProxy::EnsureFileExistsCallback& |
165 callback) | 81 callback) |
166 : MessageLoopRelay(context), | 82 : MessageLoopRelay(context), |
167 message_loop_proxy_(message_loop_proxy), | 83 message_loop_proxy_(message_loop_proxy), |
(...skipping 14 matching lines...) Expand all Loading... |
182 } | 98 } |
183 | 99 |
184 private: | 100 private: |
185 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; | 101 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; |
186 FilePath file_path_; | 102 FilePath file_path_; |
187 fileapi::FileSystemFileUtilProxy::EnsureFileExistsCallback callback_; | 103 fileapi::FileSystemFileUtilProxy::EnsureFileExistsCallback callback_; |
188 bool created_; | 104 bool created_; |
189 }; | 105 }; |
190 | 106 |
191 | 107 |
192 class RelayGetLocalPath : public MessageLoopRelay { | |
193 public: | |
194 RelayGetLocalPath( | |
195 const fileapi::FileSystemOperationContext& context, | |
196 const FilePath& virtual_path, | |
197 fileapi::FileSystemFileUtilProxy::GetLocalPathCallback* callback) | |
198 : MessageLoopRelay(context), | |
199 callback_(callback), | |
200 virtual_path_(virtual_path) { | |
201 DCHECK(callback); | |
202 } | |
203 | |
204 protected: | |
205 virtual void RunWork() { | |
206 set_error_code(file_util()->GetLocalFilePath( | |
207 context(), virtual_path_, &local_path_)); | |
208 } | |
209 | |
210 virtual void RunCallback() { | |
211 callback_->Run(error_code(), local_path_); | |
212 delete callback_; | |
213 } | |
214 | |
215 private: | |
216 fileapi::FileSystemFileUtilProxy::GetLocalPathCallback* callback_; | |
217 FilePath virtual_path_; | |
218 FilePath local_path_; | |
219 }; | |
220 | |
221 class RelayGetFileInfo : public MessageLoopRelay { | 108 class RelayGetFileInfo : public MessageLoopRelay { |
222 public: | 109 public: |
223 RelayGetFileInfo( | 110 RelayGetFileInfo( |
224 const fileapi::FileSystemOperationContext& context, | 111 const fileapi::FileSystemOperationContext& context, |
225 const FilePath& file_path, | 112 const FilePath& file_path, |
226 const fileapi::FileSystemFileUtilProxy::GetFileInfoCallback& callback) | 113 const fileapi::FileSystemFileUtilProxy::GetFileInfoCallback& callback) |
227 : MessageLoopRelay(context), | 114 : MessageLoopRelay(context), |
228 callback_(callback), | 115 callback_(callback), |
229 file_path_(file_path) { | 116 file_path_(file_path) { |
230 DCHECK_EQ(false, callback.is_null()); | 117 DCHECK_EQ(false, callback.is_null()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 virtual void RunCallback() { | 155 virtual void RunCallback() { |
269 callback_.Run(error_code(), entries_); | 156 callback_.Run(error_code(), entries_); |
270 } | 157 } |
271 | 158 |
272 private: | 159 private: |
273 fileapi::FileSystemFileUtilProxy::ReadDirectoryCallback callback_; | 160 fileapi::FileSystemFileUtilProxy::ReadDirectoryCallback callback_; |
274 FilePath file_path_; | 161 FilePath file_path_; |
275 std::vector<base::FileUtilProxy::Entry> entries_; | 162 std::vector<base::FileUtilProxy::Entry> entries_; |
276 }; | 163 }; |
277 | 164 |
278 class RelayCreateDirectory : public RelayWithStatusCallback { | |
279 public: | |
280 RelayCreateDirectory( | |
281 const fileapi::FileSystemOperationContext& context, | |
282 const FilePath& file_path, | |
283 bool exclusive, | |
284 bool recursive, | |
285 const fileapi::FileSystemFileUtilProxy::StatusCallback& callback) | |
286 : RelayWithStatusCallback(context, callback), | |
287 file_path_(file_path), | |
288 exclusive_(exclusive), | |
289 recursive_(recursive) { | |
290 } | |
291 | |
292 protected: | |
293 virtual void RunWork() { | |
294 set_error_code(file_util()->CreateDirectory( | |
295 context(), file_path_, exclusive_, recursive_)); | |
296 } | |
297 | |
298 private: | |
299 FilePath file_path_; | |
300 bool exclusive_; | |
301 bool recursive_; | |
302 }; | |
303 | |
304 class RelayCopy : public RelayWithStatusCallback { | |
305 public: | |
306 RelayCopy(const fileapi::FileSystemOperationContext& context, | |
307 const FilePath& src_file_path, | |
308 const FilePath& dest_file_path, | |
309 const fileapi::FileSystemFileUtilProxy::StatusCallback& callback) | |
310 : RelayWithStatusCallback(context, callback), | |
311 src_file_path_(src_file_path), | |
312 dest_file_path_(dest_file_path) { | |
313 } | |
314 | |
315 protected: | |
316 virtual void RunWork() { | |
317 set_error_code(file_util()->Copy( | |
318 context(), src_file_path_, dest_file_path_)); | |
319 } | |
320 | |
321 private: | |
322 FilePath src_file_path_; | |
323 FilePath dest_file_path_; | |
324 }; | |
325 | |
326 class RelayMove : public RelayWithStatusCallback { | |
327 public: | |
328 RelayMove(const fileapi::FileSystemOperationContext& context, | |
329 const FilePath& src_file_path, | |
330 const FilePath& dest_file_path, | |
331 const fileapi::FileSystemFileUtilProxy::StatusCallback& callback) | |
332 : RelayWithStatusCallback(context, callback), | |
333 src_file_path_(src_file_path), | |
334 dest_file_path_(dest_file_path) { | |
335 } | |
336 | |
337 protected: | |
338 virtual void RunWork() { | |
339 set_error_code(file_util()->Move( | |
340 context(), src_file_path_, dest_file_path_)); | |
341 } | |
342 | |
343 private: | |
344 FilePath src_file_path_; | |
345 FilePath dest_file_path_; | |
346 }; | |
347 | |
348 class RelayDelete : public RelayWithStatusCallback { | |
349 public: | |
350 RelayDelete(const fileapi::FileSystemOperationContext& context, | |
351 const FilePath& file_path, | |
352 bool recursive, | |
353 const fileapi::FileSystemFileUtilProxy::StatusCallback& callback) | |
354 : RelayWithStatusCallback(context, callback), | |
355 file_path_(file_path), | |
356 recursive_(recursive) { | |
357 } | |
358 | |
359 protected: | |
360 virtual void RunWork() { | |
361 set_error_code(file_util()->Delete(context(), file_path_, recursive_)); | |
362 } | |
363 | |
364 private: | |
365 FilePath file_path_; | |
366 bool recursive_; | |
367 }; | |
368 | |
369 class RelayTouchFilePath : public RelayWithStatusCallback { | |
370 public: | |
371 RelayTouchFilePath( | |
372 const fileapi::FileSystemOperationContext& context, | |
373 const FilePath& file_path, | |
374 const base::Time& last_access_time, | |
375 const base::Time& last_modified_time, | |
376 const fileapi::FileSystemFileUtilProxy::StatusCallback& callback) | |
377 : RelayWithStatusCallback(context, callback), | |
378 file_path_(file_path), | |
379 last_access_time_(last_access_time), | |
380 last_modified_time_(last_modified_time) { | |
381 } | |
382 | |
383 protected: | |
384 virtual void RunWork() { | |
385 set_error_code(file_util()->Touch( | |
386 context(), file_path_, last_access_time_, last_modified_time_)); | |
387 } | |
388 | |
389 private: | |
390 FilePath file_path_; | |
391 base::Time last_access_time_; | |
392 base::Time last_modified_time_; | |
393 }; | |
394 | |
395 class RelayTruncate : public RelayWithStatusCallback { | |
396 public: | |
397 RelayTruncate( | |
398 const fileapi::FileSystemOperationContext& context, | |
399 const FilePath& file_path, | |
400 int64 length, | |
401 const fileapi::FileSystemFileUtilProxy::StatusCallback& callback) | |
402 : RelayWithStatusCallback(context, callback), | |
403 file_path_(file_path), | |
404 length_(length) { | |
405 } | |
406 | |
407 protected: | |
408 virtual void RunWork() { | |
409 set_error_code(file_util()->Truncate(context(), file_path_, length_)); | |
410 } | |
411 | |
412 private: | |
413 FilePath file_path_; | |
414 int64 length_; | |
415 }; | |
416 | |
417 bool Start(const tracked_objects::Location& from_here, | 165 bool Start(const tracked_objects::Location& from_here, |
418 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, | 166 scoped_refptr<base::MessageLoopProxy> message_loop_proxy, |
419 scoped_refptr<MessageLoopRelay> relay) { | 167 scoped_refptr<MessageLoopRelay> relay) { |
420 return relay->Start(message_loop_proxy, from_here); | 168 return relay->Start(message_loop_proxy, from_here); |
421 } | 169 } |
422 | 170 |
423 } // namespace | 171 } // namespace |
424 | 172 |
425 namespace fileapi { | 173 namespace fileapi { |
426 | 174 |
427 // static | 175 // static |
428 bool FileSystemFileUtilProxy::CreateOrOpen( | |
429 const FileSystemOperationContext& context, | |
430 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
431 const FilePath& file_path, int file_flags, | |
432 const CreateOrOpenCallback& callback) { | |
433 return Start(FROM_HERE, message_loop_proxy, new RelayCreateOrOpen(context, | |
434 message_loop_proxy, file_path, file_flags, callback)); | |
435 } | |
436 | |
437 // static | |
438 bool FileSystemFileUtilProxy::Close( | |
439 const FileSystemOperationContext& context, | |
440 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
441 base::PlatformFile file_handle, | |
442 const StatusCallback& callback) { | |
443 return Start(FROM_HERE, message_loop_proxy, | |
444 new RelayClose(context, file_handle, callback)); | |
445 } | |
446 | |
447 // static | |
448 bool FileSystemFileUtilProxy::EnsureFileExists( | 176 bool FileSystemFileUtilProxy::EnsureFileExists( |
449 const FileSystemOperationContext& context, | 177 const FileSystemOperationContext& context, |
450 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 178 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
451 const FilePath& file_path, | 179 const FilePath& file_path, |
452 const EnsureFileExistsCallback& callback) { | 180 const EnsureFileExistsCallback& callback) { |
453 return Start(FROM_HERE, message_loop_proxy, new RelayEnsureFileExists( | 181 return Start(FROM_HERE, message_loop_proxy, new RelayEnsureFileExists( |
454 context, message_loop_proxy, file_path, callback)); | 182 context, message_loop_proxy, file_path, callback)); |
455 } | 183 } |
456 | 184 |
457 // static | 185 // static |
458 bool FileSystemFileUtilProxy::GetLocalPath( | |
459 const FileSystemOperationContext& context, | |
460 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
461 const FilePath& virtual_path, | |
462 GetLocalPathCallback* callback) { | |
463 return Start(FROM_HERE, message_loop_proxy, | |
464 new RelayGetLocalPath(context, virtual_path, callback)); | |
465 } | |
466 | |
467 // static | |
468 bool FileSystemFileUtilProxy::GetFileInfo( | 186 bool FileSystemFileUtilProxy::GetFileInfo( |
469 const FileSystemOperationContext& context, | 187 const FileSystemOperationContext& context, |
470 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 188 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
471 const FilePath& file_path, | 189 const FilePath& file_path, |
472 const GetFileInfoCallback& callback) { | 190 const GetFileInfoCallback& callback) { |
473 return Start(FROM_HERE, message_loop_proxy, new RelayGetFileInfo(context, | 191 return Start(FROM_HERE, message_loop_proxy, new RelayGetFileInfo(context, |
474 file_path, callback)); | 192 file_path, callback)); |
475 } | 193 } |
476 | 194 |
477 // static | 195 // static |
478 bool FileSystemFileUtilProxy::ReadDirectory( | 196 bool FileSystemFileUtilProxy::ReadDirectory( |
479 const FileSystemOperationContext& context, | 197 const FileSystemOperationContext& context, |
480 scoped_refptr<MessageLoopProxy> message_loop_proxy, | 198 scoped_refptr<MessageLoopProxy> message_loop_proxy, |
481 const FilePath& file_path, | 199 const FilePath& file_path, |
482 const ReadDirectoryCallback& callback) { | 200 const ReadDirectoryCallback& callback) { |
483 return Start(FROM_HERE, message_loop_proxy, new RelayReadDirectory(context, | 201 return Start(FROM_HERE, message_loop_proxy, new RelayReadDirectory(context, |
484 file_path, callback)); | 202 file_path, callback)); |
485 } | 203 } |
486 | 204 |
487 // static | |
488 bool FileSystemFileUtilProxy::CreateDirectory( | |
489 const FileSystemOperationContext& context, | |
490 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
491 const FilePath& file_path, | |
492 bool exclusive, | |
493 bool recursive, | |
494 const StatusCallback& callback) { | |
495 return Start(FROM_HERE, message_loop_proxy, new RelayCreateDirectory( | |
496 context, file_path, exclusive, recursive, callback)); | |
497 } | |
498 | |
499 // static | |
500 bool FileSystemFileUtilProxy::Copy( | |
501 const FileSystemOperationContext& context, | |
502 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
503 const FilePath& src_file_path, | |
504 const FilePath& dest_file_path, | |
505 const StatusCallback& callback) { | |
506 return Start(FROM_HERE, message_loop_proxy, | |
507 new RelayCopy(context, src_file_path, dest_file_path, | |
508 callback)); | |
509 } | |
510 | |
511 // static | |
512 bool FileSystemFileUtilProxy::Move( | |
513 const FileSystemOperationContext& context, | |
514 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
515 const FilePath& src_file_path, | |
516 const FilePath& dest_file_path, | |
517 const StatusCallback& callback) { | |
518 return Start(FROM_HERE, message_loop_proxy, | |
519 new RelayMove(context, src_file_path, dest_file_path, | |
520 callback)); | |
521 } | |
522 | |
523 // static | |
524 bool FileSystemFileUtilProxy::Delete( | |
525 const FileSystemOperationContext& context, | |
526 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
527 const FilePath& file_path, | |
528 bool recursive, | |
529 const StatusCallback& callback) { | |
530 return Start(FROM_HERE, message_loop_proxy, | |
531 new RelayDelete(context, file_path, recursive, callback)); | |
532 } | |
533 | |
534 // static | |
535 bool FileSystemFileUtilProxy::Touch( | |
536 const FileSystemOperationContext& context, | |
537 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
538 const FilePath& file_path, | |
539 const base::Time& last_access_time, | |
540 const base::Time& last_modified_time, | |
541 const StatusCallback& callback) { | |
542 return Start(FROM_HERE, message_loop_proxy, | |
543 new RelayTouchFilePath(context, file_path, last_access_time, | |
544 last_modified_time, callback)); | |
545 } | |
546 | |
547 // static | |
548 bool FileSystemFileUtilProxy::Truncate( | |
549 const FileSystemOperationContext& context, | |
550 scoped_refptr<MessageLoopProxy> message_loop_proxy, | |
551 const FilePath& path, | |
552 int64 length, | |
553 const StatusCallback& callback) { | |
554 return Start(FROM_HERE, message_loop_proxy, | |
555 new RelayTruncate(context, path, length, callback)); | |
556 } | |
557 | |
558 } // namespace fileapi | 205 } // namespace fileapi |
OLD | NEW |