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_internal_file_ref_backend.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string>
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/callback.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/files/file_util_proxy.h"
12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/child_process_security_policy_impl.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/fileapi/browser_file_system_helper.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_system_browser_host.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/browser_context.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/storage_partition.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/base/escape.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_file_info.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_instance.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_resource.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_file_ref.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/dispatch_host_message.h"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/ppapi_host.h"
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/file_ref_create_info.h"
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/file_ref_util.h"
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/file_type_conversion.h"
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_var.h"
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h"
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/var.h"
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/thunk/enter.h"
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/thunk/ppb_file_ref_api.h"
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/thunk/ppb_file_system_api.h"
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation.h"
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_runner.h"
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h"
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_util.h"
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ppapi::host::PpapiHost;
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ppapi::host::ResourceHost;
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content {
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperInternalFileRefBackend::PepperInternalFileRefBackend(
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PpapiHost* host,
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int render_process_id,
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    base::WeakPtr<PepperFileSystemBrowserHost> fs_host,
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const std::string& path)
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : host_(host),
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      render_process_id_(render_process_id),
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      fs_host_(fs_host),
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      fs_type_(fs_host->GetType()),
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      path_(path),
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      weak_factory_(this) {
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ppapi::NormalizeInternalPath(&path_);
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
60a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperInternalFileRefBackend::~PepperInternalFileRefBackend() {}
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::FileSystemURL PepperInternalFileRefBackend::GetFileSystemURL() const {
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!fs_url_.is_valid() && fs_host_.get() && fs_host_->IsOpened()) {
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    GURL fs_path =
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        fs_host_->GetRootUrl().Resolve(net::EscapePath(path_.substr(1)));
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_refptr<storage::FileSystemContext> fs_context =
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        GetFileSystemContext();
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (fs_context.get())
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      fs_url_ = fs_context->CrackURL(fs_path);
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return fs_url_;
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)base::FilePath PepperInternalFileRefBackend::GetExternalFilePath() const {
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return base::FilePath();
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_refptr<storage::FileSystemContext>
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperInternalFileRefBackend::GetFileSystemContext() const {
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!fs_host_.get())
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return NULL;
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return fs_host_->GetFileSystemContext();
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PepperInternalFileRefBackend::DidFinish(
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext context,
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const IPC::Message& msg,
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error error) {
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context.params.set_result(ppapi::FileErrorToPepperError(error));
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  host_->SendReply(context, msg);
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::MakeDirectory(
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext reply_context,
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int32_t make_directory_flags) {
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!GetFileSystemURL().is_valid())
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetFileSystemContext()->operation_runner()->CreateDirectory(
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetFileSystemURL(),
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !!(make_directory_flags & PP_MAKEDIRECTORYFLAG_EXCLUSIVE),
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      !!(make_directory_flags & PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS),
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&PepperInternalFileRefBackend::DidFinish,
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 reply_context,
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 PpapiPluginMsg_FileRef_MakeDirectoryReply()));
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::Touch(
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext reply_context,
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PP_Time last_access_time,
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PP_Time last_modified_time) {
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!GetFileSystemURL().is_valid())
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetFileSystemContext()->operation_runner()->TouchFile(
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetFileSystemURL(),
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ppapi::PPTimeToTime(last_access_time),
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ppapi::PPTimeToTime(last_modified_time),
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&PepperInternalFileRefBackend::DidFinish,
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 reply_context,
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 PpapiPluginMsg_FileRef_TouchReply()));
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::Delete(
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext reply_context) {
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!GetFileSystemURL().is_valid())
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetFileSystemContext()->operation_runner()->Remove(
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetFileSystemURL(),
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      false,
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&PepperInternalFileRefBackend::DidFinish,
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 reply_context,
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 PpapiPluginMsg_FileRef_DeleteReply()));
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::Rename(
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext reply_context,
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PepperFileRefHost* new_file_ref) {
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!GetFileSystemURL().is_valid())
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemURL new_url = new_file_ref->GetFileSystemURL();
1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!new_url.is_valid())
1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!new_url.IsInSameFileSystem(GetFileSystemURL()))
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetFileSystemContext()->operation_runner()->Move(
1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetFileSystemURL(),
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new_url,
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      storage::FileSystemOperation::OPTION_NONE,
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&PepperInternalFileRefBackend::DidFinish,
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 reply_context,
1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 PpapiPluginMsg_FileRef_RenameReply()));
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::Query(
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext reply_context) {
1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!GetFileSystemURL().is_valid())
1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetFileSystemContext()->operation_runner()->GetMetadata(
1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetFileSystemURL(),
1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&PepperInternalFileRefBackend::GetMetadataComplete,
1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 reply_context));
1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PepperInternalFileRefBackend::GetMetadataComplete(
1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext reply_context,
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error error,
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::File::Info& file_info) {
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  reply_context.params.set_result(ppapi::FileErrorToPepperError(error));
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PP_FileInfo pp_file_info;
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (error == base::File::FILE_OK)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ppapi::FileInfoToPepperFileInfo(file_info, fs_type_, &pp_file_info);
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  else
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    memset(&pp_file_info, 0, sizeof(pp_file_info));
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  host_->SendReply(reply_context,
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                   PpapiPluginMsg_FileRef_QueryReply(pp_file_info));
1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::ReadDirectoryEntries(
1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext reply_context) {
1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!GetFileSystemURL().is_valid())
1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return PP_ERROR_FAILED;
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemOperation::FileEntryList* accumulated_file_list =
20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      new storage::FileSystemOperation::FileEntryList;
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  GetFileSystemContext()->operation_runner()->ReadDirectory(
2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      GetFileSystemURL(),
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&PepperInternalFileRefBackend::ReadDirectoryComplete,
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 weak_factory_.GetWeakPtr(),
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 reply_context,
207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 base::Owned(accumulated_file_list)));
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PepperInternalFileRefBackend::ReadDirectoryComplete(
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext context,
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    storage::FileSystemOperation::FileEntryList* accumulated_file_list,
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::File::Error error,
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::FileSystemOperation::FileEntryList& file_list,
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    bool has_more) {
217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  accumulated_file_list->insert(
218a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      accumulated_file_list->end(), file_list.begin(), file_list.end());
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (has_more)
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context.params.set_result(ppapi::FileErrorToPepperError(error));
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::vector<ppapi::FileRefCreateInfo> infos;
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::vector<PP_FileType> file_types;
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (error == base::File::FILE_OK && fs_host_.get()) {
2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::string dir_path = path_;
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (dir_path.empty() || dir_path[dir_path.size() - 1] != '/')
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      dir_path += '/';
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    for (storage::FileSystemOperation::FileEntryList::const_iterator it =
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)             accumulated_file_list->begin();
233a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch         it != accumulated_file_list->end();
234a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch         ++it) {
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (it->is_directory)
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        file_types.push_back(PP_FILETYPE_DIRECTORY);
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      else
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        file_types.push_back(PP_FILETYPE_REGULAR);
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ppapi::FileRefCreateInfo info;
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      info.file_system_type = fs_type_;
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      info.file_system_plugin_resource = fs_host_->pp_resource();
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      std::string path =
24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          dir_path + storage::FilePathToString(base::FilePath(it->name));
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      info.internal_path = path;
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      info.display_name = ppapi::GetNameForInternalFilePath(path);
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      infos.push_back(info);
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
251a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  host_->SendReply(
252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      context,
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      PpapiPluginMsg_FileRef_ReadDirectoryEntriesReply(infos, file_types));
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::GetAbsolutePath(
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ppapi::host::ReplyMessageContext reply_context) {
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  host_->SendReply(reply_context,
259a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   PpapiPluginMsg_FileRef_GetAbsolutePathReply(path_));
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return PP_OK_COMPLETIONPENDING;
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
263558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanRead() const {
26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemURL url = GetFileSystemURL();
265558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!FileSystemURLIsValid(GetFileSystemContext().get(), url))
266558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return PP_ERROR_FAILED;
267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFileSystemFile(
268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          render_process_id_, url)) {
269558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return PP_ERROR_NOACCESS;
270558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
271558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return PP_OK;
272558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
273558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
274558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanWrite() const {
27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemURL url = GetFileSystemURL();
276558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!FileSystemURLIsValid(GetFileSystemContext().get(), url))
277558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return PP_ERROR_FAILED;
278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanWriteFileSystemFile(
279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          render_process_id_, url)) {
280558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return PP_ERROR_NOACCESS;
281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
282558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return PP_OK;
283558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
285558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanCreate() const {
28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemURL url = GetFileSystemURL();
287558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!FileSystemURLIsValid(GetFileSystemContext().get(), url))
288558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return PP_ERROR_FAILED;
289a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanCreateFileSystemFile(
290a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          render_process_id_, url)) {
291558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return PP_ERROR_NOACCESS;
292558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
293558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return PP_OK;
294558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
295558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
296558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanReadWrite() const {
29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  storage::FileSystemURL url = GetFileSystemURL();
298558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!FileSystemURLIsValid(GetFileSystemContext().get(), url))
299558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return PP_ERROR_FAILED;
300558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ChildProcessSecurityPolicyImpl* policy =
301558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      ChildProcessSecurityPolicyImpl::GetInstance();
302558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!policy->CanReadFileSystemFile(render_process_id_, url) ||
303558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      !policy->CanWriteFileSystemFile(render_process_id_, url)) {
304558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return PP_ERROR_NOACCESS;
305558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  }
306558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return PP_OK;
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace content
310