Index: content/renderer/pepper/pepper_file_io_host.cc |
=================================================================== |
--- content/renderer/pepper/pepper_file_io_host.cc (revision 215615) |
+++ content/renderer/pepper/pepper_file_io_host.cc (working copy) |
@@ -13,6 +13,7 @@ |
#include "content/child/fileapi/file_system_dispatcher.h" |
#include "content/child/quota_dispatcher.h" |
#include "content/common/fileapi/file_system_messages.h" |
+#include "content/common/view_messages.h" |
#include "content/public/common/content_client.h" |
#include "content/public/renderer/content_renderer_client.h" |
#include "content/renderer/pepper/host_globals.h" |
@@ -20,7 +21,6 @@ |
#include "content/renderer/pepper/pepper_plugin_instance_impl.h" |
#include "content/renderer/pepper/ppb_file_ref_impl.h" |
#include "content/renderer/pepper/quota_file_io.h" |
-#include "content/renderer/pepper/resource_helper.h" |
#include "content/renderer/render_thread_impl.h" |
#include "ppapi/c/pp_errors.h" |
#include "ppapi/host/dispatch_host_message.h" |
@@ -148,11 +148,14 @@ |
quota_policy_(quota::kQuotaLimitTypeUnknown), |
is_running_in_process_(host->IsRunningInProcess()), |
open_flags_(0), |
- weak_factory_(this) { |
+ weak_factory_(this), |
+ routing_id_(RenderThreadImpl::current()->GenerateRoutingID()) { |
+ ChildThread::current()->AddRoute(routing_id_, this); |
} |
PepperFileIOHost::~PepperFileIOHost() { |
OnHostMsgClose(NULL); |
+ ChildThread::current()->RemoveRoute(routing_id_); |
} |
int32_t PepperFileIOHost::OnResourceMessageReceived( |
@@ -187,6 +190,37 @@ |
return PP_ERROR_FAILED; |
} |
+bool PepperFileIOHost::OnMessageReceived(const IPC::Message& msg) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(PepperFileIOHost, msg) |
+ IPC_MESSAGE_HANDLER(ViewMsg_AsyncOpenPepperFile_ACK, OnAsyncFileOpened) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |
+ |
+void PepperFileIOHost::OnAsyncFileOpened( |
+ base::PlatformFileError error_code, |
+ IPC::PlatformFileForTransit file_for_transit, |
+ int message_id) { |
+ AsyncOpenFileCallback* callback = |
+ pending_async_open_files_.Lookup(message_id); |
+ DCHECK(callback); |
+ pending_async_open_files_.Remove(message_id); |
+ |
+ base::PlatformFile file = |
+ IPC::PlatformFileForTransitToPlatformFile(file_for_transit); |
+ callback->Run(error_code, base::PassPlatformFile(&file)); |
+ // Make sure we won't leak file handle if the requester has died. |
+ if (file != base::kInvalidPlatformFileValue) { |
+ base::FileUtilProxy::Close( |
+ RenderThreadImpl::current()->GetFileThreadMessageLoopProxy().get(), |
+ file, |
+ base::FileUtilProxy::StatusCallback()); |
+ } |
+ delete callback; |
+} |
+ |
int32_t PepperFileIOHost::OnHostMsgOpen( |
ppapi::host::HostMessageContext* context, |
PP_Resource file_ref_resource, |
@@ -229,20 +263,18 @@ |
weak_factory_.GetWeakPtr(), |
context->MakeReplyMessageContext()); |
file_system_dispatcher->OpenFile( |
- file_system_url_, platform_file_flags, |
- base::Bind(&DidOpenFileSystemURL, callback), |
- base::Bind(&DidFailOpenFileSystemURL, callback)); |
+ file_system_url_, platform_file_flags, |
+ base::Bind(&DidOpenFileSystemURL, callback), |
+ base::Bind(&DidFailOpenFileSystemURL, callback)); |
} else { |
- PepperHelperImpl* helper = static_cast<PepperPluginInstanceImpl*>( |
- PepperPluginInstance::Get(pp_instance()))->helper(); |
- if (file_system_type_ != PP_FILESYSTEMTYPE_EXTERNAL || !helper) |
+ if (file_system_type_ != PP_FILESYSTEMTYPE_EXTERNAL) |
return PP_ERROR_FAILED; |
- if (!helper->AsyncOpenFile( |
- file_ref->GetSystemPath(), open_flags, |
- base::Bind(&PepperFileIOHost::ExecutePlatformOpenFileCallback, |
- weak_factory_.GetWeakPtr(), |
- context->MakeReplyMessageContext()))) |
- return PP_ERROR_FAILED; |
+ int message_id = pending_async_open_files_.Add(new AsyncOpenFileCallback( |
+ base::Bind(&PepperFileIOHost::ExecutePlatformOpenFileCallback, |
+ weak_factory_.GetWeakPtr(), |
+ context->MakeReplyMessageContext()))); |
+ RenderThreadImpl::current()->Send(new ViewHostMsg_AsyncOpenPepperFile( |
+ routing_id_, file_ref->GetSystemPath(), open_flags, message_id)); |
} |
state_manager_.SetPendingOperation(FileIOStateManager::OPERATION_EXCLUSIVE); |