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