pepper_file_ref_host.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "webkit/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) 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperFileRefBackend::~PepperFileRefBackend() { 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperFileRefHost::PepperFileRefHost(BrowserPpapiHost* host, 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Instance instance, 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Resource resource, 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Resource file_system, 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& path) 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : ResourceHost(host->GetPpapiHost(), instance, resource), 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host_(host), 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fs_type_(PP_FILESYSTEMTYPE_INVALID) { 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!ppapi::IsValidInternalPath(path)) 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int render_process_id; 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int unused; 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!host->GetRenderViewIDsForInstance(instance, 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &render_process_id, 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &unused)) { 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ResourceHost* fs_resource_host = 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host->GetPpapiHost()->GetResourceHost(file_system); 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (fs_resource_host == NULL) { 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DLOG(ERROR) << "Couldn't find FileSystem host: " << resource 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) << " path: " << path; 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!fs_resource_host->IsFileSystemHost()) { 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DLOG(ERROR) << "Filesystem PP_Resource is not PepperFileSystemBrowserHost"; 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) PepperFileSystemBrowserHost* file_system_host = 620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) static_cast<PepperFileSystemBrowserHost*>(fs_resource_host); 630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) fs_type_ = file_system_host->GetType(); 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((fs_type_ != PP_FILESYSTEMTYPE_LOCALPERSISTENT) && 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) (fs_type_ != PP_FILESYSTEMTYPE_LOCALTEMPORARY) && 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) } 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) backend_.reset(new PepperInternalFileRefBackend( 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host->GetPpapiHost(), 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_process_id, 740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) file_system_host->AsWeakPtr(), 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) path)); 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPepperFileRefHost::PepperFileRefHost(BrowserPpapiHost* host, 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Instance instance, 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PP_Resource resource, 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::FilePath& external_path) 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : ResourceHost(host->GetPpapiHost(), instance, resource), 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_(host), 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fs_type_(PP_FILESYSTEMTYPE_EXTERNAL) { 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!ppapi::IsValidExternalPath(external_path)) 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int render_process_id; 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int unused; 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!host->GetRenderViewIDsForInstance(instance, 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &render_process_id, 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &unused)) { 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch backend_.reset(new PepperExternalFileRefBackend(host->GetPpapiHost(), 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch render_process_id, 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch external_path)); 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperFileRefHost::~PepperFileRefHost() { 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool PepperFileRefHost::IsFileRefHost() { 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PP_FileSystemType PepperFileRefHost::GetFileSystemType() const { 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return fs_type_; 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)fileapi::FileSystemURL PepperFileRefHost::GetFileSystemURL() const { 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (backend_) 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->GetFileSystemURL(); 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return fileapi::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) 124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperFileRefHost::CanRead() const { 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (backend_) 126558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return backend_->CanRead(); 127558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 128558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 129558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 130558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperFileRefHost::CanWrite() const { 131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (backend_) 132558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return backend_->CanWrite(); 133558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 135558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 136558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperFileRefHost::CanCreate() const { 137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (backend_) 138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return backend_->CanCreate(); 139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperFileRefHost::CanReadWrite() const { 143558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (backend_) 144558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return backend_->CanReadWrite(); 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_ERROR_FAILED; 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnResourceMessageReceived( 1497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const IPC::Message& msg, 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::HostMessageContext* context) { 1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!backend_) 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(PepperFileRefHost, msg) 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileRef_MakeDirectory, 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnMakeDirectory); 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileRef_Touch, 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnTouch); 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FileRef_Delete, 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnDelete); 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_FileRef_Rename, 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnRename); 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FileRef_Query, 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnQuery); 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0( 1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiHostMsg_FileRef_ReadDirectoryEntries, 1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnReadDirectoryEntries); 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_FileRef_GetAbsolutePath, 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) OnGetAbsolutePath); 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) IPC_END_MESSAGE_MAP() 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnMakeDirectory( 1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::HostMessageContext* context, 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool make_ancestors) { 178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanCreate(); 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->MakeDirectory(context->MakeReplyMessageContext(), 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) make_ancestors); 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnTouch(ppapi::host::HostMessageContext* context, 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Time last_access_time, 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Time last_modified_time) { 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(teravest): Change this to be kWriteFilePermissions here and in 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // fileapi_message_filter. 190558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanCreate(); 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->Touch(context->MakeReplyMessageContext(), 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_access_time, 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) last_modified_time); 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnDelete(ppapi::host::HostMessageContext* context) { 199558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanWrite(); 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->Delete(context->MakeReplyMessageContext()); 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnRename(ppapi::host::HostMessageContext* context, 2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Resource new_file_ref) { 207558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanReadWrite(); 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ResourceHost* resource_host = 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host_->GetPpapiHost()->GetResourceHost(new_file_ref); 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!resource_host) 214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_ERROR_BADRESOURCE; 215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PepperFileRefHost* file_ref_host = NULL; 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (resource_host->IsFileRefHost()) 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) file_ref_host = static_cast<PepperFileRefHost*>(resource_host); 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!file_ref_host) 220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return PP_ERROR_BADRESOURCE; 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 222558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch rv = file_ref_host->CanCreate(); 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->Rename(context->MakeReplyMessageContext(), 227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch file_ref_host); 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnQuery(ppapi::host::HostMessageContext* context) { 231558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanRead(); 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->Query(context->MakeReplyMessageContext()); 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnReadDirectoryEntries( 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::HostMessageContext* context) { 239558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int32_t rv = CanRead(); 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (rv != PP_OK) 241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return rv; 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->ReadDirectoryEntries(context->MakeReplyMessageContext()); 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperFileRefHost::OnGetAbsolutePath( 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::HostMessageContext* context) { 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!host_->GetPpapiHost()->permissions().HasPermission( 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::PERMISSION_PRIVATE)) 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_NOACCESS; 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return backend_->GetAbsolutePath(context->MakeReplyMessageContext()); 2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace content 254