Index: webkit/glue/plugins/pepper_file_ref.cc |
=================================================================== |
--- webkit/glue/plugins/pepper_file_ref.cc (revision 69381) |
+++ webkit/glue/plugins/pepper_file_ref.cc (working copy) |
@@ -1,347 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "webkit/glue/plugins/pepper_file_ref.h" |
- |
-#include "base/string_util.h" |
-#include "base/utf_string_conversions.h" |
-#include "ppapi/c/pp_errors.h" |
-#include "webkit/glue/plugins/pepper_common.h" |
-#include "webkit/glue/plugins/pepper_directory_reader.h" |
-#include "webkit/glue/plugins/pepper_file_callbacks.h" |
-#include "webkit/glue/plugins/pepper_file_system.h" |
-#include "webkit/glue/plugins/pepper_plugin_delegate.h" |
-#include "webkit/glue/plugins/pepper_plugin_instance.h" |
-#include "webkit/glue/plugins/pepper_plugin_module.h" |
-#include "webkit/glue/plugins/pepper_var.h" |
- |
-namespace pepper { |
- |
-namespace { |
- |
-bool IsValidLocalPath(const std::string& path) { |
- // The path must start with '/' |
- if (path.empty() || path[0] != '/') |
- return false; |
- |
- // The path must contain valid UTF-8 characters. |
- if (!IsStringUTF8(path)) |
- return false; |
- |
- return true; |
-} |
- |
-void TrimTrailingSlash(std::string* path) { |
- // If this path ends with a slash, then normalize it away unless path is the |
- // root path. |
- if (path->size() > 1 && path->at(path->size() - 1) == '/') |
- path->erase(path->size() - 1, 1); |
-} |
- |
-PP_Resource Create(PP_Resource file_system_id, const char* path) { |
- scoped_refptr<FileSystem> file_system( |
- Resource::GetAs<FileSystem>(file_system_id)); |
- if (!file_system) |
- return 0; |
- |
- if (!file_system->instance()) |
- return 0; |
- |
- std::string validated_path(path); |
- if (!IsValidLocalPath(validated_path)) |
- return 0; |
- TrimTrailingSlash(&validated_path); |
- |
- FileRef* file_ref = new FileRef(file_system->instance()->module(), |
- file_system, |
- validated_path); |
- return file_ref->GetReference(); |
-} |
- |
-PP_Bool IsFileRef(PP_Resource resource) { |
- return BoolToPPBool(!!Resource::GetAs<FileRef>(resource)); |
-} |
- |
-PP_FileSystemType_Dev GetFileSystemType(PP_Resource file_ref_id) { |
- scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
- if (!file_ref) |
- return PP_FILESYSTEMTYPE_EXTERNAL; |
- return file_ref->GetFileSystemType(); |
-} |
- |
-PP_Var GetName(PP_Resource file_ref_id) { |
- scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
- if (!file_ref) |
- return PP_MakeUndefined(); |
- return StringVar::StringToPPVar(file_ref->module(), file_ref->GetName()); |
-} |
- |
-PP_Var GetPath(PP_Resource file_ref_id) { |
- scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
- if (!file_ref) |
- return PP_MakeUndefined(); |
- |
- if (file_ref->GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) |
- return PP_MakeUndefined(); |
- |
- return StringVar::StringToPPVar(file_ref->module(), file_ref->GetPath()); |
-} |
- |
-PP_Resource GetParent(PP_Resource file_ref_id) { |
- scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
- if (!file_ref) |
- return 0; |
- |
- if (file_ref->GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) |
- return 0; |
- |
- scoped_refptr<FileRef> parent_ref(file_ref->GetParent()); |
- if (!parent_ref) |
- return 0; |
- |
- return parent_ref->GetReference(); |
-} |
- |
-int32_t MakeDirectory(PP_Resource directory_ref_id, |
- PP_Bool make_ancestors, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileRef> directory_ref( |
- Resource::GetAs<FileRef>(directory_ref_id)); |
- if (!directory_ref) |
- return PP_ERROR_BADRESOURCE; |
- |
- scoped_refptr<FileSystem> file_system = directory_ref->GetFileSystem(); |
- if (!file_system || !file_system->opened() || |
- (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
- return PP_ERROR_NOACCESS; |
- |
- PluginInstance* instance = file_system->instance(); |
- if (!instance->delegate()->MakeDirectory( |
- directory_ref->GetSystemPath(), PPBoolToBool(make_ancestors), |
- new FileCallbacks(instance->module()->AsWeakPtr(), |
- callback, NULL, NULL, NULL))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t Query(PP_Resource file_ref_id, |
- PP_FileInfo_Dev* info, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
- if (!file_ref) |
- return PP_ERROR_BADRESOURCE; |
- |
- scoped_refptr<FileSystem> file_system = file_ref->GetFileSystem(); |
- if (!file_system || !file_system->opened() || |
- (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
- return PP_ERROR_NOACCESS; |
- |
- PluginInstance* instance = file_system->instance(); |
- if (!instance->delegate()->Query( |
- file_ref->GetSystemPath(), |
- new FileCallbacks(instance->module()->AsWeakPtr(), |
- callback, info, file_system, NULL))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t Touch(PP_Resource file_ref_id, |
- PP_Time last_access_time, |
- PP_Time last_modified_time, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
- if (!file_ref) |
- return PP_ERROR_BADRESOURCE; |
- |
- scoped_refptr<FileSystem> file_system = file_ref->GetFileSystem(); |
- if (!file_system || !file_system->opened() || |
- (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
- return PP_ERROR_NOACCESS; |
- |
- PluginInstance* instance = file_system->instance(); |
- if (!instance->delegate()->Touch( |
- file_ref->GetSystemPath(), base::Time::FromDoubleT(last_access_time), |
- base::Time::FromDoubleT(last_modified_time), |
- new FileCallbacks(instance->module()->AsWeakPtr(), |
- callback, NULL, NULL, NULL))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t Delete(PP_Resource file_ref_id, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
- if (!file_ref) |
- return PP_ERROR_BADRESOURCE; |
- |
- scoped_refptr<FileSystem> file_system = file_ref->GetFileSystem(); |
- if (!file_system || !file_system->opened() || |
- (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
- return PP_ERROR_NOACCESS; |
- |
- PluginInstance* instance = file_system->instance(); |
- if (!instance->delegate()->Delete( |
- file_ref->GetSystemPath(), |
- new FileCallbacks(instance->module()->AsWeakPtr(), |
- callback, NULL, NULL, NULL))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-int32_t Rename(PP_Resource file_ref_id, |
- PP_Resource new_file_ref_id, |
- PP_CompletionCallback callback) { |
- scoped_refptr<FileRef> file_ref(Resource::GetAs<FileRef>(file_ref_id)); |
- if (!file_ref) |
- return PP_ERROR_BADRESOURCE; |
- |
- scoped_refptr<FileRef> new_file_ref( |
- Resource::GetAs<FileRef>(new_file_ref_id)); |
- if (!new_file_ref) |
- return PP_ERROR_BADRESOURCE; |
- |
- scoped_refptr<FileSystem> file_system = file_ref->GetFileSystem(); |
- if (!file_system || !file_system->opened() || |
- (file_system != new_file_ref->GetFileSystem()) || |
- (file_system->type() == PP_FILESYSTEMTYPE_EXTERNAL)) |
- return PP_ERROR_NOACCESS; |
- |
- PluginInstance* instance = file_system->instance(); |
- if (!instance->delegate()->Rename( |
- file_ref->GetSystemPath(), new_file_ref->GetSystemPath(), |
- new FileCallbacks(instance->module()->AsWeakPtr(), |
- callback, NULL, NULL, NULL))) |
- return PP_ERROR_FAILED; |
- |
- return PP_ERROR_WOULDBLOCK; |
-} |
- |
-const PPB_FileRef_Dev ppb_fileref = { |
- &Create, |
- &IsFileRef, |
- &GetFileSystemType, |
- &GetName, |
- &GetPath, |
- &GetParent, |
- &MakeDirectory, |
- &Query, |
- &Touch, |
- &Delete, |
- &Rename |
-}; |
- |
-} // namespace |
- |
-FileRef::FileRef() |
- : Resource(NULL), |
- file_system_(NULL) { |
-} |
- |
-FileRef::FileRef(PluginModule* module, |
- scoped_refptr<FileSystem> file_system, |
- const std::string& validated_path) |
- : Resource(module), |
- file_system_(file_system), |
- virtual_path_(validated_path) { |
-} |
- |
-FileRef::FileRef(PluginModule* module, |
- const FilePath& external_file_path) |
- : Resource(module), |
- file_system_(NULL), |
- system_path_(external_file_path) { |
-} |
- |
-FileRef::~FileRef() { |
-} |
- |
-// static |
-const PPB_FileRef_Dev* FileRef::GetInterface() { |
- return &ppb_fileref; |
-} |
- |
-FileRef* FileRef::AsFileRef() { |
- return this; |
-} |
- |
-std::string FileRef::GetName() const { |
- if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) { |
- FilePath::StringType path = system_path_.value(); |
- size_t pos = path.rfind(FilePath::kSeparators[0]); |
- DCHECK(pos != FilePath::StringType::npos); |
-#if defined(OS_WIN) |
- return WideToUTF8(path.substr(pos + 1)); |
-#elif defined(OS_POSIX) |
- return path.substr(pos + 1); |
-#else |
-#error "Unsupported platform." |
-#endif |
- } |
- |
- if (virtual_path_.size() == 1 && virtual_path_[0] == '/') |
- return virtual_path_; |
- |
- // There should always be a leading slash at least! |
- size_t pos = virtual_path_.rfind('/'); |
- DCHECK(pos != std::string::npos); |
- |
- return virtual_path_.substr(pos + 1); |
-} |
- |
-scoped_refptr<FileRef> FileRef::GetParent() { |
- if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) |
- return new FileRef(); |
- |
- // There should always be a leading slash at least! |
- size_t pos = virtual_path_.rfind('/'); |
- DCHECK(pos != std::string::npos); |
- |
- // If the path is "/foo", then we want to include the slash. |
- if (pos == 0) |
- pos++; |
- std::string parent_path = virtual_path_.substr(0, pos); |
- |
- FileRef* parent_ref = new FileRef(module(), file_system_, parent_path); |
- return parent_ref; |
-} |
- |
-scoped_refptr<FileSystem> FileRef::GetFileSystem() const { |
- return file_system_; |
-} |
- |
-PP_FileSystemType_Dev FileRef::GetFileSystemType() const { |
- if (!file_system_) |
- return PP_FILESYSTEMTYPE_EXTERNAL; |
- |
- return file_system_->type(); |
-} |
- |
-std::string FileRef::GetPath() const { |
- return virtual_path_; |
-} |
- |
-FilePath FileRef::GetSystemPath() const { |
- if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL) |
- return system_path_; |
- |
- // Since |virtual_path_| starts with a '/', it is considered an absolute path |
- // on POSIX systems. We need to remove the '/' before calling Append() or we |
- // will run into a DCHECK. |
- FilePath virtual_file_path( |
-#if defined(OS_WIN) |
- UTF8ToWide(virtual_path_.substr(1)) |
-#elif defined(OS_POSIX) |
- virtual_path_.substr(1) |
-#else |
-#error "Unsupported platform." |
-#endif |
- ); |
- return file_system_->root_path().Append(virtual_file_path); |
-} |
- |
-} // namespace pepper |