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 |