diff options
Diffstat (limited to 'ppapi')
34 files changed, 205 insertions, 1128 deletions
diff --git a/ppapi/ppapi_proxy.gypi b/ppapi/ppapi_proxy.gypi index 52b97e9..ab4b34a 100644 --- a/ppapi/ppapi_proxy.gypi +++ b/ppapi/ppapi_proxy.gypi @@ -115,8 +115,6 @@ 'proxy/ppb_buffer_proxy.h', 'proxy/ppb_core_proxy.cc', 'proxy/ppb_core_proxy.h', - 'proxy/ppb_file_ref_proxy.cc', - 'proxy/ppb_file_ref_proxy.h', 'proxy/ppb_flash_message_loop_proxy.cc', 'proxy/ppb_flash_message_loop_proxy.h', 'proxy/ppb_graphics_3d_proxy.cc', diff --git a/ppapi/ppapi_shared.gypi b/ppapi/ppapi_shared.gypi index 7d0dc85..cf91e3d 100644 --- a/ppapi/ppapi_shared.gypi +++ b/ppapi/ppapi_shared.gypi @@ -23,6 +23,7 @@ 'shared_impl/file_io_state_manager.h', 'shared_impl/file_path.cc', 'shared_impl/file_path.h', + 'shared_impl/file_ref_create_info.cc', 'shared_impl/file_ref_create_info.h', 'shared_impl/file_ref_util.cc', 'shared_impl/file_ref_util.h', @@ -53,8 +54,6 @@ 'shared_impl/ppb_crypto_shared.cc', 'shared_impl/ppb_device_ref_shared.cc', 'shared_impl/ppb_device_ref_shared.h', - 'shared_impl/ppb_file_ref_shared.cc', - 'shared_impl/ppb_file_ref_shared.h', 'shared_impl/ppb_gamepad_shared.cc', 'shared_impl/ppb_gamepad_shared.h', 'shared_impl/ppb_graphics_3d_shared.cc', diff --git a/ppapi/proxy/file_chooser_resource.cc b/ppapi/proxy/file_chooser_resource.cc index ebd545c..9847e29 100644 --- a/ppapi/proxy/file_chooser_resource.cc +++ b/ppapi/proxy/file_chooser_resource.cc @@ -9,8 +9,8 @@ #include "ipc/ipc_message.h" #include "ppapi/c/pp_errors.h" #include "ppapi/proxy/dispatch_reply_message.h" +#include "ppapi/proxy/file_ref_resource.h" #include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/proxy/ppb_file_ref_proxy.h" #include "ppapi/shared_impl/var.h" namespace ppapi { @@ -100,19 +100,25 @@ void FileChooserResource::PopulateAcceptTypes( void FileChooserResource::OnPluginMsgShowReply( const ResourceMessageReplyParams& params, - const std::vector<PPB_FileRef_CreateInfo>& chosen_files) { + const std::vector<FileRefCreateInfo>& chosen_files) { if (output_.is_valid()) { // Using v0.6 of the API with the output array. std::vector<PP_Resource> files; - for (size_t i = 0; i < chosen_files.size(); i++) - files.push_back(PPB_FileRef_Proxy::DeserializeFileRef(chosen_files[i])); + for (size_t i = 0; i < chosen_files.size(); i++) { + files.push_back(FileRefResource::CreateFileRef( + connection(), + pp_instance(), + chosen_files[i])); + } output_.StoreResourceVector(files); } else { // Convert each of the passed in file infos to resources. These will be // owned by the FileChooser object until they're passed to the plugin. DCHECK(file_queue_.empty()); for (size_t i = 0; i < chosen_files.size(); i++) { - file_queue_.push(PPB_FileRef_Proxy::DeserializeFileRef( + file_queue_.push(FileRefResource::CreateFileRef( + connection(), + pp_instance(), chosen_files[i])); } } diff --git a/ppapi/proxy/file_chooser_resource.h b/ppapi/proxy/file_chooser_resource.h index 58331db..b744e91 100644 --- a/ppapi/proxy/file_chooser_resource.h +++ b/ppapi/proxy/file_chooser_resource.h @@ -17,7 +17,7 @@ namespace ppapi { -struct PPB_FileRef_CreateInfo; +struct FileRefCreateInfo; namespace proxy { @@ -56,7 +56,7 @@ class PPAPI_PROXY_EXPORT FileChooserResource private: void OnPluginMsgShowReply( const ResourceMessageReplyParams& params, - const std::vector<PPB_FileRef_CreateInfo>& chosen_files); + const std::vector<FileRefCreateInfo>& chosen_files); int32_t ShowInternal(PP_Bool save_as, const PP_Var& suggested_file_name, diff --git a/ppapi/proxy/file_chooser_resource_unittest.cc b/ppapi/proxy/file_chooser_resource_unittest.cc index a5801ee..4ba5bd9 100644 --- a/ppapi/proxy/file_chooser_resource_unittest.cc +++ b/ppapi/proxy/file_chooser_resource_unittest.cc @@ -5,6 +5,7 @@ #include "base/message_loop/message_loop.h" #include "ppapi/c/dev/ppb_file_chooser_dev.h" #include "ppapi/c/pp_errors.h" +#include "ppapi/c/ppb_file_ref.h" #include "ppapi/proxy/file_chooser_resource.h" #include "ppapi/proxy/locking_resource_releaser.h" #include "ppapi/proxy/ppapi_messages.h" @@ -91,13 +92,14 @@ TEST_F(FileChooserResourceTest, Show) { reply_params.set_result(PP_OK); // Synthesize a response with one file ref in it. Note that it must have a - // host resource value set or deserialization will fail. Since there isn't - // actually a host, this can be whatever we want. - std::vector<PPB_FileRef_CreateInfo> create_info_array; - PPB_FileRef_CreateInfo create_info; - create_info.resource.SetHostResource(pp_instance(), 123); - create_info.path = "foo/bar"; - create_info.name = "baz"; + // pending_host_resource_id set. Since there isn't actually a host, this can + // be whatever we want. + std::vector<FileRefCreateInfo> create_info_array; + FileRefCreateInfo create_info; + create_info.file_system_type = PP_FILESYSTEMTYPE_EXTERNAL; + create_info.display_name = "bar"; + create_info.browser_pending_host_resource_id = 12; + create_info.renderer_pending_host_resource_id = 15; create_info_array.push_back(create_info); ASSERT_TRUE(plugin_dispatcher()->OnMessageReceived( PpapiPluginMsg_ResourceReply(reply_params, @@ -115,9 +117,8 @@ TEST_F(FileChooserResourceTest, Show) { { ProxyAutoLock lock; ScopedPPVar release_name_var(ScopedPPVar::PassRef(), name_var); - EXPECT_VAR_IS_STRING(create_info.name, name_var); + EXPECT_VAR_IS_STRING("bar", name_var); } - // Path should be undefined since it's external filesystem. PP_Var path_var(file_ref_iface->GetPath(dest[0])); { ProxyAutoLock lock; diff --git a/ppapi/proxy/file_io_resource.cc b/ppapi/proxy/file_io_resource.cc index 76ee51c..fc53fb0 100644 --- a/ppapi/proxy/file_io_resource.cc +++ b/ppapi/proxy/file_io_resource.cc @@ -111,9 +111,13 @@ int32_t FileIOResource::Open(PP_Resource file_ref, if (rv != PP_OK) return rv; + // Take a reference on the FileRef resource while we're opening the file; we + // don't want the plugin destroying it during the Open operation. + file_ref_ = enter.resource(); + Call<PpapiPluginMsg_FileIO_OpenReply>(RENDERER, PpapiHostMsg_FileIO_Open( - enter.resource()->host_resource().host_resource(), + file_ref, open_flags), base::Bind(&FileIOResource::OnPluginMsgOpenFileComplete, this, callback)); @@ -410,6 +414,9 @@ void FileIOResource::OnPluginMsgOpenFileComplete( const ResourceMessageReplyParams& params) { DCHECK(state_manager_.get_pending_operation() == FileIOStateManager::OPERATION_EXCLUSIVE); + + // Release the FileRef resource. + file_ref_ = NULL; if (params.result() == PP_OK) state_manager_.SetOpenSucceed(); diff --git a/ppapi/proxy/file_io_resource.h b/ppapi/proxy/file_io_resource.h index 1a888d1..26c4abb 100644 --- a/ppapi/proxy/file_io_resource.h +++ b/ppapi/proxy/file_io_resource.h @@ -7,11 +7,13 @@ #include <string> +#include "base/memory/scoped_ptr.h" #include "ppapi/c/private/pp_file_handle.h" #include "ppapi/proxy/connection.h" #include "ppapi/proxy/plugin_resource.h" #include "ppapi/proxy/ppapi_proxy_export.h" #include "ppapi/shared_impl/file_io_state_manager.h" +#include "ppapi/shared_impl/resource.h" #include "ppapi/thunk/ppb_file_io_api.h" namespace ppapi { @@ -137,6 +139,8 @@ class PPAPI_PROXY_EXPORT FileIOResource PP_FileSystemType file_system_type_; FileIOStateManager state_manager_; + scoped_refptr<Resource> file_ref_; + DISALLOW_COPY_AND_ASSIGN(FileIOResource); }; diff --git a/ppapi/proxy/file_ref_resource.cc b/ppapi/proxy/file_ref_resource.cc index 4c098a5..7cd96bc 100644 --- a/ppapi/proxy/file_ref_resource.cc +++ b/ppapi/proxy/file_ref_resource.cc @@ -22,7 +22,7 @@ namespace proxy { FileRefResource::FileRefResource( Connection connection, PP_Instance instance, - const FileRef_CreateInfo& create_info) + const FileRefCreateInfo& create_info) : PluginResource(connection, instance), create_info_(create_info), file_system_resource_(create_info.file_system_plugin_resource) { @@ -34,19 +34,26 @@ FileRefResource::FileRefResource( create_info_.internal_path.erase(path_size - 1, 1); path_var_ = new StringVar(create_info_.internal_path); - create_info_.display_name = GetNameForInternalFilePath( create_info_.internal_path); } name_var_ = new StringVar(create_info_.display_name); - if (create_info_.pending_host_resource_id != 0) { - AttachToPendingHost(BROWSER, create_info_.pending_host_resource_id); + if (create_info_.browser_pending_host_resource_id != 0 && + create_info_.renderer_pending_host_resource_id != 0) { + AttachToPendingHost(BROWSER, create_info_.browser_pending_host_resource_id); + AttachToPendingHost(RENDERER, + create_info_.renderer_pending_host_resource_id); } else { + CHECK(create_info_.browser_pending_host_resource_id == 0); + CHECK(create_info_.renderer_pending_host_resource_id == 0); CHECK(create_info_.file_system_type != PP_FILESYSTEMTYPE_EXTERNAL); SendCreate(BROWSER, PpapiHostMsg_FileRef_CreateInternal( create_info.file_system_plugin_resource, create_info.internal_path)); + SendCreate(RENDERER, PpapiHostMsg_FileRef_CreateInternal( + create_info.file_system_plugin_resource, + create_info.internal_path)); } } @@ -57,7 +64,7 @@ FileRefResource::~FileRefResource() { PP_Resource FileRefResource::CreateFileRef( Connection connection, PP_Instance instance, - const FileRef_CreateInfo& create_info) { + const FileRefCreateInfo& create_info) { // If we have a valid file_system resource, ensure that its type matches that // of the fs_type parameter. if (create_info.file_system_plugin_resource != 0) { @@ -82,9 +89,7 @@ PP_Resource FileRefResource::CreateFileRef( } thunk::PPB_FileRef_API* FileRefResource::AsPPB_FileRef_API() { - // TODO: return "this" once we update PPB_FileRef_API. - NOTREACHED(); - return NULL; + return this; } PP_FileSystemType FileRefResource::GetFileSystemType() const { @@ -111,7 +116,7 @@ PP_Resource FileRefResource::GetParent() { pos++; std::string parent_path = create_info_.internal_path.substr(0, pos); - ppapi::FileRef_CreateInfo parent_info; + ppapi::FileRefCreateInfo parent_info; parent_info.file_system_type = create_info_.file_system_type; parent_info.internal_path = parent_path; parent_info.display_name = GetNameForInternalFilePath(parent_path); @@ -184,33 +189,9 @@ int32_t FileRefResource::ReadDirectoryEntries( return PP_OK_COMPLETIONPENDING; } -/* -const FileRef_CreateInfo& FileRefResource::GetCreateInfo() const { +const FileRefCreateInfo& FileRefResource::GetCreateInfo() const { return create_info_; } -*/ -const PPB_FileRef_CreateInfo& FileRefResource::GetCreateInfo() const { - // FIXME - NOTREACHED(); - PPB_FileRef_CreateInfo *info = new PPB_FileRef_CreateInfo(); - return *info; -} - -// TODO(teravest): Remove this when we are finished moving to the new proxy. -int32_t FileRefResource::QueryInHost(linked_ptr<PP_FileInfo> info, - scoped_refptr<TrackedCallback> callback) { - NOTREACHED(); - return PP_ERROR_FAILED; -} - -// TODO(teravest): Remove this when we are finished moving to the new proxy. -int32_t FileRefResource::ReadDirectoryEntriesInHost( - linked_ptr<std::vector<ppapi::PPB_FileRef_CreateInfo> > files, - linked_ptr<std::vector<PP_FileType> > file_types, - scoped_refptr<TrackedCallback> callback) { - NOTREACHED(); - return PP_ERROR_FAILED; -} PP_Var FileRefResource::GetAbsolutePath() { if (!absolute_path_var_.get()) { @@ -248,7 +229,7 @@ void FileRefResource::OnDirectoryEntriesReply( const PP_ArrayOutput& output, scoped_refptr<TrackedCallback> callback, const ResourceMessageReplyParams& params, - const std::vector<ppapi::FileRef_CreateInfo>& infos, + const std::vector<ppapi::FileRefCreateInfo>& infos, const std::vector<PP_FileType>& file_types) { if (!TrackedCallback::IsPending(callback)) return; diff --git a/ppapi/proxy/file_ref_resource.h b/ppapi/proxy/file_ref_resource.h index 82570fb..f982438 100644 --- a/ppapi/proxy/file_ref_resource.h +++ b/ppapi/proxy/file_ref_resource.h @@ -29,7 +29,7 @@ class PPAPI_PROXY_EXPORT FileRefResource public: static PP_Resource CreateFileRef(Connection connection, PP_Instance instance, - const FileRef_CreateInfo& info); + const FileRefCreateInfo& info); virtual ~FileRefResource(); @@ -55,13 +55,7 @@ class PPAPI_PROXY_EXPORT FileRefResource virtual int32_t ReadDirectoryEntries( const PP_ArrayOutput& output, scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual const PPB_FileRef_CreateInfo& GetCreateInfo() const OVERRIDE; - virtual int32_t QueryInHost(linked_ptr<PP_FileInfo> info, - scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual int32_t ReadDirectoryEntriesInHost( - linked_ptr<std::vector<ppapi::PPB_FileRef_CreateInfo> > files, - linked_ptr<std::vector<PP_FileType> > file_types, - scoped_refptr<TrackedCallback> callback) OVERRIDE; + virtual const FileRefCreateInfo& GetCreateInfo() const OVERRIDE; // Private API virtual PP_Var GetAbsolutePath() OVERRIDE; @@ -69,7 +63,7 @@ class PPAPI_PROXY_EXPORT FileRefResource private: FileRefResource(Connection connection, PP_Instance instance, - const FileRef_CreateInfo& info); + const FileRefCreateInfo& info); void RunTrackedCallback(scoped_refptr<TrackedCallback> callback, const ResourceMessageReplyParams& params); @@ -83,11 +77,11 @@ class PPAPI_PROXY_EXPORT FileRefResource const PP_ArrayOutput& output, scoped_refptr<TrackedCallback> callback, const ResourceMessageReplyParams& params, - const std::vector<ppapi::FileRef_CreateInfo>& infos, + const std::vector<ppapi::FileRefCreateInfo>& infos, const std::vector<PP_FileType>& file_types); // Populated after creation. - FileRef_CreateInfo create_info_; + FileRefCreateInfo create_info_; // Some file ref operations may fail if the the file system resource inside // create_info_ is destroyed. Therefore, we explicitly hold a reference to diff --git a/ppapi/proxy/flash_drm_resource.cc b/ppapi/proxy/flash_drm_resource.cc index a4be23b..889aa72 100644 --- a/ppapi/proxy/flash_drm_resource.cc +++ b/ppapi/proxy/flash_drm_resource.cc @@ -7,9 +7,8 @@ #include "base/bind.h" #include "ppapi/c/pp_errors.h" #include "ppapi/proxy/dispatch_reply_message.h" +#include "ppapi/proxy/file_ref_resource.h" #include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/proxy/ppb_file_ref_proxy.h" -#include "ppapi/shared_impl/ppb_file_ref_shared.h" #include "ppapi/shared_impl/var.h" namespace ppapi { @@ -88,10 +87,14 @@ void FlashDRMResource::OnPluginMsgGetVoucherFileReply( PP_Resource* dest, scoped_refptr<TrackedCallback> callback, const ResourceMessageReplyParams& params, - const PPB_FileRef_CreateInfo& file_info) { + const FileRefCreateInfo& file_info) { if (TrackedCallback::IsPending(callback)) { - if (params.result() == PP_OK) - *dest = PPB_FileRef_Proxy::DeserializeFileRef(file_info); + if (params.result() == PP_OK) { + *dest = FileRefResource::CreateFileRef( + connection(), + pp_instance(), + file_info); + } callback->Run(params.result()); } } diff --git a/ppapi/proxy/flash_drm_resource.h b/ppapi/proxy/flash_drm_resource.h index 12c71e8..9a4b31c 100644 --- a/ppapi/proxy/flash_drm_resource.h +++ b/ppapi/proxy/flash_drm_resource.h @@ -11,7 +11,7 @@ #include "ppapi/thunk/ppb_flash_drm_api.h" namespace ppapi { -struct PPB_FileRef_CreateInfo; +struct FileRefCreateInfo; } namespace ppapi { @@ -44,7 +44,7 @@ class FlashDRMResource void OnPluginMsgGetVoucherFileReply(PP_Resource* dest, scoped_refptr<TrackedCallback> callback, const ResourceMessageReplyParams& params, - const PPB_FileRef_CreateInfo& file_info); + const FileRefCreateInfo& file_info); DISALLOW_COPY_AND_ASSIGN(FlashDRMResource); }; diff --git a/ppapi/proxy/flash_file_resource.cc b/ppapi/proxy/flash_file_resource.cc index 1387eb7..ce7a2ce 100644 --- a/ppapi/proxy/flash_file_resource.cc +++ b/ppapi/proxy/flash_file_resource.cc @@ -13,6 +13,7 @@ #include "ppapi/shared_impl/time_conversion.h" #include "ppapi/shared_impl/var.h" #include "ppapi/thunk/enter.h" +#include "ppapi/thunk/ppb_file_ref_api.h" namespace ppapi { namespace proxy { diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc index 115516f..a72f472 100644 --- a/ppapi/proxy/interface_list.cc +++ b/ppapi/proxy/interface_list.cc @@ -101,7 +101,6 @@ #include "ppapi/proxy/ppb_broker_proxy.h" #include "ppapi/proxy/ppb_buffer_proxy.h" #include "ppapi/proxy/ppb_core_proxy.h" -#include "ppapi/proxy/ppb_file_ref_proxy.h" #include "ppapi/proxy/ppb_flash_message_loop_proxy.h" #include "ppapi/proxy/ppb_graphics_3d_proxy.h" #include "ppapi/proxy/ppb_image_data_proxy.h" diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h index f108812..2793e5f 100644 --- a/ppapi/proxy/ppapi_messages.h +++ b/ppapi/proxy/ppapi_messages.h @@ -202,11 +202,12 @@ IPC_STRUCT_TRAITS_BEGIN(ppapi::DirEntry) IPC_STRUCT_TRAITS_MEMBER(is_dir) IPC_STRUCT_TRAITS_END() -IPC_STRUCT_TRAITS_BEGIN(ppapi::FileRef_CreateInfo) +IPC_STRUCT_TRAITS_BEGIN(ppapi::FileRefCreateInfo) IPC_STRUCT_TRAITS_MEMBER(file_system_type) IPC_STRUCT_TRAITS_MEMBER(internal_path) IPC_STRUCT_TRAITS_MEMBER(display_name) - IPC_STRUCT_TRAITS_MEMBER(pending_host_resource_id) + IPC_STRUCT_TRAITS_MEMBER(browser_pending_host_resource_id) + IPC_STRUCT_TRAITS_MEMBER(renderer_pending_host_resource_id) IPC_STRUCT_TRAITS_MEMBER(file_system_plugin_resource) IPC_STRUCT_TRAITS_END() @@ -298,8 +299,7 @@ IPC_STRUCT_TRAITS_END() IPC_STRUCT_TRAITS_BEGIN(ppapi::URLRequestInfoData::BodyItem) IPC_STRUCT_TRAITS_MEMBER(is_file) IPC_STRUCT_TRAITS_MEMBER(data) - // Note: we don't serialize file_ref. - IPC_STRUCT_TRAITS_MEMBER(file_ref_host_resource) + IPC_STRUCT_TRAITS_MEMBER(file_ref_pp_resource) IPC_STRUCT_TRAITS_MEMBER(start_offset) IPC_STRUCT_TRAITS_MEMBER(number_of_bytes) IPC_STRUCT_TRAITS_MEMBER(expected_last_modified_time) @@ -486,30 +486,6 @@ IPC_MESSAGE_ROUTED4(PpapiMsg_PPBAudio_NotifyAudioStreamCreated, ppapi::proxy::SerializedHandle /* socket_handle */, ppapi::proxy::SerializedHandle /* handle */) -// PPB_FileRef. -// TODO(teravest): Remove these messages when we've switched over to the "new" -// proxy. -IPC_MESSAGE_ROUTED3( - PpapiMsg_PPBFileRef_CallbackComplete, - ppapi::HostResource /* resource */, - uint32_t /* callback_id */, - int32_t /* result */) - -IPC_MESSAGE_ROUTED4( - PpapiMsg_PPBFileRef_QueryCallbackComplete, - ppapi::HostResource /* resource */, - PP_FileInfo /* file_info */, - uint32_t /* callback_id */, - int32_t /* result */) - -IPC_MESSAGE_ROUTED5( - PpapiMsg_PPBFileRef_ReadDirectoryEntriesCallbackComplete, - ppapi::HostResource /* resource */, - std::vector<ppapi::PPB_FileRef_CreateInfo> /* files */, - std::vector<PP_FileType> /* file_types */, - uint32_t /* callback_id */, - int32_t /* result */) - // PPB_FileSystem. IPC_MESSAGE_ROUTED2( PpapiMsg_PPBFileSystem_OpenComplete, @@ -772,43 +748,6 @@ IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBCore_AddRefResource, IPC_MESSAGE_ROUTED1(PpapiHostMsg_PPBCore_ReleaseResource, ppapi::HostResource) -// PPB_FileRef. -// TODO(teravest): Remove these messages when we've switched over to the "new" -// proxy. -IPC_SYNC_MESSAGE_ROUTED3_1(PpapiHostMsg_PPBFileRef_Create, - PP_Instance /* instance */, - PP_Resource /* file_system */, - std::string /* path */, - ppapi::PPB_FileRef_CreateInfo /* result */) -IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBFileRef_GetParent, - ppapi::HostResource /* file_ref */, - ppapi::PPB_FileRef_CreateInfo /* result */) -IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBFileRef_MakeDirectory, - ppapi::HostResource /* file_ref */, - PP_Bool /* make_ancestors */, - uint32_t /* callback_id */) -IPC_MESSAGE_ROUTED4(PpapiHostMsg_PPBFileRef_Touch, - ppapi::HostResource /* file_ref */, - PP_Time /* last_access */, - PP_Time /* last_modified */, - uint32_t /* callback_id */) -IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBFileRef_Delete, - ppapi::HostResource /* file_ref */, - uint32_t /* callback_id */) -IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBFileRef_Rename, - ppapi::HostResource /* file_ref */, - ppapi::HostResource /* new_file_ref */, - uint32_t /* callback_id */) -IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBFileRef_Query, - ppapi::HostResource /* file_ref */, - uint32_t /* callback_id */) -IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBFileRef_GetAbsolutePath, - ppapi::HostResource /* file_ref */, - ppapi::proxy::SerializedVar /* result */) -IPC_MESSAGE_ROUTED2(PpapiHostMsg_PPBFileRef_ReadDirectoryEntries, - ppapi::HostResource /* file_ref */, - uint32_t /* callback_id */) - // PPB_Graphics3D. IPC_SYNC_MESSAGE_ROUTED3_1(PpapiHostMsg_PPBGraphics3D_Create, PP_Instance /* instance */, @@ -1202,7 +1141,6 @@ IPC_MESSAGE_ROUTED2( ppapi::proxy::ResourceMessageReplyParams /* reply_params */, IPC::Message /* nested_msg */) - IPC_SYNC_MESSAGE_CONTROL2_2(PpapiHostMsg_ResourceSyncCall, ppapi::proxy::ResourceMessageCallParams /* call_params */, IPC::Message /* nested_msg */, @@ -1276,7 +1214,7 @@ IPC_MESSAGE_CONTROL4(PpapiHostMsg_FileChooser_Show, std::string /* suggested_file_name */, std::vector<std::string> /* accept_mime_types */) IPC_MESSAGE_CONTROL1(PpapiPluginMsg_FileChooser_ShowReply, - std::vector<ppapi::PPB_FileRef_CreateInfo> /* files */) + std::vector<ppapi::FileRefCreateInfo> /* files */) // FileIO IPC_MESSAGE_CONTROL0(PpapiHostMsg_FileIO_Create) @@ -1352,10 +1290,10 @@ IPC_MESSAGE_CONTROL1(PpapiPluginMsg_FileRef_QueryReply, // location indicated by the FileRef. IPC_MESSAGE_CONTROL0(PpapiHostMsg_FileRef_ReadDirectoryEntries) -// FileRef_CreateInfo does not provide file type information, so two +// FileRefCreateInfo does not provide file type information, so two // corresponding vectors are returned. IPC_MESSAGE_CONTROL2(PpapiPluginMsg_FileRef_ReadDirectoryEntriesReply, - std::vector<ppapi::FileRef_CreateInfo> /* files */, + std::vector<ppapi::FileRefCreateInfo> /* files */, std::vector<PP_FileType> /* file_types */) // Requests that the browser reply with the absolute path to the indicated @@ -1396,7 +1334,7 @@ IPC_MESSAGE_CONTROL0(PpapiHostMsg_FlashDRM_GetVoucherFile) // Reply message for GetVoucherFile which contains the CreateInfo for a // PPB_FileRef which points to the voucher file. IPC_MESSAGE_CONTROL1(PpapiPluginMsg_FlashDRM_GetVoucherFileReply, - ppapi::PPB_FileRef_CreateInfo /* file_info */) + ppapi::FileRefCreateInfo /* file_info */) // Gamepad. IPC_MESSAGE_CONTROL0(PpapiHostMsg_Gamepad_Create) @@ -1775,30 +1713,6 @@ IPC_MESSAGE_CONTROL0(PpapiHostMsg_BrowserFontSingleton_GetFontFamilies) IPC_MESSAGE_CONTROL1(PpapiPluginMsg_BrowserFontSingleton_GetFontFamiliesReply, std::string /* families */) -// FileRef. -// Requests that the browser reply with file system and path information about -// the resource indicated in |params| which exists in the given -// |child_process_id|. |routing_id| is sent so that the reply can be routed -// properly in the renderer. -// Only sent from the renderer to the browser. -IPC_MESSAGE_CONTROL4(PpapiHostMsg_FileRef_GetInfoForRenderer, - int /* routing_id */, - int /* child_process_id */, - int32_t /* sequence */, - std::vector<PP_Resource> /* resources */) - -// Reply to PpapiHostMsg_FileRef_GetInfoForRenderer with a sequence number for -// invoking the right callback, |fs_type| which indicates the file system, and -// path information in either |file_system_url_spec| (for internal file systems) -// or |external_path| (for external file systems). -// Only sent from the browser to the renderer. -IPC_MESSAGE_ROUTED5(PpapiHostMsg_FileRef_GetInfoForRendererReply, - int32_t /* sequence */, - std::vector<PP_Resource> /* resources */, - std::vector<PP_FileSystemType> /* fs_type */, - std::vector<std::string> /* file_system_url_spec */, - std::vector<base::FilePath> /* external_path */) - // Flash ----------------------------------------------------------------------- IPC_MESSAGE_CONTROL0(PpapiHostMsg_Flash_Create) diff --git a/ppapi/proxy/ppapi_param_traits.cc b/ppapi/proxy/ppapi_param_traits.cc index ca25f82..5d4345f 100644 --- a/ppapi/proxy/ppapi_param_traits.cc +++ b/ppapi/proxy/ppapi_param_traits.cc @@ -175,36 +175,6 @@ void ParamTraits<PP_NetAddress_Private>::Log(const param_type& p, l->append(" bytes)>"); } -// TODO(teravest): Remove this when FileRef is moved to the "new" proxy. -// PPB_FileRef_CreateInfo ------------------------------------------------------ - -// static -void ParamTraits<ppapi::PPB_FileRef_CreateInfo>::Write(Message* m, - const param_type& p) { - ParamTraits<ppapi::HostResource>::Write(m, p.resource); - ParamTraits<int>::Write(m, p.file_system_type); - ParamTraits<std::string>::Write(m, p.path); - ParamTraits<std::string>::Write(m, p.name); - ParamTraits<PP_Resource>::Write(m, p.file_system_plugin_resource); -} - -// static -bool ParamTraits<ppapi::PPB_FileRef_CreateInfo>::Read(const Message* m, - PickleIterator* iter, - param_type* r) { - return - ParamTraits<ppapi::HostResource>::Read(m, iter, &r->resource) && - ParamTraits<int>::Read(m, iter, &r->file_system_type) && - ParamTraits<std::string>::Read(m, iter, &r->path) && - ParamTraits<std::string>::Read(m, iter, &r->name) && - ParamTraits<PP_Resource>::Read(m, iter, &r->file_system_plugin_resource); -} - -// static -void ParamTraits<ppapi::PPB_FileRef_CreateInfo>::Log(const param_type& p, - std::string* l) { -} - // HostResource ---------------------------------------------------------------- // static @@ -274,28 +244,6 @@ void ParamTraits< std::vector<ppapi::proxy::SerializedVar> >::Log( std::string* l) { } -// std::vector<PPB_FileRef_CreateInfo> ----------------------------------------- - -void ParamTraits< std::vector<ppapi::PPB_FileRef_CreateInfo> >::Write( - Message* m, - const param_type& p) { - WriteVectorWithoutCopy(m, p); -} - -// static -bool ParamTraits< std::vector<ppapi::PPB_FileRef_CreateInfo> >::Read( - const Message* m, - PickleIterator* iter, - param_type* r) { - return ReadVectorWithoutCopy(m, iter, r); -} - -// static -void ParamTraits< std::vector<ppapi::PPB_FileRef_CreateInfo> >::Log( - const param_type& p, - std::string* l) { -} - // ppapi::PpapiPermissions ----------------------------------------------------- void ParamTraits<ppapi::PpapiPermissions>::Write(Message* m, diff --git a/ppapi/proxy/ppapi_param_traits.h b/ppapi/proxy/ppapi_param_traits.h index f56415a8..b56ec3e 100644 --- a/ppapi/proxy/ppapi_param_traits.h +++ b/ppapi/proxy/ppapi_param_traits.h @@ -17,7 +17,6 @@ #include "ppapi/shared_impl/file_path.h" #include "ppapi/shared_impl/file_ref_create_info.h" #include "ppapi/shared_impl/ppapi_permissions.h" -#include "ppapi/shared_impl/ppb_file_ref_shared.h" #include "ppapi/shared_impl/socket_option_data.h" struct PP_FileInfo; @@ -77,15 +76,6 @@ struct PPAPI_PROXY_EXPORT ParamTraits< static void Log(const param_type& p, std::string* l); }; -// TODO(teravest): Remove this when we've switched over to the new proxy. -template<> -struct PPAPI_PROXY_EXPORT ParamTraits<ppapi::PPB_FileRef_CreateInfo> { - typedef ppapi::PPB_FileRef_CreateInfo param_type; - static void Write(Message* m, const param_type& p); - static bool Read(const Message* m, PickleIterator* iter, param_type* r); - static void Log(const param_type& p, std::string* l); -}; - template<> struct PPAPI_PROXY_EXPORT ParamTraits< ppapi::proxy::PPBURLLoader_UpdateProgress_Params> { @@ -154,15 +144,6 @@ struct PPAPI_PROXY_EXPORT ParamTraits< }; template<> -struct PPAPI_PROXY_EXPORT ParamTraits< std::vector< - ppapi::PPB_FileRef_CreateInfo> > { - typedef std::vector<ppapi::PPB_FileRef_CreateInfo> param_type; - static void Write(Message* m, const param_type& p); - static bool Read(const Message* m, PickleIterator* iter, param_type* r); - static void Log(const param_type& p, std::string* l); -}; - -template<> struct PPAPI_PROXY_EXPORT ParamTraits<ppapi::PpapiPermissions> { typedef ppapi::PpapiPermissions param_type; static void Write(Message* m, const param_type& p); diff --git a/ppapi/proxy/ppb_file_ref_proxy.cc b/ppapi/proxy/ppb_file_ref_proxy.cc deleted file mode 100644 index 62c55da..0000000 --- a/ppapi/proxy/ppb_file_ref_proxy.cc +++ /dev/null @@ -1,549 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ppapi/proxy/ppb_file_ref_proxy.h" - -#include <map> - -#include "base/bind.h" -#include "ppapi/c/pp_directory_entry.h" -#include "ppapi/c/pp_errors.h" -#include "ppapi/c/ppb_file_ref.h" -#include "ppapi/c/private/ppb_file_ref_private.h" -#include "ppapi/c/private/ppb_proxy_private.h" -#include "ppapi/proxy/enter_proxy.h" -#include "ppapi/proxy/host_dispatcher.h" -#include "ppapi/proxy/plugin_dispatcher.h" -#include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/proxy/serialized_var.h" -#include "ppapi/shared_impl/array_writer.h" -#include "ppapi/shared_impl/ppb_file_ref_shared.h" -#include "ppapi/shared_impl/scoped_pp_resource.h" -#include "ppapi/shared_impl/tracked_callback.h" -#include "ppapi/thunk/resource_creation_api.h" -#include "ppapi/thunk/thunk.h" - -using ppapi::thunk::EnterResourceNoLock; -using ppapi::thunk::PPB_FileRef_API; -using ppapi::thunk::ResourceCreationAPI; - -namespace ppapi { -namespace proxy { - -namespace { - -void ReleaseEntries(const std::vector<PP_DirectoryEntry>& entries) { - ResourceTracker* tracker = PpapiGlobals::Get()->GetResourceTracker(); - for (std::vector<PP_DirectoryEntry>::const_iterator it = entries.begin(); - it != entries.end(); ++it) - tracker->ReleaseResource(it->file_ref); -} - -} // namespace - -class FileRef : public PPB_FileRef_Shared { - public: - explicit FileRef(const PPB_FileRef_CreateInfo& info); - virtual ~FileRef(); - - // Resource overrides. - virtual void LastPluginRefWasDeleted() OVERRIDE; - - // PPB_FileRef_API implementation (not provided by PPB_FileRef_Shared). - virtual PP_Resource GetParent() OVERRIDE; - virtual int32_t MakeDirectory( - PP_Bool make_ancestors, - scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual int32_t Touch(PP_Time last_access_time, - PP_Time last_modified_time, - scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual int32_t Delete(scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual int32_t Rename(PP_Resource new_file_ref, - scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual int32_t Query(PP_FileInfo* info, - scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual int32_t ReadDirectoryEntries( - const PP_ArrayOutput& output, - scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual int32_t QueryInHost( - linked_ptr<PP_FileInfo> info, - scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual int32_t ReadDirectoryEntriesInHost( - linked_ptr<std::vector<ppapi::PPB_FileRef_CreateInfo> > files, - linked_ptr<std::vector<PP_FileType> > file_types, - scoped_refptr<TrackedCallback> callback) OVERRIDE; - virtual PP_Var GetAbsolutePath() OVERRIDE; - - // Executes the pending callback with the given ID. See pending_callbacks_. - void ExecuteCallback(uint32_t callback_id, int32_t result); - int32_t SetFileInfo(uint32_t callback_id, const PP_FileInfo& info); - int32_t SetReadDirectoryEntriesOutput( - uint32_t callback_id, - const std::vector<ppapi::PPB_FileRef_CreateInfo>& infos, - const std::vector<PP_FileType>& file_types); - - private: - PluginDispatcher* GetDispatcher() const { - return PluginDispatcher::GetForResource(this); - } - - // Adds a callback to the list and returns its ID. - uint32_t SendCallback(scoped_refptr<TrackedCallback> callback); - - // This class can have any number of out-standing requests with completion - // callbacks, in contrast to most resources which have one possible pending - // callback pending (like a Flush callback). - // - // To keep track of them, assign integer IDs to the callbacks, which is how - // the callback will be identified when it's passed to the host and then - // back here. Use unsigned so that overflow is well-defined. - uint32_t next_callback_id_; - typedef std::map<uint32_t, - scoped_refptr<TrackedCallback> > PendingCallbackMap; - PendingCallbackMap pending_callbacks_; - - // Used to keep pointers to PP_FileInfo instances that are written before - // callbacks are invoked. The id of a pending file info will match that of - // the corresponding callback. - typedef std::map<uint32_t, PP_FileInfo*> PendingFileInfoMap; - PendingFileInfoMap pending_file_infos_; - - // Used to keep PP_ArrayOutput instances that are written before callbacks - // are invoked. The id of a pending array output will match that of the - // corresponding callback. - typedef std::map<uint32_t, PP_ArrayOutput> - PendingReadDirectoryEntriesOutputMap; - PendingReadDirectoryEntriesOutputMap pending_read_entries_outputs_; - - // Holds a reference on plugin side when running out of process, so that - // FileSystem won't die before FileRef. See PPB_FileRef_Impl for - // corresponding code for in-process mode. Note that this workaround will - // be no longer needed after FileRef refactoring. - ScopedPPResource file_system_; - - DISALLOW_IMPLICIT_CONSTRUCTORS(FileRef); -}; - -FileRef::FileRef(const PPB_FileRef_CreateInfo& info) - : PPB_FileRef_Shared(OBJECT_IS_PROXY, info), - next_callback_id_(0u), - file_system_(info.file_system_plugin_resource) { -} - -FileRef::~FileRef() { - // The callbacks map should have been cleared by LastPluginRefWasDeleted. - DCHECK(pending_callbacks_.empty()); - DCHECK(pending_file_infos_.empty()); - DCHECK(pending_read_entries_outputs_.empty()); -} - -void FileRef::LastPluginRefWasDeleted() { - // The callback tracker will abort our callbacks for us. - pending_callbacks_.clear(); - pending_file_infos_.clear(); - pending_read_entries_outputs_.clear(); -} - -PP_Resource FileRef::GetParent() { - PPB_FileRef_CreateInfo create_info; - GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_GetParent( - API_ID_PPB_FILE_REF, host_resource(), &create_info)); - return PPB_FileRef_Proxy::DeserializeFileRef(create_info); -} - -int32_t FileRef::MakeDirectory(PP_Bool make_ancestors, - scoped_refptr<TrackedCallback> callback) { - GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_MakeDirectory( - API_ID_PPB_FILE_REF, host_resource(), make_ancestors, - SendCallback(callback))); - return PP_OK_COMPLETIONPENDING; -} - -int32_t FileRef::Touch(PP_Time last_access_time, - PP_Time last_modified_time, - scoped_refptr<TrackedCallback> callback) { - GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Touch( - API_ID_PPB_FILE_REF, host_resource(), last_access_time, - last_modified_time, SendCallback(callback))); - return PP_OK_COMPLETIONPENDING; -} - -int32_t FileRef::Delete(scoped_refptr<TrackedCallback> callback) { - GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Delete( - API_ID_PPB_FILE_REF, host_resource(), SendCallback(callback))); - return PP_OK_COMPLETIONPENDING; -} - -int32_t FileRef::Rename(PP_Resource new_file_ref, - scoped_refptr<TrackedCallback> callback) { - Resource* new_file_ref_object = - PpapiGlobals::Get()->GetResourceTracker()->GetResource(new_file_ref); - if (!new_file_ref_object || - new_file_ref_object->host_resource().instance() != pp_instance()) - return PP_ERROR_BADRESOURCE; - - GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Rename( - API_ID_PPB_FILE_REF, host_resource(), - new_file_ref_object->host_resource(), SendCallback(callback))); - return PP_OK_COMPLETIONPENDING; -} - -int32_t FileRef::Query(PP_FileInfo* info, - scoped_refptr<TrackedCallback> callback) { - // Store the pending file info id. - uint32_t id = SendCallback(callback); - pending_file_infos_[id] = info; - GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Query( - API_ID_PPB_FILE_REF, host_resource(), id)); - return PP_OK_COMPLETIONPENDING; -} - -int32_t FileRef::ReadDirectoryEntries( - const PP_ArrayOutput& output, - scoped_refptr<TrackedCallback> callback) { - // Store the pending read entries output id. - uint32_t id = SendCallback(callback); - pending_read_entries_outputs_[id] = output; - GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_ReadDirectoryEntries( - API_ID_PPB_FILE_REF, host_resource(), id)); - return PP_OK_COMPLETIONPENDING; -} - -int32_t FileRef::QueryInHost( - linked_ptr<PP_FileInfo> info, - scoped_refptr<TrackedCallback> callback) { - NOTREACHED(); - return PP_ERROR_FAILED; -} - -int32_t FileRef::ReadDirectoryEntriesInHost( - linked_ptr<std::vector<ppapi::PPB_FileRef_CreateInfo> > files, - linked_ptr<std::vector<PP_FileType> > file_types, - scoped_refptr<TrackedCallback> callback) { - NOTREACHED(); - return PP_ERROR_FAILED; -} - -PP_Var FileRef::GetAbsolutePath() { - ReceiveSerializedVarReturnValue result; - GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_GetAbsolutePath( - API_ID_PPB_FILE_REF, host_resource(), &result)); - return result.Return(GetDispatcher()); -} - -void FileRef::ExecuteCallback(uint32_t callback_id, int32_t result) { - PendingCallbackMap::iterator found = pending_callbacks_.find(callback_id); - if (found == pending_callbacks_.end()) { - // This will happen when the plugin deletes its resource with a pending - // callback. The callback will be locally issued with an ABORTED call while - // the operation may still be pending in the renderer. - return; - } - - // Executing the callback may mutate the callback list. - scoped_refptr<TrackedCallback> callback = found->second; - pending_callbacks_.erase(found); - callback->Run(result); -} - -int32_t FileRef::SetFileInfo(uint32_t callback_id, const PP_FileInfo& info) { - PendingFileInfoMap::iterator found = pending_file_infos_.find(callback_id); - if (found == pending_file_infos_.end()) - return PP_ERROR_FAILED; - PP_FileInfo* target_info = found->second; - *target_info = info; - pending_file_infos_.erase(found); - return PP_OK; -} - -int32_t FileRef::SetReadDirectoryEntriesOutput( - uint32_t callback_id, - const std::vector<ppapi::PPB_FileRef_CreateInfo>& infos, - const std::vector<PP_FileType>& file_types) { - PendingReadDirectoryEntriesOutputMap::iterator found = - pending_read_entries_outputs_.find(callback_id); - if (found == pending_read_entries_outputs_.end()) - return PP_ERROR_FAILED; - - PP_ArrayOutput output = found->second; - pending_read_entries_outputs_.erase(found); - - std::vector<PP_DirectoryEntry> entries; - for (size_t i = 0; i < infos.size(); ++i) { - PP_DirectoryEntry entry; - entry.file_ref = PPB_FileRef_Proxy::DeserializeFileRef(infos[i]); - entry.file_type = file_types[i]; - entries.push_back(entry); - } - - ArrayWriter writer(output); - if (!writer.is_valid()) { - ReleaseEntries(entries); - return PP_ERROR_BADARGUMENT; - } - - writer.StoreVector(entries); - return PP_OK; -} - -uint32_t FileRef::SendCallback(scoped_refptr<TrackedCallback> callback) { - // In extreme cases the IDs may wrap around, so avoid duplicates. - while (pending_callbacks_.count(next_callback_id_)) - ++next_callback_id_; - - pending_callbacks_[next_callback_id_] = callback; - return next_callback_id_++; -} - -PPB_FileRef_Proxy::PPB_FileRef_Proxy(Dispatcher* dispatcher) - : InterfaceProxy(dispatcher), - callback_factory_(this) { -} - -PPB_FileRef_Proxy::~PPB_FileRef_Proxy() { -} - -// static -PP_Resource PPB_FileRef_Proxy::CreateProxyResource(PP_Instance instance, - PP_Resource file_system, - const char* path) { - PPB_FileRef_CreateInfo create_info; - PluginDispatcher::GetForInstance(instance)->Send( - new PpapiHostMsg_PPBFileRef_Create( - API_ID_PPB_FILE_REF, instance, file_system, path, &create_info)); - return PPB_FileRef_Proxy::DeserializeFileRef(create_info); -} - -bool PPB_FileRef_Proxy::OnMessageReceived(const IPC::Message& msg) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(PPB_FileRef_Proxy, msg) -#if !defined(OS_NACL) - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Create, OnMsgCreate) - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_GetParent, OnMsgGetParent) - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_MakeDirectory, - OnMsgMakeDirectory) - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Touch, OnMsgTouch) - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Delete, OnMsgDelete) - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Rename, OnMsgRename) - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_Query, OnMsgQuery) - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_ReadDirectoryEntries, - OnMsgReadDirectoryEntries) - IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFileRef_GetAbsolutePath, - OnMsgGetAbsolutePath) -#endif // !defined(OS_NACL) - - IPC_MESSAGE_HANDLER(PpapiMsg_PPBFileRef_CallbackComplete, - OnMsgCallbackComplete) - IPC_MESSAGE_HANDLER(PpapiMsg_PPBFileRef_QueryCallbackComplete, - OnMsgQueryCallbackComplete) - IPC_MESSAGE_HANDLER( - PpapiMsg_PPBFileRef_ReadDirectoryEntriesCallbackComplete, - OnMsgReadDirectoryEntriesCallbackComplete) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -// static -void PPB_FileRef_Proxy::SerializeFileRef(PP_Resource file_ref, - PPB_FileRef_CreateInfo* result) { - EnterResourceNoLock<PPB_FileRef_API> enter(file_ref, false); - if (enter.succeeded()) - *result = enter.object()->GetCreateInfo(); -} - -// static -PP_Resource PPB_FileRef_Proxy::DeserializeFileRef( - const PPB_FileRef_CreateInfo& serialized) { - if (serialized.resource.is_null()) - return 0; // Resource invalid. - return (new FileRef(serialized))->GetReference(); -} - -#if !defined(OS_NACL) -void PPB_FileRef_Proxy::OnMsgCreate(PP_Instance pp_instance, - PP_Resource file_system, - const std::string& path, - PPB_FileRef_CreateInfo* result) { - thunk::EnterResourceCreation enter(pp_instance); - if (enter.failed()) - return; - - PP_Resource resource = enter.functions()->CreateFileRef( - pp_instance, file_system, path.c_str()); - if (!resource) - return; // CreateInfo default constructor initializes to 0. - SerializeFileRef(resource, result); -} - -void PPB_FileRef_Proxy::OnMsgGetParent(const HostResource& host_resource, - PPB_FileRef_CreateInfo* result) { - EnterHostFromHostResource<PPB_FileRef_API> enter(host_resource); - if (enter.succeeded()) - SerializeFileRef(enter.object()->GetParent(), result); -} - -void PPB_FileRef_Proxy::OnMsgMakeDirectory(const HostResource& host_resource, - PP_Bool make_ancestors, - uint32_t callback_id) { - EnterHostFromHostResourceForceCallback<PPB_FileRef_API> enter( - host_resource, callback_factory_, - &PPB_FileRef_Proxy::OnCallbackCompleteInHost, host_resource, callback_id); - if (enter.succeeded()) { - enter.SetResult(enter.object()->MakeDirectory(make_ancestors, - enter.callback())); - } -} - -void PPB_FileRef_Proxy::OnMsgTouch(const HostResource& host_resource, - PP_Time last_access, - PP_Time last_modified, - uint32_t callback_id) { - EnterHostFromHostResourceForceCallback<PPB_FileRef_API> enter( - host_resource, callback_factory_, - &PPB_FileRef_Proxy::OnCallbackCompleteInHost, host_resource, callback_id); - if (enter.succeeded()) { - enter.SetResult(enter.object()->Touch(last_access, last_modified, - enter.callback())); - } -} - -void PPB_FileRef_Proxy::OnMsgDelete(const HostResource& host_resource, - uint32_t callback_id) { - EnterHostFromHostResourceForceCallback<PPB_FileRef_API> enter( - host_resource, callback_factory_, - &PPB_FileRef_Proxy::OnCallbackCompleteInHost, host_resource, callback_id); - if (enter.succeeded()) - enter.SetResult(enter.object()->Delete(enter.callback())); -} - -void PPB_FileRef_Proxy::OnMsgRename(const HostResource& file_ref, - const HostResource& new_file_ref, - uint32_t callback_id) { - EnterHostFromHostResourceForceCallback<PPB_FileRef_API> enter( - file_ref, callback_factory_, - &PPB_FileRef_Proxy::OnCallbackCompleteInHost, file_ref, callback_id); - if (enter.succeeded()) { - enter.SetResult(enter.object()->Rename(new_file_ref.host_resource(), - enter.callback())); - } -} - -void PPB_FileRef_Proxy::OnMsgQuery(const HostResource& file_ref, - uint32_t callback_id) { - linked_ptr<PP_FileInfo> info(new PP_FileInfo()); - EnterHostFromHostResourceForceCallback<PPB_FileRef_API> enter( - file_ref, callback_factory_, - &PPB_FileRef_Proxy::OnQueryCallbackCompleteInHost, file_ref, - info, callback_id); - if (enter.succeeded()) - enter.SetResult(enter.object()->QueryInHost(info, enter.callback())); -} - -void PPB_FileRef_Proxy::OnMsgGetAbsolutePath(const HostResource& host_resource, - SerializedVarReturnValue result) { - EnterHostFromHostResource<PPB_FileRef_API> enter(host_resource); - if (enter.succeeded()) - result.Return(dispatcher(), enter.object()->GetAbsolutePath()); -} - -void PPB_FileRef_Proxy::OnMsgReadDirectoryEntries(const HostResource& file_ref, - uint32_t callback_id) { - linked_ptr<std::vector<ppapi::PPB_FileRef_CreateInfo> > files( - new std::vector<ppapi::PPB_FileRef_CreateInfo>()); - linked_ptr<std::vector<PP_FileType> > file_types( - new std::vector<PP_FileType>()); - HostCallbackParams params(file_ref, callback_id); - EnterHostFromHostResourceForceCallback<PPB_FileRef_API> enter( - file_ref, callback_factory_, - &PPB_FileRef_Proxy::OnReadDirectoryEntriesCallbackCompleteInHost, - params, files, file_types); - if (enter.succeeded()) { - enter.SetResult(enter.object()->ReadDirectoryEntriesInHost( - files, file_types, enter.callback())); - } -} - -#endif // !defined(OS_NACL) - -void PPB_FileRef_Proxy::OnMsgCallbackComplete( - const HostResource& host_resource, - uint32_t callback_id, - int32_t result) { - // Forward the callback info to the plugin resource. - EnterPluginFromHostResource<PPB_FileRef_API> enter(host_resource); - if (enter.succeeded()) - static_cast<FileRef*>(enter.object())->ExecuteCallback(callback_id, result); -} - -void PPB_FileRef_Proxy::OnMsgQueryCallbackComplete( - const HostResource& host_resource, - const PP_FileInfo& info, - uint32_t callback_id, - int32_t result) { - EnterPluginFromHostResource<PPB_FileRef_API> enter(host_resource); - if (!enter.succeeded()) - return; - - if (result == PP_OK) { - result = static_cast<FileRef*>(enter.object())->SetFileInfo( - callback_id, info); - } - static_cast<FileRef*>(enter.object())->ExecuteCallback(callback_id, result); -} - -void PPB_FileRef_Proxy::OnMsgReadDirectoryEntriesCallbackComplete( - const HostResource& host_resource, - const std::vector<ppapi::PPB_FileRef_CreateInfo>& infos, - const std::vector<PP_FileType>& file_types, - uint32_t callback_id, - int32_t result) { - CHECK_EQ(infos.size(), file_types.size()); - - EnterPluginFromHostResource<PPB_FileRef_API> enter(host_resource); - if (!enter.succeeded()) - return; - - if (result == PP_OK) { - result = - static_cast<FileRef*>(enter.object())->SetReadDirectoryEntriesOutput( - callback_id, infos, file_types); - } - static_cast<FileRef*>(enter.object())->ExecuteCallback( - callback_id, result); -} - -#if !defined(OS_NACL) -void PPB_FileRef_Proxy::OnCallbackCompleteInHost( - int32_t result, - const HostResource& host_resource, - uint32_t callback_id) { - // Execute OnMsgCallbackComplete in the plugin process. - Send(new PpapiMsg_PPBFileRef_CallbackComplete( - API_ID_PPB_FILE_REF, host_resource, callback_id, result)); -} - -void PPB_FileRef_Proxy::OnQueryCallbackCompleteInHost( - int32_t result, - const HostResource& host_resource, - linked_ptr<PP_FileInfo> info, - uint32_t callback_id) { - Send(new PpapiMsg_PPBFileRef_QueryCallbackComplete( - API_ID_PPB_FILE_REF, host_resource, *info, callback_id, result)); -} - -void PPB_FileRef_Proxy::OnReadDirectoryEntriesCallbackCompleteInHost( - int32_t result, - HostCallbackParams params, - linked_ptr<std::vector<ppapi::PPB_FileRef_CreateInfo> > files, - linked_ptr<std::vector<PP_FileType> > file_types) { - Send(new PpapiMsg_PPBFileRef_ReadDirectoryEntriesCallbackComplete( - API_ID_PPB_FILE_REF, params.host_resource, - *files, *file_types, params.callback_id, result)); -} - -#endif // !defined(OS_NACL) - -} // namespace proxy -} // namespace ppapi diff --git a/ppapi/proxy/ppb_file_ref_proxy.h b/ppapi/proxy/ppb_file_ref_proxy.h deleted file mode 100644 index cbfadb5..0000000 --- a/ppapi/proxy/ppb_file_ref_proxy.h +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PPAPI_PROXY_PPB_FILE_REF_PROXY_H_ -#define PPAPI_PROXY_PPB_FILE_REF_PROXY_H_ - -#include <string> - -#include "base/basictypes.h" -#include "base/memory/linked_ptr.h" -#include "ppapi/c/pp_file_info.h" -#include "ppapi/c/pp_module.h" -#include "ppapi/c/pp_resource.h" -#include "ppapi/c/pp_time.h" -#include "ppapi/proxy/interface_proxy.h" -#include "ppapi/proxy/ppapi_proxy_export.h" -#include "ppapi/proxy/proxy_completion_callback_factory.h" -#include "ppapi/shared_impl/host_resource.h" -#include "ppapi/utility/completion_callback_factory.h" - -namespace ppapi { - -struct PPB_FileRef_CreateInfo; - -namespace proxy { - -class SerializedVarReturnValue; - -class PPAPI_PROXY_EXPORT PPB_FileRef_Proxy - : public NON_EXPORTED_BASE(InterfaceProxy) { - public: - explicit PPB_FileRef_Proxy(Dispatcher* dispatcher); - virtual ~PPB_FileRef_Proxy(); - - static PP_Resource CreateProxyResource(PP_Instance instance, - PP_Resource file_system, - const char* path); - static PP_Resource CreateProxyResource( - const PPB_FileRef_CreateInfo& serialized); - - // InterfaceProxy implementation. - virtual bool OnMessageReceived(const IPC::Message& msg); - - // Takes a resource in the host and converts it into a serialized file ref - // "create info" for reconstitution in the plugin. This struct contains all - // the necessary information about the file ref. - // - // Various PPAPI functions return file refs from various interfaces, so this - // function is public so anybody can send a file ref. - static void SerializeFileRef(PP_Resource file_ref, - PPB_FileRef_CreateInfo* result); - - // Creates a plugin resource from the given CreateInfo sent from the host. - // The value will be the result of calling SerializeFileRef on the host. - // This represents passing the resource ownership to the plugin. This - // function also checks the validity of the result and returns 0 on failure. - // - // Various PPAPI functions return file refs from various interfaces, so this - // function is public so anybody can receive a file ref. - static PP_Resource DeserializeFileRef( - const PPB_FileRef_CreateInfo& serialized); - - static const ApiID kApiID = API_ID_PPB_FILE_REF; - - private: - // Plugin -> host message handlers. - void OnMsgCreate(PP_Instance instance, - PP_Resource file_system, - const std::string& path, - PPB_FileRef_CreateInfo* result); - void OnMsgGetParent(const HostResource& host_resource, - PPB_FileRef_CreateInfo* result); - void OnMsgMakeDirectory(const HostResource& host_resource, - PP_Bool make_ancestors, - uint32_t callback_id); - void OnMsgTouch(const HostResource& host_resource, - PP_Time last_access, - PP_Time last_modified, - uint32_t callback_id); - void OnMsgDelete(const HostResource& host_resource, - uint32_t callback_id); - void OnMsgRename(const HostResource& file_ref, - const HostResource& new_file_ref, - uint32_t callback_id); - void OnMsgQuery(const HostResource& file_ref, - uint32_t callback_id); - void OnMsgGetAbsolutePath(const HostResource& host_resource, - SerializedVarReturnValue result); - void OnMsgReadDirectoryEntries(const HostResource& file_ref, - uint32_t callback_id); - - // Host -> Plugin message handlers. - void OnMsgCallbackComplete(const HostResource& host_resource, - uint32_t callback_id, - int32_t result); - void OnMsgQueryCallbackComplete(const HostResource& host_resource, - const PP_FileInfo& info, - uint32_t callback_id, - int32_t result); - void OnMsgReadDirectoryEntriesCallbackComplete( - const HostResource& host_resource, - const std::vector<ppapi::PPB_FileRef_CreateInfo>& infos, - const std::vector<PP_FileType>& file_types, - uint32_t callback_id, - int32_t result); - - struct HostCallbackParams { - HostCallbackParams(const HostResource& host_res, uint32_t cb_id) - : host_resource(host_res), callback_id(cb_id) { - } - HostResource host_resource; - uint32_t callback_id; - }; - - void OnCallbackCompleteInHost(int32_t result, - const HostResource& host_resource, - uint32_t callback_id); - void OnQueryCallbackCompleteInHost( - int32_t result, - const HostResource& host_resource, - linked_ptr<PP_FileInfo> info, - uint32_t callback_id); - void OnReadDirectoryEntriesCallbackCompleteInHost( - int32_t result, - HostCallbackParams params, - linked_ptr<std::vector<ppapi::PPB_FileRef_CreateInfo> > files, - linked_ptr<std::vector<PP_FileType> > file_types); - - ProxyCompletionCallbackFactory<PPB_FileRef_Proxy> callback_factory_; - - DISALLOW_COPY_AND_ASSIGN(PPB_FileRef_Proxy); -}; - -} // namespace proxy -} // namespace ppapi - -#endif // PPAPI_PROXY_PPB_FILE_REF_PROXY_H_ diff --git a/ppapi/proxy/resource_creation_proxy.cc b/ppapi/proxy/resource_creation_proxy.cc index 4814c97..88f99e32 100644 --- a/ppapi/proxy/resource_creation_proxy.cc +++ b/ppapi/proxy/resource_creation_proxy.cc @@ -11,6 +11,7 @@ #include "ppapi/proxy/ext_crx_file_system_private_resource.h" #include "ppapi/proxy/file_chooser_resource.h" #include "ppapi/proxy/file_io_resource.h" +#include "ppapi/proxy/file_ref_resource.h" #include "ppapi/proxy/file_system_resource.h" #include "ppapi/proxy/flash_drm_resource.h" #include "ppapi/proxy/flash_font_file_resource.h" @@ -26,7 +27,6 @@ #include "ppapi/proxy/ppb_audio_proxy.h" #include "ppapi/proxy/ppb_broker_proxy.h" #include "ppapi/proxy/ppb_buffer_proxy.h" -#include "ppapi/proxy/ppb_file_ref_proxy.h" #include "ppapi/proxy/ppb_flash_message_loop_proxy.h" #include "ppapi/proxy/ppb_graphics_3d_proxy.h" #include "ppapi/proxy/ppb_image_data_proxy.h" @@ -78,15 +78,10 @@ PP_Resource ResourceCreationProxy::CreateFileIO(PP_Instance instance) { return (new FileIOResource(GetConnection(), instance))->GetReference(); } -PP_Resource ResourceCreationProxy::CreateFileRef(PP_Instance instance, - PP_Resource file_system, - const char* path) { - return PPB_FileRef_Proxy::CreateProxyResource(instance, file_system, path); -} - PP_Resource ResourceCreationProxy::CreateFileRef( - const PPB_FileRef_CreateInfo& create_info) { - return PPB_FileRef_Proxy::DeserializeFileRef(create_info); + PP_Instance instance, + const FileRefCreateInfo& create_info) { + return FileRefResource::CreateFileRef(GetConnection(), instance, create_info); } PP_Resource ResourceCreationProxy::CreateFileSystem( diff --git a/ppapi/proxy/resource_creation_proxy.h b/ppapi/proxy/resource_creation_proxy.h index edca902..a8101db 100644 --- a/ppapi/proxy/resource_creation_proxy.h +++ b/ppapi/proxy/resource_creation_proxy.h @@ -38,11 +38,9 @@ class ResourceCreationProxy : public InterfaceProxy, // ResourceCreationAPI (called in plugin). virtual PP_Resource CreateFileIO(PP_Instance instance) OVERRIDE; - virtual PP_Resource CreateFileRef(PP_Instance instance, - PP_Resource file_system, - const char* path) OVERRIDE; virtual PP_Resource CreateFileRef( - const PPB_FileRef_CreateInfo& create_info) OVERRIDE; + PP_Instance instance, + const FileRefCreateInfo& create_info) OVERRIDE; virtual PP_Resource CreateFileSystem(PP_Instance instance, PP_FileSystemType type) OVERRIDE; virtual PP_Resource CreateIMEInputEvent(PP_Instance instance, diff --git a/ppapi/proxy/url_loader_resource.cc b/ppapi/proxy/url_loader_resource.cc index 5bbc937..1ff0a5e 100644 --- a/ppapi/proxy/url_loader_resource.cc +++ b/ppapi/proxy/url_loader_resource.cc @@ -9,8 +9,8 @@ #include "ppapi/c/pp_errors.h" #include "ppapi/c/ppb_url_loader.h" #include "ppapi/proxy/dispatch_reply_message.h" +#include "ppapi/proxy/file_ref_resource.h" #include "ppapi/proxy/ppapi_messages.h" -#include "ppapi/proxy/ppb_file_ref_proxy.h" #include "ppapi/proxy/url_request_info_resource.h" #include "ppapi/proxy/url_response_info_resource.h" #include "ppapi/shared_impl/ppapi_globals.h" @@ -158,9 +158,14 @@ int32_t URLLoaderResource::ReadResponseBody( int32_t rv = ValidateCallback(callback); if (rv != PP_OK) return rv; - if (!response_info_.get() || - !response_info_->data().body_as_file_ref.resource.is_null()) + if (!response_info_.get()) return PP_ERROR_FAILED; + + // Fail if we have a valid file ref. + // ReadResponseBody() is for reading to a user-provided buffer. + if (response_info_->data().body_as_file_ref.IsValid()) + return PP_ERROR_FAILED; + if (bytes_to_read <= 0 || !buffer) return PP_ERROR_BADARGUMENT; @@ -186,8 +191,11 @@ int32_t URLLoaderResource::FinishStreamingToFile( int32_t rv = ValidateCallback(callback); if (rv != PP_OK) return rv; - if (!response_info_.get() || - response_info_->data().body_as_file_ref.resource.is_null()) + if (!response_info_.get()) + return PP_ERROR_FAILED; + + // Fail if we do not have a valid file ref. + if (!response_info_->data().body_as_file_ref.IsValid()) return PP_ERROR_FAILED; // We may have already reached EOF. @@ -357,10 +365,10 @@ void URLLoaderResource::RunCallback(int32_t result) { void URLLoaderResource::SaveResponseInfo(const URLResponseInfoData& data) { // Create a proxy resource for the the file ref host resource if needed. PP_Resource body_as_file_ref = 0; - if (!data.body_as_file_ref.resource.is_null()) { - thunk::EnterResourceCreationNoLock enter(pp_instance()); - body_as_file_ref = - enter.functions()->CreateFileRef(data.body_as_file_ref); + if (data.body_as_file_ref.IsValid()) { + body_as_file_ref = FileRefResource::CreateFileRef(connection(), + pp_instance(), + data.body_as_file_ref); } response_info_ = new URLResponseInfoResource( connection(), pp_instance(), data, body_as_file_ref); @@ -389,4 +397,4 @@ size_t URLLoaderResource::FillUserBuffer() { } } // namespace proxy -} // namespace ppapi
\ No newline at end of file +} // namespace ppapi diff --git a/ppapi/proxy/url_response_info_resource.cc b/ppapi/proxy/url_response_info_resource.cc index 85dae9a..315b4a1 100644 --- a/ppapi/proxy/url_response_info_resource.cc +++ b/ppapi/proxy/url_response_info_resource.cc @@ -4,7 +4,7 @@ #include "ppapi/proxy/url_response_info_resource.h" -#include "ppapi/proxy/ppb_file_ref_proxy.h" +#include "ppapi/proxy/file_ref_resource.h" #include "ppapi/shared_impl/var.h" #include "ppapi/thunk/enter.h" #include "ppapi/thunk/resource_creation_api.h" diff --git a/ppapi/shared_impl/file_ref_create_info.cc b/ppapi/shared_impl/file_ref_create_info.cc new file mode 100644 index 0000000..2fd3e13 --- /dev/null +++ b/ppapi/shared_impl/file_ref_create_info.cc @@ -0,0 +1,50 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ppapi/shared_impl/file_ref_create_info.h" + +#include "base/logging.h" +#include "base/strings/utf_string_conversions.h" +#include "ppapi/c/pp_file_info.h" + +namespace ppapi { + +namespace { + +std::string GetNameForExternalFilePath(const base::FilePath& in_path) { + const base::FilePath::StringType& path = in_path.value(); + size_t pos = path.rfind(base::FilePath::kSeparators[0]); + CHECK(pos != base::FilePath::StringType::npos); +#if defined(OS_WIN) + return base::WideToUTF8(path.substr(pos + 1)); +#elif defined(OS_POSIX) + return path.substr(pos + 1); +#else +#error "Unsupported platform." +#endif +} + +} // namespace + +bool FileRefCreateInfo::IsValid() const { + return file_system_type != PP_FILESYSTEMTYPE_INVALID; +} + +FileRefCreateInfo +MakeExternalFileRefCreateInfo(const base::FilePath& external_path, + const std::string& display_name, + int browser_pending_host_resource_id, + int renderer_pending_host_resource_id) { + FileRefCreateInfo info; + info.file_system_type = PP_FILESYSTEMTYPE_EXTERNAL; + if (!display_name.empty()) + info.display_name = display_name; + else + info.display_name = GetNameForExternalFilePath(external_path); + info.browser_pending_host_resource_id = browser_pending_host_resource_id; + info.renderer_pending_host_resource_id = renderer_pending_host_resource_id; + return info; +} + +} // namespace ppapi diff --git a/ppapi/shared_impl/file_ref_create_info.h b/ppapi/shared_impl/file_ref_create_info.h index a3599f7..02fc8cc 100644 --- a/ppapi/shared_impl/file_ref_create_info.h +++ b/ppapi/shared_impl/file_ref_create_info.h @@ -10,24 +10,42 @@ #include "base/files/file_path.h" #include "ppapi/c/pp_file_info.h" #include "ppapi/c/pp_resource.h" +#include "ppapi/shared_impl/ppapi_shared_export.h" namespace ppapi { // FileRefs are created in a number of places and they include a number of // return values. This struct encapsulates everything in one place. -struct FileRef_CreateInfo { +struct FileRefCreateInfo { + FileRefCreateInfo() : file_system_type(PP_FILESYSTEMTYPE_INVALID), + browser_pending_host_resource_id(0), + renderer_pending_host_resource_id(0), + file_system_plugin_resource(0) { } + + PPAPI_SHARED_EXPORT bool IsValid() const; + PP_FileSystemType file_system_type; std::string internal_path; std::string display_name; // Used when a FileRef is created in the Renderer. - int pending_host_resource_id; + int browser_pending_host_resource_id; + int renderer_pending_host_resource_id; // Since FileRef needs to hold a FileSystem reference, we need to pass the - // resource in this CreateInfo. + // resource in this CreateInfo. This struct doesn't hold any refrence on the + // file_system_plugin_resource. PP_Resource file_system_plugin_resource; }; +// Used in the renderer when sending a FileRefCreateInfo to a plugin for a +// FileRef on an external filesystem. +PPAPI_SHARED_EXPORT FileRefCreateInfo +MakeExternalFileRefCreateInfo(const base::FilePath& external_path, + const std::string& display_name, + int browser_pending_host_resource_id, + int renderer_pending_host_resource_id); + } // namespace ppapi #endif // PPAPI_SHARED_IMPL_FILE_REF_CREATE_INFO_H diff --git a/ppapi/shared_impl/ppb_file_ref_shared.cc b/ppapi/shared_impl/ppb_file_ref_shared.cc deleted file mode 100644 index a47cdb8..0000000 --- a/ppapi/shared_impl/ppb_file_ref_shared.cc +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ppapi/shared_impl/ppb_file_ref_shared.h" - -#include "base/logging.h" -#include "ppapi/shared_impl/var.h" - -namespace ppapi { - -PPB_FileRef_Shared::PPB_FileRef_Shared(ResourceObjectType type, - const PPB_FileRef_CreateInfo& info) - : Resource(type, info.resource), - create_info_(info) { - if (type == OBJECT_IS_IMPL) { - // Resource's constructor assigned a PP_Resource, so we can fill out our - // host resource now. - create_info_.resource = host_resource(); - } -} - -PPB_FileRef_Shared::~PPB_FileRef_Shared() { -} - -thunk::PPB_FileRef_API* PPB_FileRef_Shared::AsPPB_FileRef_API() { - return this; -} - -PP_FileSystemType PPB_FileRef_Shared::GetFileSystemType() const { - return static_cast<PP_FileSystemType>(create_info_.file_system_type); -} - -PP_Var PPB_FileRef_Shared::GetName() const { - if (!name_var_.get()) { - name_var_ = new StringVar(create_info_.name); - } - return name_var_->GetPPVar(); -} - -PP_Var PPB_FileRef_Shared::GetPath() const { - if (create_info_.file_system_type == PP_FILESYSTEMTYPE_EXTERNAL) - return PP_MakeUndefined(); - if (!path_var_.get()) { - path_var_ = new StringVar(create_info_.path); - } - return path_var_->GetPPVar(); -} - -const PPB_FileRef_CreateInfo& PPB_FileRef_Shared::GetCreateInfo() const { - return create_info_; -} - -} // namespace ppapi diff --git a/ppapi/shared_impl/ppb_file_ref_shared.h b/ppapi/shared_impl/ppb_file_ref_shared.h deleted file mode 100644 index 5025eb3..0000000 --- a/ppapi/shared_impl/ppb_file_ref_shared.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef PPAPI_SHARED_IMPL_PPB_FILE_REF_SHARED_H_ -#define PPAPI_SHARED_IMPL_PPB_FILE_REF_SHARED_H_ - -#include <string> - -#include "base/compiler_specific.h" -#include "ppapi/shared_impl/resource.h" -#include "ppapi/thunk/ppb_file_ref_api.h" - -namespace ppapi { - -class StringVar; - -// FileRefs are created in a number of places and they include a number of -// return values. This struct encapsulates everything in one place. -struct PPB_FileRef_CreateInfo { - PPB_FileRef_CreateInfo() - : file_system_type(PP_FILESYSTEMTYPE_EXTERNAL), - file_system_plugin_resource(0) {} - - ppapi::HostResource resource; - int file_system_type; // One of PP_FileSystemType values. - std::string path; - std::string name; - - // Since FileRef needs to hold a FileSystem reference, we need to pass the - // resource in this CreateInfo. Note that this is a plugin resource as - // FileSystem is already in new design. - PP_Resource file_system_plugin_resource; -}; - -// This class provides the shared implementation of a FileRef. The functions -// that actually "do stuff" like Touch and MakeDirectory are implemented -// differently for the proxied and non-proxied derived classes. -class PPAPI_SHARED_EXPORT PPB_FileRef_Shared - : public Resource, - public thunk::PPB_FileRef_API { - public: - PPB_FileRef_Shared(ResourceObjectType type, - const PPB_FileRef_CreateInfo& info); - virtual ~PPB_FileRef_Shared(); - - // Resource overrides. - virtual thunk::PPB_FileRef_API* AsPPB_FileRef_API() OVERRIDE; - - // PPB_FileRef_API implementation (partial). - virtual PP_FileSystemType GetFileSystemType() const OVERRIDE; - virtual PP_Var GetName() const OVERRIDE; - virtual PP_Var GetPath() const OVERRIDE; - virtual const PPB_FileRef_CreateInfo& GetCreateInfo() const OVERRIDE; - virtual PP_Var GetAbsolutePath() = 0; - - private: - PPB_FileRef_CreateInfo create_info_; - - // Lazily initialized vars created from the create_info_. This is so we can - // return the identical string object every time they're requested. - mutable scoped_refptr<StringVar> name_var_; - mutable scoped_refptr<StringVar> path_var_; - - DISALLOW_IMPLICIT_CONSTRUCTORS(PPB_FileRef_Shared); -}; - -} // namespace ppapi - -#endif // PPAPI_SHARED_IMPL_PPB_FILE_REF_SHARED_H_ diff --git a/ppapi/shared_impl/url_request_info_data.cc b/ppapi/shared_impl/url_request_info_data.cc index 8bb02a4..15b2787 100644 --- a/ppapi/shared_impl/url_request_info_data.cc +++ b/ppapi/shared_impl/url_request_info_data.cc @@ -17,6 +17,7 @@ const int32_t kDefaultPrefetchBufferLowerThreshold = 50 * 1000 * 1000; URLRequestInfoData::BodyItem::BodyItem() : is_file(false), + file_ref_pp_resource(0), start_offset(0), number_of_bytes(-1), expected_last_modified_time(0.0) { @@ -25,6 +26,7 @@ URLRequestInfoData::BodyItem::BodyItem() URLRequestInfoData::BodyItem::BodyItem(const std::string& data) : is_file(false), data(data), + file_ref_pp_resource(0), start_offset(0), number_of_bytes(-1), expected_last_modified_time(0.0) { @@ -36,8 +38,8 @@ URLRequestInfoData::BodyItem::BodyItem( int64_t number_of_bytes, PP_Time expected_last_modified_time) : is_file(true), - file_ref(file_ref), - file_ref_host_resource(file_ref->host_resource()), + file_ref_resource(file_ref), + file_ref_pp_resource(file_ref->pp_resource()), start_offset(start_offset), number_of_bytes(number_of_bytes), expected_last_modified_time(expected_last_modified_time) { diff --git a/ppapi/shared_impl/url_request_info_data.h b/ppapi/shared_impl/url_request_info_data.h index 501251a..d0acf4b 100644 --- a/ppapi/shared_impl/url_request_info_data.h +++ b/ppapi/shared_impl/url_request_info_data.h @@ -9,10 +9,12 @@ #include <vector> #include "base/memory/ref_counted.h" +#include "ppapi/c/pp_resource.h" #include "ppapi/c/pp_stdint.h" #include "ppapi/c/pp_time.h" -#include "ppapi/shared_impl/host_resource.h" +#include "ppapi/shared_impl/ppapi_globals.h" #include "ppapi/shared_impl/ppapi_shared_export.h" +#include "ppapi/shared_impl/resource_tracker.h" namespace ppapi { @@ -32,19 +34,12 @@ struct PPAPI_SHARED_EXPORT URLRequestInfoData { std::string data; - // Is is_file is set, these variables are set. Note that the resource - // may still be NULL in some cases, such as deserialization errors. - // - // This is a bit tricky. In the plugin side of the proxy, both the file ref - // and the file_ref_host_resource will be set and valid. The scoped_refptr - // ensures that the resource is alive for as long as the BodyItem is. - // - // When we deserialize this in the renderer, only the - // file_ref_host_resource's are serialized over IPC. The file_refs won't be - // valid until the host resources are converted to Resource pointers in the - // PPB_URLRequestInfo_Impl. - scoped_refptr<Resource> file_ref; - HostResource file_ref_host_resource; + // Only set on the plugin-side, for refcounting purposes. Only valid when + // |is_file| is set. + scoped_refptr<Resource> file_ref_resource; + // This struct holds no ref to this resource. Only valid when |is_file| is + // set. + PP_Resource file_ref_pp_resource; int64_t start_offset; int64_t number_of_bytes; diff --git a/ppapi/shared_impl/url_response_info_data.h b/ppapi/shared_impl/url_response_info_data.h index a40ca50..c6f7dbd 100644 --- a/ppapi/shared_impl/url_response_info_data.h +++ b/ppapi/shared_impl/url_response_info_data.h @@ -8,7 +8,7 @@ #include <string> #include "ppapi/c/pp_stdint.h" -#include "ppapi/shared_impl/ppb_file_ref_shared.h" +#include "ppapi/shared_impl/file_ref_create_info.h" #include "ppapi/shared_impl/ppapi_shared_export.h" namespace ppapi { @@ -23,8 +23,8 @@ struct PPAPI_SHARED_EXPORT URLResponseInfoData { std::string status_text; std::string redirect_url; - // Nonzero when streaming to a file. - PPB_FileRef_CreateInfo body_as_file_ref; + // Valid when streaming to a file. + FileRefCreateInfo body_as_file_ref; }; } // namespace ppapi diff --git a/ppapi/thunk/interfaces_ppb_private.h b/ppapi/thunk/interfaces_ppb_private.h index 3e0289c..391904d3 100644 --- a/ppapi/thunk/interfaces_ppb_private.h +++ b/ppapi/thunk/interfaces_ppb_private.h @@ -33,7 +33,7 @@ PROXIED_IFACE(NoAPIName, PPB_FILECHOOSER_TRUSTED_INTERFACE_0_5, PPB_FileChooserTrusted_0_5) PROXIED_IFACE(NoAPIName, PPB_FILECHOOSER_TRUSTED_INTERFACE_0_6, PPB_FileChooserTrusted_0_6) -PROXIED_IFACE(PPB_FileRef, PPB_FILEREFPRIVATE_INTERFACE_0_1, +PROXIED_IFACE(NoAPIName, PPB_FILEREFPRIVATE_INTERFACE_0_1, PPB_FileRefPrivate_0_1) // TODO(xhwang): Move PPB_Flash_DeviceID back to interfaces_ppb_private_flash.h. PROXIED_IFACE(NoAPIName, PPB_FLASH_DEVICEID_INTERFACE_1_0, diff --git a/ppapi/thunk/interfaces_ppb_public_stable.h b/ppapi/thunk/interfaces_ppb_public_stable.h index 19626aa..5addc759 100644 --- a/ppapi/thunk/interfaces_ppb_public_stable.h +++ b/ppapi/thunk/interfaces_ppb_public_stable.h @@ -19,7 +19,6 @@ // that exist in the webkit/plugins/ppapi/*_impl.h, but not in the proxy. PROXIED_API(PPB_Audio) PROXIED_API(PPB_Core) -PROXIED_API(PPB_FileRef) PROXIED_API(PPB_Graphics3D) PROXIED_API(PPB_ImageData) PROXIED_API(PPB_Instance) @@ -45,8 +44,8 @@ UNPROXIED_API(PPB_AudioConfig) // interface string. // Note: Core is special and is registered manually. PROXIED_IFACE(PPB_Audio, PPB_AUDIO_INTERFACE_1_0, PPB_Audio_1_0) -PROXIED_IFACE(PPB_FileRef, PPB_FILEREF_INTERFACE_1_0, PPB_FileRef_1_0) -PROXIED_IFACE(PPB_FileRef, PPB_FILEREF_INTERFACE_1_1, PPB_FileRef_1_1) +PROXIED_IFACE(NoAPIName, PPB_FILEREF_INTERFACE_1_0, PPB_FileRef_1_0) +PROXIED_IFACE(NoAPIName, PPB_FILEREF_INTERFACE_1_1, PPB_FileRef_1_1) PROXIED_IFACE(NoAPIName, PPB_FILESYSTEM_INTERFACE_1_0, PPB_FileSystem_1_0) PROXIED_IFACE(PPB_Graphics3D, PPB_GRAPHICS_3D_INTERFACE_1_0, PPB_Graphics3D_1_0) PROXIED_IFACE(PPB_ImageData, PPB_IMAGEDATA_INTERFACE_1_0, PPB_ImageData_1_0) diff --git a/ppapi/thunk/ppb_file_ref_api.h b/ppapi/thunk/ppb_file_ref_api.h index ba92b63..b473ae2 100644 --- a/ppapi/thunk/ppb_file_ref_api.h +++ b/ppapi/thunk/ppb_file_ref_api.h @@ -10,11 +10,12 @@ #include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" #include "ppapi/c/ppb_file_ref.h" +#include "ppapi/shared_impl/file_ref_create_info.h" #include "ppapi/thunk/ppapi_thunk_export.h" namespace ppapi { -struct PPB_FileRef_CreateInfo; +struct FileRefCreateInfo; class TrackedCallback; namespace thunk { @@ -40,25 +41,10 @@ class PPAPI_THUNK_EXPORT PPB_FileRef_API { virtual int32_t ReadDirectoryEntries( const PP_ArrayOutput& output, scoped_refptr<TrackedCallback> callback) = 0; - // We define variants of Query and ReadDirectoryEntries because - // 1. we need to take linked_ptr instead of raw pointers to avoid - // use-after-free, and 2. we don't use PP_ArrayOutput for the - // communication between renderers and the browser in - // ReadDirectoryEntries. The *InHost functions must not be called in - // plugins, and Query and ReadDirectoryEntries must not be called in - // renderers. - // TODO(hamaji): These functions must be removed when we move - // FileRef to the new resource design. http://crbug.com/225441 - virtual int32_t QueryInHost(linked_ptr<PP_FileInfo> info, - scoped_refptr<TrackedCallback> callback) = 0; - virtual int32_t ReadDirectoryEntriesInHost( - linked_ptr<std::vector<ppapi::PPB_FileRef_CreateInfo> > files, - linked_ptr<std::vector<PP_FileType> > file_types, - scoped_refptr<TrackedCallback> callback) = 0; // Internal function for use in proxying. Returns the internal CreateInfo // (the contained resource does not carry a ref on behalf of the caller). - virtual const PPB_FileRef_CreateInfo& GetCreateInfo() const = 0; + virtual const FileRefCreateInfo& GetCreateInfo() const = 0; // Private API virtual PP_Var GetAbsolutePath() = 0; diff --git a/ppapi/thunk/ppb_file_ref_thunk.cc b/ppapi/thunk/ppb_file_ref_thunk.cc index beb0e41..64c90b5 100644 --- a/ppapi/thunk/ppb_file_ref_thunk.cc +++ b/ppapi/thunk/ppb_file_ref_thunk.cc @@ -7,6 +7,7 @@ #include "ppapi/c/pp_completion_callback.h" #include "ppapi/c/pp_errors.h" #include "ppapi/c/private/ppb_file_ref_private.h" +#include "ppapi/shared_impl/file_ref_create_info.h" #include "ppapi/shared_impl/proxy_lock.h" #include "ppapi/shared_impl/tracked_callback.h" #include "ppapi/thunk/enter.h" @@ -32,7 +33,13 @@ PP_Resource Create(PP_Resource file_system, const char* path) { EnterResourceCreationNoLock enter(instance); if (enter.failed()) return 0; - return enter.functions()->CreateFileRef(instance, file_system, path); + FileRefCreateInfo info; + info.file_system_type = enter_file_system.object()->GetType(); + info.internal_path = std::string(path); + info.browser_pending_host_resource_id = 0; + info.renderer_pending_host_resource_id = 0; + info.file_system_plugin_resource = file_system; + return enter.functions()->CreateFileRef(instance, info); } PP_Bool IsFileRef(PP_Resource resource) { diff --git a/ppapi/thunk/resource_creation_api.h b/ppapi/thunk/resource_creation_api.h index 4930755..262a294 100644 --- a/ppapi/thunk/resource_creation_api.h +++ b/ppapi/thunk/resource_creation_api.h @@ -33,7 +33,7 @@ struct PP_Size; namespace ppapi { -struct PPB_FileRef_CreateInfo; +struct FileRefCreateInfo; struct URLRequestInfoData; struct URLResponseInfoData; @@ -49,15 +49,9 @@ class ResourceCreationAPI { virtual ~ResourceCreationAPI() {} virtual PP_Resource CreateFileIO(PP_Instance instance) = 0; - virtual PP_Resource CreateFileRef(PP_Instance instance, - PP_Resource file_system, - const char* path) = 0; - // Like the above version but takes a serialized file ref. The resource - // in the serialized file ref is passed into this, which takes ownership of - // the reference. In the proxy, the return value will be a plugin resource. - // In the impl, the return value will be the same resource ID. virtual PP_Resource CreateFileRef( - const PPB_FileRef_CreateInfo& serialized) = 0; + PP_Instance instance, + const FileRefCreateInfo& serialized) = 0; virtual PP_Resource CreateFileSystem(PP_Instance instance, PP_FileSystemType type) = 0; virtual PP_Resource CreateIMEInputEvent(PP_Instance instance, |