15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "fake_ppapi/fake_pepper_interface_html5_fs.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <string.h>
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <algorithm>
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <ppapi/c/pp_completion_callback.h>
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <ppapi/c/pp_errors.h>
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "gtest/gtest.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeInstanceResource : public FakeResource {
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeInstanceResource() : filesystem_template(NULL) {}
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static const char* classname() { return "FakeInstanceResource"; }
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem* filesystem_template;  // Weak reference.
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeFileSystemResource : public FakeResource {
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileSystemResource() : filesystem(NULL), opened(false) {}
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ~FakeFileSystemResource() { delete filesystem; }
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static const char* classname() { return "FakeFileSystemResource"; }
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem* filesystem;  // Owned.
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool opened;
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeFileRefResource : public FakeResource {
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileRefResource() : filesystem(NULL) {}
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static const char* classname() { return "FakeFileRefResource"; }
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem* filesystem;  // Weak reference.
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem::Path path;
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeFileIoResource : public FakeResource {
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileIoResource() : node(NULL), open_flags(0) {}
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  static const char* classname() { return "FakeFileIoResource"; }
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsNode* node;  // Weak reference.
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int32_t open_flags;
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Helper function to call the completion callback if it is defined (an
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// asynchronous call), or return the result directly if it isn't (a synchronous
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// call).
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use like this:
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//   if (<some error condition>)
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//     return RunCompletionCallback(callback, PP_ERROR_FUBAR);
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//   /* Everything worked OK */
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//   return RunCompletionCallback(callback, PP_OK);
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t RunCompletionCallback(PP_CompletionCallback* callback, int32_t result) {
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (callback->func) {
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    PP_RunCompletionCallback(callback, result);
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_OK_COMPLETIONPENDING;
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return result;
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeHtml5FsNode::FakeHtml5FsNode(const PP_FileInfo& info) : info_(info) {}
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeHtml5FsNode::FakeHtml5FsNode(const PP_FileInfo& info,
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 const std::vector<uint8_t>& contents)
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : info_(info), contents_(contents) {}
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeHtml5FsNode::FakeHtml5FsNode(const PP_FileInfo& info,
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 const std::string& contents)
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : info_(info) {
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::copy(contents.begin(), contents.end(), std::back_inserter(contents_));
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeHtml5FsNode::Read(int64_t offset,
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              char* buffer,
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              int32_t bytes_to_read) {
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (offset < 0)
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_FAILED;
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bytes_to_read =
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::max(0, std::min<int32_t>(bytes_to_read, contents_.size() - offset));
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  memcpy(buffer, contents_.data() + offset, bytes_to_read);
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return bytes_to_read;
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeHtml5FsNode::Write(int64_t offset,
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                               const char* buffer,
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                               int32_t bytes_to_write) {
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (offset < 0)
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_FAILED;
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  size_t new_size = offset + bytes_to_write;
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (new_size > contents_.size())
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    contents_.resize(new_size);
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  memcpy(contents_.data() + offset, buffer, bytes_to_write);
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info_.size = new_size;
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return bytes_to_write;
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeHtml5FsNode::Append(const char* buffer, int32_t bytes_to_write) {
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return Write(contents_.size(), buffer, bytes_to_write);
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeHtml5FsNode::SetLength(int64_t length) {
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  contents_.resize(length);
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info_.size = length;
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return PP_OK;
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void FakeHtml5FsNode::GetInfo(PP_FileInfo* out_info) { *out_info = info_; }
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool FakeHtml5FsNode::IsRegular() const {
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return info_.type == PP_FILETYPE_REGULAR;
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool FakeHtml5FsNode::IsDirectory() const {
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return info_.type == PP_FILETYPE_DIRECTORY;
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeHtml5FsFilesystem::FakeHtml5FsFilesystem()
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : filesystem_type_(PP_FILESYSTEMTYPE_INVALID) {
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Clear();
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeHtml5FsFilesystem::FakeHtml5FsFilesystem(PP_FileSystemType type)
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : filesystem_type_(type) {
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Clear();
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeHtml5FsFilesystem::FakeHtml5FsFilesystem(
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const FakeHtml5FsFilesystem& filesystem,
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    PP_FileSystemType type)
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : node_map_(filesystem.node_map_), filesystem_type_(type) {}
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void FakeHtml5FsFilesystem::Clear() {
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  node_map_.clear();
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Always have a root node.
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AddDirectory("/", NULL);
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool FakeHtml5FsFilesystem::AddEmptyFile(const Path& path,
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                         FakeHtml5FsNode** out_node) {
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return AddFile(path, std::vector<uint8_t>(), out_node);
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool FakeHtml5FsFilesystem::AddFile(const Path& path,
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                    const std::string& contents,
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                    FakeHtml5FsNode** out_node) {
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::vector<uint8_t> data;
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::copy(contents.begin(), contents.end(), std::back_inserter(data));
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return AddFile(path, data, out_node);
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool FakeHtml5FsFilesystem::AddFile(const Path& path,
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                    const std::vector<uint8_t>& contents,
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                    FakeHtml5FsNode** out_node) {
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NodeMap::iterator iter = node_map_.find(path);
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (iter != node_map_.end()) {
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (out_node)
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      *out_node = NULL;
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  PP_FileInfo info;
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.size = contents.size();
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.type = PP_FILETYPE_REGULAR;
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.system_type = filesystem_type_;
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.creation_time = 0;
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.last_access_time = 0;
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.last_modified_time = 0;
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsNode node(info, contents);
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::pair<NodeMap::iterator, bool> result =
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      node_map_.insert(NodeMap::value_type(path, node));
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(true, result.second);
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (out_node)
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *out_node = &result.first->second;
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return true;
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool FakeHtml5FsFilesystem::AddDirectory(const Path& path,
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                         FakeHtml5FsNode** out_node) {
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NodeMap::iterator iter = node_map_.find(path);
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (iter != node_map_.end()) {
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (out_node)
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      *out_node = NULL;
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  PP_FileInfo info;
2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.size = 0;
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.type = PP_FILETYPE_DIRECTORY;
2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.system_type = filesystem_type_;
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.creation_time = 0;
2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.last_access_time = 0;
2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  info.last_modified_time = 0;
2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsNode node(info);
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::pair<NodeMap::iterator, bool> result =
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      node_map_.insert(NodeMap::value_type(path, node));
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(true, result.second);
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (out_node)
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *out_node = &result.first->second;
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return true;
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool FakeHtml5FsFilesystem::RemoveNode(const Path& path) {
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return node_map_.erase(path) >= 1;
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeHtml5FsNode* FakeHtml5FsFilesystem::GetNode(const Path& path) {
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NodeMap::iterator iter = node_map_.find(path);
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (iter == node_map_.end())
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return NULL;
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return &iter->second;
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool FakeHtml5FsFilesystem::GetDirectoryEntries(
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const Path& path,
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DirectoryEntries* out_dir_entries) const {
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  out_dir_entries->clear();
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NodeMap::const_iterator iter = node_map_.find(path);
2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (iter == node_map_.end())
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const FakeHtml5FsNode& dir_node = iter->second;
2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!dir_node.IsDirectory())
2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return false;
2453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (NodeMap::const_iterator iter = node_map_.begin();
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)       iter != node_map_.end();
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)       ++iter) {
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const Path& node_path = iter->first;
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (node_path.find(path) == std::string::npos)
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      continue;
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // A node is not a child of itself.
2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (&iter->second == &dir_node)
2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      continue;
2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Only consider children, not descendants. If we find a forward slash, then
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // the node must be in a subdirectory.
2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (node_path.find('/', path.size() + 1) != std::string::npos)
2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      continue;
2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // The directory entry names do not include the path.
2633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    Path entry_path = node_path;
2643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    size_t last_slash = node_path.rfind('/');
2653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (last_slash != std::string::npos)
2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      entry_path.erase(0, last_slash + 1);
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    DirectoryEntry entry;
2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    entry.path = entry_path;
2703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    entry.node = &iter->second;
2713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    out_dir_entries->push_back(entry);
2723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return true;
2753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// static
2783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeHtml5FsFilesystem::Path FakeHtml5FsFilesystem::GetParentPath(
2793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const Path& path) {
2803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  size_t last_slash = path.rfind('/');
2813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (last_slash == 0)
2823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return "/";
2833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(std::string::npos, last_slash);
2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return path.substr(0, last_slash);
2863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeFileIoInterface::FakeFileIoInterface(FakeCoreInterface* core_interface)
2893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : core_interface_(core_interface) {}
2903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)PP_Resource FakeFileIoInterface::Create(PP_Resource) {
2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return CREATE_RESOURCE(core_interface_->resource_manager(),
2933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         FakeFileIoResource,
2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         new FakeFileIoResource);
2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileIoInterface::Open(PP_Resource file_io,
2983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  PP_Resource file_ref,
2993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  int32_t open_flags,
3003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  PP_CompletionCallback callback) {
3013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileIoResource* file_io_resource =
3023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
3033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_io_resource == NULL)
3043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
3053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool flag_write = !!(open_flags & PP_FILEOPENFLAG_WRITE);
3073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool flag_create = !!(open_flags & PP_FILEOPENFLAG_CREATE);
3083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool flag_truncate = !!(open_flags & PP_FILEOPENFLAG_TRUNCATE);
3093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool flag_exclusive = !!(open_flags & PP_FILEOPENFLAG_EXCLUSIVE);
3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool flag_append = !!(open_flags & PP_FILEOPENFLAG_APPEND);
3113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if ((flag_append && flag_write) || (flag_truncate && !flag_write))
3133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADARGUMENT;
3143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileRefResource* file_ref_resource =
3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
3173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_ref_resource == NULL)
3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const FakeHtml5FsFilesystem::Path& path = file_ref_resource->path;
3213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem* filesystem = file_ref_resource->filesystem;
3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsNode* node = filesystem->GetNode(path);
3233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool node_exists = node != NULL;
3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!node_exists) {
3263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!flag_create)
3273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    bool result = filesystem->AddEmptyFile(path, &node);
3303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_EQ(true, result);
3313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else {
3323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (flag_create && flag_exclusive)
3333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return RunCompletionCallback(&callback, PP_ERROR_FILEEXISTS);
3343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
3353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  file_io_resource->node = node;
3373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  file_io_resource->open_flags = open_flags;
3383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (flag_truncate)
3403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, node->SetLength(0));
3413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, PP_OK);
3433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileIoInterface::Query(PP_Resource file_io,
3463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   PP_FileInfo* info,
3473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   PP_CompletionCallback callback) {
3483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileIoResource* file_io_resource =
3493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
3503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_io_resource == NULL)
3513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!file_io_resource->node)
3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FAILED);
3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  file_io_resource->node->GetInfo(info);
3573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, PP_OK);
3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileIoInterface::Read(PP_Resource file_io,
3613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  int64_t offset,
3623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  char* buffer,
3633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  int32_t bytes_to_read,
3643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                  PP_CompletionCallback callback) {
3653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileIoResource* file_io_resource =
3663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
3673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_io_resource == NULL)
3683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
3693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (bytes_to_read < 0)
3713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FAILED);
3723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if ((file_io_resource->open_flags & PP_FILEOPENFLAG_READ) !=
3743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      PP_FILEOPENFLAG_READ) {
3753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_NOACCESS);
3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!file_io_resource->node)
3793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FAILED);
3803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int32_t result = file_io_resource->node->Read(offset, buffer, bytes_to_read);
3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, result);
3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileIoInterface::Write(PP_Resource file_io,
3863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   int64_t offset,
3873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   const char* buffer,
3883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   int32_t bytes_to_write,
3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   PP_CompletionCallback callback) {
3903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileIoResource* file_io_resource =
3913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
3923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_io_resource == NULL)
3933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
3943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if ((file_io_resource->open_flags & PP_FILEOPENFLAG_WRITE) !=
3963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      PP_FILEOPENFLAG_WRITE) {
3973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_NOACCESS);
3983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
3993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!file_io_resource->node)
4013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FAILED);
4023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int32_t result;
4043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if ((file_io_resource->open_flags & PP_FILEOPENFLAG_APPEND) ==
4053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      PP_FILEOPENFLAG_APPEND) {
4063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    result = file_io_resource->node->Append(buffer, bytes_to_write);
4073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else {
4083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    result = file_io_resource->node->Write(offset, buffer, bytes_to_write);
4093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
4103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, result);
4123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileIoInterface::SetLength(PP_Resource file_io,
4153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       int64_t length,
4163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       PP_CompletionCallback callback) {
4173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileIoResource* file_io_resource =
4183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
4193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_io_resource == NULL)
4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
4213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if ((file_io_resource->open_flags & PP_FILEOPENFLAG_WRITE) !=
4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      PP_FILEOPENFLAG_WRITE) {
4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_NOACCESS);
4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
4263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!file_io_resource->node)
4283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FAILED);
4293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  int32_t result = file_io_resource->node->SetLength(length);
4313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, result);
4323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileIoInterface::Flush(PP_Resource file_io,
4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                   PP_CompletionCallback callback) {
4363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileIoResource* file_io_resource =
4373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
4383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_io_resource == NULL)
4393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
4403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!file_io_resource->node)
4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FAILED);
4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, PP_OK);
4453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void FakeFileIoInterface::Close(PP_Resource file_io) {
4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileIoResource* file_io_resource =
4493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileIoResource>(file_io);
4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_io_resource == NULL)
4513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return;
4523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  file_io_resource->node = NULL;
4543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  file_io_resource->open_flags = 0;
4553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeFileRefInterface::FakeFileRefInterface(FakeCoreInterface* core_interface,
4583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           FakeVarInterface* var_interface)
4593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : core_interface_(core_interface), var_interface_(var_interface) {}
4603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)PP_Resource FakeFileRefInterface::Create(PP_Resource file_system,
4623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                         const char* path) {
4633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileSystemResource* file_system_resource =
4643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileSystemResource>(
4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          file_system);
4663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_system_resource == NULL)
4673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
4683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!file_system_resource->opened)
4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_FAILED;
4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (path == NULL)
4733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_FAILED;
4743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  size_t path_len = strlen(path);
4763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (path_len == 0)
4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_FAILED;
4783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileRefResource* file_ref_resource = new FakeFileRefResource;
4803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  file_ref_resource->filesystem = file_system_resource->filesystem;
4813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  file_ref_resource->path = path;
4823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Remove a trailing slash from the path, unless it is the root path.
4843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (path_len > 1 && file_ref_resource->path[path_len - 1] == '/')
4853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    file_ref_resource->path.erase(path_len - 1);
4863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return CREATE_RESOURCE(core_interface_->resource_manager(),
4883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         FakeFileRefResource,
4893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         file_ref_resource);
4903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)PP_Var FakeFileRefInterface::GetName(PP_Resource file_ref) {
4933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileRefResource* file_ref_resource =
4943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
4953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_ref_resource == NULL)
4963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_MakeUndefined();
4973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return var_interface_->VarFromUtf8(file_ref_resource->path.c_str(),
4993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     file_ref_resource->path.size());
5003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileRefInterface::MakeDirectory(PP_Resource directory_ref,
5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                            PP_Bool make_parents,
5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                            PP_CompletionCallback callback) {
5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileRefResource* directory_ref_resource =
5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileRefResource>(
5073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          directory_ref);
5083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (directory_ref_resource == NULL)
5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(binji): We don't currently use make_parents in nacl_io, so
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // I won't bother handling it yet.
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (make_parents == PP_TRUE)
5143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_FAILED;
5153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem* filesystem = directory_ref_resource->filesystem;
5173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem::Path path = directory_ref_resource->path;
5183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Pepper returns PP_ERROR_NOACCESS when trying to create the root directory,
5203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // not PP_ERROR_FILEEXISTS, as you might expect.
5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (path == "/")
5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_NOACCESS);
5233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsNode* node = filesystem->GetNode(path);
5253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (node != NULL)
5263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FILEEXISTS);
5273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem::Path parent_path = filesystem->GetParentPath(path);
5293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsNode* parent_node = filesystem->GetNode(parent_path);
5303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (parent_node == NULL)
5313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
5323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!parent_node->IsDirectory())
5343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FAILED);
5353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool result = filesystem->AddDirectory(directory_ref_resource->path, NULL);
5373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(true, result);
5383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, PP_OK);
5393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileRefInterface::Delete(PP_Resource file_ref,
5423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                     PP_CompletionCallback callback) {
5433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileRefResource* file_ref_resource =
5443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
5453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_ref_resource == NULL)
5463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
5473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem* filesystem = file_ref_resource->filesystem;
5493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem::Path path = file_ref_resource->path;
5503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsNode* node = filesystem->GetNode(path);
5513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (node == NULL)
5523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
5533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  filesystem->RemoveNode(path);
5553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, PP_OK);
5563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileRefInterface::Query(PP_Resource file_ref,
5593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                    PP_FileInfo* info,
5603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                    PP_CompletionCallback callback) {
5613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileRefResource* file_ref_resource =
5623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
5633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_ref_resource == NULL)
5643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
5653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem* filesystem = file_ref_resource->filesystem;
5673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem::Path path = file_ref_resource->path;
5683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsNode* node = filesystem->GetNode(path);
5693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (node == NULL)
5703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
5713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  node->GetInfo(info);
5733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, PP_OK);
5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileRefInterface::ReadDirectoryEntries(
5773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    PP_Resource directory_ref,
5783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const PP_ArrayOutput& output,
5793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    PP_CompletionCallback callback) {
5803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileRefResource* directory_ref_resource =
5813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileRefResource>(
5823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          directory_ref);
5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (directory_ref_resource == NULL)
5843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
5853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem* filesystem = directory_ref_resource->filesystem;
5873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem::Path path = directory_ref_resource->path;
5883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsNode* node = filesystem->GetNode(path);
5893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (node == NULL)
5903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
5913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (!node->IsDirectory())
5933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FAILED);
5943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeHtml5FsFilesystem::DirectoryEntries fake_dir_entries;
5963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  filesystem->GetDirectoryEntries(path, &fake_dir_entries);
5973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  uint32_t element_count = fake_dir_entries.size();
5993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  uint32_t element_size = sizeof(fake_dir_entries[0]);
6003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void* data_buffer =
6013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      (*output.GetDataBuffer)(output.user_data, element_count, element_size);
6023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (data_buffer == NULL)
6043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FAILED);
6053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  PP_DirectoryEntry* dir_entries = static_cast<PP_DirectoryEntry*>(data_buffer);
6073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  for (uint32_t i = 0; i < element_count; ++i) {
6083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const FakeHtml5FsFilesystem::DirectoryEntry& fake_dir_entry =
6093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        fake_dir_entries[i];
6103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    FakeFileRefResource* file_ref_resource = new FakeFileRefResource;
6123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    file_ref_resource->filesystem = directory_ref_resource->filesystem;
6133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    file_ref_resource->path = fake_dir_entry.path;
6143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    PP_Resource file_ref = CREATE_RESOURCE(core_interface_->resource_manager(),
6153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           FakeFileRefResource,
6163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           file_ref_resource);
6173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    dir_entries[i].file_ref = file_ref;
6193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    dir_entries[i].file_type = fake_dir_entry.node->file_type();
6203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
6213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, PP_OK);
6233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t FakeFileRefInterface::Rename(PP_Resource file_ref,
6265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     PP_Resource new_file_ref,
6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     PP_CompletionCallback callback) {
6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeFileRefResource* file_ref_resource =
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileRefResource>(file_ref);
6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (file_ref_resource == NULL)
6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeFileRefResource* new_file_ref_resource =
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileRefResource>(
6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          new_file_ref);
6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (new_file_ref_resource == NULL)
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeHtml5FsFilesystem* filesystem = file_ref_resource->filesystem;
6405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeHtml5FsFilesystem::Path path = file_ref_resource->path;
6415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeHtml5FsFilesystem::Path newpath = new_file_ref_resource->path;
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeHtml5FsNode* node = filesystem->GetNode(path);
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (node == NULL)
6445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_FILENOTFOUND);
6455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // FakeFileRefResource does not support directory rename.
6465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!node->IsRegular())
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return RunCompletionCallback(&callback, PP_ERROR_NOTAFILE);
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove the destination if it exists.
6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  filesystem->RemoveNode(newpath);
6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::vector<uint8_t> contents = node->contents();
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(filesystem->AddFile(newpath, contents, NULL));
6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(filesystem->RemoveNode(path));
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RunCompletionCallback(&callback, PP_OK);
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakeFileSystemInterface::FakeFileSystemInterface(
6583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    FakeCoreInterface* core_interface)
6593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : core_interface_(core_interface) {}
6603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PP_Bool FakeFileSystemInterface::IsFileSystem(PP_Resource resource) {
662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool not_found_ok = true;
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FakeFileSystemResource* file_system_resource =
664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileSystemResource>(
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          resource, not_found_ok);
666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return file_system_resource != NULL ? PP_TRUE : PP_FALSE;
667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)PP_Resource FakeFileSystemInterface::Create(PP_Instance instance,
6703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                            PP_FileSystemType filesystem_type) {
6713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeInstanceResource* instance_resource =
6723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeInstanceResource>(instance);
6733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (instance_resource == NULL)
6743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
6753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileSystemResource* file_system_resource = new FakeFileSystemResource;
6773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  file_system_resource->filesystem = new FakeHtml5FsFilesystem(
6783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      *instance_resource->filesystem_template, filesystem_type);
6793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return CREATE_RESOURCE(core_interface_->resource_manager(),
6813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         FakeFileSystemResource,
6823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         file_system_resource);
6833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int32_t FakeFileSystemInterface::Open(PP_Resource file_system,
6863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                      int64_t expected_size,
6873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                      PP_CompletionCallback callback) {
6883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeFileSystemResource* file_system_resource =
6893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      core_interface_->resource_manager()->Get<FakeFileSystemResource>(
6903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          file_system);
6913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (file_system_resource == NULL)
6923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return PP_ERROR_BADRESOURCE;
6933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  file_system_resource->opened = true;
6953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return RunCompletionCallback(&callback, PP_OK);
6963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
6973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakePepperInterfaceHtml5Fs::FakePepperInterfaceHtml5Fs()
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : core_interface_(&resource_manager_),
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var_interface_(&var_manager_),
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file_system_interface_(&core_interface_),
7023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      file_ref_interface_(&core_interface_, &var_interface_),
7033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      file_io_interface_(&core_interface_) {
7043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Init();
7053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakePepperInterfaceHtml5Fs::FakePepperInterfaceHtml5Fs(
7083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const FakeHtml5FsFilesystem& filesystem)
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : core_interface_(&resource_manager_),
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      var_interface_(&var_manager_),
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      filesystem_template_(filesystem),
7123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      file_system_interface_(&core_interface_),
7133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      file_ref_interface_(&core_interface_, &var_interface_),
7143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      file_io_interface_(&core_interface_),
7153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      instance_(0) {
7163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Init();
7173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void FakePepperInterfaceHtml5Fs::Init() {
7203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeInstanceResource* instance_resource = new FakeInstanceResource;
7213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  instance_resource->filesystem_template = &filesystem_template_;
7223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  instance_ = CREATE_RESOURCE(core_interface_.resource_manager(),
7243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              FakeInstanceResource,
7253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              instance_resource);
7263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakePepperInterfaceHtml5Fs::~FakePepperInterfaceHtml5Fs() {
7293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  core_interface_.ReleaseResource(instance_);
7303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)nacl_io::CoreInterface* FakePepperInterfaceHtml5Fs::GetCoreInterface() {
7333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return &core_interface_;
7343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)nacl_io::FileSystemInterface*
7373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)FakePepperInterfaceHtml5Fs::GetFileSystemInterface() {
7383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return &file_system_interface_;
7393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)nacl_io::FileRefInterface* FakePepperInterfaceHtml5Fs::GetFileRefInterface() {
7423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return &file_ref_interface_;
7433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)nacl_io::FileIoInterface* FakePepperInterfaceHtml5Fs::GetFileIoInterface() {
7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return &file_io_interface_;
7473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
7483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
7493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)nacl_io::VarInterface* FakePepperInterfaceHtml5Fs::GetVarInterface() {
7503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return &var_interface_;
7513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
752