1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/proxy/file_ref_resource.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/pp_directory_entry.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/pp_instance.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/c/pp_resource.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/proxy/ppapi_messages.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/shared_impl/array_writer.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/shared_impl/file_ref_util.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/shared_impl/resource.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/shared_impl/resource_tracker.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/shared_impl/var.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/thunk/enter.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ppapi/thunk/ppb_file_system_api.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace ppapi {
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace proxy {
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochFileRefResource::FileRefResource(
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Connection connection,
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PP_Instance instance,
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const FileRefCreateInfo& create_info)
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : PluginResource(connection, instance),
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      create_info_(create_info),
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      file_system_resource_(create_info.file_system_plugin_resource) {
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (uses_internal_paths()) {
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // If path ends with a slash, then normalize it away unless path is
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // the root path.
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int path_size = create_info_.internal_path.size();
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (path_size > 1 && create_info_.internal_path.at(path_size - 1) == '/')
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      create_info_.internal_path.erase(path_size - 1, 1);
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    path_var_ = new StringVar(create_info_.internal_path);
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    create_info_.display_name = GetNameForInternalFilePath(
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        create_info_.internal_path);
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } else {
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    DCHECK(!create_info_.display_name.empty());
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  name_var_ = new StringVar(create_info_.display_name);
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (create_info_.browser_pending_host_resource_id != 0 &&
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      create_info_.renderer_pending_host_resource_id != 0) {
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    AttachToPendingHost(BROWSER, create_info_.browser_pending_host_resource_id);
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    AttachToPendingHost(RENDERER,
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        create_info_.renderer_pending_host_resource_id);
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    CHECK_EQ(0, create_info_.browser_pending_host_resource_id);
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    CHECK_EQ(0, create_info_.renderer_pending_host_resource_id);
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    CHECK(uses_internal_paths());
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SendCreate(BROWSER, PpapiHostMsg_FileRef_CreateForFileAPI(
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        create_info.file_system_plugin_resource,
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        create_info.internal_path));
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SendCreate(RENDERER, PpapiHostMsg_FileRef_CreateForFileAPI(
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        create_info.file_system_plugin_resource,
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        create_info.internal_path));
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochFileRefResource::~FileRefResource() {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// static
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPP_Resource FileRefResource::CreateFileRef(
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Connection connection,
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PP_Instance instance,
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const FileRefCreateInfo& create_info) {
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // If we have a valid file_system resource, ensure that its type matches that
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // of the fs_type parameter.
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (create_info.file_system_plugin_resource != 0) {
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    thunk::EnterResourceNoLock<thunk::PPB_FileSystem_API> enter(
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        create_info.file_system_plugin_resource, true);
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (enter.failed())
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return 0;
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (enter.object()->GetType() != create_info.file_system_type) {
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      NOTREACHED() << "file system type mismatch with resource";
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return 0;
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (create_info.file_system_type == PP_FILESYSTEMTYPE_LOCALPERSISTENT ||
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      create_info.file_system_type == PP_FILESYSTEMTYPE_LOCALTEMPORARY) {
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!IsValidInternalPath(create_info.internal_path))
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return 0;
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return (new FileRefResource(connection,
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              instance,
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              create_info))->GetReference();
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochthunk::PPB_FileRef_API* FileRefResource::AsPPB_FileRef_API() {
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return this;
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPP_FileSystemType FileRefResource::GetFileSystemType() const {
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return create_info_.file_system_type;
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPP_Var FileRefResource::GetName() const {
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return name_var_->GetPPVar();
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPP_Var FileRefResource::GetPath() const {
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!uses_internal_paths())
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return PP_MakeUndefined();
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return path_var_->GetPPVar();
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPP_Resource FileRefResource::GetParent() {
112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!uses_internal_paths())
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return 0;
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  size_t pos = create_info_.internal_path.rfind('/');
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CHECK(pos != std::string::npos);
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (pos == 0)
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    pos++;
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string parent_path = create_info_.internal_path.substr(0, pos);
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ppapi::FileRefCreateInfo parent_info;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parent_info.file_system_type = create_info_.file_system_type;
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parent_info.internal_path = parent_path;
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parent_info.display_name = GetNameForInternalFilePath(parent_path);
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  parent_info.file_system_plugin_resource =
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      create_info_.file_system_plugin_resource;
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return (new FileRefResource(connection(),
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              pp_instance(),
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              parent_info))->GetReference();
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t FileRefResource::MakeDirectory(
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int32_t make_directory_flags,
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<TrackedCallback> callback) {
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Call<PpapiPluginMsg_FileRef_MakeDirectoryReply>(
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BROWSER,
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      PpapiHostMsg_FileRef_MakeDirectory(make_directory_flags),
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&FileRefResource::RunTrackedCallback, this, callback));
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_OK_COMPLETIONPENDING;
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t FileRefResource::Touch(PP_Time last_access_time,
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               PP_Time last_modified_time,
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               scoped_refptr<TrackedCallback> callback) {
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Call<PpapiPluginMsg_FileRef_TouchReply>(
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BROWSER,
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PpapiHostMsg_FileRef_Touch(last_access_time,
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 last_modified_time),
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&FileRefResource::RunTrackedCallback, this, callback));
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_OK_COMPLETIONPENDING;
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t FileRefResource::Delete(scoped_refptr<TrackedCallback> callback) {
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Call<PpapiPluginMsg_FileRef_DeleteReply>(
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BROWSER,
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PpapiHostMsg_FileRef_Delete(),
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&FileRefResource::RunTrackedCallback, this, callback));
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_OK_COMPLETIONPENDING;
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t FileRefResource::Rename(PP_Resource new_file_ref,
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                scoped_refptr<TrackedCallback> callback) {
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Call<PpapiPluginMsg_FileRef_RenameReply>(
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BROWSER,
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PpapiHostMsg_FileRef_Rename(new_file_ref),
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&FileRefResource::RunTrackedCallback, this, callback));
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_OK_COMPLETIONPENDING;
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t FileRefResource::Query(PP_FileInfo* info,
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               scoped_refptr<TrackedCallback> callback) {
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (info == NULL)
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return PP_ERROR_BADARGUMENT;
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Call<PpapiPluginMsg_FileRef_QueryReply>(
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BROWSER,
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PpapiHostMsg_FileRef_Query(),
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&FileRefResource::OnQueryReply, this, info, callback));
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_OK_COMPLETIONPENDING;
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint32_t FileRefResource::ReadDirectoryEntries(
184eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const PP_ArrayOutput& output,
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<TrackedCallback> callback) {
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Call<PpapiPluginMsg_FileRef_ReadDirectoryEntriesReply>(
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BROWSER,
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PpapiHostMsg_FileRef_ReadDirectoryEntries(),
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&FileRefResource::OnDirectoryEntriesReply,
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 this, output, callback));
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return PP_OK_COMPLETIONPENDING;
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)const FileRefCreateInfo& FileRefResource::GetCreateInfo() const {
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return create_info_;
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochPP_Var FileRefResource::GetAbsolutePath() {
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!absolute_path_var_.get()) {
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::string absolute_path;
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    int32_t result = SyncCall<PpapiPluginMsg_FileRef_GetAbsolutePathReply>(
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        BROWSER, PpapiHostMsg_FileRef_GetAbsolutePath(), &absolute_path);
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (result != PP_OK)
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return PP_MakeUndefined();
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    absolute_path_var_ = new StringVar(absolute_path);
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return absolute_path_var_->GetPPVar();
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FileRefResource::RunTrackedCallback(
211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<TrackedCallback> callback,
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const ResourceMessageReplyParams& params) {
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (TrackedCallback::IsPending(callback))
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    callback->Run(params.result());
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FileRefResource::OnQueryReply(
218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PP_FileInfo* out_info,
219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<TrackedCallback> callback,
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const ResourceMessageReplyParams& params,
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const PP_FileInfo& info) {
222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!TrackedCallback::IsPending(callback))
223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (params.result() == PP_OK)
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    *out_info = info;
227eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  callback->Run(params.result());
228eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FileRefResource::OnDirectoryEntriesReply(
231eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const PP_ArrayOutput& output,
232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<TrackedCallback> callback,
233eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const ResourceMessageReplyParams& params,
234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    const std::vector<ppapi::FileRefCreateInfo>& infos,
235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<PP_FileType>& file_types) {
236eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!TrackedCallback::IsPending(callback))
237eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
239eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (params.result() == PP_OK) {
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ArrayWriter writer(output);
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (!writer.is_valid()) {
242eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      callback->Run(PP_ERROR_BADARGUMENT);
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      return;
244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<PP_DirectoryEntry> entries;
247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    for (size_t i = 0; i < infos.size(); ++i) {
248eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      PP_DirectoryEntry entry;
249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      entry.file_ref = FileRefResource::CreateFileRef(connection(),
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                      pp_instance(),
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                      infos[i]);
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      entry.file_type = file_types[i];
253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      entries.push_back(entry);
254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    writer.StoreVector(entries);
257eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  callback->Run(params.result());
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
260eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
261a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool FileRefResource::uses_internal_paths() const {
262a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return (create_info_.file_system_type != PP_FILESYSTEMTYPE_EXTERNAL) ||
263a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch         !create_info_.internal_path.empty();
264a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
265a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace proxy
267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace ppapi
268