| Index: webkit/glue/plugins/pepper_file_ref.cc
|
| ===================================================================
|
| --- webkit/glue/plugins/pepper_file_ref.cc (revision 0)
|
| +++ webkit/glue/plugins/pepper_file_ref.cc (revision 0)
|
| @@ -0,0 +1,175 @@
|
| +// 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 "webkit/glue/plugins/pepper_plugin_instance.h"
|
| +#include "webkit/glue/plugins/pepper_var.h"
|
| +#include "webkit/glue/plugins/pepper_resource_tracker.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 CreateFileRef(PP_Instance instance_id,
|
| + PP_FileSystemType fs_type,
|
| + const char* path) {
|
| + PluginInstance* instance = PluginInstance::FromPPInstance(instance_id);
|
| + if (!instance)
|
| + return 0;
|
| +
|
| + std::string origin; // TODO(darin): Extract from PluginInstance.
|
| +
|
| + std::string validated_path(path);
|
| + if (!IsValidLocalPath(validated_path))
|
| + return 0;
|
| + TrimTrailingSlash(&validated_path);
|
| +
|
| + FileRef* file_ref = new FileRef(instance->module(),
|
| + fs_type,
|
| + validated_path,
|
| + origin);
|
| + file_ref->AddRef(); // AddRef for the caller.
|
| + return file_ref->GetResource();
|
| +}
|
| +
|
| +PP_Resource CreatePersistentFileRef(PP_Instance instance_id, const char* path) {
|
| + return CreateFileRef(instance_id, PP_FileSystemType_LocalPersistent, path);
|
| +}
|
| +
|
| +PP_Resource CreateTemporaryFileRef(PP_Instance instance_id, const char* path) {
|
| + return CreateFileRef(instance_id, PP_FileSystemType_LocalTemporary, path);
|
| +}
|
| +
|
| +bool IsFileRef(PP_Resource resource) {
|
| + return !!ResourceTracker::Get()->GetAsFileRef(resource).get();
|
| +}
|
| +
|
| +PP_FileSystemType GetFileSystemType(PP_Resource file_ref_id) {
|
| + scoped_refptr<FileRef> file_ref(
|
| + ResourceTracker::Get()->GetAsFileRef(file_ref_id));
|
| + if (!file_ref.get())
|
| + return PP_FileSystemType_External;
|
| +
|
| + return file_ref->file_system_type();
|
| +}
|
| +
|
| +PP_Var GetName(PP_Resource file_ref_id) {
|
| + scoped_refptr<FileRef> file_ref(
|
| + ResourceTracker::Get()->GetAsFileRef(file_ref_id));
|
| + if (!file_ref.get())
|
| + return PP_MakeVoid();
|
| +
|
| + return StringToPPVar(file_ref->GetName());
|
| +}
|
| +
|
| +PP_Var GetPath(PP_Resource file_ref_id) {
|
| + scoped_refptr<FileRef> file_ref(
|
| + ResourceTracker::Get()->GetAsFileRef(file_ref_id));
|
| + if (!file_ref.get())
|
| + return PP_MakeVoid();
|
| +
|
| + if (file_ref->file_system_type() == PP_FileSystemType_External)
|
| + return PP_MakeVoid();
|
| +
|
| + return StringToPPVar(file_ref->path());
|
| +}
|
| +
|
| +PP_Resource GetParent(PP_Resource file_ref_id) {
|
| + scoped_refptr<FileRef> file_ref(
|
| + ResourceTracker::Get()->GetAsFileRef(file_ref_id));
|
| + if (!file_ref.get())
|
| + return 0;
|
| +
|
| + if (file_ref->file_system_type() == PP_FileSystemType_External)
|
| + return 0;
|
| +
|
| + scoped_refptr<FileRef> parent_ref(file_ref->GetParent());
|
| + if (!parent_ref.get())
|
| + return 0;
|
| + parent_ref->AddRef(); // AddRef for the caller.
|
| +
|
| + return parent_ref->GetResource();
|
| +}
|
| +
|
| +const PPB_FileRef ppb_fileref = {
|
| + &CreatePersistentFileRef,
|
| + &CreateTemporaryFileRef,
|
| + &IsFileRef,
|
| + &GetFileSystemType,
|
| + &GetName,
|
| + &GetPath,
|
| + &GetParent
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +FileRef::FileRef(PluginModule* module,
|
| + PP_FileSystemType file_system_type,
|
| + const std::string& validated_path,
|
| + const std::string& origin)
|
| + : Resource(module),
|
| + fs_type_(file_system_type),
|
| + path_(validated_path),
|
| + origin_(origin) {
|
| +}
|
| +
|
| +FileRef::~FileRef() {
|
| +}
|
| +
|
| +// static
|
| +const PPB_FileRef* FileRef::GetInterface() {
|
| + return &ppb_fileref;
|
| +}
|
| +
|
| +std::string FileRef::GetName() const {
|
| + if (path_.size() == 1 && path_[0] == '/')
|
| + return path_;
|
| +
|
| + // There should always be a leading slash at least!
|
| + size_t pos = path_.rfind('/');
|
| + DCHECK(pos != std::string::npos);
|
| +
|
| + return path_.substr(pos + 1);
|
| +}
|
| +
|
| +scoped_refptr<FileRef> FileRef::GetParent() {
|
| + if (path_.size() == 1 && path_[0] == '/')
|
| + return this;
|
| +
|
| + // There should always be a leading slash at least!
|
| + size_t pos = 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 = path_.substr(0, pos);
|
| +
|
| + FileRef* parent_ref = new FileRef(module(), fs_type_, parent_path, origin_);
|
| + parent_ref->AddRef(); // AddRef for the caller.
|
| + return parent_ref;
|
| +}
|
| +
|
| +} // namespace pepper
|
|
|
| Property changes on: webkit\glue\plugins\pepper_file_ref.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|