OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ppapi/proxy/file_io_resource.h" | 5 #include "ppapi/proxy/file_io_resource.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/task_runner_util.h" | 8 #include "base/task_runner_util.h" |
9 #include "ipc/ipc_message.h" | 9 #include "ipc/ipc_message.h" |
10 #include "ppapi/c/pp_errors.h" | 10 #include "ppapi/c/pp_errors.h" |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
131 int32_t rv = state_manager_.CheckOperationState( | 131 int32_t rv = state_manager_.CheckOperationState( |
132 FileIOStateManager::OPERATION_EXCLUSIVE, true); | 132 FileIOStateManager::OPERATION_EXCLUSIVE, true); |
133 if (rv != PP_OK) | 133 if (rv != PP_OK) |
134 return rv; | 134 return rv; |
135 if (!info) | 135 if (!info) |
136 return PP_ERROR_BADARGUMENT; | 136 return PP_ERROR_BADARGUMENT; |
137 if (!FileHandleHolder::IsValid(file_handle_)) | 137 if (!FileHandleHolder::IsValid(file_handle_)) |
138 return PP_ERROR_FAILED; | 138 return PP_ERROR_FAILED; |
139 | 139 |
140 state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); | 140 state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); |
141 scoped_refptr<QueryOp> query_op(new QueryOp(file_handle_)); | |
142 | 141 |
143 // If the callback is blocking, perform the task on the calling thread. | 142 // If the callback is blocking, perform the task on the calling thread. |
144 if (callback->is_blocking()) { | 143 if (callback->is_blocking()) { |
145 int32_t result; | 144 int32_t result = PP_ERROR_FAILED; |
145 base::PlatformFileInfo file_info; | |
146 // The plugin could release its reference to this instance when we release | |
147 // the proxy lock below. | |
148 scoped_refptr<FileIOResource> protect(this); | |
146 { | 149 { |
147 // Release the proxy lock while making a potentially slow file call. | 150 // Release the proxy lock while making a potentially slow file call. |
148 ProxyAutoUnlock unlock; | 151 ProxyAutoUnlock unlock; |
149 result = query_op->DoWork(); | 152 if (base::GetPlatformFileInfo(file_handle_->raw_handle(), &file_info)) |
153 result = PP_OK; | |
150 } | 154 } |
151 return OnQueryComplete(query_op, info, result); | 155 if (result == PP_OK) { |
156 // This writes the file info into the plugin's PP_FileInfo struct. | |
157 ppapi::PlatformFileInfoToPepperFileInfo(file_info, | |
158 file_system_type_, | |
159 info); | |
160 } | |
161 state_manager_.SetOperationFinished(); | |
162 return result; | |
152 } | 163 } |
153 | 164 |
154 // For the non-blocking case, post a task to the file thread and add a | 165 // For the non-blocking case, post a task to the file thread and add a |
155 // completion task to write the result. | 166 // completion task to write the result. |
167 scoped_refptr<QueryOp> query_op(new QueryOp(file_handle_)); | |
156 base::PostTaskAndReplyWithResult( | 168 base::PostTaskAndReplyWithResult( |
157 PpapiGlobals::Get()->GetFileTaskRunner(), | 169 PpapiGlobals::Get()->GetFileTaskRunner(), |
158 FROM_HERE, | 170 FROM_HERE, |
159 Bind(&FileIOResource::QueryOp::DoWork, query_op), | 171 Bind(&FileIOResource::QueryOp::DoWork, query_op), |
160 RunWhileLocked(Bind(&TrackedCallback::Run, callback))); | 172 RunWhileLocked(Bind(&TrackedCallback::Run, callback))); |
161 callback->set_completion_task( | 173 callback->set_completion_task( |
162 Bind(&FileIOResource::OnQueryComplete, this, query_op, info)); | 174 Bind(&FileIOResource::OnQueryComplete, this, query_op, info)); |
163 | 175 |
164 return PP_OK_COMPLETIONPENDING; | 176 return PP_OK_COMPLETIONPENDING; |
165 } | 177 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
309 const PP_ArrayOutput& array_output, | 321 const PP_ArrayOutput& array_output, |
310 scoped_refptr<TrackedCallback> callback) { | 322 scoped_refptr<TrackedCallback> callback) { |
311 if (bytes_to_read < 0) | 323 if (bytes_to_read < 0) |
312 return PP_ERROR_FAILED; | 324 return PP_ERROR_FAILED; |
313 if (!FileHandleHolder::IsValid(file_handle_)) | 325 if (!FileHandleHolder::IsValid(file_handle_)) |
314 return PP_ERROR_FAILED; | 326 return PP_ERROR_FAILED; |
315 | 327 |
316 state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_READ); | 328 state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_READ); |
317 | 329 |
318 bytes_to_read = std::min(bytes_to_read, kMaxReadSize); | 330 bytes_to_read = std::min(bytes_to_read, kMaxReadSize); |
319 scoped_refptr<ReadOp> read_op( | |
320 new ReadOp(file_handle_, offset, bytes_to_read)); | |
321 if (callback->is_blocking()) { | 331 if (callback->is_blocking()) { |
322 int32_t result; | 332 char* buffer = static_cast<char*>( |
323 { | 333 array_output.GetDataBuffer(array_output.user_data, bytes_to_read, 1)); |
dmichael (off chromium)
2013/10/22 18:02:58
I had to read a bunch of code to convince myself w
bbudge
2013/10/22 20:51:04
Done.
| |
334 int32_t result = PP_ERROR_FAILED; | |
335 // The plugin could release its reference to this instance when we release | |
336 // the proxy lock below. | |
337 scoped_refptr<FileIOResource> protect(this); | |
338 if (buffer) { | |
324 // Release the proxy lock while making a potentially slow file call. | 339 // Release the proxy lock while making a potentially slow file call. |
325 ProxyAutoUnlock unlock; | 340 ProxyAutoUnlock unlock; |
326 result = read_op->DoWork(); | 341 result = base::ReadPlatformFile( |
342 file_handle_->raw_handle(), offset, buffer, bytes_to_read); | |
343 if (result < 0) | |
344 result = PP_ERROR_FAILED; | |
327 } | 345 } |
328 return OnReadComplete(read_op, array_output, result); | 346 state_manager_.SetOperationFinished(); |
347 return result; | |
329 } | 348 } |
330 | 349 |
331 // For the non-blocking case, post a task to the file thread. | 350 // For the non-blocking case, post a task to the file thread. |
351 scoped_refptr<ReadOp> read_op( | |
352 new ReadOp(file_handle_, offset, bytes_to_read)); | |
332 base::PostTaskAndReplyWithResult( | 353 base::PostTaskAndReplyWithResult( |
333 PpapiGlobals::Get()->GetFileTaskRunner(), | 354 PpapiGlobals::Get()->GetFileTaskRunner(), |
334 FROM_HERE, | 355 FROM_HERE, |
335 Bind(&FileIOResource::ReadOp::DoWork, read_op), | 356 Bind(&FileIOResource::ReadOp::DoWork, read_op), |
336 RunWhileLocked(Bind(&TrackedCallback::Run, callback))); | 357 RunWhileLocked(Bind(&TrackedCallback::Run, callback))); |
337 callback->set_completion_task( | 358 callback->set_completion_task( |
338 Bind(&FileIOResource::OnReadComplete, this, read_op, array_output)); | 359 Bind(&FileIOResource::OnReadComplete, this, read_op, array_output)); |
339 | 360 |
340 return PP_OK_COMPLETIONPENDING; | 361 return PP_OK_COMPLETIONPENDING; |
341 } | 362 } |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
431 *output_handle = IPC::PlatformFileForTransitToPlatformFile(transit_file); | 452 *output_handle = IPC::PlatformFileForTransitToPlatformFile(transit_file); |
432 | 453 |
433 // End this operation now, so the user's callback can execute another FileIO | 454 // End this operation now, so the user's callback can execute another FileIO |
434 // operation, assuming there are no other pending operations. | 455 // operation, assuming there are no other pending operations. |
435 state_manager_.SetOperationFinished(); | 456 state_manager_.SetOperationFinished(); |
436 callback->Run(result); | 457 callback->Run(result); |
437 } | 458 } |
438 | 459 |
439 } // namespace proxy | 460 } // namespace proxy |
440 } // namespace ppapi | 461 } // namespace ppapi |
OLD | NEW |