| Index: native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_html5_fs.cc
|
| diff --git a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_html5_fs.cc b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_html5_fs.cc
|
| index c2b1b9bdf41f057046389f8c80944fe0229805c5..4ac8d3c115b3fe644e2d29474ba7bf9ab8b7a3aa 100644
|
| --- a/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_html5_fs.cc
|
| +++ b/native_client_sdk/src/tests/nacl_io_test/fake_ppapi/fake_pepper_interface_html5_fs.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Copyright 2016 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.
|
|
|
| @@ -13,6 +13,14 @@
|
|
|
| #include "gtest/gtest.h"
|
|
|
| +#include "fake_ppapi/fake_core_interface.h"
|
| +#include "fake_ppapi/fake_filesystem.h"
|
| +#include "fake_ppapi/fake_file_io_interface.h"
|
| +#include "fake_ppapi/fake_file_ref_interface.h"
|
| +#include "fake_ppapi/fake_file_system_interface.h"
|
| +#include "fake_ppapi/fake_util.h"
|
| +#include "fake_ppapi/fake_var_interface.h"
|
| +
|
| namespace {
|
|
|
| class FakeInstanceResource : public FakeResource {
|
| @@ -20,681 +28,11 @@ class FakeInstanceResource : public FakeResource {
|
| FakeInstanceResource() : filesystem_template(NULL) {}
|
| static const char* classname() { return "FakeInstanceResource"; }
|
|
|
| - FakeHtml5FsFilesystem* filesystem_template; // Weak reference.
|
| -};
|
| -
|
| -class FakeFileSystemResource : public FakeResource {
|
| - public:
|
| - FakeFileSystemResource() : filesystem(NULL), opened(false) {}
|
| - ~FakeFileSystemResource() { delete filesystem; }
|
| - static const char* classname() { return "FakeFileSystemResource"; }
|
| -
|
| - FakeHtml5FsFilesystem* filesystem; // Owned.
|
| - bool opened;
|
| -};
|
| -
|
| -class FakeFileRefResource : public FakeResource {
|
| - public:
|
| - FakeFileRefResource() : filesystem(NULL) {}
|
| - static const char* classname() { return "FakeFileRefResource"; }
|
| -
|
| - FakeHtml5FsFilesystem* filesystem; // Weak reference.
|
| - FakeHtml5FsFilesystem::Path path;
|
| -};
|
| -
|
| -class FakeFileIoResource : public FakeResource {
|
| - public:
|
| - FakeFileIoResource() : node(NULL), open_flags(0) {}
|
| - static const char* classname() { return "FakeFileIoResource"; }
|
| -
|
| - FakeHtml5FsNode* node; // Weak reference.
|
| - int32_t open_flags;
|
| + FakeFilesystem* filesystem_template; // Weak reference.
|
| };
|
|
|
| -// Helper function to call the completion callback if it is defined (an
|
| -// asynchronous call), or return the result directly if it isn't (a synchronous
|
| -// call).
|
| -//
|
| -// Use like this:
|
| -// if (<some error condition>)
|
| -// return RunCompletionCallback(callback, PP_ERROR_FUBAR);
|
| -//
|
| -// /* Everything worked OK */
|
| -// return RunCompletionCallback(callback, PP_OK);
|
| -int32_t RunCompletionCallback(PP_CompletionCallback* callback, int32_t result) {
|
| - if (callback->func) {
|
| - PP_RunCompletionCallback(callback, result);
|
| - return PP_OK_COMPLETIONPENDING;
|
| - }
|
| - return result;
|
| -}
|
| -
|
| } // namespace
|
|
|
| -FakeHtml5FsNode::FakeHtml5FsNode(const PP_FileInfo& info) : info_(info) {}
|
| -
|
| -FakeHtml5FsNode::FakeHtml5FsNode(const PP_FileInfo& info,
|
| - const std::vector<uint8_t>& contents)
|
| - : info_(info), contents_(contents) {}
|
| -
|
| -FakeHtml5FsNode::FakeHtml5FsNode(const PP_FileInfo& info,
|
| - const std::string& contents)
|
| - : info_(info) {
|
| - std::copy(contents.begin(), contents.end(), std::back_inserter(contents_));
|
| -}
|
| -
|
| -int32_t FakeHtml5FsNode::Read(int64_t offset,
|
| - char* buffer,
|
| - int32_t bytes_to_read) {
|
| - if (offset < 0)
|
| - return PP_ERROR_FAILED;
|
| -
|
| - bytes_to_read =
|
| - std::max(0, std::min<int32_t>(bytes_to_read, contents_.size() - offset));
|
| - memcpy(buffer, contents_.data() + offset, bytes_to_read);
|
| - return bytes_to_read;
|
| -}
|
| -
|
| -int32_t FakeHtml5FsNode::Write(int64_t offset,
|
| - const char* buffer,
|
| - int32_t bytes_to_write) {
|
| - if (offset < 0)
|
| - return PP_ERROR_FAILED;
|
| -
|
| - size_t new_size = offset + bytes_to_write;
|
| - if (new_size > contents_.size())
|
| - contents_.resize(new_size);
|
| -
|
| - memcpy(contents_.data() + offset, buffer, bytes_to_write);
|
| - info_.size = new_size;
|
| - return bytes_to_write;
|
| -}
|
| -
|
| -int32_t FakeHtml5FsNode::Append(const char* buffer, int32_t bytes_to_write) {
|
| - return Write(contents_.size(), buffer, bytes_to_write);
|
| -}
|
| -
|
| -int32_t FakeHtml5FsNode::SetLength(int64_t length) {
|
| - contents_.resize(length);
|
| - info_.size = length;
|
| - return PP_OK;
|
| -}
|
| -
|
| -void FakeHtml5FsNode::GetInfo(PP_FileInfo* out_info) { *out_info = info_; }
|
| -
|
| -bool FakeHtml5FsNode::IsRegular() const {
|
| - return info_.type == PP_FILETYPE_REGULAR;
|
| -}
|
| -
|
| -bool FakeHtml5FsNode::IsDirectory() const {
|
| - return info_.type == PP_FILETYPE_DIRECTORY;
|
| -}
|
| -
|
| -FakeHtml5FsFilesystem::FakeHtml5FsFilesystem()
|
| - : filesystem_type_(PP_FILESYSTEMTYPE_INVALID) {
|
| - Clear();
|
| -}
|
| -
|
| -FakeHtml5FsFilesystem::FakeHtml5FsFilesystem(PP_FileSystemType type)
|
| - : filesystem_type_(type) {
|
| - Clear();
|
| -}
|
| -
|
| -FakeHtml5FsFilesystem::FakeHtml5FsFilesystem(
|
| - const FakeHtml5FsFilesystem& filesystem,
|
| - PP_FileSystemType type)
|
| - : node_map_(filesystem.node_map_), filesystem_type_(type) {}
|
| -
|
| -void FakeHtml5FsFilesystem::Clear() {
|
| - node_map_.clear();
|
| - // Always have a root node.
|
| - AddDirectory("/", NULL);
|
| -}
|
| -
|
| -bool FakeHtml5FsFilesystem::AddEmptyFile(const Path& path,
|
| - FakeHtml5FsNode** out_node) {
|
| - return AddFile(path, std::vector<uint8_t>(), out_node);
|
| -}
|
| -
|
| -bool FakeHtml5FsFilesystem::AddFile(const Path& path,
|
| - const std::string& contents,
|
| - FakeHtml5FsNode** out_node) {
|
| - std::vector<uint8_t> data;
|
| - std::copy(contents.begin(), contents.end(), std::back_inserter(data));
|
| - return AddFile(path, data, out_node);
|
| -}
|
| -
|
| -bool FakeHtml5FsFilesystem::AddFile(const Path& path,
|
| - const std::vector<uint8_t>& contents,
|
| - FakeHtml5FsNode** out_node) {
|
| - NodeMap::iterator iter = node_map_.find(path);
|
| - if (iter != node_map_.end()) {
|
| - if (out_node)
|
| - *out_node = NULL;
|
| - return false;
|
| - }
|
| -
|
| - PP_FileInfo info;
|
| - info.size = contents.size();
|
| - info.type = PP_FILETYPE_REGULAR;
|
| - info.system_type = filesystem_type_;
|
| - info.creation_time = 0;
|
| - info.last_access_time = 0;
|
| - info.last_modified_time = 0;
|
| -
|
| - FakeHtml5FsNode node(info, contents);
|
| - std::pair<NodeMap::iterator, bool> result =
|
| - node_map_.insert(NodeMap::value_type(path, node));
|
| -
|
| - EXPECT_EQ(true, result.second);
|
| - if (out_node)
|
| - *out_node = &result.first->second;
|
| - return true;
|
| -}
|
| -
|
| -bool FakeHtml5FsFilesystem::AddDirectory(const Path& path,
|
| - FakeHtml5FsNode** out_node) {
|
| - NodeMap::iterator iter = node_map_.find(path);
|
| - if (iter != node_map_.end()) {
|
| - if (out_node)
|
| - *out_node = NULL;
|
| - return false;
|
| - }
|
| -
|
| - PP_FileInfo info;
|
| - info.size = 0;
|
| - info.type = PP_FILETYPE_DIRECTORY;
|
| - info.system_type = filesystem_type_;
|
| - info.creation_time = 0;
|
| - info.last_access_time = 0;
|
| - info.last_modified_time = 0;
|
| -
|
| - FakeHtml5FsNode node(info);
|
| - std::pair<NodeMap::iterator, bool> result =
|
| - node_map_.insert(NodeMap::value_type(path, node));
|
| -
|
| - EXPECT_EQ(true, result.second);
|
| - if (out_node)
|
| - *out_node = &result.first->second;
|
| - return true;
|
| -}
|
| -
|
| -bool FakeHtml5FsFilesystem::RemoveNode(const Path& path) {
|
| - return node_map_.erase(path) >= 1;
|
| -}
|
| -
|
| -FakeHtml5FsNode* FakeHtml5FsFilesystem::GetNode(const Path& path) {
|
| - NodeMap::iterator iter = node_map_.find(path);
|
| - if (iter == node_map_.end())
|
| - return NULL;
|
| - return &iter->second;
|
| -}
|
| -
|
| -bool FakeHtml5FsFilesystem::GetDirectoryEntries(
|
| - const Path& path,
|
| - DirectoryEntries* out_dir_entries) const {
|
| - out_dir_entries->clear();
|
| -
|
| - NodeMap::const_iterator iter = node_map_.find(path);
|
| - if (iter == node_map_.end())
|
| - return false;
|
| -
|
| - const FakeHtml5FsNode& dir_node = iter->second;
|
| - if (!dir_node.IsDirectory())
|
| - return false;
|
| -
|
| - for (NodeMap::const_iterator iter = node_map_.begin();
|
| - iter != node_map_.end();
|
| - ++iter) {
|
| - const Path& node_path = iter->first;
|
| - if (node_path.find(path) == std::string::npos)
|
| - continue;
|
| -
|
| - // A node is not a child of itself.
|
| - if (&iter->second == &dir_node)
|
| - continue;
|
| -
|
| - // Only consider children, not descendants. If we find a forward slash, then
|
| - // the node must be in a subdirectory.
|
| - if (node_path.find('/', path.size() + 1) != std::string::npos)
|
| - continue;
|
| -
|
| - // The directory entry names do not include the path.
|
| - Path entry_path = node_path;
|
| - size_t last_slash = node_path.rfind('/');
|
| - if (last_slash != std::string::npos)
|
| - entry_path.erase(0, last_slash + 1);
|
| -
|
| - DirectoryEntry entry;
|
| - entry.path = entry_path;
|
| - entry.node = &iter->second;
|
| - out_dir_entries->push_back(entry);
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -// static
|
| -FakeHtml5FsFilesystem::Path FakeHtml5FsFilesystem::GetParentPath(
|
| - const Path& path) {
|
| - size_t last_slash = path.rfind('/');
|
| - if (last_slash == 0)
|
| - return "/";
|
| -
|
| - EXPECT_EQ(std::string::npos, last_slash);
|
| - return path.substr(0, last_slash);
|
| -}
|
| -
|
| -FakeFileIoInterface::FakeFileIoInterface(FakeCoreInterface* core_interface)
|
| - : core_interface_(core_interface) {}
|
| -
|
| -PP_Resource FakeFileIoInterface::Create(PP_Resource) {
|
| - return CREATE_RESOURCE(core_interface_->resource_manager(),
|
| - FakeFileIoResource,
|
| - new FakeFileIoResource);
|
| -}
|
| -
|
| -int32_t FakeFileIoInterface::Open(PP_Resource file_io,
|
| - PP_Resource file_ref,
|
| - int32_t open_flags,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileIoResource* file_io_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
|
| - if (file_io_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - bool flag_write = !!(open_flags & PP_FILEOPENFLAG_WRITE);
|
| - bool flag_create = !!(open_flags & PP_FILEOPENFLAG_CREATE);
|
| - bool flag_truncate = !!(open_flags & PP_FILEOPENFLAG_TRUNCATE);
|
| - bool flag_exclusive = !!(open_flags & PP_FILEOPENFLAG_EXCLUSIVE);
|
| - bool flag_append = !!(open_flags & PP_FILEOPENFLAG_APPEND);
|
| -
|
| - if ((flag_append && flag_write) || (flag_truncate && !flag_write))
|
| - return PP_ERROR_BADARGUMENT;
|
| -
|
| - FakeFileRefResource* file_ref_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
|
| - if (file_ref_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - const FakeHtml5FsFilesystem::Path& path = file_ref_resource->path;
|
| - FakeHtml5FsFilesystem* filesystem = file_ref_resource->filesystem;
|
| - FakeHtml5FsNode* node = filesystem->GetNode(path);
|
| - bool node_exists = node != NULL;
|
| -
|
| - if (!node_exists) {
|
| - if (!flag_create)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
|
| -
|
| - bool result = filesystem->AddEmptyFile(path, &node);
|
| - EXPECT_EQ(true, result);
|
| - } else {
|
| - if (flag_create && flag_exclusive)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FILEEXISTS);
|
| - }
|
| -
|
| - file_io_resource->node = node;
|
| - file_io_resource->open_flags = open_flags;
|
| -
|
| - if (flag_truncate)
|
| - return RunCompletionCallback(&callback, node->SetLength(0));
|
| -
|
| - return RunCompletionCallback(&callback, PP_OK);
|
| -}
|
| -
|
| -int32_t FakeFileIoInterface::Query(PP_Resource file_io,
|
| - PP_FileInfo* info,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileIoResource* file_io_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
|
| - if (file_io_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - if (!file_io_resource->node)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FAILED);
|
| -
|
| - file_io_resource->node->GetInfo(info);
|
| - return RunCompletionCallback(&callback, PP_OK);
|
| -}
|
| -
|
| -int32_t FakeFileIoInterface::Read(PP_Resource file_io,
|
| - int64_t offset,
|
| - char* buffer,
|
| - int32_t bytes_to_read,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileIoResource* file_io_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
|
| - if (file_io_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - if (bytes_to_read < 0)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FAILED);
|
| -
|
| - if ((file_io_resource->open_flags & PP_FILEOPENFLAG_READ) !=
|
| - PP_FILEOPENFLAG_READ) {
|
| - return RunCompletionCallback(&callback, PP_ERROR_NOACCESS);
|
| - }
|
| -
|
| - if (!file_io_resource->node)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FAILED);
|
| -
|
| - int32_t result = file_io_resource->node->Read(offset, buffer, bytes_to_read);
|
| - return RunCompletionCallback(&callback, result);
|
| -}
|
| -
|
| -int32_t FakeFileIoInterface::Write(PP_Resource file_io,
|
| - int64_t offset,
|
| - const char* buffer,
|
| - int32_t bytes_to_write,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileIoResource* file_io_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
|
| - if (file_io_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - if ((file_io_resource->open_flags & PP_FILEOPENFLAG_WRITE) !=
|
| - PP_FILEOPENFLAG_WRITE) {
|
| - return RunCompletionCallback(&callback, PP_ERROR_NOACCESS);
|
| - }
|
| -
|
| - if (!file_io_resource->node)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FAILED);
|
| -
|
| - int32_t result;
|
| - if ((file_io_resource->open_flags & PP_FILEOPENFLAG_APPEND) ==
|
| - PP_FILEOPENFLAG_APPEND) {
|
| - result = file_io_resource->node->Append(buffer, bytes_to_write);
|
| - } else {
|
| - result = file_io_resource->node->Write(offset, buffer, bytes_to_write);
|
| - }
|
| -
|
| - return RunCompletionCallback(&callback, result);
|
| -}
|
| -
|
| -int32_t FakeFileIoInterface::SetLength(PP_Resource file_io,
|
| - int64_t length,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileIoResource* file_io_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
|
| - if (file_io_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - if ((file_io_resource->open_flags & PP_FILEOPENFLAG_WRITE) !=
|
| - PP_FILEOPENFLAG_WRITE) {
|
| - return RunCompletionCallback(&callback, PP_ERROR_NOACCESS);
|
| - }
|
| -
|
| - if (!file_io_resource->node)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FAILED);
|
| -
|
| - int32_t result = file_io_resource->node->SetLength(length);
|
| - return RunCompletionCallback(&callback, result);
|
| -}
|
| -
|
| -int32_t FakeFileIoInterface::Flush(PP_Resource file_io,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileIoResource* file_io_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
|
| - if (file_io_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - if (!file_io_resource->node)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FAILED);
|
| -
|
| - return RunCompletionCallback(&callback, PP_OK);
|
| -}
|
| -
|
| -void FakeFileIoInterface::Close(PP_Resource file_io) {
|
| - FakeFileIoResource* file_io_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
|
| - if (file_io_resource == NULL)
|
| - return;
|
| -
|
| - file_io_resource->node = NULL;
|
| - file_io_resource->open_flags = 0;
|
| -}
|
| -
|
| -FakeFileRefInterface::FakeFileRefInterface(FakeCoreInterface* core_interface,
|
| - FakeVarInterface* var_interface)
|
| - : core_interface_(core_interface), var_interface_(var_interface) {}
|
| -
|
| -PP_Resource FakeFileRefInterface::Create(PP_Resource file_system,
|
| - const char* path) {
|
| - FakeFileSystemResource* file_system_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileSystemResource>(
|
| - file_system);
|
| - if (file_system_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - if (!file_system_resource->opened)
|
| - return PP_ERROR_FAILED;
|
| -
|
| - if (path == NULL)
|
| - return PP_ERROR_FAILED;
|
| -
|
| - size_t path_len = strlen(path);
|
| - if (path_len == 0)
|
| - return PP_ERROR_FAILED;
|
| -
|
| - FakeFileRefResource* file_ref_resource = new FakeFileRefResource;
|
| - file_ref_resource->filesystem = file_system_resource->filesystem;
|
| - file_ref_resource->path = path;
|
| -
|
| - // Remove a trailing slash from the path, unless it is the root path.
|
| - if (path_len > 1 && file_ref_resource->path[path_len - 1] == '/')
|
| - file_ref_resource->path.erase(path_len - 1);
|
| -
|
| - return CREATE_RESOURCE(core_interface_->resource_manager(),
|
| - FakeFileRefResource,
|
| - file_ref_resource);
|
| -}
|
| -
|
| -PP_Var FakeFileRefInterface::GetName(PP_Resource file_ref) {
|
| - FakeFileRefResource* file_ref_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
|
| - if (file_ref_resource == NULL)
|
| - return PP_MakeUndefined();
|
| -
|
| - return var_interface_->VarFromUtf8(file_ref_resource->path.c_str(),
|
| - file_ref_resource->path.size());
|
| -}
|
| -
|
| -int32_t FakeFileRefInterface::MakeDirectory(PP_Resource directory_ref,
|
| - PP_Bool make_parents,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileRefResource* directory_ref_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileRefResource>(
|
| - directory_ref);
|
| - if (directory_ref_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - // TODO(binji): We don't currently use make_parents in nacl_io, so
|
| - // I won't bother handling it yet.
|
| - if (make_parents == PP_TRUE)
|
| - return PP_ERROR_FAILED;
|
| -
|
| - FakeHtml5FsFilesystem* filesystem = directory_ref_resource->filesystem;
|
| - FakeHtml5FsFilesystem::Path path = directory_ref_resource->path;
|
| -
|
| - // Pepper returns PP_ERROR_NOACCESS when trying to create the root directory,
|
| - // not PP_ERROR_FILEEXISTS, as you might expect.
|
| - if (path == "/")
|
| - return RunCompletionCallback(&callback, PP_ERROR_NOACCESS);
|
| -
|
| - FakeHtml5FsNode* node = filesystem->GetNode(path);
|
| - if (node != NULL)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FILEEXISTS);
|
| -
|
| - FakeHtml5FsFilesystem::Path parent_path = filesystem->GetParentPath(path);
|
| - FakeHtml5FsNode* parent_node = filesystem->GetNode(parent_path);
|
| - if (parent_node == NULL)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
|
| -
|
| - if (!parent_node->IsDirectory())
|
| - return RunCompletionCallback(&callback, PP_ERROR_FAILED);
|
| -
|
| - bool result = filesystem->AddDirectory(directory_ref_resource->path, NULL);
|
| - EXPECT_EQ(true, result);
|
| - return RunCompletionCallback(&callback, PP_OK);
|
| -}
|
| -
|
| -int32_t FakeFileRefInterface::Delete(PP_Resource file_ref,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileRefResource* file_ref_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
|
| - if (file_ref_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - FakeHtml5FsFilesystem* filesystem = file_ref_resource->filesystem;
|
| - FakeHtml5FsFilesystem::Path path = file_ref_resource->path;
|
| - FakeHtml5FsNode* node = filesystem->GetNode(path);
|
| - if (node == NULL)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
|
| -
|
| - filesystem->RemoveNode(path);
|
| - return RunCompletionCallback(&callback, PP_OK);
|
| -}
|
| -
|
| -int32_t FakeFileRefInterface::Query(PP_Resource file_ref,
|
| - PP_FileInfo* info,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileRefResource* file_ref_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
|
| - if (file_ref_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - FakeHtml5FsFilesystem* filesystem = file_ref_resource->filesystem;
|
| - FakeHtml5FsFilesystem::Path path = file_ref_resource->path;
|
| - FakeHtml5FsNode* node = filesystem->GetNode(path);
|
| - if (node == NULL)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
|
| -
|
| - node->GetInfo(info);
|
| - return RunCompletionCallback(&callback, PP_OK);
|
| -}
|
| -
|
| -int32_t FakeFileRefInterface::ReadDirectoryEntries(
|
| - PP_Resource directory_ref,
|
| - const PP_ArrayOutput& output,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileRefResource* directory_ref_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileRefResource>(
|
| - directory_ref);
|
| - if (directory_ref_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - FakeHtml5FsFilesystem* filesystem = directory_ref_resource->filesystem;
|
| - FakeHtml5FsFilesystem::Path path = directory_ref_resource->path;
|
| - FakeHtml5FsNode* node = filesystem->GetNode(path);
|
| - if (node == NULL)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
|
| -
|
| - if (!node->IsDirectory())
|
| - return RunCompletionCallback(&callback, PP_ERROR_FAILED);
|
| -
|
| - FakeHtml5FsFilesystem::DirectoryEntries fake_dir_entries;
|
| - filesystem->GetDirectoryEntries(path, &fake_dir_entries);
|
| -
|
| - uint32_t element_count = fake_dir_entries.size();
|
| - uint32_t element_size = sizeof(fake_dir_entries[0]);
|
| - void* data_buffer =
|
| - (*output.GetDataBuffer)(output.user_data, element_count, element_size);
|
| -
|
| - if (data_buffer == NULL)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FAILED);
|
| -
|
| - PP_DirectoryEntry* dir_entries = static_cast<PP_DirectoryEntry*>(data_buffer);
|
| - for (uint32_t i = 0; i < element_count; ++i) {
|
| - const FakeHtml5FsFilesystem::DirectoryEntry& fake_dir_entry =
|
| - fake_dir_entries[i];
|
| -
|
| - FakeFileRefResource* file_ref_resource = new FakeFileRefResource;
|
| - file_ref_resource->filesystem = directory_ref_resource->filesystem;
|
| - file_ref_resource->path = fake_dir_entry.path;
|
| - PP_Resource file_ref = CREATE_RESOURCE(core_interface_->resource_manager(),
|
| - FakeFileRefResource,
|
| - file_ref_resource);
|
| -
|
| - dir_entries[i].file_ref = file_ref;
|
| - dir_entries[i].file_type = fake_dir_entry.node->file_type();
|
| - }
|
| -
|
| - return RunCompletionCallback(&callback, PP_OK);
|
| -}
|
| -
|
| -int32_t FakeFileRefInterface::Rename(PP_Resource file_ref,
|
| - PP_Resource new_file_ref,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileRefResource* file_ref_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
|
| - if (file_ref_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - FakeFileRefResource* new_file_ref_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileRefResource>(
|
| - new_file_ref);
|
| - if (new_file_ref_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - FakeHtml5FsFilesystem* filesystem = file_ref_resource->filesystem;
|
| - FakeHtml5FsFilesystem::Path path = file_ref_resource->path;
|
| - FakeHtml5FsFilesystem::Path newpath = new_file_ref_resource->path;
|
| - FakeHtml5FsNode* node = filesystem->GetNode(path);
|
| - if (node == NULL)
|
| - return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
|
| - // FakeFileRefResource does not support directory rename.
|
| - if (!node->IsRegular())
|
| - return RunCompletionCallback(&callback, PP_ERROR_NOTAFILE);
|
| -
|
| - // Remove the destination if it exists.
|
| - filesystem->RemoveNode(newpath);
|
| - const std::vector<uint8_t> contents = node->contents();
|
| - EXPECT_TRUE(filesystem->AddFile(newpath, contents, NULL));
|
| - EXPECT_TRUE(filesystem->RemoveNode(path));
|
| - return RunCompletionCallback(&callback, PP_OK);
|
| -}
|
| -
|
| -FakeFileSystemInterface::FakeFileSystemInterface(
|
| - FakeCoreInterface* core_interface)
|
| - : core_interface_(core_interface) {}
|
| -
|
| -PP_Bool FakeFileSystemInterface::IsFileSystem(PP_Resource resource) {
|
| - bool not_found_ok = true;
|
| - FakeFileSystemResource* file_system_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileSystemResource>(
|
| - resource, not_found_ok);
|
| - return file_system_resource != NULL ? PP_TRUE : PP_FALSE;
|
| -}
|
| -
|
| -PP_Resource FakeFileSystemInterface::Create(PP_Instance instance,
|
| - PP_FileSystemType filesystem_type) {
|
| - FakeInstanceResource* instance_resource =
|
| - core_interface_->resource_manager()->Get<FakeInstanceResource>(instance);
|
| - if (instance_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - FakeFileSystemResource* file_system_resource = new FakeFileSystemResource;
|
| - file_system_resource->filesystem = new FakeHtml5FsFilesystem(
|
| - *instance_resource->filesystem_template, filesystem_type);
|
| -
|
| - return CREATE_RESOURCE(core_interface_->resource_manager(),
|
| - FakeFileSystemResource,
|
| - file_system_resource);
|
| -}
|
| -
|
| -int32_t FakeFileSystemInterface::Open(PP_Resource file_system,
|
| - int64_t expected_size,
|
| - PP_CompletionCallback callback) {
|
| - FakeFileSystemResource* file_system_resource =
|
| - core_interface_->resource_manager()->Get<FakeFileSystemResource>(
|
| - file_system);
|
| - if (file_system_resource == NULL)
|
| - return PP_ERROR_BADRESOURCE;
|
| -
|
| - file_system_resource->opened = true;
|
| - return RunCompletionCallback(&callback, PP_OK);
|
| -}
|
| -
|
| FakePepperInterfaceHtml5Fs::FakePepperInterfaceHtml5Fs()
|
| : core_interface_(&resource_manager_),
|
| var_interface_(&var_manager_),
|
| @@ -705,7 +43,7 @@ FakePepperInterfaceHtml5Fs::FakePepperInterfaceHtml5Fs()
|
| }
|
|
|
| FakePepperInterfaceHtml5Fs::FakePepperInterfaceHtml5Fs(
|
| - const FakeHtml5FsFilesystem& filesystem)
|
| + const FakeFilesystem& filesystem)
|
| : core_interface_(&resource_manager_),
|
| var_interface_(&var_manager_),
|
| filesystem_template_(filesystem),
|
| @@ -721,8 +59,7 @@ void FakePepperInterfaceHtml5Fs::Init() {
|
| instance_resource->filesystem_template = &filesystem_template_;
|
|
|
| instance_ = CREATE_RESOURCE(core_interface_.resource_manager(),
|
| - FakeInstanceResource,
|
| - instance_resource);
|
| + FakeInstanceResource, instance_resource);
|
| }
|
|
|
| FakePepperInterfaceHtml5Fs::~FakePepperInterfaceHtml5Fs() {
|
|
|