| Index: ppapi/proxy/file_io_resource.cc
|
| diff --git a/ppapi/proxy/file_io_resource.cc b/ppapi/proxy/file_io_resource.cc
|
| index b1eb450479da9da5acc266224bddc31a0da0a320..347d4ef89168fd5102ef4cf8184e427155c58925 100644
|
| --- a/ppapi/proxy/file_io_resource.cc
|
| +++ b/ppapi/proxy/file_io_resource.cc
|
| @@ -138,21 +138,33 @@ int32_t FileIOResource::Query(PP_FileInfo* info,
|
| return PP_ERROR_FAILED;
|
|
|
| state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE);
|
| - scoped_refptr<QueryOp> query_op(new QueryOp(file_handle_));
|
|
|
| // If the callback is blocking, perform the task on the calling thread.
|
| if (callback->is_blocking()) {
|
| - int32_t result;
|
| + int32_t result = PP_ERROR_FAILED;
|
| + base::PlatformFileInfo file_info;
|
| + // The plugin could release its reference to this instance when we release
|
| + // the proxy lock below.
|
| + scoped_refptr<FileIOResource> protect(this);
|
| {
|
| // Release the proxy lock while making a potentially slow file call.
|
| ProxyAutoUnlock unlock;
|
| - result = query_op->DoWork();
|
| + if (base::GetPlatformFileInfo(file_handle_->raw_handle(), &file_info))
|
| + result = PP_OK;
|
| + }
|
| + if (result == PP_OK) {
|
| + // This writes the file info into the plugin's PP_FileInfo struct.
|
| + ppapi::PlatformFileInfoToPepperFileInfo(file_info,
|
| + file_system_type_,
|
| + info);
|
| }
|
| - return OnQueryComplete(query_op, info, result);
|
| + state_manager_.SetOperationFinished();
|
| + return result;
|
| }
|
|
|
| // For the non-blocking case, post a task to the file thread and add a
|
| // completion task to write the result.
|
| + scoped_refptr<QueryOp> query_op(new QueryOp(file_handle_));
|
| base::PostTaskAndReplyWithResult(
|
| PpapiGlobals::Get()->GetFileTaskRunner(),
|
| FROM_HERE,
|
| @@ -316,19 +328,28 @@ int32_t FileIOResource::ReadValidated(int64_t offset,
|
| state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_READ);
|
|
|
| bytes_to_read = std::min(bytes_to_read, kMaxReadSize);
|
| - scoped_refptr<ReadOp> read_op(
|
| - new ReadOp(file_handle_, offset, bytes_to_read));
|
| if (callback->is_blocking()) {
|
| - int32_t result;
|
| - {
|
| + char* buffer = static_cast<char*>(
|
| + array_output.GetDataBuffer(array_output.user_data, bytes_to_read, 1));
|
| + int32_t result = PP_ERROR_FAILED;
|
| + // The plugin could release its reference to this instance when we release
|
| + // the proxy lock below.
|
| + scoped_refptr<FileIOResource> protect(this);
|
| + if (buffer) {
|
| // Release the proxy lock while making a potentially slow file call.
|
| ProxyAutoUnlock unlock;
|
| - result = read_op->DoWork();
|
| + result = base::ReadPlatformFile(
|
| + file_handle_->raw_handle(), offset, buffer, bytes_to_read);
|
| + if (result < 0)
|
| + result = PP_ERROR_FAILED;
|
| }
|
| - return OnReadComplete(read_op, array_output, result);
|
| + state_manager_.SetOperationFinished();
|
| + return result;
|
| }
|
|
|
| // For the non-blocking case, post a task to the file thread.
|
| + scoped_refptr<ReadOp> read_op(
|
| + new ReadOp(file_handle_, offset, bytes_to_read));
|
| base::PostTaskAndReplyWithResult(
|
| PpapiGlobals::Get()->GetFileTaskRunner(),
|
| FROM_HERE,
|
|
|