| 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/ppb_file_ref_proxy.h" | 5 #include "ppapi/proxy/ppb_file_ref_proxy.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "ppapi/c/pp_errors.h" | 10 #include "ppapi/c/pp_errors.h" |
| 11 #include "ppapi/c/ppb_file_ref.h" | 11 #include "ppapi/c/ppb_file_ref.h" |
| 12 #include "ppapi/c/private/ppb_file_ref_private.h" | 12 #include "ppapi/c/private/ppb_file_ref_private.h" |
| 13 #include "ppapi/c/private/ppb_proxy_private.h" | 13 #include "ppapi/c/private/ppb_proxy_private.h" |
| 14 #include "ppapi/proxy/enter_proxy.h" | 14 #include "ppapi/proxy/enter_proxy.h" |
| 15 #include "ppapi/proxy/host_dispatcher.h" | 15 #include "ppapi/proxy/host_dispatcher.h" |
| 16 #include "ppapi/proxy/plugin_dispatcher.h" | 16 #include "ppapi/proxy/plugin_dispatcher.h" |
| 17 #include "ppapi/proxy/ppapi_messages.h" | 17 #include "ppapi/proxy/ppapi_messages.h" |
| 18 #include "ppapi/proxy/serialized_var.h" | 18 #include "ppapi/proxy/serialized_var.h" |
| 19 #include "ppapi/shared_impl/ppb_file_ref_shared.h" | 19 #include "ppapi/shared_impl/ppb_file_ref_shared.h" |
| 20 #include "ppapi/shared_impl/scoped_pp_resource.h" |
| 20 #include "ppapi/shared_impl/tracked_callback.h" | 21 #include "ppapi/shared_impl/tracked_callback.h" |
| 21 #include "ppapi/thunk/resource_creation_api.h" | 22 #include "ppapi/thunk/resource_creation_api.h" |
| 22 #include "ppapi/thunk/thunk.h" | 23 #include "ppapi/thunk/thunk.h" |
| 23 | 24 |
| 24 using ppapi::thunk::EnterResourceNoLock; | 25 using ppapi::thunk::EnterResourceNoLock; |
| 25 using ppapi::thunk::PPB_FileRef_API; | 26 using ppapi::thunk::PPB_FileRef_API; |
| 26 using ppapi::thunk::ResourceCreationAPI; | 27 using ppapi::thunk::ResourceCreationAPI; |
| 27 | 28 |
| 28 namespace ppapi { | 29 namespace ppapi { |
| 29 namespace proxy { | 30 namespace proxy { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 typedef std::map<uint32_t, | 75 typedef std::map<uint32_t, |
| 75 scoped_refptr<TrackedCallback> > PendingCallbackMap; | 76 scoped_refptr<TrackedCallback> > PendingCallbackMap; |
| 76 PendingCallbackMap pending_callbacks_; | 77 PendingCallbackMap pending_callbacks_; |
| 77 | 78 |
| 78 // Used to keep pointers to PP_FileInfo instances that are written before | 79 // Used to keep pointers to PP_FileInfo instances that are written before |
| 79 // callbacks are invoked. The id of a pending file info will match that of | 80 // callbacks are invoked. The id of a pending file info will match that of |
| 80 // the corresponding callback. | 81 // the corresponding callback. |
| 81 typedef std::map<uint32_t, PP_FileInfo*> PendingFileInfoMap; | 82 typedef std::map<uint32_t, PP_FileInfo*> PendingFileInfoMap; |
| 82 PendingFileInfoMap pending_file_infos_; | 83 PendingFileInfoMap pending_file_infos_; |
| 83 | 84 |
| 85 // Holds a reference on plugin side when running out of process, so that |
| 86 // FileSystem won't die before FileRef. See PPB_FileRef_Impl for |
| 87 // corresponding code for in-process mode. Note that this workaround will |
| 88 // be no longer needed after FileRef refactoring. |
| 89 ScopedPPResource file_system_; |
| 90 |
| 84 DISALLOW_IMPLICIT_CONSTRUCTORS(FileRef); | 91 DISALLOW_IMPLICIT_CONSTRUCTORS(FileRef); |
| 85 }; | 92 }; |
| 86 | 93 |
| 87 FileRef::FileRef(const PPB_FileRef_CreateInfo& info) | 94 FileRef::FileRef(const PPB_FileRef_CreateInfo& info) |
| 88 : PPB_FileRef_Shared(OBJECT_IS_PROXY, info), | 95 : PPB_FileRef_Shared(OBJECT_IS_PROXY, info), |
| 89 next_callback_id_(0u) { | 96 next_callback_id_(0u), |
| 97 file_system_(info.file_system_plugin_resource) { |
| 90 } | 98 } |
| 91 | 99 |
| 92 FileRef::~FileRef() { | 100 FileRef::~FileRef() { |
| 93 // The callbacks map should have been cleared by LastPluginRefWasDeleted. | 101 // The callbacks map should have been cleared by LastPluginRefWasDeleted. |
| 94 DCHECK(pending_callbacks_.empty()); | 102 DCHECK(pending_callbacks_.empty()); |
| 95 DCHECK(pending_file_infos_.empty()); | 103 DCHECK(pending_file_infos_.empty()); |
| 96 } | 104 } |
| 97 | 105 |
| 98 void FileRef::LastPluginRefWasDeleted() { | 106 void FileRef::LastPluginRefWasDeleted() { |
| 99 // The callback tracker will abort our callbacks for us. | 107 // The callback tracker will abort our callbacks for us. |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 | 205 |
| 198 PPB_FileRef_Proxy::PPB_FileRef_Proxy(Dispatcher* dispatcher) | 206 PPB_FileRef_Proxy::PPB_FileRef_Proxy(Dispatcher* dispatcher) |
| 199 : InterfaceProxy(dispatcher), | 207 : InterfaceProxy(dispatcher), |
| 200 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 208 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| 201 } | 209 } |
| 202 | 210 |
| 203 PPB_FileRef_Proxy::~PPB_FileRef_Proxy() { | 211 PPB_FileRef_Proxy::~PPB_FileRef_Proxy() { |
| 204 } | 212 } |
| 205 | 213 |
| 206 // static | 214 // static |
| 207 PP_Resource PPB_FileRef_Proxy::CreateProxyResource(PP_Resource file_system, | 215 PP_Resource PPB_FileRef_Proxy::CreateProxyResource(PP_Instance instance, |
| 216 PP_Resource file_system, |
| 208 const char* path) { | 217 const char* path) { |
| 209 Resource* file_system_object = | |
| 210 PpapiGlobals::Get()->GetResourceTracker()->GetResource(file_system); | |
| 211 if (!file_system_object) | |
| 212 return 0; | |
| 213 | |
| 214 PPB_FileRef_CreateInfo create_info; | 218 PPB_FileRef_CreateInfo create_info; |
| 215 PluginDispatcher::GetForResource(file_system_object)->Send( | 219 PluginDispatcher::GetForInstance(instance)->Send( |
| 216 new PpapiHostMsg_PPBFileRef_Create( | 220 new PpapiHostMsg_PPBFileRef_Create( |
| 217 API_ID_PPB_FILE_REF, file_system_object->host_resource(), | 221 API_ID_PPB_FILE_REF, instance, file_system, path, &create_info)); |
| 218 path, &create_info)); | |
| 219 return PPB_FileRef_Proxy::DeserializeFileRef(create_info); | 222 return PPB_FileRef_Proxy::DeserializeFileRef(create_info); |
| 220 } | 223 } |
| 221 | 224 |
| 222 bool PPB_FileRef_Proxy::OnMessageReceived(const IPC::Message& msg) { | 225 bool PPB_FileRef_Proxy::OnMessageReceived(const IPC::Message& msg) { |
| 223 bool handled = true; | 226 bool handled = true; |
| 224 IPC_BEGIN_MESSAGE_MAP(PPB_FileRef_Proxy, msg) | 227 IPC_BEGIN_MESSAGE_MAP(PPB_FileRef_Proxy, msg) |
| 225 #if !defined(OS_NACL) | 228 #if !defined(OS_NACL) |
| 226 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Create, OnMsgCreate) | 229 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Create, OnMsgCreate) |
| 227 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_GetParent, OnMsgGetParent) | 230 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_GetParent, OnMsgGetParent) |
| 228 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_MakeDirectory, | 231 IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_MakeDirectory, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 254 | 257 |
| 255 // static | 258 // static |
| 256 PP_Resource PPB_FileRef_Proxy::DeserializeFileRef( | 259 PP_Resource PPB_FileRef_Proxy::DeserializeFileRef( |
| 257 const PPB_FileRef_CreateInfo& serialized) { | 260 const PPB_FileRef_CreateInfo& serialized) { |
| 258 if (serialized.resource.is_null()) | 261 if (serialized.resource.is_null()) |
| 259 return 0; // Resource invalid. | 262 return 0; // Resource invalid. |
| 260 return (new FileRef(serialized))->GetReference(); | 263 return (new FileRef(serialized))->GetReference(); |
| 261 } | 264 } |
| 262 | 265 |
| 263 #if !defined(OS_NACL) | 266 #if !defined(OS_NACL) |
| 264 void PPB_FileRef_Proxy::OnMsgCreate(const HostResource& file_system, | 267 void PPB_FileRef_Proxy::OnMsgCreate(PP_Instance pp_instance, |
| 268 PP_Resource file_system, |
| 265 const std::string& path, | 269 const std::string& path, |
| 266 PPB_FileRef_CreateInfo* result) { | 270 PPB_FileRef_CreateInfo* result) { |
| 267 thunk::EnterResourceCreation enter(file_system.instance()); | 271 thunk::EnterResourceCreation enter(pp_instance); |
| 268 if (enter.failed()) | 272 if (enter.failed()) |
| 269 return; | 273 return; |
| 274 |
| 270 PP_Resource resource = enter.functions()->CreateFileRef( | 275 PP_Resource resource = enter.functions()->CreateFileRef( |
| 271 file_system.host_resource(), path.c_str()); | 276 pp_instance, file_system, path.c_str()); |
| 272 if (!resource) | 277 if (!resource) |
| 273 return; // CreateInfo default constructor initializes to 0. | 278 return; // CreateInfo default constructor initializes to 0. |
| 274 SerializeFileRef(resource, result); | 279 SerializeFileRef(resource, result); |
| 275 } | 280 } |
| 276 | 281 |
| 277 void PPB_FileRef_Proxy::OnMsgGetParent(const HostResource& host_resource, | 282 void PPB_FileRef_Proxy::OnMsgGetParent(const HostResource& host_resource, |
| 278 PPB_FileRef_CreateInfo* result) { | 283 PPB_FileRef_CreateInfo* result) { |
| 279 EnterHostFromHostResource<PPB_FileRef_API> enter(host_resource); | 284 EnterHostFromHostResource<PPB_FileRef_API> enter(host_resource); |
| 280 if (enter.succeeded()) | 285 if (enter.succeeded()) |
| 281 SerializeFileRef(enter.object()->GetParent(), result); | 286 SerializeFileRef(enter.object()->GetParent(), result); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 const HostResource& host_resource, | 389 const HostResource& host_resource, |
| 385 base::internal::OwnedWrapper<PP_FileInfo> info, | 390 base::internal::OwnedWrapper<PP_FileInfo> info, |
| 386 uint32_t callback_id) { | 391 uint32_t callback_id) { |
| 387 Send(new PpapiMsg_PPBFileRef_QueryCallbackComplete( | 392 Send(new PpapiMsg_PPBFileRef_QueryCallbackComplete( |
| 388 API_ID_PPB_FILE_REF, host_resource, *info.get(), callback_id, result)); | 393 API_ID_PPB_FILE_REF, host_resource, *info.get(), callback_id, result)); |
| 389 } | 394 } |
| 390 #endif // !defined(OS_NACL) | 395 #endif // !defined(OS_NACL) |
| 391 | 396 |
| 392 } // namespace proxy | 397 } // namespace proxy |
| 393 } // namespace ppapi | 398 } // namespace ppapi |
| OLD | NEW |