17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_ref_host.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string> 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/renderer_host/pepper/pepper_external_file_ref_backend.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_system_browser_host.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_internal_file_ref_backend.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_file_info.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_instance.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_resource.h" 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/dispatch_host_message.h" 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/ppapi_host.h" 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/file_ref_util.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_permission_policy.h" 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ppapi::host::ResourceHost; 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content { 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 26a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperFileRefBackend::~PepperFileRefBackend() {} 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperFileRefHost::PepperFileRefHost(BrowserPpapiHost* host, 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Instance instance, 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Resource resource, 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Resource file_system, 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& path) 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : ResourceHost(host->GetPpapiHost(), instance, resource), 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host_(host), 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fs_type_(PP_FILESYSTEMTYPE_INVALID) { 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!ppapi::IsValidInternalPath(path)) 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int render_process_id; 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int unused; 41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!host->GetRenderFrameIDsForInstance( 42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch instance, &render_process_id, &unused)) { 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ResourceHost* fs_resource_host = 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host->GetPpapiHost()->GetResourceHost(file_system); 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (fs_resource_host == NULL) { 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DLOG(ERROR) << "Couldn't find FileSystem host: " << resource 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << " path: " << path; 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!fs_resource_host->IsFileSystemHost()) { 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DLOG(ERROR) << "Filesystem PP_Resource is not PepperFileSystemBrowserHost"; 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PepperFileSystemBrowserHost* file_system_host = 600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static_cast<PepperFileSystemBrowserHost*>(fs_resource_host); 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) file_system_host_ = file_system_host->AsWeakPtr(); 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) fs_type_ = file_system_host->GetType(); 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((fs_type_ != PP_FILESYSTEMTYPE_LOCALPERSISTENT) && 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) (fs_type_ != PP_FILESYSTEMTYPE_LOCALTEMPORARY) && 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (fs_type_ != PP_FILESYSTEMTYPE_EXTERNAL) && 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) (fs_type_ != PP_FILESYSTEMTYPE_ISOLATED)) { 677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DLOG(ERROR) << "Unsupported filesystem type: " << fs_type_; 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if ((fs_type_ == PP_FILESYSTEMTYPE_EXTERNAL) && 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (!file_system_host->GetRootUrl().is_valid())) { 72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DLOG(ERROR) << "Native external filesystems are not supported by this " 73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch << "constructor."; 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return; 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch backend_.reset(new PepperInternalFileRefBackend(host->GetPpapiHost(), 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_process_id, 79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch file_system_host->AsWeakPtr(), 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch path)); 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPepperFileRefHost::PepperFileRefHost(BrowserPpapiHost* host, 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Instance instance, 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Resource resource, 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& external_path) 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : ResourceHost(host->GetPpapiHost(), instance, resource), 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_(host), 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fs_type_(PP_FILESYSTEMTYPE_EXTERNAL) { 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!ppapi::IsValidExternalPath(external_path)) 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int render_process_id; 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int unused; 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!host->GetRenderFrameIDsForInstance( 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch instance, &render_process_id, &unused)) { 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch backend_.reset(new PepperExternalFileRefBackend( 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch host->GetPpapiHost(), render_process_id, external_path)); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 104a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperFileRefHost::~PepperFileRefHost() {} 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool PepperFileRefHost::IsFileRefHost() { return true; } 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PP_FileSystemType PepperFileRefHost::GetFileSystemType() const { 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return fs_type_; 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::FileSystemURL PepperFileRefHost::GetFileSystemURL() const { 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (backend_) 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->GetFileSystemURL(); 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return storage::FileSystemURL(); 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)base::FilePath PepperFileRefHost::GetExternalFilePath() const { 1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (backend_) 1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return backend_->GetExternalFilePath(); 1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return base::FilePath(); 1228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)base::WeakPtr<PepperFileSystemBrowserHost> 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)PepperFileRefHost::GetFileSystemHost() const { 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return file_system_host_; 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 129558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperFileRefHost::CanRead() const { 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (backend_) 131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return backend_->CanRead(); 132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 133558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 135558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperFileRefHost::CanWrite() const { 136558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (backend_) 137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return backend_->CanWrite(); 138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperFileRefHost::CanCreate() const { 142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (backend_) 143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return backend_->CanCreate(); 144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 145558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 147558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperFileRefHost::CanReadWrite() const { 148558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (backend_) 149558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return backend_->CanReadWrite(); 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_ERROR_FAILED; 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnResourceMessageReceived( 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const IPC::Message& msg, 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::HostMessageContext* context) { 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!backend_) 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_BEGIN_MESSAGE_MAP(PepperFileRefHost, msg) 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileRef_MakeDirectory, 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnMakeDirectory) 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileRef_Touch, OnTouch) 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FileRef_Delete, OnDelete) 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileRef_Rename, OnRename) 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FileRef_Query, OnQuery) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0( 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PpapiHostMsg_FileRef_ReadDirectoryEntries, OnReadDirectoryEntries) 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FileRef_GetAbsolutePath, 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnGetAbsolutePath) 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_END_MESSAGE_MAP() 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnMakeDirectory( 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::HostMessageContext* context, 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t make_directory_flags) { 177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanCreate(); 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return backend_->MakeDirectory(context->MakeReplyMessageContext(), 181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch make_directory_flags); 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnTouch(ppapi::host::HostMessageContext* context, 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Time last_access_time, 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Time last_modified_time) { 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(teravest): Change this to be kWriteFilePermissions here and in 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // fileapi_message_filter. 189558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanCreate(); 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 192a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return backend_->Touch( 193a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch context->MakeReplyMessageContext(), last_access_time, last_modified_time); 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnDelete(ppapi::host::HostMessageContext* context) { 197558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanWrite(); 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->Delete(context->MakeReplyMessageContext()); 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnRename(ppapi::host::HostMessageContext* context, 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Resource new_file_ref) { 205558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanReadWrite(); 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResourceHost* resource_host = 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_->GetPpapiHost()->GetResourceHost(new_file_ref); 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!resource_host) 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_ERROR_BADRESOURCE; 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PepperFileRefHost* file_ref_host = NULL; 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (resource_host->IsFileRefHost()) 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) file_ref_host = static_cast<PepperFileRefHost*>(resource_host); 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!file_ref_host) 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_ERROR_BADRESOURCE; 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 220558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch rv = file_ref_host->CanCreate(); 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return backend_->Rename(context->MakeReplyMessageContext(), file_ref_host); 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnQuery(ppapi::host::HostMessageContext* context) { 228558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanRead(); 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->Query(context->MakeReplyMessageContext()); 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnReadDirectoryEntries( 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::HostMessageContext* context) { 236558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanRead(); 237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->ReadDirectoryEntries(context->MakeReplyMessageContext()); 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnGetAbsolutePath( 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::HostMessageContext* context) { 2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!host_->GetPpapiHost()->permissions().HasPermission( 245a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ppapi::PERMISSION_PRIVATE)) 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_NOACCESS; 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->GetAbsolutePath(context->MakeReplyMessageContext()); 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace content 251