| 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 "webkit/fileapi/isolated_file_util.h" | 5 #include "webkit/fileapi/isolated_file_util.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "webkit/blob/shareable_file_reference.h" | 10 #include "webkit/blob/shareable_file_reference.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 virtual base::Time LastModifiedTime() OVERRIDE { | 46 virtual base::Time LastModifiedTime() OVERRIDE { |
| 47 return file_info_.last_modified; | 47 return file_info_.last_modified; |
| 48 } | 48 } |
| 49 | 49 |
| 50 private: | 50 private: |
| 51 std::vector<FileInfo> files_; | 51 std::vector<FileInfo> files_; |
| 52 std::vector<FileInfo>::const_iterator file_iter_; | 52 std::vector<FileInfo>::const_iterator file_iter_; |
| 53 base::PlatformFileInfo file_info_; | 53 base::PlatformFileInfo file_info_; |
| 54 }; | 54 }; |
| 55 | 55 |
| 56 // Recursively enumerate each path from a given paths set. | |
| 57 class RecursiveSetFileEnumerator | |
| 58 : public FileSystemFileUtil::AbstractFileEnumerator { | |
| 59 public: | |
| 60 explicit RecursiveSetFileEnumerator(const std::vector<FileInfo>& files) | |
| 61 : files_(files) { | |
| 62 file_iter_ = files_.begin(); | |
| 63 current_enumerator_.reset(new SetFileEnumerator(files)); | |
| 64 } | |
| 65 virtual ~RecursiveSetFileEnumerator() {} | |
| 66 | |
| 67 // AbstractFileEnumerator overrides. | |
| 68 virtual base::FilePath Next() OVERRIDE; | |
| 69 virtual int64 Size() OVERRIDE { | |
| 70 DCHECK(current_enumerator_.get()); | |
| 71 return current_enumerator_->Size(); | |
| 72 } | |
| 73 virtual bool IsDirectory() OVERRIDE { | |
| 74 DCHECK(current_enumerator_.get()); | |
| 75 return current_enumerator_->IsDirectory(); | |
| 76 } | |
| 77 virtual base::Time LastModifiedTime() OVERRIDE { | |
| 78 DCHECK(current_enumerator_.get()); | |
| 79 return current_enumerator_->LastModifiedTime(); | |
| 80 } | |
| 81 | |
| 82 private: | |
| 83 std::vector<FileInfo> files_; | |
| 84 std::vector<FileInfo>::iterator file_iter_; | |
| 85 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> current_enumerator_; | |
| 86 }; | |
| 87 | |
| 88 base::FilePath RecursiveSetFileEnumerator::Next() { | |
| 89 if (current_enumerator_.get()) { | |
| 90 base::FilePath path = current_enumerator_->Next(); | |
| 91 if (!path.empty()) | |
| 92 return path; | |
| 93 } | |
| 94 | |
| 95 // We reached the end. | |
| 96 if (file_iter_ == files_.end()) | |
| 97 return base::FilePath(); | |
| 98 | |
| 99 // Enumerates subdirectories of the next path. | |
| 100 FileInfo& next_file = *file_iter_++; | |
| 101 current_enumerator_ = NativeFileUtil::CreateFileEnumerator( | |
| 102 next_file.path, true /* recursive */); | |
| 103 DCHECK(current_enumerator_.get()); | |
| 104 return current_enumerator_->Next(); | |
| 105 } | |
| 106 | |
| 107 } // namespace | 56 } // namespace |
| 108 | 57 |
| 109 //------------------------------------------------------------------------- | 58 //------------------------------------------------------------------------- |
| 110 | 59 |
| 111 IsolatedFileUtil::IsolatedFileUtil() {} | 60 IsolatedFileUtil::IsolatedFileUtil() {} |
| 112 | 61 |
| 113 PlatformFileError IsolatedFileUtil::GetLocalFilePath( | 62 PlatformFileError IsolatedFileUtil::GetLocalFilePath( |
| 114 FileSystemOperationContext* context, | 63 FileSystemOperationContext* context, |
| 115 const FileSystemURL& url, | 64 const FileSystemURL& url, |
| 116 base::FilePath* local_file_path) { | 65 base::FilePath* local_file_path) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 if (error == base::PLATFORM_FILE_OK) | 105 if (error == base::PLATFORM_FILE_OK) |
| 157 *platform_path = url.path(); | 106 *platform_path = url.path(); |
| 158 return error; | 107 return error; |
| 159 } | 108 } |
| 160 | 109 |
| 161 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> | 110 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> |
| 162 DraggedFileUtil::CreateFileEnumerator( | 111 DraggedFileUtil::CreateFileEnumerator( |
| 163 FileSystemOperationContext* context, | 112 FileSystemOperationContext* context, |
| 164 const FileSystemURL& root, | 113 const FileSystemURL& root, |
| 165 bool recursive) { | 114 bool recursive) { |
| 115 if (recursive) { |
| 116 NOTREACHED() << "Recursive enumeration not supported."; |
| 117 return scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator>( |
| 118 new EmptyFileEnumerator); |
| 119 } |
| 166 DCHECK(root.is_valid()); | 120 DCHECK(root.is_valid()); |
| 167 if (!root.path().empty()) | 121 if (!root.path().empty()) |
| 168 return NativeFileUtil::CreateFileEnumerator(root.path(), recursive); | 122 return LocalFileUtil::CreateFileEnumerator(context, root, recursive); |
| 169 | 123 |
| 170 // Root path case. | 124 // Root path case. |
| 171 std::vector<FileInfo> toplevels; | 125 std::vector<FileInfo> toplevels; |
| 172 IsolatedContext::GetInstance()->GetDraggedFileInfo( | 126 IsolatedContext::GetInstance()->GetDraggedFileInfo( |
| 173 root.filesystem_id(), &toplevels); | 127 root.filesystem_id(), &toplevels); |
| 174 if (!recursive) { | 128 return scoped_ptr<AbstractFileEnumerator>(new SetFileEnumerator(toplevels)); |
| 175 return make_scoped_ptr(new SetFileEnumerator(toplevels)) | |
| 176 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); | |
| 177 } | |
| 178 return make_scoped_ptr(new RecursiveSetFileEnumerator(toplevels)) | |
| 179 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); | |
| 180 } | 129 } |
| 181 | 130 |
| 182 } // namespace fileapi | 131 } // namespace fileapi |
| OLD | NEW |