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