file_io_resource.cc revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/file_io_resource.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/task_runner_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_message.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/array_writer.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ppapi/shared_impl/file_type_conversion.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h" 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ppapi/shared_impl/proxy_lock.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/resource_tracker.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/enter.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/ppb_file_ref_api.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::thunk::EnterResourceNoLock; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::thunk::PPB_FileIO_API; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::thunk::PPB_FileRef_API; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// We must allocate a buffer sized according to the request of the plugin. To 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// reduce the chance of out-of-memory errors, we cap the read size to 32MB. 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// This is OK since the API specifies that it may perform a partial read. 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic const int32_t kMaxReadSize = 32 * 1024 * 1024; // 32MB 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// An adapter to let Read() share the same implementation with ReadToArray(). 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void* DummyGetDataBuffer(void* user_data, uint32_t count, uint32_t size) { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return user_data; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// File thread task to close the file handle. 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid DoClose(base::PlatformFile file) { 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::ClosePlatformFile(file); 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace proxy { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochFileIOResource::QueryOp::QueryOp(PP_FileHandle file_handle) 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : file_handle_(file_handle) { 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochFileIOResource::QueryOp::~QueryOp() { 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochint32_t FileIOResource::QueryOp::DoWork() { 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return base::GetPlatformFileInfo(file_handle_, &file_info_) ? 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PP_OK : PP_ERROR_FAILED; 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochFileIOResource::ReadOp::ReadOp(PP_FileHandle file_handle, 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int64_t offset, 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int32_t bytes_to_read) 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : file_handle_(file_handle), 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch offset_(offset), 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bytes_to_read_(bytes_to_read) { 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochFileIOResource::ReadOp::~ReadOp() { 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochint32_t FileIOResource::ReadOp::DoWork() { 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(!buffer_.get()); 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch buffer_.reset(new char[bytes_to_read_]); 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return base::ReadPlatformFile( 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch file_handle_, offset_, buffer_.get(), bytes_to_read_); 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FileIOResource::FileIOResource(Connection connection, PP_Instance instance) 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : PluginResource(connection, instance), 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch file_handle_(base::kInvalidPlatformFileValue), 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch file_system_type_(PP_FILESYSTEMTYPE_INVALID) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCreate(RENDERER, PpapiHostMsg_FileIO_Create()); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FileIOResource::~FileIOResource() { 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch CloseFileHandle(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PPB_FileIO_API* FileIOResource::AsPPB_FileIO_API() { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return this; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::Open(PP_Resource file_ref, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t open_flags, 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterResourceNoLock<PPB_FileRef_API> enter(file_ref, true); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.failed()) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_BADRESOURCE; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PPB_FileRef_API* file_ref_api = enter.object(); 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PP_FileSystemType type = file_ref_api->GetFileSystemType(); 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (type != PP_FILESYSTEMTYPE_LOCALPERSISTENT && 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch type != PP_FILESYSTEMTYPE_LOCALTEMPORARY && 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch type != PP_FILESYSTEMTYPE_EXTERNAL && 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch type != PP_FILESYSTEMTYPE_ISOLATED) { 104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch NOTREACHED(); 105ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return PP_ERROR_FAILED; 106ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch file_system_type_ = type; 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE, false); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rv != PP_OK) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_FileIO_OpenReply>(RENDERER, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_FileIO_Open( 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch file_ref, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) open_flags), 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FileIOResource::OnPluginMsgOpenFileComplete, this, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback)); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::Query(PP_FileInfo* info, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE, true); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rv != PP_OK) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!info) 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return PP_ERROR_BADARGUMENT; 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (file_handle_ == base::kInvalidPlatformFileValue) 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return PP_ERROR_FAILED; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_refptr<QueryOp> query_op(new QueryOp(file_handle_)); 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // If the callback is blocking, perform the task on the calling thread. 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (callback->is_blocking()) { 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int32_t result; 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Release the proxy lock while making a potentially slow file call. 144ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ProxyAutoUnlock unlock; 145ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch result = query_op->DoWork(); 146ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 147ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return OnQueryComplete(query_op, info, result); 148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 149ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // For the non-blocking case, post a task to the file thread and add a 151ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // completion task to write the result. 152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::PostTaskAndReplyWithResult( 153ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PpapiGlobals::Get()->GetFileTaskRunner(pp_instance()), 154ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FROM_HERE, 155ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Bind(&FileIOResource::QueryOp::DoWork, query_op), 156ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RunWhileLocked(Bind(&TrackedCallback::Run, callback))); 157ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback->set_completion_task( 158ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Bind(&FileIOResource::OnQueryComplete, this, query_op, info)); 159ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::Touch(PP_Time last_access_time, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Time last_modified_time, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE, true); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rv != PP_OK) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_FileIO_GeneralReply>(RENDERER, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_FileIO_Touch(last_access_time, last_modified_time), 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FileIOResource::OnPluginMsgGeneralComplete, this, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback)); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::Read(int64_t offset, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char* buffer, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t bytes_to_read, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_READ, true); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rv != PP_OK) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_ArrayOutput output_adapter; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_adapter.GetDataBuffer = &DummyGetDataBuffer; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_adapter.user_data = buffer; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ReadValidated(offset, bytes_to_read, output_adapter, callback); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::ReadToArray(int64_t offset, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t max_read_length, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_ArrayOutput* array_output, 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(array_output); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_READ, true); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rv != PP_OK) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ReadValidated(offset, max_read_length, *array_output, callback); 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::Write(int64_t offset, 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* buffer, 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t bytes_to_write, 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_WRITE, true); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rv != PP_OK) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(brettw) it would be nice to use a shared memory buffer for large 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // writes rather than having to copy to a string (which will involve a number 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of extra copies to serialize over IPC). 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_FileIO_GeneralReply>(RENDERER, 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_FileIO_Write(offset, std::string(buffer, bytes_to_write)), 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FileIOResource::OnPluginMsgGeneralComplete, this, 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback)); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_WRITE); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::SetLength(int64_t length, 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE, true); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rv != PP_OK) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_FileIO_GeneralReply>(RENDERER, 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_FileIO_SetLength(length), 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FileIOResource::OnPluginMsgGeneralComplete, this, 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback)); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::Flush(scoped_refptr<TrackedCallback> callback) { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t rv = state_manager_.CheckOperationState( 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE, true); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rv != PP_OK) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rv; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_FileIO_GeneralReply>(RENDERER, 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_FileIO_Flush(), 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&FileIOResource::OnPluginMsgGeneralComplete, this, 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback)); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FileIOResource::Close() { 261ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch CloseFileHandle(); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_FileIO_Close()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::GetOSFileDescriptor() { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t file_descriptor; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only available when running in process. 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncCall<PpapiPluginMsg_FileIO_GetOSFileDescriptorReply>( 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RENDERER, PpapiHostMsg_FileIO_GetOSFileDescriptor(), &file_descriptor); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return file_descriptor; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 273ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochint32_t FileIOResource::RequestOSFileHandle( 274ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PP_FileHandle* handle, 275ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_refptr<TrackedCallback> callback) { 276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int32_t rv = state_manager_.CheckOperationState( 277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FileIOStateManager::OPERATION_EXCLUSIVE, true); 278ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (rv != PP_OK) 279ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return rv; 280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 281ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Call<PpapiPluginMsg_FileIO_RequestOSFileHandleReply>(RENDERER, 282ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PpapiHostMsg_FileIO_RequestOSFileHandle(), 283ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&FileIOResource::OnPluginMsgRequestOSFileHandleComplete, this, 284ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback, handle)); 285ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 286ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 287ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return PP_OK_COMPLETIONPENDING; 288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 289ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::WillWrite(int64_t offset, 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t bytes_to_write, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_FileIO_GeneralReply>(RENDERER, 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_FileIO_WillWrite(offset, bytes_to_write), 295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&FileIOResource::OnPluginMsgGeneralComplete, this, callback)); 296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::WillSetLength(int64_t length, 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_FileIO_GeneralReply>(RENDERER, 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_FileIO_WillSetLength(length), 305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&FileIOResource::OnPluginMsgGeneralComplete, this, callback)); 306ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FileIOResource::ReadValidated(int64_t offset, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t bytes_to_read, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_ArrayOutput& array_output, 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback) { 315ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (bytes_to_read < 0) 316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return PP_ERROR_FAILED; 317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (file_handle_ == base::kInvalidPlatformFileValue) 318ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return PP_ERROR_FAILED; 319ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_READ); 321ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 322ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bytes_to_read = std::min(bytes_to_read, kMaxReadSize); 323ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_refptr<ReadOp> read_op( 324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new ReadOp(file_handle_, offset, bytes_to_read)); 325ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (callback->is_blocking()) { 326ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int32_t result; 327ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch { 328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Release the proxy lock while making a potentially slow file call. 329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ProxyAutoUnlock unlock; 330ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch result = read_op->DoWork(); 331ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return OnReadComplete(read_op, array_output, result); 333ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 334ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 335ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // For the non-blocking case, post a task to the file thread. 336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::PostTaskAndReplyWithResult( 337ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PpapiGlobals::Get()->GetFileTaskRunner(pp_instance()), 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FROM_HERE, 339ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Bind(&FileIOResource::ReadOp::DoWork, read_op), 340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch RunWhileLocked(Bind(&TrackedCallback::Run, callback))); 341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch callback->set_completion_task( 342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Bind(&FileIOResource::OnReadComplete, this, read_op, array_output)); 343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid FileIOResource::CloseFileHandle() { 348ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (file_handle_ != base::kInvalidPlatformFileValue) { 349ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Close our local fd on the file thread. 350ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::TaskRunner* file_task_runner = 351ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PpapiGlobals::Get()->GetFileTaskRunner(pp_instance()); 352ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch file_task_runner->PostTask(FROM_HERE, 353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::Bind(&DoClose, file_handle_)); 354fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch file_handle_ = base::kInvalidPlatformFileValue; 356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 357ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 358fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochint32_t FileIOResource::OnQueryComplete(scoped_refptr<QueryOp> query_op, 360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PP_FileInfo* info, 361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int32_t result) { 362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(state_manager_.get_pending_operation() == 363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FileIOStateManager::OPERATION_EXCLUSIVE); 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (result == PP_OK) { 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // This writes the file info into the plugin's PP_FileInfo struct. 367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::PlatformFileInfoToPepperFileInfo(query_op->file_info(), 368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch file_system_type_, 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch info); 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch state_manager_.SetOperationFinished(); 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return result; 373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 375ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochint32_t FileIOResource::OnReadComplete(scoped_refptr<ReadOp> read_op, 376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PP_ArrayOutput array_output, 377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch int32_t result) { 378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(state_manager_.get_pending_operation() == 379ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FileIOStateManager::OPERATION_READ); 380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (result >= 0) { 381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ArrayWriter output; 382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch output.set_pp_array_output(array_output); 383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (output.is_valid()) 384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch output.StoreArray(read_op->buffer(), result); 385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch else 386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch result = PP_ERROR_FAILED; 387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } else { 388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The read operation failed. 389ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch result = PP_ERROR_FAILED; 390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch state_manager_.SetOperationFinished(); 392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return result; 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FileIOResource::OnPluginMsgGeneralComplete( 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback, 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params) { 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(state_manager_.get_pending_operation() == 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE || 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.get_pending_operation() == 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_WRITE); 402ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // End this operation now, so the user's callback can execute another FileIO 403ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // operation, assuming there are no other pending operations. 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetOperationFinished(); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback->Run(params.result()); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FileIOResource::OnPluginMsgOpenFileComplete( 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback, 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params) { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(state_manager_.get_pending_operation() == 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.result() == PP_OK) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetOpenSucceed(); 415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = params.result(); 417ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch IPC::PlatformFileForTransit transit_file; 418ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if ((result == PP_OK) && params.TakeFileHandleAtIndex(0, &transit_file)) 419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch file_handle_ = IPC::PlatformFileForTransitToPlatformFile(transit_file); 420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // End this operation now, so the user's callback can execute another FileIO 421ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // operation, assuming there are no other pending operations. 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) state_manager_.SetOperationFinished(); 423a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) callback->Run(result); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void FileIOResource::OnPluginMsgRequestOSFileHandleComplete( 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<TrackedCallback> callback, 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PP_FileHandle* output_handle, 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ResourceMessageReplyParams& params) { 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(state_manager_.get_pending_operation() == 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FileIOStateManager::OPERATION_EXCLUSIVE); 432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!TrackedCallback::IsPending(callback)) { 434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) state_manager_.SetOperationFinished(); 435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int32_t result = params.result(); 439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IPC::PlatformFileForTransit transit_file; 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!params.TakeFileHandleAtIndex(0, &transit_file)) 441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result = PP_ERROR_FAILED; 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *output_handle = IPC::PlatformFileForTransitToPlatformFile(transit_file); 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 444ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // End this operation now, so the user's callback can execute another FileIO 445ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // operation, assuming there are no other pending operations. 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) state_manager_.SetOperationFinished(); 447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback->Run(result); 448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace proxy 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 452