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