diff options
Diffstat (limited to 'webkit/glue/plugins/pepper_file_ref.cc')
-rw-r--r-- | webkit/glue/plugins/pepper_file_ref.cc | 343 |
1 files changed, 0 insertions, 343 deletions
diff --git a/webkit/glue/plugins/pepper_file_ref.cc b/webkit/glue/plugins/pepper_file_ref.cc deleted file mode 100644 index 6068a29..0000000 --- a/webkit/glue/plugins/pepper_file_ref.cc +++ /dev/null @@ -1,343 +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; -} - -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 |