| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/glue/plugins/pepper_file_ref.h" | 5 #include "webkit/plugins/ppapi/ppb_file_ref_impl.h" |
| 6 | 6 |
| 7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
| 8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "ppapi/c/pp_errors.h" | 9 #include "ppapi/c/pp_errors.h" |
| 10 #include "webkit/glue/plugins/pepper_common.h" | 10 #include "webkit/plugins/ppapi/common.h" |
| 11 #include "webkit/glue/plugins/pepper_directory_reader.h" | 11 #include "webkit/plugins/ppapi/file_callbacks.h" |
| 12 #include "webkit/glue/plugins/pepper_file_callbacks.h" | 12 #include "webkit/plugins/ppapi/plugin_delegate.h" |
| 13 #include "webkit/glue/plugins/pepper_file_system.h" | 13 #include "webkit/plugins/ppapi/plugin_instance.h" |
| 14 #include "webkit/glue/plugins/pepper_plugin_delegate.h" | 14 #include "webkit/plugins/ppapi/plugin_module.h" |
| 15 #include "webkit/glue/plugins/pepper_plugin_instance.h" | 15 #include "webkit/plugins/ppapi/ppb_directory_reader_impl.h" |
| 16 #include "webkit/glue/plugins/pepper_plugin_module.h" | 16 #include "webkit/plugins/ppapi/ppb_file_system_impl.h" |
| 17 #include "webkit/glue/plugins/pepper_var.h" | 17 #include "webkit/plugins/ppapi/var.h" |
| 18 | 18 |
| 19 namespace pepper { | 19 namespace webkit { |
| 20 namespace ppapi { |
| 20 | 21 |
| 21 namespace { | 22 namespace { |
| 22 | 23 |
| 23 bool IsValidLocalPath(const std::string& path) { | 24 bool IsValidLocalPath(const std::string& path) { |
| 24 // The path must start with '/' | 25 // The path must start with '/' |
| 25 if (path.empty() || path[0] != '/') | 26 if (path.empty() || path[0] != '/') |
| 26 return false; | 27 return false; |
| 27 | 28 |
| 28 // The path must contain valid UTF-8 characters. | 29 // The path must contain valid UTF-8 characters. |
| 29 if (!IsStringUTF8(path)) | 30 if (!IsStringUTF8(path)) |
| 30 return false; | 31 return false; |
| 31 | 32 |
| 32 return true; | 33 return true; |
| 33 } | 34 } |
| 34 | 35 |
| 35 void TrimTrailingSlash(std::string* path) { | 36 void TrimTrailingSlash(std::string* path) { |
| 36 // If this path ends with a slash, then normalize it away unless path is the | 37 // If this path ends with a slash, then normalize it away unless path is the |
| 37 // root path. | 38 // root path. |
| 38 if (path->size() > 1 && path->at(path->size() - 1) == '/') | 39 if (path->size() > 1 && path->at(path->size() - 1) == '/') |
| 39 path->erase(path->size() - 1, 1); | 40 path->erase(path->size() - 1, 1); |
| 40 } | 41 } |
| 41 | 42 |
| 42 PP_Resource Create(PP_Resource file_system_id, const char* path) { | 43 PP_Resource Create(PP_Resource file_system_id, const char* path) { |
| 43 scoped_refptr<FileSystem> file_system( | 44 scoped_refptr<PPB_FileSystem_Impl> file_system( |
| 44 Resource::GetAs<FileSystem>(file_system_id)); | 45 Resource::GetAs<PPB_FileSystem_Impl>(file_system_id)); |
| 45 if (!file_system) | 46 if (!file_system) |
| 46 return 0; | 47 return 0; |
| 47 | 48 |
| 48 if (!file_system->instance()) | 49 if (!file_system->instance()) |
| 49 return 0; | 50 return 0; |
| 50 | 51 |
| 51 std::string validated_path(path); | 52 std::string validated_path(path); |
| 52 if (!IsValidLocalPath(validated_path)) | 53 if (!IsValidLocalPath(validated_path)) |
| 53 return 0; | 54 return 0; |
| 54 TrimTrailingSlash(&validated_path); | 55 TrimTrailingSlash(&validated_path); |
| 55 | 56 |
| 56 FileRef* file_ref = new FileRef(file_system->instance()->module(), | 57 PPB_FileRef_Impl* file_ref = |
| 57 file_system, | 58 new PPB_FileRef_Impl(file_system->instance()->module(), |
| 58 validated_path); | 59 file_system, validated_path); |
| 59 return file_ref->GetReference(); | 60 return file_ref->GetReference(); |
| 60 } | 61 } |
| 61 | 62 |
| 62 PP_Bool IsFileRef(PP_Resource resource) { | 63 PP_Bool IsFileRef(PP_Resource resource) { |
| 63 return BoolToPPBool(!!Resource::GetAs<FileRef>(resource)); | 64 return BoolToPPBool(!!Resource::GetAs<PPB_FileRef_Impl>(resource)); |
| 64 } | 65 } |
| 65 | 66 |
| 66 PP_FileSystemType_Dev GetFileSystemType(PP_Resource file_ref_id) { | 67 PP_FileSystemType_Dev GetFileSystemType(PP_Resource file_ref_id) { |
| 67 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); | 68 scoped_refptr<PPB_FileRef_Impl> file_ref( |
| 69 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id)); |
| 68 if (!file_ref) | 70 if (!file_ref) |
| 69 return PP_FILESYSTEMTYPE_EXTERNAL; | 71 return PP_FILESYSTEMTYPE_EXTERNAL; |
| 70 return file_ref->GetFileSystemType(); | 72 return file_ref->GetFileSystemType(); |
| 71 } | 73 } |
| 72 | 74 |
| 73 PP_Var GetName(PP_Resource file_ref_id) { | 75 PP_Var GetName(PP_Resource file_ref_id) { |
| 74 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); | 76 scoped_refptr<PPB_FileRef_Impl> file_ref( |
| 77 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id)); |
| 75 if (!file_ref) | 78 if (!file_ref) |
| 76 return PP_MakeUndefined(); | 79 return PP_MakeUndefined(); |
| 77 return StringVar::StringToPPVar(file_ref->module(), file_ref->GetName()); | 80 return StringVar::StringToPPVar(file_ref->module(), file_ref->GetName()); |
| 78 } | 81 } |
| 79 | 82 |
| 80 PP_Var GetPath(PP_Resource file_ref_id) { | 83 PP_Var GetPath(PP_Resource file_ref_id) { |
| 81 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); | 84 scoped_refptr<PPB_FileRef_Impl> file_ref( |
| 85 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id)); |
| 82 if (!file_ref) | 86 if (!file_ref) |
| 83 return PP_MakeUndefined(); | 87 return PP_MakeUndefined(); |
| 84 | 88 |
| 85 if (file_ref->GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) | 89 if (file_ref->GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) |
| 86 return PP_MakeUndefined(); | 90 return PP_MakeUndefined(); |
| 87 | 91 |
| 88 return StringVar::StringToPPVar(file_ref->module(), file_ref->GetPath()); | 92 return StringVar::StringToPPVar(file_ref->module(), file_ref->GetPath()); |
| 89 } | 93 } |
| 90 | 94 |
| 91 PP_Resource GetParent(PP_Resource file_ref_id) { | 95 PP_Resource GetParent(PP_Resource file_ref_id) { |
| 92 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); | 96 scoped_refptr<PPB_FileRef_Impl> file_ref( |
| 97 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id)); |
| 93 if (!file_ref) | 98 if (!file_ref) |
| 94 return 0; | 99 return 0; |
| 95 | 100 |
| 96 if (file_ref->GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) | 101 if (file_ref->GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) |
| 97 return 0; | 102 return 0; |
| 98 | 103 |
| 99 scoped_refptr<FileRef> parent_ref(file_ref->GetParent()); | 104 scoped_refptr<PPB_FileRef_Impl> parent_ref(file_ref->GetParent()); |
| 100 if (!parent_ref) | 105 if (!parent_ref) |
| 101 return 0; | 106 return 0; |
| 102 | 107 |
| 103 return parent_ref->GetReference(); | 108 return parent_ref->GetReference(); |
| 104 } | 109 } |
| 105 | 110 |
| 106 int32_t MakeDirectory(PP_Resource directory_ref_id, | 111 int32_t MakeDirectory(PP_Resource directory_ref_id, |
| 107 PP_Bool make_ancestors, | 112 PP_Bool make_ancestors, |
| 108 PP_CompletionCallback callback) { | 113 PP_CompletionCallback callback) { |
| 109 scoped_refptr<FileRef> directory_ref( | 114 scoped_refptr<PPB_FileRef_Impl> directory_ref( |
| 110 Resource::GetAs<FileRef>(directory_ref_id)); | 115 Resource::GetAs<PPB_FileRef_Impl>(directory_ref_id)); |
| 111 if (!directory_ref) | 116 if (!directory_ref) |
| 112 return PP_ERROR_BADRESOURCE; | 117 return PP_ERROR_BADRESOURCE; |
| 113 | 118 |
| 114 scoped_refptr<FileSystem> file_system = directory_ref->GetFileSystem(); | 119 scoped_refptr<PPB_FileSystem_Impl> file_system = directory_ref->GetFileSystem(
); |
| 115 if (!file_system || !file_system->opened() || | 120 if (!file_system || !file_system->opened() || |
| 116 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) | 121 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
| 117 return PP_ERROR_NOACCESS; | 122 return PP_ERROR_NOACCESS; |
| 118 | 123 |
| 119 PluginInstance* instance = file_system->instance(); | 124 PluginInstance* instance = file_system->instance(); |
| 120 if (!instance->delegate()->MakeDirectory( | 125 if (!instance->delegate()->MakeDirectory( |
| 121 directory_ref->GetSystemPath(), PPBoolToBool(make_ancestors), | 126 directory_ref->GetSystemPath(), PPBoolToBool(make_ancestors), |
| 122 new FileCallbacks(instance->module()->AsWeakPtr(), | 127 new FileCallbacks(instance->module()->AsWeakPtr(), |
| 123 callback, NULL, NULL, NULL))) | 128 callback, NULL, NULL, NULL))) |
| 124 return PP_ERROR_FAILED; | 129 return PP_ERROR_FAILED; |
| 125 | 130 |
| 126 return PP_ERROR_WOULDBLOCK; | 131 return PP_ERROR_WOULDBLOCK; |
| 127 } | 132 } |
| 128 | 133 |
| 129 int32_t Query(PP_Resource file_ref_id, | 134 int32_t Query(PP_Resource file_ref_id, |
| 130 PP_FileInfo_Dev* info, | 135 PP_FileInfo_Dev* info, |
| 131 PP_CompletionCallback callback) { | 136 PP_CompletionCallback callback) { |
| 132 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); | 137 scoped_refptr<PPB_FileRef_Impl> file_ref( |
| 138 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id)); |
| 133 if (!file_ref) | 139 if (!file_ref) |
| 134 return PP_ERROR_BADRESOURCE; | 140 return PP_ERROR_BADRESOURCE; |
| 135 | 141 |
| 136 scoped_refptr<FileSystem> file_system = file_ref->GetFileSystem(); | 142 scoped_refptr<PPB_FileSystem_Impl> file_system = file_ref->GetFileSystem(); |
| 137 if (!file_system || !file_system->opened() || | 143 if (!file_system || !file_system->opened() || |
| 138 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) | 144 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
| 139 return PP_ERROR_NOACCESS; | 145 return PP_ERROR_NOACCESS; |
| 140 | 146 |
| 141 PluginInstance* instance = file_system->instance(); | 147 PluginInstance* instance = file_system->instance(); |
| 142 if (!instance->delegate()->Query( | 148 if (!instance->delegate()->Query( |
| 143 file_ref->GetSystemPath(), | 149 file_ref->GetSystemPath(), |
| 144 new FileCallbacks(instance->module()->AsWeakPtr(), | 150 new FileCallbacks(instance->module()->AsWeakPtr(), |
| 145 callback, info, file_system, NULL))) | 151 callback, info, file_system, NULL))) |
| 146 return PP_ERROR_FAILED; | 152 return PP_ERROR_FAILED; |
| 147 | 153 |
| 148 return PP_ERROR_WOULDBLOCK; | 154 return PP_ERROR_WOULDBLOCK; |
| 149 } | 155 } |
| 150 | 156 |
| 151 int32_t Touch(PP_Resource file_ref_id, | 157 int32_t Touch(PP_Resource file_ref_id, |
| 152 PP_Time last_access_time, | 158 PP_Time last_access_time, |
| 153 PP_Time last_modified_time, | 159 PP_Time last_modified_time, |
| 154 PP_CompletionCallback callback) { | 160 PP_CompletionCallback callback) { |
| 155 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); | 161 scoped_refptr<PPB_FileRef_Impl> file_ref( |
| 162 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id)); |
| 156 if (!file_ref) | 163 if (!file_ref) |
| 157 return PP_ERROR_BADRESOURCE; | 164 return PP_ERROR_BADRESOURCE; |
| 158 | 165 |
| 159 scoped_refptr<FileSystem> file_system = file_ref->GetFileSystem(); | 166 scoped_refptr<PPB_FileSystem_Impl> file_system = file_ref->GetFileSystem(); |
| 160 if (!file_system || !file_system->opened() || | 167 if (!file_system || !file_system->opened() || |
| 161 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) | 168 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
| 162 return PP_ERROR_NOACCESS; | 169 return PP_ERROR_NOACCESS; |
| 163 | 170 |
| 164 PluginInstance* instance = file_system->instance(); | 171 PluginInstance* instance = file_system->instance(); |
| 165 if (!instance->delegate()->Touch( | 172 if (!instance->delegate()->Touch( |
| 166 file_ref->GetSystemPath(), base::Time::FromDoubleT(last_access_time), | 173 file_ref->GetSystemPath(), base::Time::FromDoubleT(last_access_time), |
| 167 base::Time::FromDoubleT(last_modified_time), | 174 base::Time::FromDoubleT(last_modified_time), |
| 168 new FileCallbacks(instance->module()->AsWeakPtr(), | 175 new FileCallbacks(instance->module()->AsWeakPtr(), |
| 169 callback, NULL, NULL, NULL))) | 176 callback, NULL, NULL, NULL))) |
| 170 return PP_ERROR_FAILED; | 177 return PP_ERROR_FAILED; |
| 171 | 178 |
| 172 return PP_ERROR_WOULDBLOCK; | 179 return PP_ERROR_WOULDBLOCK; |
| 173 } | 180 } |
| 174 | 181 |
| 175 int32_t Delete(PP_Resource file_ref_id, | 182 int32_t Delete(PP_Resource file_ref_id, |
| 176 PP_CompletionCallback callback) { | 183 PP_CompletionCallback callback) { |
| 177 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); | 184 scoped_refptr<PPB_FileRef_Impl> file_ref( |
| 185 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id)); |
| 178 if (!file_ref) | 186 if (!file_ref) |
| 179 return PP_ERROR_BADRESOURCE; | 187 return PP_ERROR_BADRESOURCE; |
| 180 | 188 |
| 181 scoped_refptr<FileSystem> file_system = file_ref->GetFileSystem(); | 189 scoped_refptr<PPB_FileSystem_Impl> file_system = file_ref->GetFileSystem(); |
| 182 if (!file_system || !file_system->opened() || | 190 if (!file_system || !file_system->opened() || |
| 183 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) | 191 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
| 184 return PP_ERROR_NOACCESS; | 192 return PP_ERROR_NOACCESS; |
| 185 | 193 |
| 186 PluginInstance* instance = file_system->instance(); | 194 PluginInstance* instance = file_system->instance(); |
| 187 if (!instance->delegate()->Delete( | 195 if (!instance->delegate()->Delete( |
| 188 file_ref->GetSystemPath(), | 196 file_ref->GetSystemPath(), |
| 189 new FileCallbacks(instance->module()->AsWeakPtr(), | 197 new FileCallbacks(instance->module()->AsWeakPtr(), |
| 190 callback, NULL, NULL, NULL))) | 198 callback, NULL, NULL, NULL))) |
| 191 return PP_ERROR_FAILED; | 199 return PP_ERROR_FAILED; |
| 192 | 200 |
| 193 return PP_ERROR_WOULDBLOCK; | 201 return PP_ERROR_WOULDBLOCK; |
| 194 } | 202 } |
| 195 | 203 |
| 196 int32_t Rename(PP_Resource file_ref_id, | 204 int32_t Rename(PP_Resource file_ref_id, |
| 197 PP_Resource new_file_ref_id, | 205 PP_Resource new_file_ref_id, |
| 198 PP_CompletionCallback callback) { | 206 PP_CompletionCallback callback) { |
| 199 scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); | 207 scoped_refptr<PPB_FileRef_Impl> file_ref( |
| 208 Resource::GetAs<PPB_FileRef_Impl>(file_ref_id)); |
| 200 if (!file_ref) | 209 if (!file_ref) |
| 201 return PP_ERROR_BADRESOURCE; | 210 return PP_ERROR_BADRESOURCE; |
| 202 | 211 |
| 203 scoped_refptr<FileRef> new_file_ref( | 212 scoped_refptr<PPB_FileRef_Impl> new_file_ref( |
| 204 Resource::GetAs<FileRef>(new_file_ref_id)); | 213 Resource::GetAs<PPB_FileRef_Impl>(new_file_ref_id)); |
| 205 if (!new_file_ref) | 214 if (!new_file_ref) |
| 206 return PP_ERROR_BADRESOURCE; | 215 return PP_ERROR_BADRESOURCE; |
| 207 | 216 |
| 208 scoped_refptr<FileSystem> file_system = file_ref->GetFileSystem(); | 217 scoped_refptr<PPB_FileSystem_Impl> file_system = file_ref->GetFileSystem(); |
| 209 if (!file_system || !file_system->opened() || | 218 if (!file_system || !file_system->opened() || |
| 210 (file_system != new_file_ref->GetFileSystem()) || | 219 (file_system != new_file_ref->GetFileSystem()) || |
| 211 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) | 220 (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
| 212 return PP_ERROR_NOACCESS; | 221 return PP_ERROR_NOACCESS; |
| 213 | 222 |
| 214 PluginInstance* instance = file_system->instance(); | 223 PluginInstance* instance = file_system->instance(); |
| 215 if (!instance->delegate()->Rename( | 224 if (!instance->delegate()->Rename( |
| 216 file_ref->GetSystemPath(), new_file_ref->GetSystemPath(), | 225 file_ref->GetSystemPath(), new_file_ref->GetSystemPath(), |
| 217 new FileCallbacks(instance->module()->AsWeakPtr(), | 226 new FileCallbacks(instance->module()->AsWeakPtr(), |
| 218 callback, NULL, NULL, NULL))) | 227 callback, NULL, NULL, NULL))) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 230 &GetParent, | 239 &GetParent, |
| 231 &MakeDirectory, | 240 &MakeDirectory, |
| 232 &Query, | 241 &Query, |
| 233 &Touch, | 242 &Touch, |
| 234 &Delete, | 243 &Delete, |
| 235 &Rename | 244 &Rename |
| 236 }; | 245 }; |
| 237 | 246 |
| 238 } // namespace | 247 } // namespace |
| 239 | 248 |
| 240 FileRef::FileRef() | 249 PPB_FileRef_Impl::PPB_FileRef_Impl() |
| 241 : Resource(NULL), | 250 : Resource(NULL), |
| 242 file_system_(NULL) { | 251 file_system_(NULL) { |
| 243 } | 252 } |
| 244 | 253 |
| 245 FileRef::FileRef(PluginModule* module, | 254 PPB_FileRef_Impl::PPB_FileRef_Impl(PluginModule* module, |
| 246 scoped_refptr<FileSystem> file_system, | 255 scoped_refptr<PPB_FileSystem_Impl> file_system, |
| 247 const std::string& validated_path) | 256 const std::string& validated_path) |
| 248 : Resource(module), | 257 : Resource(module), |
| 249 file_system_(file_system), | 258 file_system_(file_system), |
| 250 virtual_path_(validated_path) { | 259 virtual_path_(validated_path) { |
| 251 } | 260 } |
| 252 | 261 |
| 253 FileRef::FileRef(PluginModule* module, | 262 PPB_FileRef_Impl::PPB_FileRef_Impl(PluginModule* module, |
| 254 const FilePath& external_file_path) | 263 const FilePath& external_file_path) |
| 255 : Resource(module), | 264 : Resource(module), |
| 256 file_system_(NULL), | 265 file_system_(NULL), |
| 257 system_path_(external_file_path) { | 266 system_path_(external_file_path) { |
| 258 } | 267 } |
| 259 | 268 |
| 260 FileRef::~FileRef() { | 269 PPB_FileRef_Impl::~PPB_FileRef_Impl() { |
| 261 } | 270 } |
| 262 | 271 |
| 263 // static | 272 // static |
| 264 const PPB_FileRef_Dev* FileRef::GetInterface() { | 273 const PPB_FileRef_Dev* PPB_FileRef_Impl::GetInterface() { |
| 265 return &ppb_fileref; | 274 return &ppb_fileref; |
| 266 } | 275 } |
| 267 | 276 |
| 268 FileRef* FileRef::AsFileRef() { | 277 PPB_FileRef_Impl* PPB_FileRef_Impl::AsPPB_FileRef_Impl() { |
| 269 return this; | 278 return this; |
| 270 } | 279 } |
| 271 | 280 |
| 272 std::string FileRef::GetName() const { | 281 std::string PPB_FileRef_Impl::GetName() const { |
| 273 if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) { | 282 if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) { |
| 274 FilePath::StringType path = system_path_.value(); | 283 FilePath::StringType path = system_path_.value(); |
| 275 size_t pos = path.rfind(FilePath::kSeparators[0]); | 284 size_t pos = path.rfind(FilePath::kSeparators[0]); |
| 276 DCHECK(pos != FilePath::StringType::npos); | 285 DCHECK(pos != FilePath::StringType::npos); |
| 277 #if defined(OS_WIN) | 286 #if defined(OS_WIN) |
| 278 return WideToUTF8(path.substr(pos + 1)); | 287 return WideToUTF8(path.substr(pos + 1)); |
| 279 #elif defined(OS_POSIX) | 288 #elif defined(OS_POSIX) |
| 280 return path.substr(pos + 1); | 289 return path.substr(pos + 1); |
| 281 #else | 290 #else |
| 282 #error "Unsupported platform." | 291 #error "Unsupported platform." |
| 283 #endif | 292 #endif |
| 284 } | 293 } |
| 285 | 294 |
| 286 if (virtual_path_.size() == 1 && virtual_path_[0] == '/') | 295 if (virtual_path_.size() == 1 && virtual_path_[0] == '/') |
| 287 return virtual_path_; | 296 return virtual_path_; |
| 288 | 297 |
| 289 // There should always be a leading slash at least! | 298 // There should always be a leading slash at least! |
| 290 size_t pos = virtual_path_.rfind('/'); | 299 size_t pos = virtual_path_.rfind('/'); |
| 291 DCHECK(pos != std::string::npos); | 300 DCHECK(pos != std::string::npos); |
| 292 | 301 |
| 293 return virtual_path_.substr(pos + 1); | 302 return virtual_path_.substr(pos + 1); |
| 294 } | 303 } |
| 295 | 304 |
| 296 scoped_refptr<FileRef> FileRef::GetParent() { | 305 scoped_refptr<PPB_FileRef_Impl> PPB_FileRef_Impl::GetParent() { |
| 297 if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) | 306 if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) |
| 298 return new FileRef(); | 307 return new PPB_FileRef_Impl(); |
| 299 | 308 |
| 300 // There should always be a leading slash at least! | 309 // There should always be a leading slash at least! |
| 301 size_t pos = virtual_path_.rfind('/'); | 310 size_t pos = virtual_path_.rfind('/'); |
| 302 DCHECK(pos != std::string::npos); | 311 DCHECK(pos != std::string::npos); |
| 303 | 312 |
| 304 // If the path is "/foo", then we want to include the slash. | 313 // If the path is "/foo", then we want to include the slash. |
| 305 if (pos == 0) | 314 if (pos == 0) |
| 306 pos++; | 315 pos++; |
| 307 std::string parent_path = virtual_path_.substr(0, pos); | 316 std::string parent_path = virtual_path_.substr(0, pos); |
| 308 | 317 |
| 309 FileRef* parent_ref = new FileRef(module(), file_system_, parent_path); | 318 PPB_FileRef_Impl* parent_ref = new PPB_FileRef_Impl(module(), file_system_, |
| 319 parent_path); |
| 310 return parent_ref; | 320 return parent_ref; |
| 311 } | 321 } |
| 312 | 322 |
| 313 scoped_refptr<FileSystem> FileRef::GetFileSystem() const { | 323 scoped_refptr<PPB_FileSystem_Impl> PPB_FileRef_Impl::GetFileSystem() const { |
| 314 return file_system_; | 324 return file_system_; |
| 315 } | 325 } |
| 316 | 326 |
| 317 PP_FileSystemType_Dev FileRef::GetFileSystemType() const { | 327 PP_FileSystemType_Dev PPB_FileRef_Impl::GetFileSystemType() const { |
| 318 if (!file_system_) | 328 if (!file_system_) |
| 319 return PP_FILESYSTEMTYPE_EXTERNAL; | 329 return PP_FILESYSTEMTYPE_EXTERNAL; |
| 320 | 330 |
| 321 return file_system_->type(); | 331 return file_system_->type(); |
| 322 } | 332 } |
| 323 | 333 |
| 324 std::string FileRef::GetPath() const { | 334 std::string PPB_FileRef_Impl::GetPath() const { |
| 325 return virtual_path_; | 335 return virtual_path_; |
| 326 } | 336 } |
| 327 | 337 |
| 328 FilePath FileRef::GetSystemPath() const { | 338 FilePath PPB_FileRef_Impl::GetSystemPath() const { |
| 329 if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) | 339 if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) |
| 330 return system_path_; | 340 return system_path_; |
| 331 | 341 |
| 332 // Since |virtual_path_| starts with a '/', it is considered an absolute path | 342 // Since |virtual_path_| starts with a '/', it is considered an absolute path |
| 333 // on POSIX systems. We need to remove the '/' before calling Append() or we | 343 // on POSIX systems. We need to remove the '/' before calling Append() or we |
| 334 // will run into a DCHECK. | 344 // will run into a DCHECK. |
| 335 FilePath virtual_file_path( | 345 FilePath virtual_file_path( |
| 336 #if defined(OS_WIN) | 346 #if defined(OS_WIN) |
| 337 UTF8ToWide(virtual_path_.substr(1)) | 347 UTF8ToWide(virtual_path_.substr(1)) |
| 338 #elif defined(OS_POSIX) | 348 #elif defined(OS_POSIX) |
| 339 virtual_path_.substr(1) | 349 virtual_path_.substr(1) |
| 340 #else | 350 #else |
| 341 #error "Unsupported platform." | 351 #error "Unsupported platform." |
| 342 #endif | 352 #endif |
| 343 ); | 353 ); |
| 344 return file_system_->root_path().Append(virtual_file_path); | 354 return file_system_->root_path().Append(virtual_file_path); |
| 345 } | 355 } |
| 346 | 356 |
| 347 } // namespace pepper | 357 } // namespace ppapi |
| 358 } // namespace webkit |
| 359 |
| OLD | NEW |