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