| 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 16 matching lines...) Expand all Loading... |
| 27 // Used to enumerate top-level paths of an isolated filesystem. | 27 // Used to enumerate top-level paths of an isolated filesystem. |
| 28 class SetFileEnumerator : public FileSystemFileUtil::AbstractFileEnumerator { | 28 class SetFileEnumerator : public FileSystemFileUtil::AbstractFileEnumerator { |
| 29 public: | 29 public: |
| 30 explicit SetFileEnumerator(const std::vector<FileInfo>& files) | 30 explicit SetFileEnumerator(const std::vector<FileInfo>& files) |
| 31 : files_(files) { | 31 : files_(files) { |
| 32 file_iter_ = files_.begin(); | 32 file_iter_ = files_.begin(); |
| 33 } | 33 } |
| 34 virtual ~SetFileEnumerator() {} | 34 virtual ~SetFileEnumerator() {} |
| 35 | 35 |
| 36 // AbstractFileEnumerator overrides. | 36 // AbstractFileEnumerator overrides. |
| 37 virtual FilePath Next() OVERRIDE { | 37 virtual base::FilePath Next() OVERRIDE { |
| 38 if (file_iter_ == files_.end()) | 38 if (file_iter_ == files_.end()) |
| 39 return FilePath(); | 39 return base::FilePath(); |
| 40 FilePath platform_file = (file_iter_++)->path; | 40 base::FilePath platform_file = (file_iter_++)->path; |
| 41 NativeFileUtil::GetFileInfo(platform_file, &file_info_); | 41 NativeFileUtil::GetFileInfo(platform_file, &file_info_); |
| 42 return platform_file; | 42 return platform_file; |
| 43 } | 43 } |
| 44 virtual int64 Size() OVERRIDE { return file_info_.size; } | 44 virtual int64 Size() OVERRIDE { return file_info_.size; } |
| 45 virtual bool IsDirectory() OVERRIDE { return file_info_.is_directory; } | 45 virtual bool IsDirectory() OVERRIDE { return file_info_.is_directory; } |
| 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. | 56 // Recursively enumerate each path from a given paths set. |
| 57 class RecursiveSetFileEnumerator | 57 class RecursiveSetFileEnumerator |
| 58 : public FileSystemFileUtil::AbstractFileEnumerator { | 58 : public FileSystemFileUtil::AbstractFileEnumerator { |
| 59 public: | 59 public: |
| 60 explicit RecursiveSetFileEnumerator(const std::vector<FileInfo>& files) | 60 explicit RecursiveSetFileEnumerator(const std::vector<FileInfo>& files) |
| 61 : files_(files) { | 61 : files_(files) { |
| 62 file_iter_ = files_.begin(); | 62 file_iter_ = files_.begin(); |
| 63 current_enumerator_.reset(new SetFileEnumerator(files)); | 63 current_enumerator_.reset(new SetFileEnumerator(files)); |
| 64 } | 64 } |
| 65 virtual ~RecursiveSetFileEnumerator() {} | 65 virtual ~RecursiveSetFileEnumerator() {} |
| 66 | 66 |
| 67 // AbstractFileEnumerator overrides. | 67 // AbstractFileEnumerator overrides. |
| 68 virtual FilePath Next() OVERRIDE; | 68 virtual base::FilePath Next() OVERRIDE; |
| 69 virtual int64 Size() OVERRIDE { | 69 virtual int64 Size() OVERRIDE { |
| 70 DCHECK(current_enumerator_.get()); | 70 DCHECK(current_enumerator_.get()); |
| 71 return current_enumerator_->Size(); | 71 return current_enumerator_->Size(); |
| 72 } | 72 } |
| 73 virtual bool IsDirectory() OVERRIDE { | 73 virtual bool IsDirectory() OVERRIDE { |
| 74 DCHECK(current_enumerator_.get()); | 74 DCHECK(current_enumerator_.get()); |
| 75 return current_enumerator_->IsDirectory(); | 75 return current_enumerator_->IsDirectory(); |
| 76 } | 76 } |
| 77 virtual base::Time LastModifiedTime() OVERRIDE { | 77 virtual base::Time LastModifiedTime() OVERRIDE { |
| 78 DCHECK(current_enumerator_.get()); | 78 DCHECK(current_enumerator_.get()); |
| 79 return current_enumerator_->LastModifiedTime(); | 79 return current_enumerator_->LastModifiedTime(); |
| 80 } | 80 } |
| 81 | 81 |
| 82 private: | 82 private: |
| 83 std::vector<FileInfo> files_; | 83 std::vector<FileInfo> files_; |
| 84 std::vector<FileInfo>::iterator file_iter_; | 84 std::vector<FileInfo>::iterator file_iter_; |
| 85 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> current_enumerator_; | 85 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> current_enumerator_; |
| 86 }; | 86 }; |
| 87 | 87 |
| 88 FilePath RecursiveSetFileEnumerator::Next() { | 88 base::FilePath RecursiveSetFileEnumerator::Next() { |
| 89 if (current_enumerator_.get()) { | 89 if (current_enumerator_.get()) { |
| 90 FilePath path = current_enumerator_->Next(); | 90 base::FilePath path = current_enumerator_->Next(); |
| 91 if (!path.empty()) | 91 if (!path.empty()) |
| 92 return path; | 92 return path; |
| 93 } | 93 } |
| 94 | 94 |
| 95 // We reached the end. | 95 // We reached the end. |
| 96 if (file_iter_ == files_.end()) | 96 if (file_iter_ == files_.end()) |
| 97 return FilePath(); | 97 return base::FilePath(); |
| 98 | 98 |
| 99 // Enumerates subdirectories of the next path. | 99 // Enumerates subdirectories of the next path. |
| 100 FileInfo& next_file = *file_iter_++; | 100 FileInfo& next_file = *file_iter_++; |
| 101 current_enumerator_ = NativeFileUtil::CreateFileEnumerator( | 101 current_enumerator_ = NativeFileUtil::CreateFileEnumerator( |
| 102 next_file.path, true /* recursive */); | 102 next_file.path, true /* recursive */); |
| 103 DCHECK(current_enumerator_.get()); | 103 DCHECK(current_enumerator_.get()); |
| 104 return current_enumerator_->Next(); | 104 return current_enumerator_->Next(); |
| 105 } | 105 } |
| 106 | 106 |
| 107 } // namespace | 107 } // namespace |
| 108 | 108 |
| 109 //------------------------------------------------------------------------- | 109 //------------------------------------------------------------------------- |
| 110 | 110 |
| 111 IsolatedFileUtil::IsolatedFileUtil() {} | 111 IsolatedFileUtil::IsolatedFileUtil() {} |
| 112 | 112 |
| 113 PlatformFileError IsolatedFileUtil::GetLocalFilePath( | 113 PlatformFileError IsolatedFileUtil::GetLocalFilePath( |
| 114 FileSystemOperationContext* context, | 114 FileSystemOperationContext* context, |
| 115 const FileSystemURL& url, | 115 const FileSystemURL& url, |
| 116 FilePath* local_file_path) { | 116 base::FilePath* local_file_path) { |
| 117 DCHECK(local_file_path); | 117 DCHECK(local_file_path); |
| 118 DCHECK(url.is_valid()); | 118 DCHECK(url.is_valid()); |
| 119 if (url.path().empty()) { | 119 if (url.path().empty()) { |
| 120 // Root direcory case, which should not be accessed. | 120 // Root direcory case, which should not be accessed. |
| 121 return base::PLATFORM_FILE_ERROR_ACCESS_DENIED; | 121 return base::PLATFORM_FILE_ERROR_ACCESS_DENIED; |
| 122 } | 122 } |
| 123 *local_file_path = url.path(); | 123 *local_file_path = url.path(); |
| 124 return base::PLATFORM_FILE_OK; | 124 return base::PLATFORM_FILE_OK; |
| 125 } | 125 } |
| 126 | 126 |
| 127 //------------------------------------------------------------------------- | 127 //------------------------------------------------------------------------- |
| 128 | 128 |
| 129 DraggedFileUtil::DraggedFileUtil() {} | 129 DraggedFileUtil::DraggedFileUtil() {} |
| 130 | 130 |
| 131 PlatformFileError DraggedFileUtil::GetFileInfo( | 131 PlatformFileError DraggedFileUtil::GetFileInfo( |
| 132 FileSystemOperationContext* context, | 132 FileSystemOperationContext* context, |
| 133 const FileSystemURL& url, | 133 const FileSystemURL& url, |
| 134 PlatformFileInfo* file_info, | 134 PlatformFileInfo* file_info, |
| 135 FilePath* platform_path) { | 135 base::FilePath* platform_path) { |
| 136 DCHECK(file_info); | 136 DCHECK(file_info); |
| 137 std::string filesystem_id; | 137 std::string filesystem_id; |
| 138 DCHECK(url.is_valid()); | 138 DCHECK(url.is_valid()); |
| 139 if (url.path().empty()) { | 139 if (url.path().empty()) { |
| 140 // The root directory case. | 140 // The root directory case. |
| 141 // For now we leave three time fields (modified/accessed/creation time) | 141 // For now we leave three time fields (modified/accessed/creation time) |
| 142 // NULL as it is not really clear what to be set for this virtual directory. | 142 // NULL as it is not really clear what to be set for this virtual directory. |
| 143 // TODO(kinuko): Maybe we want to set the time when this filesystem is | 143 // TODO(kinuko): Maybe we want to set the time when this filesystem is |
| 144 // created (i.e. when the files/directories are dropped). | 144 // created (i.e. when the files/directories are dropped). |
| 145 file_info->is_directory = true; | 145 file_info->is_directory = true; |
| 146 file_info->is_symbolic_link = false; | 146 file_info->is_symbolic_link = false; |
| 147 file_info->size = 0; | 147 file_info->size = 0; |
| 148 return base::PLATFORM_FILE_OK; | 148 return base::PLATFORM_FILE_OK; |
| 149 } | 149 } |
| 150 base::PlatformFileError error = | 150 base::PlatformFileError error = |
| 151 NativeFileUtil::GetFileInfo(url.path(), file_info); | 151 NativeFileUtil::GetFileInfo(url.path(), file_info); |
| 152 if (file_util::IsLink(url.path()) && !FilePath().IsParent(url.path())) { | 152 if (file_util::IsLink(url.path()) && !base::FilePath().IsParent(url.path())) { |
| 153 // Don't follow symlinks unless it's the one that are selected by the user. | 153 // Don't follow symlinks unless it's the one that are selected by the user. |
| 154 return base::PLATFORM_FILE_ERROR_NOT_FOUND; | 154 return base::PLATFORM_FILE_ERROR_NOT_FOUND; |
| 155 } | 155 } |
| 156 if (error == base::PLATFORM_FILE_OK) | 156 if (error == base::PLATFORM_FILE_OK) |
| 157 *platform_path = url.path(); | 157 *platform_path = url.path(); |
| 158 return error; | 158 return error; |
| 159 } | 159 } |
| 160 | 160 |
| 161 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> | 161 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> |
| 162 DraggedFileUtil::CreateFileEnumerator( | 162 DraggedFileUtil::CreateFileEnumerator( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 173 root.filesystem_id(), &toplevels); | 173 root.filesystem_id(), &toplevels); |
| 174 if (!recursive) { | 174 if (!recursive) { |
| 175 return make_scoped_ptr(new SetFileEnumerator(toplevels)) | 175 return make_scoped_ptr(new SetFileEnumerator(toplevels)) |
| 176 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); | 176 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); |
| 177 } | 177 } |
| 178 return make_scoped_ptr(new RecursiveSetFileEnumerator(toplevels)) | 178 return make_scoped_ptr(new RecursiveSetFileEnumerator(toplevels)) |
| 179 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); | 179 .PassAs<FileSystemFileUtil::AbstractFileEnumerator>(); |
| 180 } | 180 } |
| 181 | 181 |
| 182 } // namespace fileapi | 182 } // namespace fileapi |
| OLD | NEW |