summaryrefslogtreecommitdiffstats
path: root/webkit/plugins/ppapi/ppb_file_ref_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webkit/plugins/ppapi/ppb_file_ref_impl.cc')
-rw-r--r--webkit/plugins/ppapi/ppb_file_ref_impl.cc145
1 files changed, 67 insertions, 78 deletions
diff --git a/webkit/plugins/ppapi/ppb_file_ref_impl.cc b/webkit/plugins/ppapi/ppb_file_ref_impl.cc
index d586149..c196f15 100644
--- a/webkit/plugins/ppapi/ppb_file_ref_impl.cc
+++ b/webkit/plugins/ppapi/ppb_file_ref_impl.cc
@@ -21,6 +21,8 @@
#include "webkit/plugins/ppapi/ppb_file_system_impl.h"
#include "webkit/plugins/ppapi/resource_helper.h"
+using ppapi::HostResource;
+using ppapi::PPB_FileRef_CreateInfo;
using ppapi::PPTimeToTime;
using ppapi::StringVar;
using ppapi::thunk::EnterResourceNoLock;
@@ -51,35 +53,51 @@ void TrimTrailingSlash(std::string* path) {
path->erase(path->size() - 1, 1);
}
-} // namespace
+std::string GetNameForExternalFilePath(const FilePath& in_path) {
+ const FilePath::StringType& path = in_path.value();
+ size_t pos = path.rfind(FilePath::kSeparators[0]);
+ CHECK(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
+}
-PPB_FileRef_Impl::PPB_FileRef_Impl()
- : Resource(0),
- file_system_() {
+std::string GetNameForVirtualFilePath(const std::string& path) {
+ if (path.size() == 1 && path[0] == '/')
+ return path;
+
+ // There should always be a leading slash at least!
+ size_t pos = path.rfind('/');
+ CHECK(pos != std::string::npos);
+ return path.substr(pos + 1);
}
-PPB_FileRef_Impl::PPB_FileRef_Impl(
- PP_Instance instance,
- scoped_refptr<PPB_FileSystem_Impl> file_system,
- const std::string& validated_path)
- : Resource(instance),
+} // namespace
+
+PPB_FileRef_Impl::PPB_FileRef_Impl(const PPB_FileRef_CreateInfo& info,
+ PPB_FileSystem_Impl* file_system)
+ : FileRefImpl(FileRefImpl::InitAsImpl(), info),
file_system_(file_system),
- virtual_path_(validated_path) {
+ external_file_system_path_() {
}
-PPB_FileRef_Impl::PPB_FileRef_Impl(PP_Instance instance,
+PPB_FileRef_Impl::PPB_FileRef_Impl(const PPB_FileRef_CreateInfo& info,
const FilePath& external_file_path)
- : Resource(instance),
- file_system_(NULL),
- system_path_(external_file_path) {
+ : FileRefImpl(FileRefImpl::InitAsImpl(), info),
+ file_system_(),
+ external_file_system_path_(external_file_path) {
}
PPB_FileRef_Impl::~PPB_FileRef_Impl() {
}
// static
-PP_Resource PPB_FileRef_Impl::Create(PP_Resource pp_file_system,
- const char* path) {
+PPB_FileRef_Impl* PPB_FileRef_Impl::CreateInternal(PP_Resource pp_file_system,
+ const std::string& path) {
EnterResourceNoLock<PPB_FileSystem_API> enter(pp_file_system, true);
if (enter.failed())
return 0;
@@ -93,83 +111,52 @@ PP_Resource PPB_FileRef_Impl::Create(PP_Resource pp_file_system,
file_system->type() != PP_FILESYSTEMTYPE_LOCALTEMPORARY)
return 0;
- std::string validated_path(path);
- if (!IsValidLocalPath(validated_path))
- return 0;
- TrimTrailingSlash(&validated_path);
+ PPB_FileRef_CreateInfo info;
+ info.resource = HostResource::MakeInstanceOnly(file_system->pp_instance());
+ info.file_system_type = file_system->type();
- return (new PPB_FileRef_Impl(file_system->pp_instance(),
- file_system, validated_path))->GetReference();
-}
+ // Validate the path.
+ info.path = path;
+ if (!IsValidLocalPath(info.path))
+ return 0;
+ TrimTrailingSlash(&info.path);
-PPB_FileRef_API* PPB_FileRef_Impl::AsPPB_FileRef_API() {
- return this;
-}
+ info.name = GetNameForVirtualFilePath(info.path);
-PPB_FileRef_Impl* PPB_FileRef_Impl::AsPPB_FileRef_Impl() {
- return this;
+ return new PPB_FileRef_Impl(info, file_system);
}
-PP_FileSystemType PPB_FileRef_Impl::GetFileSystemType() const {
- // When the file ref exists but there's no explicit filesystem object
- // associated with it, that means it's an "external" filesystem.
- if (!file_system_)
- return PP_FILESYSTEMTYPE_EXTERNAL;
- return file_system_->type();
-}
-
-PP_Var PPB_FileRef_Impl::GetName() const {
- std::string result;
- 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)
- result = WideToUTF8(path.substr(pos + 1));
-#elif defined(OS_POSIX)
- result = path.substr(pos + 1);
-#else
-#error "Unsupported platform."
-#endif
- } else if (virtual_path_.size() == 1 && virtual_path_[0] == '/') {
- result = virtual_path_;
- } else {
- // There should always be a leading slash at least!
- size_t pos = virtual_path_.rfind('/');
- DCHECK(pos != std::string::npos);
- result = virtual_path_.substr(pos + 1);
- }
-
- PluginModule* plugin_module = ResourceHelper::GetPluginModule(this);
- if (!plugin_module)
- return PP_MakeUndefined();
- return StringVar::StringToPPVar(plugin_module->pp_module(), result);
-}
+// static
+PPB_FileRef_Impl* PPB_FileRef_Impl::CreateExternal(
+ PP_Instance instance,
+ const FilePath& external_file_path) {
+ PPB_FileRef_CreateInfo info;
+ info.resource = HostResource::MakeInstanceOnly(instance);
+ info.file_system_type = PP_FILESYSTEMTYPE_EXTERNAL;
+ info.name = GetNameForExternalFilePath(external_file_path);
-PP_Var PPB_FileRef_Impl::GetPath() const {
- if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL)
- return PP_MakeUndefined();
- PluginModule* plugin_module = ResourceHelper::GetPluginModule(this);
- if (!plugin_module)
- return PP_MakeUndefined();
- return StringVar::StringToPPVar(plugin_module->pp_module(), virtual_path_);
+ return new PPB_FileRef_Impl(info, external_file_path);
}
PP_Resource PPB_FileRef_Impl::GetParent() {
if (GetFileSystemType() == PP_FILESYSTEMTYPE_EXTERNAL)
return 0;
+ const std::string& virtual_path = GetCreateInfo().path;
+
// There should always be a leading slash at least!
- size_t pos = virtual_path_.rfind('/');
- DCHECK(pos != std::string::npos);
+ size_t pos = virtual_path.rfind('/');
+ CHECK(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);
+ std::string parent_path = virtual_path.substr(0, pos);
scoped_refptr<PPB_FileRef_Impl> parent_ref(
- new PPB_FileRef_Impl(pp_instance(), file_system_, parent_path));
+ CreateInternal(file_system_->pp_resource(), parent_path));
+ if (!parent_ref.get())
+ return 0;
return parent_ref->GetReference();
}
@@ -251,7 +238,7 @@ FilePath PPB_FileRef_Impl::GetSystemPath() const {
NOTREACHED();
return FilePath();
}
- return system_path_;
+ return external_file_system_path_;
}
GURL PPB_FileRef_Impl::GetFileSystemURL() const {
@@ -260,14 +247,16 @@ GURL PPB_FileRef_Impl::GetFileSystemURL() const {
NOTREACHED();
return GURL();
}
- if (!virtual_path_.size())
- return file_system_->root_url();
+
+ const std::string& virtual_path = GetCreateInfo().path;
+ CHECK(!virtual_path.empty()); // Should always be at least "/".
+
// Since |virtual_path_| starts with a '/', it looks like an absolute path.
// We need to trim off the '/' before calling Resolve, as FileSystem URLs
// start with a storage type identifier that looks like a path segment.
// TODO(ericu): Switch this to use Resolve after fixing GURL to understand
// FileSystem URLs.
- return GURL(file_system_->root_url().spec() + virtual_path_.substr(1));
+ return GURL(file_system_->root_url().spec() + virtual_path.substr(1));
}
bool PPB_FileRef_Impl::IsValidNonExternalFileSystem() const {