summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy
diff options
context:
space:
mode:
Diffstat (limited to 'ppapi/proxy')
-rw-r--r--ppapi/proxy/enter_proxy.h58
-rw-r--r--ppapi/proxy/interface_id.h1
-rw-r--r--ppapi/proxy/plugin_resource_tracker.cc8
-rw-r--r--ppapi/proxy/plugin_resource_tracker.h6
-rw-r--r--ppapi/proxy/ppb_audio_config_proxy.cc4
-rw-r--r--ppapi/proxy/ppb_audio_proxy.cc21
-rw-r--r--ppapi/proxy/ppb_broker_proxy.cc4
-rw-r--r--ppapi/proxy/ppb_buffer_proxy.cc4
-rw-r--r--ppapi/proxy/ppb_char_set_proxy.cc2
-rw-r--r--ppapi/proxy/ppb_char_set_proxy.h2
-rw-r--r--ppapi/proxy/ppb_cursor_control_proxy.cc2
-rw-r--r--ppapi/proxy/ppb_cursor_control_proxy.h2
-rw-r--r--ppapi/proxy/ppb_file_chooser_proxy.cc147
-rw-r--r--ppapi/proxy/ppb_file_chooser_proxy.h5
-rw-r--r--ppapi/proxy/ppb_file_ref_proxy.cc293
-rw-r--r--ppapi/proxy/ppb_file_ref_proxy.h5
-rw-r--r--ppapi/proxy/ppb_file_system_proxy.cc150
-rw-r--r--ppapi/proxy/ppb_file_system_proxy.h6
-rw-r--r--ppapi/proxy/ppb_font_proxy.cc4
-rw-r--r--ppapi/proxy/ppb_font_proxy.h4
-rw-r--r--ppapi/proxy/ppb_graphics_2d_proxy.cc107
-rw-r--r--ppapi/proxy/ppb_graphics_2d_proxy.h59
-rw-r--r--ppapi/proxy/ppb_image_data_proxy.cc2
-rw-r--r--ppapi/proxy/ppb_image_data_proxy.h2
-rw-r--r--ppapi/proxy/resource_creation_proxy.cc50
-rw-r--r--ppapi/proxy/resource_creation_proxy.h11
26 files changed, 507 insertions, 452 deletions
diff --git a/ppapi/proxy/enter_proxy.h b/ppapi/proxy/enter_proxy.h
new file mode 100644
index 0000000..6e52705
--- /dev/null
+++ b/ppapi/proxy/enter_proxy.h
@@ -0,0 +1,58 @@
+// 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_ENTER_PROXY_H_
+#define PPAPI_PROXY_ENTER_PROXY_H_
+
+#include "base/logging.h"
+#include "ppapi/proxy/host_dispatcher.h"
+#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/plugin_resource_tracker.h"
+#include "ppapi/thunk/enter.h"
+
+namespace pp {
+namespace proxy {
+
+// Wrapper around EnterResourceNoLock that takes a host resource. This is used
+// when handling messages in the plugin from the host and we need to convert to
+// an object in the plugin side corresponding to that.
+//
+// This never locks since we assume the host Resource is coming from IPC, and
+// never logs errors since we assume the host is doing reasonable things.
+template<typename ResourceT>
+class EnterPluginFromHostResource
+ : public ::ppapi::thunk::EnterResourceNoLock<ResourceT> {
+ public:
+ EnterPluginFromHostResource(const HostResource& host_resource)
+ : ::ppapi::thunk::EnterResourceNoLock<ResourceT>(
+ PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
+ host_resource),
+ false) {
+ // Validate that we're in the plugin rather than the host. Otherwise this
+ // object will do the wrong thing. In the plugin, the instance should have
+ // a corresponding plugin dispatcher (assuming the resource is valid).
+ DCHECK(this->failed() ||
+ PluginDispatcher::GetForInstance(host_resource.instance()));
+ }
+};
+
+template<typename ResourceT>
+class EnterHostFromHostResource
+ : public ::ppapi::thunk::EnterResourceNoLock<ResourceT> {
+ public:
+ EnterHostFromHostResource(const HostResource& host_resource)
+ : ::ppapi::thunk::EnterResourceNoLock<ResourceT>(
+ host_resource.host_resource(), false) {
+ // Validate that we're in the host rather than the plugin. Otherwise this
+ // object will do the wrong thing. In the host, the instance should have
+ // a corresponding host disptacher (assuming the resource is valid).
+ DCHECK(this->failed() ||
+ HostDispatcher::GetForInstance(host_resource.instance()));
+ }
+};
+
+} // namespace proxy
+} // namespace pp
+
+#endif // PPAPI_PROXY_ENTER_PROXY_H_
diff --git a/ppapi/proxy/interface_id.h b/ppapi/proxy/interface_id.h
index 039008c..7363340 100644
--- a/ppapi/proxy/interface_id.h
+++ b/ppapi/proxy/interface_id.h
@@ -26,6 +26,7 @@ enum InterfaceID {
INTERFACE_ID_PPB_FILE_CHOOSER,
INTERFACE_ID_PPB_FILE_REF,
INTERFACE_ID_PPB_FILE_SYSTEM,
+ INTERFACE_ID_PPB_FIND,
INTERFACE_ID_PPB_FLASH,
INTERFACE_ID_PPB_FLASH_CLIPBOARD,
INTERFACE_ID_PPB_FLASH_FILE_FILEREF,
diff --git a/ppapi/proxy/plugin_resource_tracker.cc b/ppapi/proxy/plugin_resource_tracker.cc
index a6e087f..e1726cf 100644
--- a/ppapi/proxy/plugin_resource_tracker.cc
+++ b/ppapi/proxy/plugin_resource_tracker.cc
@@ -139,6 +139,14 @@ PP_Resource PluginResourceTracker::PluginResourceForHostResource(
return NULL;
}
+PP_Instance PluginResourceTracker::GetInstanceForResource(
+ PP_Resource resource) {
+ ResourceMap::iterator found = resource_map_.find(resource);
+ if (found == resource_map_.end())
+ return 0;
+ return found->second.resource->instance();
+}
+
void PluginResourceTracker::ReleasePluginResourceRef(
const PP_Resource& resource,
bool notify_browser_on_release) {
diff --git a/ppapi/proxy/plugin_resource_tracker.h b/ppapi/proxy/plugin_resource_tracker.h
index 5dfdf82..c00d3f2 100644
--- a/ppapi/proxy/plugin_resource_tracker.h
+++ b/ppapi/proxy/plugin_resource_tracker.h
@@ -8,6 +8,7 @@
#include <map>
#include <utility>
+#include "base/compiler_specific.h"
#include "base/memory/linked_ptr.h"
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_instance.h"
@@ -56,10 +57,11 @@ class PluginResourceTracker : public ::ppapi::TrackerBase {
// TrackerBase.
virtual ::ppapi::ResourceObjectBase* GetResourceAPI(
- PP_Resource res);
+ PP_Resource res) OVERRIDE;
virtual ::ppapi::FunctionGroupBase* GetFunctionAPI(
PP_Instance inst,
- pp::proxy::InterfaceID id);
+ pp::proxy::InterfaceID id) OVERRIDE;
+ virtual PP_Instance GetInstanceForResource(PP_Resource resource) OVERRIDE;
private:
friend struct DefaultSingletonTraits<PluginResourceTracker>;
diff --git a/ppapi/proxy/ppb_audio_config_proxy.cc b/ppapi/proxy/ppb_audio_config_proxy.cc
index 8e78ecd..e8eb056 100644
--- a/ppapi/proxy/ppb_audio_config_proxy.cc
+++ b/ppapi/proxy/ppb_audio_config_proxy.cc
@@ -23,7 +23,7 @@ class AudioConfig : public PluginResource,
virtual ~AudioConfig();
// ResourceObjectBase overrides.
- virtual ::ppapi::thunk::PPB_AudioConfig_API* AsAudioConfig_API() OVERRIDE;
+ virtual ::ppapi::thunk::PPB_AudioConfig_API* AsPPB_AudioConfig_API() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(AudioConfig);
@@ -36,7 +36,7 @@ AudioConfig::AudioConfig(const HostResource& resource)
AudioConfig::~AudioConfig() {
}
-::ppapi::thunk::PPB_AudioConfig_API* AudioConfig::AsAudioConfig_API() {
+::ppapi::thunk::PPB_AudioConfig_API* AudioConfig::AsPPB_AudioConfig_API() {
return this;
}
diff --git a/ppapi/proxy/ppb_audio_proxy.cc b/ppapi/proxy/ppb_audio_proxy.cc
index 6c2cc7a..22ddddd 100644
--- a/ppapi/proxy/ppb_audio_proxy.cc
+++ b/ppapi/proxy/ppb_audio_proxy.cc
@@ -10,6 +10,7 @@
#include "ppapi/c/ppb_audio_config.h"
#include "ppapi/c/ppb_var.h"
#include "ppapi/c/trusted/ppb_audio_trusted.h"
+#include "ppapi/proxy/enter_proxy.h"
#include "ppapi/proxy/interface_id.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/plugin_resource.h"
@@ -21,6 +22,8 @@
#include "ppapi/thunk/resource_creation_api.h"
#include "ppapi/thunk/thunk.h"
+using ::ppapi::thunk::PPB_Audio_API;
+
namespace pp {
namespace proxy {
@@ -33,7 +36,7 @@ class Audio : public PluginResource, public ppapi::AudioImpl {
virtual ~Audio();
// ResourceObjectBase overrides.
- virtual ::ppapi::thunk::PPB_Audio_API* AsAudio_API();
+ virtual PPB_Audio_API* AsPPB_Audio_API();
// PPB_Audio_API implementation.
virtual PP_Resource GetCurrentConfig() OVERRIDE;
@@ -62,7 +65,7 @@ Audio::~Audio() {
PluginResourceTracker::GetInstance()->ReleaseResource(config_);
}
-::ppapi::thunk::PPB_Audio_API* Audio::AsAudio_API() {
+PPB_Audio_API* Audio::AsPPB_Audio_API() {
return this;
}
@@ -232,11 +235,7 @@ void PPB_Audio_Proxy::OnMsgNotifyAudioStreamCreated(
IPC::PlatformFileForTransit socket_handle,
base::SharedMemoryHandle handle,
uint32_t length) {
- PP_Resource plugin_resource =
- PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
- audio_id);
- ppapi::thunk::EnterResource<ppapi::thunk::PPB_Audio_API> enter(
- plugin_resource, false);
+ EnterPluginFromHostResource<PPB_Audio_API> enter(audio_id);
if (enter.failed() || result_code != PP_OK) {
// The caller may still have given us these handles in the failure case.
// The easiest way to clean these up is to just put them in the objects
@@ -244,11 +243,11 @@ void PPB_Audio_Proxy::OnMsgNotifyAudioStreamCreated(
base::SyncSocket temp_socket(
IPC::PlatformFileForTransitToPlatformFile(socket_handle));
base::SharedMemory temp_mem(handle, false);
- return;
+ } else {
+ static_cast<Audio*>(enter.object())->SetStreamInfo(
+ handle, length,
+ IPC::PlatformFileForTransitToPlatformFile(socket_handle));
}
- Audio* audio = static_cast<Audio*>(enter.object());
- audio->SetStreamInfo(
- handle, length, IPC::PlatformFileForTransitToPlatformFile(socket_handle));
}
void PPB_Audio_Proxy::AudioChannelConnected(
diff --git a/ppapi/proxy/ppb_broker_proxy.cc b/ppapi/proxy/ppb_broker_proxy.cc
index 74aa4a2..97fe0d0 100644
--- a/ppapi/proxy/ppb_broker_proxy.cc
+++ b/ppapi/proxy/ppb_broker_proxy.cc
@@ -52,7 +52,7 @@ class Broker : public ppapi::thunk::PPB_Broker_API,
virtual ~Broker();
// ResourceObjectBase overries.
- virtual ppapi::thunk::PPB_Broker_API* AsBroker_API() OVERRIDE;
+ virtual ppapi::thunk::PPB_Broker_API* AsPPB_Broker_API() OVERRIDE;
// PPB_Broker_API implementation.
virtual int32_t Connect(PP_CompletionCallback connect_callback) OVERRIDE;
@@ -95,7 +95,7 @@ Broker::~Broker() {
socket_handle_ = base::kInvalidPlatformFileValue;
}
-ppapi::thunk::PPB_Broker_API* Broker::AsBroker_API() {
+ppapi::thunk::PPB_Broker_API* Broker::AsPPB_Broker_API() {
return this;
}
diff --git a/ppapi/proxy/ppb_buffer_proxy.cc b/ppapi/proxy/ppb_buffer_proxy.cc
index d6f910f..5c2fd8a 100644
--- a/ppapi/proxy/ppb_buffer_proxy.cc
+++ b/ppapi/proxy/ppb_buffer_proxy.cc
@@ -41,7 +41,7 @@ class Buffer : public ppapi::thunk::PPB_Buffer_API,
virtual Buffer* AsBuffer() OVERRIDE;
// ResourceObjectBase overries.
- virtual ppapi::thunk::PPB_Buffer_API* AsBuffer_API() OVERRIDE;
+ virtual ppapi::thunk::PPB_Buffer_API* AsPPB_Buffer_API() OVERRIDE;
// PPB_Buffer_API implementation.
virtual PP_Bool Describe(uint32_t* size_in_bytes) OVERRIDE;
@@ -75,7 +75,7 @@ Buffer* Buffer::AsBuffer() {
return this;
}
-ppapi::thunk::PPB_Buffer_API* Buffer::AsBuffer_API() {
+ppapi::thunk::PPB_Buffer_API* Buffer::AsPPB_Buffer_API() {
return this;
}
diff --git a/ppapi/proxy/ppb_char_set_proxy.cc b/ppapi/proxy/ppb_char_set_proxy.cc
index a896693..1887549 100644
--- a/ppapi/proxy/ppb_char_set_proxy.cc
+++ b/ppapi/proxy/ppb_char_set_proxy.cc
@@ -52,7 +52,7 @@ const InterfaceProxy::Info* PPB_CharSet_Proxy::GetInfo() {
}
ppapi::thunk::PPB_CharSet_FunctionAPI*
-PPB_CharSet_Proxy::AsCharSet_FunctionAPI() {
+PPB_CharSet_Proxy::AsPPB_CharSet_FunctionAPI() {
return this;
}
diff --git a/ppapi/proxy/ppb_char_set_proxy.h b/ppapi/proxy/ppb_char_set_proxy.h
index b64884c..0f70ab5 100644
--- a/ppapi/proxy/ppb_char_set_proxy.h
+++ b/ppapi/proxy/ppb_char_set_proxy.h
@@ -29,7 +29,7 @@ class PPB_CharSet_Proxy : public ppapi::FunctionGroupBase,
static const Info* GetInfo();
// FunctionGroupBase overrides.
- virtual ppapi::thunk::PPB_CharSet_FunctionAPI* AsCharSet_FunctionAPI()
+ virtual ppapi::thunk::PPB_CharSet_FunctionAPI* AsPPB_CharSet_FunctionAPI()
OVERRIDE;
// PPB_CharSet_FunctionAPI implementation.
diff --git a/ppapi/proxy/ppb_cursor_control_proxy.cc b/ppapi/proxy/ppb_cursor_control_proxy.cc
index 37619b7..993efe8 100644
--- a/ppapi/proxy/ppb_cursor_control_proxy.cc
+++ b/ppapi/proxy/ppb_cursor_control_proxy.cc
@@ -49,7 +49,7 @@ const InterfaceProxy::Info* PPB_CursorControl_Proxy::GetInfo() {
}
ppapi::thunk::PPB_CursorControl_FunctionAPI*
-PPB_CursorControl_Proxy::AsCursorControl_FunctionAPI() {
+PPB_CursorControl_Proxy::AsPPB_CursorControl_FunctionAPI() {
return this;
}
diff --git a/ppapi/proxy/ppb_cursor_control_proxy.h b/ppapi/proxy/ppb_cursor_control_proxy.h
index 234f6cd..8657dc9 100644
--- a/ppapi/proxy/ppb_cursor_control_proxy.h
+++ b/ppapi/proxy/ppb_cursor_control_proxy.h
@@ -31,7 +31,7 @@ class PPB_CursorControl_Proxy
static const Info* GetInfo();
// FunctionGroupBase overrides.
- ppapi::thunk::PPB_CursorControl_FunctionAPI* AsCursorControl_FunctionAPI()
+ ppapi::thunk::PPB_CursorControl_FunctionAPI* AsPPB_CursorControl_FunctionAPI()
OVERRIDE;
// PPB_CursorControl_FunctionAPI implementation.
diff --git a/ppapi/proxy/ppb_file_chooser_proxy.cc b/ppapi/proxy/ppb_file_chooser_proxy.cc
index 6307806..38bc058 100644
--- a/ppapi/proxy/ppb_file_chooser_proxy.cc
+++ b/ppapi/proxy/ppb_file_chooser_proxy.cc
@@ -9,23 +9,39 @@
#include "ppapi/c/dev/ppb_file_chooser_dev.h"
#include "ppapi/c/pp_errors.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/plugin_resource.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/ppb_file_ref_proxy.h"
#include "ppapi/proxy/serialized_var.h"
+#include "ppapi/thunk/thunk.h"
+
+using ::ppapi::thunk::PPB_FileChooser_API;
namespace pp {
namespace proxy {
-class FileChooser : public PluginResource {
+class FileChooser : public PluginResource,
+ public PPB_FileChooser_API {
public:
FileChooser(const HostResource& resource);
virtual ~FileChooser();
- virtual FileChooser* AsFileChooser();
+ // ResourceObjectBase overrides.
+ virtual PPB_FileChooser_API* AsPPB_FileChooser_API() OVERRIDE;
+
+ // PPB_FileChooser_API implementation.
+ virtual int32_t Show(PP_CompletionCallback callback) OVERRIDE;
+ virtual PP_Resource GetNextChosenFile() OVERRIDE;
+
+ // Handles the choose complete notification from the host.
+ void ChooseComplete(
+ int32_t result_code,
+ const std::vector<PPBFileRef_CreateInfo>& chosen_files);
+ private:
PP_CompletionCallback current_show_callback_;
// All files returned by the current show callback that haven't yet been
@@ -34,7 +50,6 @@ class FileChooser : public PluginResource {
// has transferred to the plugin.
std::queue<PP_Resource> file_queue_;
- private:
DISALLOW_COPY_AND_ASSIGN(FileChooser);
};
@@ -62,73 +77,47 @@ FileChooser::~FileChooser() {
}
}
-FileChooser* FileChooser::AsFileChooser() {
+PPB_FileChooser_API* FileChooser::AsPPB_FileChooser_API() {
return this;
}
-namespace {
-
-PP_Resource Create(PP_Instance instance,
- const PP_FileChooserOptions_Dev* options) {
- Dispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
- if (!dispatcher)
- return 0;
-
- HostResource result;
- dispatcher->Send(new PpapiHostMsg_PPBFileChooser_Create(
- INTERFACE_ID_PPB_FILE_CHOOSER, instance,
- options->mode,
- options->accept_mime_types ? options->accept_mime_types : std::string(),
- &result));
-
- if (result.is_null())
- return 0;
- linked_ptr<FileChooser> object(new FileChooser(result));
- return PluginResourceTracker::GetInstance()->AddResource(object);
-}
-
-PP_Bool IsFileChooser(PP_Resource resource) {
- FileChooser* object = PluginResource::GetAs<FileChooser>(resource);
- return BoolToPPBool(!!object);
-}
-
-int32_t Show(PP_Resource chooser, struct PP_CompletionCallback callback) {
- FileChooser* object = PluginResource::GetAs<FileChooser>(chooser);
- if (!object)
- return PP_ERROR_BADRESOURCE;
- Dispatcher* dispatcher = PluginDispatcher::GetForInstance(object->instance());
- if (!dispatcher)
- return PP_ERROR_BADARGUMENT;
-
- if (object->current_show_callback_.func)
+int32_t FileChooser::Show(PP_CompletionCallback callback) {
+ if (current_show_callback_.func)
return PP_ERROR_INPROGRESS; // Can't show more than once.
- object->current_show_callback_ = callback;
- dispatcher->Send(new PpapiHostMsg_PPBFileChooser_Show(
- INTERFACE_ID_PPB_FILE_CHOOSER,
- object->host_resource()));
+ current_show_callback_ = callback;
+ GetDispatcher()->Send(new PpapiHostMsg_PPBFileChooser_Show(
+ INTERFACE_ID_PPB_FILE_CHOOSER, host_resource()));
return PP_OK_COMPLETIONPENDING;
}
-PP_Resource GetNextChosenFile(PP_Resource chooser) {
- FileChooser* object = PluginResource::GetAs<FileChooser>(chooser);
- if (!object || object->file_queue_.empty())
+PP_Resource FileChooser::GetNextChosenFile() {
+ if (file_queue_.empty())
return 0;
// Return the next resource in the queue. These resource have already been
// addrefed (they're currently owned by the FileChooser) and returning them
// transfers ownership of that reference to the plugin.
- PP_Resource next = object->file_queue_.front();
- object->file_queue_.pop();
+ PP_Resource next = file_queue_.front();
+ file_queue_.pop();
return next;
}
-const PPB_FileChooser_Dev file_chooser_interface = {
- &Create,
- &IsFileChooser,
- &Show,
- &GetNextChosenFile
-};
+void FileChooser::ChooseComplete(
+ int32_t result_code,
+ const std::vector<PPBFileRef_CreateInfo>& chosen_files) {
+ // 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(chosen_files[i]));
+
+ // Notify the plugin of the new data.
+ PP_RunAndClearCompletionCallback(&current_show_callback_, result_code);
+ // DANGER: May delete |this|!
+}
+
+namespace {
InterfaceProxy* CreateFileChooserProxy(Dispatcher* dispatcher,
const void* target_interface) {
@@ -148,7 +137,7 @@ PPB_FileChooser_Proxy::~PPB_FileChooser_Proxy() {
const InterfaceProxy::Info* PPB_FileChooser_Proxy::GetInfo() {
static const Info info = {
- &file_chooser_interface,
+ ::ppapi::thunk::GetPPB_FileChooser_Thunk(),
PPB_FILECHOOSER_DEV_INTERFACE,
INTERFACE_ID_PPB_FILE_CHOOSER,
false,
@@ -157,6 +146,27 @@ const InterfaceProxy::Info* PPB_FileChooser_Proxy::GetInfo() {
return &info;
}
+// static
+PP_Resource PPB_FileChooser_Proxy::CreateProxyResource(
+ PP_Instance instance,
+ const PP_FileChooserOptions_Dev* options) {
+ Dispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
+ if (!dispatcher)
+ return 0;
+
+ HostResource result;
+ dispatcher->Send(new PpapiHostMsg_PPBFileChooser_Create(
+ INTERFACE_ID_PPB_FILE_CHOOSER, instance,
+ options->mode,
+ options->accept_mime_types ? options->accept_mime_types : std::string(),
+ &result));
+
+ if (result.is_null())
+ return 0;
+ linked_ptr<FileChooser> object(new FileChooser(result));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
+}
+
bool PPB_FileChooser_Proxy::OnMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PPB_FileChooser_Proxy, msg)
@@ -197,30 +207,11 @@ void PPB_FileChooser_Proxy::OnMsgChooseComplete(
const HostResource& chooser,
int32_t result_code,
const std::vector<PPBFileRef_CreateInfo>& chosen_files) {
- PP_Resource plugin_resource =
- PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
- chooser);
- if (!plugin_resource)
- return;
- FileChooser* object = PluginResource::GetAs<FileChooser>(plugin_resource);
- if (!object)
- return;
-
- // 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(object->file_queue_.empty());
- for (size_t i = 0; i < chosen_files.size(); i++) {
- object->file_queue_.push(
- PPB_FileRef_Proxy::DeserializeFileRef(chosen_files[i]));
+ EnterPluginFromHostResource<PPB_FileChooser_API> enter(chooser);
+ if (enter.succeeded()) {
+ static_cast<FileChooser*>(enter.object())->ChooseComplete(
+ result_code, chosen_files);
}
-
- // Notify the plugin of the new data. We have to swap out the callback
- // because the plugin may trigger deleting the object from the callback, and
- // the FileChooser object will attempt to call the callback in its destructor
- // with the ABORTED status.
- PP_RunAndClearCompletionCallback(&object->current_show_callback_,
- result_code);
- // DANGER: May delete |object|!
}
void PPB_FileChooser_Proxy::OnShowCallback(int32_t result,
diff --git a/ppapi/proxy/ppb_file_chooser_proxy.h b/ppapi/proxy/ppb_file_chooser_proxy.h
index 97b3aa2..4b83e950 100644
--- a/ppapi/proxy/ppb_file_chooser_proxy.h
+++ b/ppapi/proxy/ppb_file_chooser_proxy.h
@@ -13,6 +13,7 @@
#include "ppapi/cpp/completion_callback.h"
#include "ppapi/proxy/interface_proxy.h"
#include "ppapi/proxy/proxy_non_thread_safe_ref_count.h"
+#include "ppapi/thunk/ppb_file_chooser_api.h"
struct PPB_FileChooser_Dev;
@@ -29,6 +30,10 @@ class PPB_FileChooser_Proxy : public InterfaceProxy {
static const Info* GetInfo();
+ static PP_Resource CreateProxyResource(
+ PP_Instance instance,
+ const PP_FileChooserOptions_Dev* options);
+
const PPB_FileChooser_Dev* ppb_file_chooser_target() const {
return static_cast<const PPB_FileChooser_Dev*>(target_interface());
}
diff --git a/ppapi/proxy/ppb_file_ref_proxy.cc b/ppapi/proxy/ppb_file_ref_proxy.cc
index 3348818..149e23b 100644
--- a/ppapi/proxy/ppb_file_ref_proxy.cc
+++ b/ppapi/proxy/ppb_file_ref_proxy.cc
@@ -7,28 +7,54 @@
#include "ppapi/c/dev/ppb_file_ref_dev.h"
#include "ppapi/c/pp_errors.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/plugin_resource.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/serialized_var.h"
+#include "ppapi/thunk/ppb_file_ref_api.h"
+#include "ppapi/thunk/resource_creation_api.h"
+#include "ppapi/thunk/thunk.h"
+
+using ppapi::thunk::EnterFunctionNoLock;
+using ppapi::thunk::EnterResourceNoLock;
+using ppapi::thunk::PPB_FileRef_API;
+using ppapi::thunk::ResourceCreationAPI;
namespace pp {
namespace proxy {
-// This object maintains most of the state of the ref in the plugin for fast
-// querying. It's all set in the constructor from the "create info" sent from
-// the host.
-class FileRef : public PluginResource {
+namespace {
+
+InterfaceProxy* CreateFileRefProxy(Dispatcher* dispatcher,
+ const void* target_interface) {
+ return new PPB_FileRef_Proxy(dispatcher, target_interface);
+}
+
+} // namespace
+
+class FileRef : public PluginResource, public PPB_FileRef_API {
public:
- FileRef(const PPBFileRef_CreateInfo& info);
+ explicit FileRef(const PPBFileRef_CreateInfo& info);
virtual ~FileRef();
- virtual FileRef* AsFileRef();
-
- PP_FileSystemType_Dev file_system_type() const { return file_system_type_; }
- const PP_Var& path() const { return path_; }
- const PP_Var& name() const { return name_; }
+ // ResourceObjectBase overrides.
+ virtual PPB_FileRef_API* AsPPB_FileRef_API() OVERRIDE;
+
+ // PPB_FileRef_API implementation.
+ virtual PP_FileSystemType_Dev GetFileSystemType() const OVERRIDE;
+ virtual PP_Var GetName() const OVERRIDE;
+ virtual PP_Var GetPath() const OVERRIDE;
+ virtual PP_Resource GetParent() OVERRIDE;
+ virtual int32_t MakeDirectory(PP_Bool make_ancestors,
+ PP_CompletionCallback callback) OVERRIDE;
+ virtual int32_t Touch(PP_Time last_access_time,
+ PP_Time last_modified_time,
+ PP_CompletionCallback callback) OVERRIDE;
+ virtual int32_t Delete(PP_CompletionCallback callback) OVERRIDE;
+ virtual int32_t Rename(PP_Resource new_file_ref,
+ PP_CompletionCallback callback) OVERRIDE;
private:
PP_FileSystemType_Dev file_system_type_;
@@ -53,168 +79,71 @@ FileRef::~FileRef() {
PluginVarTracker::GetInstance()->Release(name_);
}
-FileRef* FileRef::AsFileRef() {
+PPB_FileRef_API* FileRef::AsPPB_FileRef_API() {
return this;
}
-namespace {
-
-bool FileRefAndDispatcherForResource(PP_Resource resource,
- FileRef** file_ref,
- Dispatcher** dispatcher) {
- *file_ref = PluginResource::GetAs<FileRef>(resource);
- if (!file_ref)
- return false;
- *dispatcher = PluginDispatcher::GetForInstance((*file_ref)->instance());
- return !!(*dispatcher);
-}
-
-PP_Resource Create(PP_Resource file_system, const char* path) {
- PluginResource* file_system_object =
- PluginResourceTracker::GetInstance()->GetResourceObject(file_system);
- if (!file_system_object)
- return 0;
-
- Dispatcher* dispatcher =
- PluginDispatcher::GetForInstance(file_system_object->instance());
- if (!dispatcher)
- return 0;
-
- PPBFileRef_CreateInfo create_info;
- dispatcher->Send(new PpapiHostMsg_PPBFileRef_Create(
- INTERFACE_ID_PPB_FILE_REF, file_system_object->host_resource(),
- path, &create_info));
- return PPB_FileRef_Proxy::DeserializeFileRef(create_info);
-}
-
-PP_Bool IsFileRef(PP_Resource resource) {
- FileRef* object = PluginResource::GetAs<FileRef>(resource);
- return BoolToPPBool(!!object);
+PP_FileSystemType_Dev FileRef::GetFileSystemType() const {
+ return file_system_type_;
}
-PP_FileSystemType_Dev GetFileSystemType(PP_Resource file_ref) {
- FileRef* object = PluginResource::GetAs<FileRef>(file_ref);
- if (!object)
- return PP_FILESYSTEMTYPE_EXTERNAL;
- return object->file_system_type();
+PP_Var FileRef::GetName() const {
+ PluginVarTracker::GetInstance()->AddRef(name_);
+ return name_;
}
-PP_Var GetName(PP_Resource file_ref) {
- FileRef* object = PluginResource::GetAs<FileRef>(file_ref);
- if (!object)
- return PP_MakeUndefined();
-
- PluginVarTracker::GetInstance()->AddRef(object->name());
- return object->name();
+PP_Var FileRef::GetPath() const {
+ PluginVarTracker::GetInstance()->AddRef(path_);
+ return path_;
}
-PP_Var GetPath(PP_Resource file_ref) {
- FileRef* object = PluginResource::GetAs<FileRef>(file_ref);
- if (!object)
- return PP_MakeUndefined();
-
- PluginVarTracker::GetInstance()->AddRef(object->path());
- return object->path();
-}
-
-PP_Resource GetParent(PP_Resource file_ref) {
- FileRef* object;
- Dispatcher* dispatcher;
- if (!FileRefAndDispatcherForResource(file_ref, &object, &dispatcher))
- return 0;
-
+PP_Resource FileRef::GetParent() {
PPBFileRef_CreateInfo create_info;
- dispatcher->Send(new PpapiHostMsg_PPBFileRef_GetParent(
- INTERFACE_ID_PPB_FILE_REF, object->host_resource(), &create_info));
+ GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_GetParent(
+ INTERFACE_ID_PPB_FILE_REF, host_resource(), &create_info));
return PPB_FileRef_Proxy::DeserializeFileRef(create_info);
}
-int32_t MakeDirectory(PP_Resource directory_ref,
- PP_Bool make_ancestors,
- struct PP_CompletionCallback callback) {
- FileRef* object;
- Dispatcher* dispatcher;
- if (!FileRefAndDispatcherForResource(directory_ref, &object, &dispatcher))
- return PP_ERROR_BADRESOURCE;
-
- dispatcher->Send(new PpapiHostMsg_PPBFileRef_MakeDirectory(
- INTERFACE_ID_PPB_FILE_REF, object->host_resource(), make_ancestors,
- dispatcher->callback_tracker().SendCallback(callback)));
+int32_t FileRef::MakeDirectory(PP_Bool make_ancestors,
+ PP_CompletionCallback callback) {
+ GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_MakeDirectory(
+ INTERFACE_ID_PPB_FILE_REF, host_resource(), make_ancestors,
+ GetDispatcher()->callback_tracker().SendCallback(callback)));
return PP_OK_COMPLETIONPENDING;
}
-int32_t Touch(PP_Resource file_ref,
- PP_Time last_access_time,
- PP_Time last_modified_time,
- struct PP_CompletionCallback callback) {
- FileRef* object;
- Dispatcher* dispatcher;
- if (!FileRefAndDispatcherForResource(file_ref, &object, &dispatcher))
- return PP_ERROR_BADRESOURCE;
-
- dispatcher->Send(new PpapiHostMsg_PPBFileRef_Touch(
- INTERFACE_ID_PPB_FILE_REF, object->host_resource(),
+int32_t FileRef::Touch(PP_Time last_access_time,
+ PP_Time last_modified_time,
+ PP_CompletionCallback callback) {
+ GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Touch(
+ INTERFACE_ID_PPB_FILE_REF, host_resource(),
last_access_time, last_modified_time,
- dispatcher->callback_tracker().SendCallback(callback)));
+ GetDispatcher()->callback_tracker().SendCallback(callback)));
return PP_OK_COMPLETIONPENDING;
}
-int32_t Delete(PP_Resource file_ref,
- struct PP_CompletionCallback callback) {
- FileRef* object;
- Dispatcher* dispatcher;
- if (!FileRefAndDispatcherForResource(file_ref, &object, &dispatcher))
- return PP_ERROR_BADRESOURCE;
-
- dispatcher->Send(new PpapiHostMsg_PPBFileRef_Delete(
- INTERFACE_ID_PPB_FILE_REF, object->host_resource(),
- dispatcher->callback_tracker().SendCallback(callback)));
+int32_t FileRef::Delete(PP_CompletionCallback callback) {
+ GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Delete(
+ INTERFACE_ID_PPB_FILE_REF, host_resource(),
+ GetDispatcher()->callback_tracker().SendCallback(callback)));
return PP_OK_COMPLETIONPENDING;
}
-int32_t Rename(PP_Resource file_ref,
- PP_Resource new_file_ref,
- struct PP_CompletionCallback callback) {
- FileRef* obj1;
- Dispatcher* dispatcher1;
- if (!FileRefAndDispatcherForResource(file_ref, &obj1, &dispatcher1))
- return PP_ERROR_BADRESOURCE;
-
- FileRef* obj2;
- Dispatcher* dispatcher2;
- if (!FileRefAndDispatcherForResource(new_file_ref, &obj2, &dispatcher2))
- return PP_ERROR_BADRESOURCE;
-
- if (obj1->instance() != obj2->instance())
+int32_t FileRef::Rename(PP_Resource new_file_ref,
+ PP_CompletionCallback callback) {
+ PluginResource* new_file_ref_object =
+ PluginResourceTracker::GetInstance()->GetResourceObject(new_file_ref);
+ if (!new_file_ref_object ||
+ new_file_ref_object->host_resource().instance() != instance())
return PP_ERROR_BADRESOURCE;
- dispatcher1->Send(new PpapiHostMsg_PPBFileRef_Rename(
- INTERFACE_ID_PPB_FILE_REF, obj1->host_resource(),
- obj2->host_resource(),
- dispatcher1->callback_tracker().SendCallback(callback)));
+ GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Rename(
+ INTERFACE_ID_PPB_FILE_REF, host_resource(),
+ new_file_ref_object->host_resource(),
+ GetDispatcher()->callback_tracker().SendCallback(callback)));
return PP_OK_COMPLETIONPENDING;
}
-const PPB_FileRef_Dev file_ref_interface = {
- &Create,
- &IsFileRef,
- &GetFileSystemType,
- &GetName,
- &GetPath,
- &GetParent,
- &MakeDirectory,
- &Touch,
- &Delete,
- &Rename
-};
-
-InterfaceProxy* CreateFileRefProxy(Dispatcher* dispatcher,
- const void* target_interface) {
- return new PPB_FileRef_Proxy(dispatcher, target_interface);
-}
-
-} // namespace
-
PPB_FileRef_Proxy::PPB_FileRef_Proxy(Dispatcher* dispatcher,
const void* target_interface)
: InterfaceProxy(dispatcher, target_interface) {
@@ -225,7 +154,7 @@ PPB_FileRef_Proxy::~PPB_FileRef_Proxy() {
const InterfaceProxy::Info* PPB_FileRef_Proxy::GetInfo() {
static const Info info = {
- &file_ref_interface,
+ ::ppapi::thunk::GetPPB_FileRef_Thunk(),
PPB_FILEREF_DEV_INTERFACE,
INTERFACE_ID_PPB_FILE_REF,
false,
@@ -234,6 +163,21 @@ const InterfaceProxy::Info* PPB_FileRef_Proxy::GetInfo() {
return &info;
}
+// static
+PP_Resource PPB_FileRef_Proxy::CreateProxyResource(PP_Resource file_system,
+ const char* path) {
+ PluginResource* file_system_object =
+ PluginResourceTracker::GetInstance()->GetResourceObject(file_system);
+ if (!file_system_object)
+ return 0;
+
+ PPBFileRef_CreateInfo create_info;
+ file_system_object->GetDispatcher()->Send(new PpapiHostMsg_PPBFileRef_Create(
+ INTERFACE_ID_PPB_FILE_REF, file_system_object->host_resource(),
+ 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)
@@ -251,6 +195,12 @@ bool PPB_FileRef_Proxy::OnMessageReceived(const IPC::Message& msg) {
void PPB_FileRef_Proxy::SerializeFileRef(PP_Resource file_ref,
PPBFileRef_CreateInfo* result) {
+ EnterResourceNoLock<PPB_FileRef_API> enter(file_ref, false);
+ if (enter.failed()) {
+ NOTREACHED();
+ return;
+ }
+
// We need the instance out of the resource for serializing back to the
// plugin. This code can only run in the host.
if (dispatcher()->IsPlugin()) {
@@ -263,13 +213,11 @@ void PPB_FileRef_Proxy::SerializeFileRef(PP_Resource file_ref,
result->resource.SetHostResource(instance, file_ref);
result->file_system_type =
- static_cast<int>(ppb_file_ref_target()->GetFileSystemType(file_ref));
- result->path = SerializedVarReturnValue::Convert(
- dispatcher(),
- ppb_file_ref_target()->GetPath(file_ref));
- result->name = SerializedVarReturnValue::Convert(
- dispatcher(),
- ppb_file_ref_target()->GetName(file_ref));
+ static_cast<int>(enter.object()->GetFileSystemType());
+ result->path = SerializedVarReturnValue::Convert(dispatcher(),
+ enter.object()->GetPath());
+ result->name = SerializedVarReturnValue::Convert(dispatcher(),
+ enter.object()->GetName());
}
// static
@@ -285,8 +233,10 @@ PP_Resource PPB_FileRef_Proxy::DeserializeFileRef(
void PPB_FileRef_Proxy::OnMsgCreate(const HostResource& file_system,
const std::string& path,
PPBFileRef_CreateInfo* result) {
-
- PP_Resource resource = ppb_file_ref_target()->Create(
+ EnterFunctionNoLock<ResourceCreationAPI> enter(file_system.instance(), true);
+ if (enter.failed())
+ return;
+ PP_Resource resource = enter.functions()->CreateFileRef(
file_system.host_resource(), path.c_str());
if (!resource)
return; // CreateInfo default constructor initializes to 0.
@@ -295,18 +245,19 @@ void PPB_FileRef_Proxy::OnMsgCreate(const HostResource& file_system,
void PPB_FileRef_Proxy::OnMsgGetParent(const HostResource& host_resource,
PPBFileRef_CreateInfo* result) {
- PP_Resource resource = ppb_file_ref_target()->GetParent(
- host_resource.host_resource());
- SerializeFileRef(resource, 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 serialized_callback) {
+ EnterHostFromHostResource<PPB_FileRef_API> enter(host_resource);
+ if (enter.failed())
+ return;
PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
- int32_t result =
- ppb_file_ref_target()->MakeDirectory(host_resource.host_resource(),
- make_ancestors, callback);
+ int32_t result = enter.object()->MakeDirectory(make_ancestors, callback);
if (result != PP_OK_COMPLETIONPENDING)
PP_RunCompletionCallback(&callback, result);
}
@@ -315,19 +266,22 @@ void PPB_FileRef_Proxy::OnMsgTouch(const HostResource& host_resource,
PP_Time last_access,
PP_Time last_modified,
uint32_t serialized_callback) {
+ EnterHostFromHostResource<PPB_FileRef_API> enter(host_resource);
+ if (enter.failed())
+ return;
PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
- int32_t result =
- ppb_file_ref_target()->Touch(host_resource.host_resource(),
- last_access, last_modified, callback);
+ int32_t result = enter.object()->Touch(last_access, last_modified, callback);
if (result != PP_OK_COMPLETIONPENDING)
PP_RunCompletionCallback(&callback, result);
}
void PPB_FileRef_Proxy::OnMsgDelete(const HostResource& host_resource,
uint32_t serialized_callback) {
+ EnterHostFromHostResource<PPB_FileRef_API> enter(host_resource);
+ if (enter.failed())
+ return;
PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
- int32_t result =
- ppb_file_ref_target()->Delete(host_resource.host_resource(), callback);
+ int32_t result = enter.object()->Delete(callback);
if (result != PP_OK_COMPLETIONPENDING)
PP_RunCompletionCallback(&callback, result);
}
@@ -335,11 +289,12 @@ void PPB_FileRef_Proxy::OnMsgDelete(const HostResource& host_resource,
void PPB_FileRef_Proxy::OnMsgRename(const HostResource& file_ref,
const HostResource& new_file_ref,
uint32_t serialized_callback) {
+ EnterHostFromHostResource<PPB_FileRef_API> enter(file_ref);
+ if (enter.failed())
+ return;
PP_CompletionCallback callback = ReceiveCallback(serialized_callback);
- int32_t result =
- ppb_file_ref_target()->Rename(file_ref.host_resource(),
- new_file_ref.host_resource(),
- callback);
+ int32_t result = enter.object()->Rename(new_file_ref.host_resource(),
+ callback);
if (result != PP_OK_COMPLETIONPENDING)
PP_RunCompletionCallback(&callback, result);
}
diff --git a/ppapi/proxy/ppb_file_ref_proxy.h b/ppapi/proxy/ppb_file_ref_proxy.h
index ca0b588..076bea2 100644
--- a/ppapi/proxy/ppb_file_ref_proxy.h
+++ b/ppapi/proxy/ppb_file_ref_proxy.h
@@ -28,9 +28,8 @@ class PPB_FileRef_Proxy : public InterfaceProxy {
static const Info* GetInfo();
- const PPB_FileRef_Dev* ppb_file_ref_target() const {
- return static_cast<const PPB_FileRef_Dev*>(target_interface());
- }
+ static PP_Resource CreateProxyResource(PP_Resource file_system,
+ const char* path);
// InterfaceProxy implementation.
virtual bool OnMessageReceived(const IPC::Message& msg);
diff --git a/ppapi/proxy/ppb_file_system_proxy.cc b/ppapi/proxy/ppb_file_system_proxy.cc
index f75ebc7..c6b7caa 100644
--- a/ppapi/proxy/ppb_file_system_proxy.cc
+++ b/ppapi/proxy/ppb_file_system_proxy.cc
@@ -8,30 +8,57 @@
#include "base/task.h"
#include "ppapi/c/dev/ppb_file_system_dev.h"
#include "ppapi/c/pp_errors.h"
+#include "ppapi/proxy/enter_proxy.h"
#include "ppapi/proxy/host_dispatcher.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/serialized_var.h"
+#include "ppapi/thunk/enter.h"
+#include "ppapi/thunk/ppb_file_system_api.h"
+#include "ppapi/thunk/resource_creation_api.h"
+#include "ppapi/thunk/thunk.h"
+
+using ppapi::thunk::EnterFunctionNoLock;
+using ppapi::thunk::PPB_FileSystem_API;
+using ppapi::thunk::ResourceCreationAPI;
namespace pp {
namespace proxy {
+namespace {
+
+InterfaceProxy* CreateFileSystemProxy(Dispatcher* dispatcher,
+ const void* target_interface) {
+ return new PPB_FileSystem_Proxy(dispatcher, target_interface);
+}
+
+} // namespace
+
// This object maintains most of the state of the ref in the plugin for fast
// querying. It's all set in the constructor from the "create info" sent from
// the host.
-class FileSystem : public PluginResource {
+class FileSystem : public PluginResource, public PPB_FileSystem_API {
public:
FileSystem(const HostResource& host_resource, PP_FileSystemType_Dev type);
virtual ~FileSystem();
- virtual FileSystem* AsFileSystem();
+ // ResourceObjectBase override.
+ virtual PPB_FileSystem_API* AsPPB_FileSystem_API() OVERRIDE;
+
+ // PPB_FileSystem_APi implementation.
+ virtual int32_t Open(int64_t expected_size,
+ PP_CompletionCallback callback) OVERRIDE;
+ virtual PP_FileSystemType_Dev GetType() OVERRIDE;
+
+ // Called when the host has responded to our open request.
+ void OpenComplete(int32_t result);
+ private:
PP_FileSystemType_Dev type_;
bool called_open_;
PP_CompletionCallback current_open_callback_;
- private:
DISALLOW_COPY_AND_ASSIGN(FileSystem);
};
@@ -57,77 +84,32 @@ FileSystem::~FileSystem() {
}
}
-FileSystem* FileSystem::AsFileSystem() {
+PPB_FileSystem_API* FileSystem::AsPPB_FileSystem_API() {
return this;
}
-namespace {
-
-PP_Resource Create(PP_Instance instance, PP_FileSystemType_Dev type) {
- PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
- if (!dispatcher)
- return PP_ERROR_BADARGUMENT;
-
- HostResource result;
- dispatcher->Send(new PpapiHostMsg_PPBFileSystem_Create(
- INTERFACE_ID_PPB_FILE_SYSTEM, instance, type, &result));
- if (result.is_null())
- return 0;
-
- linked_ptr<FileSystem> object(new FileSystem(result, type));
- return PluginResourceTracker::GetInstance()->AddResource(object);
-}
-
-PP_Bool IsFileSystem(PP_Resource resource) {
- FileSystem* object = PluginResource::GetAs<FileSystem>(resource);
- return BoolToPPBool(!!object);
-}
-
-int32_t Open(PP_Resource file_system,
- int64_t expected_size,
- struct PP_CompletionCallback callback) {
- FileSystem* object = PluginResource::GetAs<FileSystem>(file_system);
- if (!object)
- return PP_ERROR_BADRESOURCE;
-
- Dispatcher* dispatcher = PluginDispatcher::GetForInstance(object->instance());
- if (!dispatcher)
- return PP_ERROR_BADARGUMENT;
-
- if (object->current_open_callback_.func)
+int32_t FileSystem::Open(int64_t expected_size,
+ PP_CompletionCallback callback) {
+ if (current_open_callback_.func)
return PP_ERROR_INPROGRESS;
- else if (object->called_open_)
+ if (called_open_)
return PP_ERROR_FAILED;
- object->current_open_callback_ = callback;
- object->called_open_ = true;
-
- dispatcher->Send(new PpapiHostMsg_PPBFileSystem_Open(
- INTERFACE_ID_PPB_FILE_SYSTEM, object->host_resource(), expected_size));
+ current_open_callback_ = callback;
+ called_open_ = true;
+ GetDispatcher()->Send(new PpapiHostMsg_PPBFileSystem_Open(
+ INTERFACE_ID_PPB_FILE_SYSTEM, host_resource(), expected_size));
return PP_OK_COMPLETIONPENDING;
}
-PP_FileSystemType_Dev GetType(PP_Resource resource) {
- FileSystem* object = PluginResource::GetAs<FileSystem>(resource);
- if (!object)
- return PP_FILESYSTEMTYPE_INVALID;
- return object->type_;
+PP_FileSystemType_Dev FileSystem::GetType() {
+ return type_;
}
-const PPB_FileSystem_Dev file_system_interface = {
- &Create,
- &IsFileSystem,
- &Open,
- &GetType
-};
-
-InterfaceProxy* CreateFileSystemProxy(Dispatcher* dispatcher,
- const void* target_interface) {
- return new PPB_FileSystem_Proxy(dispatcher, target_interface);
+void FileSystem::OpenComplete(int32_t result) {
+ PP_RunAndClearCompletionCallback(&current_open_callback_, result);
}
-} // namespace
-
PPB_FileSystem_Proxy::PPB_FileSystem_Proxy(Dispatcher* dispatcher,
const void* target_interface)
: InterfaceProxy(dispatcher, target_interface),
@@ -139,7 +121,7 @@ PPB_FileSystem_Proxy::~PPB_FileSystem_Proxy() {
const InterfaceProxy::Info* PPB_FileSystem_Proxy::GetInfo() {
static const Info info = {
- &file_system_interface,
+ ::ppapi::thunk::GetPPB_FileSystem_Thunk(),
PPB_FILESYSTEM_DEV_INTERFACE,
INTERFACE_ID_PPB_FILE_SYSTEM,
false,
@@ -148,6 +130,24 @@ const InterfaceProxy::Info* PPB_FileSystem_Proxy::GetInfo() {
return &info;
}
+// static
+PP_Resource PPB_FileSystem_Proxy::CreateProxyResource(
+ PP_Instance instance,
+ PP_FileSystemType_Dev type) {
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
+ if (!dispatcher)
+ return PP_ERROR_BADARGUMENT;
+
+ HostResource result;
+ dispatcher->Send(new PpapiHostMsg_PPBFileSystem_Create(
+ INTERFACE_ID_PPB_FILE_SYSTEM, instance, type, &result));
+ if (result.is_null())
+ return 0;
+
+ linked_ptr<FileSystem> object(new FileSystem(result, type));
+ return PluginResourceTracker::GetInstance()->AddResource(object);
+}
+
bool PPB_FileSystem_Proxy::OnMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PPB_FileSystem_Proxy, msg)
@@ -162,7 +162,10 @@ bool PPB_FileSystem_Proxy::OnMessageReceived(const IPC::Message& msg) {
void PPB_FileSystem_Proxy::OnMsgCreate(PP_Instance instance,
int type,
HostResource* result) {
- PP_Resource resource = ppb_file_system_target()->Create(
+ EnterFunctionNoLock<ResourceCreationAPI> enter(instance, true);
+ if (enter.failed())
+ return;
+ PP_Resource resource = enter.functions()->CreateFileSystem(
instance, static_cast<PP_FileSystemType_Dev>(type));
if (!resource)
return; // CreateInfo default constructor initializes to 0.
@@ -171,25 +174,24 @@ void PPB_FileSystem_Proxy::OnMsgCreate(PP_Instance instance,
void PPB_FileSystem_Proxy::OnMsgOpen(const HostResource& host_resource,
int64_t expected_size) {
+ EnterHostFromHostResource<PPB_FileSystem_API> enter(host_resource);
+ if (enter.failed())
+ return;
+
CompletionCallback callback = callback_factory_.NewCallback(
&PPB_FileSystem_Proxy::OpenCompleteInHost, host_resource);
-
- int32_t result = ppb_file_system_target()->Open(
- host_resource.host_resource(), expected_size,
- callback.pp_completion_callback());
+ int32_t result = enter.object()->Open(expected_size,
+ callback.pp_completion_callback());
if (result != PP_OK_COMPLETIONPENDING)
callback.Run(result);
}
// Called in the plugin to handle the open callback.
-void PPB_FileSystem_Proxy::OnMsgOpenComplete(const HostResource& filesystem,
+void PPB_FileSystem_Proxy::OnMsgOpenComplete(const HostResource& host_resource,
int32_t result) {
- FileSystem* object = PluginResource::GetAs<FileSystem>(
- PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
- filesystem));
- if (!object || !object->current_open_callback_.func)
- return;
- PP_RunAndClearCompletionCallback(&object->current_open_callback_, result);
+ EnterPluginFromHostResource<PPB_FileSystem_API> enter(host_resource);
+ if (enter.succeeded())
+ static_cast<FileSystem*>(enter.object())->OpenComplete(result);
}
void PPB_FileSystem_Proxy::OpenCompleteInHost(
diff --git a/ppapi/proxy/ppb_file_system_proxy.h b/ppapi/proxy/ppb_file_system_proxy.h
index acfe171..e00a11d 100644
--- a/ppapi/proxy/ppb_file_system_proxy.h
+++ b/ppapi/proxy/ppb_file_system_proxy.h
@@ -8,6 +8,7 @@
#include <string>
#include "base/basictypes.h"
+#include "ppapi/c/dev/ppb_file_system_dev.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_time.h"
@@ -29,9 +30,8 @@ class PPB_FileSystem_Proxy : public InterfaceProxy {
static const Info* GetInfo();
- const PPB_FileSystem_Dev* ppb_file_system_target() const {
- return static_cast<const PPB_FileSystem_Dev*>(target_interface());
- }
+ static PP_Resource CreateProxyResource(PP_Instance instance,
+ PP_FileSystemType_Dev type);
// InterfaceProxy implementation.
virtual bool OnMessageReceived(const IPC::Message& msg);
diff --git a/ppapi/proxy/ppb_font_proxy.cc b/ppapi/proxy/ppb_font_proxy.cc
index eab4494..c8f621a 100644
--- a/ppapi/proxy/ppb_font_proxy.cc
+++ b/ppapi/proxy/ppb_font_proxy.cc
@@ -64,7 +64,7 @@ const InterfaceProxy::Info* PPB_Font_Proxy::GetInfo() {
return &info;
}
-::ppapi::thunk::PPB_Font_FunctionAPI* PPB_Font_Proxy::AsFont_FunctionAPI() {
+::ppapi::thunk::PPB_Font_FunctionAPI* PPB_Font_Proxy::AsPPB_Font_FunctionAPI() {
return this;
}
@@ -114,7 +114,7 @@ Font::Font(const HostResource& resource,
Font::~Font() {
}
-ppapi::thunk::PPB_Font_API* Font::AsFont_API() {
+ppapi::thunk::PPB_Font_API* Font::AsPPB_Font_API() {
return this;
}
diff --git a/ppapi/proxy/ppb_font_proxy.h b/ppapi/proxy/ppb_font_proxy.h
index bb351ea..32893ea 100644
--- a/ppapi/proxy/ppb_font_proxy.h
+++ b/ppapi/proxy/ppb_font_proxy.h
@@ -30,7 +30,7 @@ class PPB_Font_Proxy : public ppapi::FunctionGroupBase,
static const Info* GetInfo();
// FunctionGroupBase overrides.
- virtual ppapi::thunk::PPB_Font_FunctionAPI* AsFont_FunctionAPI() OVERRIDE;
+ virtual ppapi::thunk::PPB_Font_FunctionAPI* AsPPB_Font_FunctionAPI() OVERRIDE;
// PPB_Font_FunctionAPI implementation.
virtual PP_Var GetFontFamilies(PP_Instance instance) OVERRIDE;
@@ -54,7 +54,7 @@ class Font : public PluginResource,
virtual ~Font();
// ResourceObjectBase.
- virtual ppapi::thunk::PPB_Font_API* AsFont_API() OVERRIDE;
+ virtual ppapi::thunk::PPB_Font_API* AsPPB_Font_API() OVERRIDE;
// PluginResource overrides.
virtual Font* AsFont() OVERRIDE;
diff --git a/ppapi/proxy/ppb_graphics_2d_proxy.cc b/ppapi/proxy/ppb_graphics_2d_proxy.cc
index 38777b7..8027956 100644
--- a/ppapi/proxy/ppb_graphics_2d_proxy.cc
+++ b/ppapi/proxy/ppb_graphics_2d_proxy.cc
@@ -12,14 +12,15 @@
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/ppb_graphics_2d.h"
+#include "ppapi/proxy/enter_proxy.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/thunk/enter.h"
+#include "ppapi/thunk/ppb_graphics_2d_api.h"
#include "ppapi/thunk/thunk.h"
using ::ppapi::thunk::PPB_Graphics2D_API;
-using ::ppapi::thunk::EnterResource;
namespace pp {
namespace proxy {
@@ -33,7 +34,54 @@ InterfaceProxy* CreateGraphics2DProxy(Dispatcher* dispatcher,
} // namespace
-PPB_Graphics2D_API* Graphics2D::AsGraphics2D_API() {
+class Graphics2D : public PluginResource,
+ public ::ppapi::thunk::PPB_Graphics2D_API {
+ public:
+ Graphics2D(const HostResource& host_resource,
+ const PP_Size& size,
+ PP_Bool is_always_opaque);
+ virtual ~Graphics2D();
+
+ // ResourceObjectBase.
+ virtual PPB_Graphics2D_API* AsPPB_Graphics2D_API();
+
+ // PPB_Graphics_2D_API.
+ PP_Bool Describe(PP_Size* size, PP_Bool* is_always_opaque);
+ void PaintImageData(PP_Resource image_data,
+ const PP_Point* top_left,
+ const PP_Rect* src_rect);
+ void Scroll(const PP_Rect* clip_rect,
+ const PP_Point* amount);
+ void ReplaceContents(PP_Resource image_data);
+ int32_t Flush(PP_CompletionCallback callback);
+
+ // Notification that the host has sent an ACK for a pending Flush.
+ void FlushACK(int32_t result_code);
+
+ private:
+ PP_Size size_;
+ PP_Bool is_always_opaque_;
+
+ // In the plugin, this is the current callback set for Flushes. When the
+ // callback function pointer is non-NULL, we're waiting for a flush ACK.
+ PP_CompletionCallback current_flush_callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(Graphics2D);
+};
+
+Graphics2D::Graphics2D(const HostResource& host_resource,
+ const PP_Size& size,
+ PP_Bool is_always_opaque)
+ : PluginResource(host_resource),
+ size_(size),
+ is_always_opaque_(is_always_opaque),
+ current_flush_callback_(PP_BlockUntilComplete()) {
+}
+
+Graphics2D::~Graphics2D() {
+}
+
+PPB_Graphics2D_API* Graphics2D::AsPPB_Graphics2D_API() {
return this;
}
@@ -85,15 +133,19 @@ int32_t Graphics2D::Flush(PP_CompletionCallback callback) {
if (!callback.func)
return PP_ERROR_BADARGUMENT;
- if (is_flush_pending())
+ if (current_flush_callback_.func)
return PP_ERROR_INPROGRESS; // Can't have >1 flush pending.
- set_current_flush_callback(callback);
+ current_flush_callback_ = callback;
GetDispatcher()->Send(new PpapiHostMsg_PPBGraphics2D_Flush(
INTERFACE_ID_PPB_GRAPHICS_2D, host_resource()));
return PP_OK_COMPLETIONPENDING;
}
+void Graphics2D::FlushACK(int32_t result_code) {
+ PP_RunAndClearCompletionCallback(&current_flush_callback_, result_code);
+}
+
PPB_Graphics2D_Proxy::PPB_Graphics2D_Proxy(Dispatcher* dispatcher,
const void* target_interface)
: InterfaceProxy(dispatcher, target_interface),
@@ -115,6 +167,26 @@ const InterfaceProxy::Info* PPB_Graphics2D_Proxy::GetInfo() {
return &info;
}
+// static
+PP_Resource PPB_Graphics2D_Proxy::CreateProxyResource(
+ PP_Instance instance,
+ const PP_Size& size,
+ PP_Bool is_always_opaque) {
+ PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance);
+ if (!dispatcher)
+ return 0;
+
+ HostResource result;
+ dispatcher->Send(new PpapiHostMsg_ResourceCreation_Graphics2D(
+ INTERFACE_ID_RESOURCE_CREATION, instance, size, is_always_opaque,
+ &result));
+ if (result.is_null())
+ return 0;
+ linked_ptr<Graphics2D> graphics_2d(new Graphics2D(result, size,
+ is_always_opaque));
+ return PluginResourceTracker::GetInstance()->AddResource(graphics_2d);
+}
+
bool PPB_Graphics2D_Proxy::OnMessageReceived(const IPC::Message& msg) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PPB_Graphics2D_Proxy, msg)
@@ -141,7 +213,7 @@ void PPB_Graphics2D_Proxy::OnMsgPaintImageData(
const PP_Point& top_left,
bool src_rect_specified,
const PP_Rect& src_rect) {
- EnterResource<PPB_Graphics2D_API> enter(graphics_2d.host_resource(), false);
+ EnterHostFromHostResource<PPB_Graphics2D_API> enter(graphics_2d);
if (enter.failed())
return;
enter.object()->PaintImageData(image_data.host_resource(), &top_left,
@@ -152,7 +224,7 @@ void PPB_Graphics2D_Proxy::OnMsgScroll(const HostResource& graphics_2d,
bool clip_specified,
const PP_Rect& clip,
const PP_Point& amount) {
- EnterResource<PPB_Graphics2D_API> enter(graphics_2d.host_resource(), false);
+ EnterHostFromHostResource<PPB_Graphics2D_API> enter(graphics_2d);
if (enter.failed())
return;
enter.object()->Scroll(clip_specified ? &clip : NULL, &amount);
@@ -161,7 +233,7 @@ void PPB_Graphics2D_Proxy::OnMsgScroll(const HostResource& graphics_2d,
void PPB_Graphics2D_Proxy::OnMsgReplaceContents(
const HostResource& graphics_2d,
const HostResource& image_data) {
- EnterResource<PPB_Graphics2D_API> enter(graphics_2d.host_resource(), false);
+ EnterHostFromHostResource<PPB_Graphics2D_API> enter(graphics_2d);
if (enter.failed())
return;
enter.object()->ReplaceContents(image_data.host_resource());
@@ -182,24 +254,9 @@ void PPB_Graphics2D_Proxy::OnMsgFlush(const HostResource& graphics_2d) {
void PPB_Graphics2D_Proxy::OnMsgFlushACK(const HostResource& host_resource,
int32_t pp_error) {
- PP_Resource plugin_resource =
- PluginResourceTracker::GetInstance()->PluginResourceForHostResource(
- host_resource);
- if (!plugin_resource)
- return;
-
- Graphics2D* object = PluginResource::GetAs<Graphics2D>(plugin_resource);
- if (!object) {
- // The plugin has released the graphics 2D object so don't issue the
- // callback.
- return;
- }
-
- // Be careful to make the callback NULL again before issuing the callback
- // since the plugin might want to flush from within the callback.
- PP_CompletionCallback callback = object->current_flush_callback();
- object->set_current_flush_callback(PP_BlockUntilComplete());
- PP_RunCompletionCallback(&callback, pp_error);
+ EnterPluginFromHostResource<PPB_Graphics2D_API> enter(host_resource);
+ if (enter.succeeded())
+ static_cast<Graphics2D*>(enter.object())->FlushACK(pp_error);
}
void PPB_Graphics2D_Proxy::SendFlushACKToPlugin(
diff --git a/ppapi/proxy/ppb_graphics_2d_proxy.h b/ppapi/proxy/ppb_graphics_2d_proxy.h
index b799950..9be7f83 100644
--- a/ppapi/proxy/ppb_graphics_2d_proxy.h
+++ b/ppapi/proxy/ppb_graphics_2d_proxy.h
@@ -17,7 +17,6 @@
#include "ppapi/proxy/interface_proxy.h"
#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/proxy_non_thread_safe_ref_count.h"
-#include "ppapi/thunk/ppb_graphics_2d_api.h"
struct PPB_Graphics2D;
struct PP_Point;
@@ -33,6 +32,10 @@ class PPB_Graphics2D_Proxy : public InterfaceProxy {
static const Info* GetInfo();
+ static PP_Resource CreateProxyResource(PP_Instance instance,
+ const PP_Size& size,
+ PP_Bool is_always_opaque);
+
const PPB_Graphics2D* ppb_graphics_2d_target() const {
return static_cast<const PPB_Graphics2D*>(target_interface());
}
@@ -67,60 +70,6 @@ class PPB_Graphics2D_Proxy : public InterfaceProxy {
ProxyNonThreadSafeRefCount> callback_factory_;
};
-class Graphics2D : public PluginResource,
- public ::ppapi::thunk::PPB_Graphics2D_API {
- public:
- Graphics2D(const HostResource& host_resource,
- const PP_Size& size,
- PP_Bool is_always_opaque)
- : PluginResource(host_resource),
- size_(size),
- is_always_opaque_(is_always_opaque),
- current_flush_callback_(PP_BlockUntilComplete()) {
- }
- virtual ~Graphics2D() {
- }
-
- // Resource overrides.
- virtual Graphics2D* AsGraphics2D() { return this; }
-
- const PP_Size& size() const { return size_; }
- PP_Bool is_always_opaque() const { return is_always_opaque_; }
-
- bool is_flush_pending() const { return !!current_flush_callback_.func; }
-
- PP_CompletionCallback current_flush_callback() const {
- return current_flush_callback_;
- }
- void set_current_flush_callback(PP_CompletionCallback cb) {
- current_flush_callback_ = cb;
- }
-
- // ResourceObjectBase.
- virtual PPB_Graphics2D_API* AsGraphics2D_API();
-
- // PPB_Graphics_2D_API.
- PP_Bool Describe(PP_Size* size, PP_Bool* is_always_opaque);
- void PaintImageData(PP_Resource image_data,
- const PP_Point* top_left,
- const PP_Rect* src_rect);
- void Scroll(const PP_Rect* clip_rect,
- const PP_Point* amount);
- void ReplaceContents(PP_Resource image_data);
- int32_t Flush(PP_CompletionCallback callback);
-
- private:
- PP_Size size_;
- PP_Bool is_always_opaque_;
-
- // In the plugin, this is the current callback set for Flushes. When the
- // callback function pointer is non-NULL, we're waiting for a flush ACK.
- PP_CompletionCallback current_flush_callback_;
-
- DISALLOW_COPY_AND_ASSIGN(Graphics2D);
-};
-
-
} // namespace proxy
} // namespace pp
diff --git a/ppapi/proxy/ppb_image_data_proxy.cc b/ppapi/proxy/ppb_image_data_proxy.cc
index 2117e82..2d8e7f9 100644
--- a/ppapi/proxy/ppb_image_data_proxy.cc
+++ b/ppapi/proxy/ppb_image_data_proxy.cc
@@ -76,7 +76,7 @@ ImageData::ImageData(const HostResource& resource,
ImageData::~ImageData() {
}
-::ppapi::thunk::PPB_ImageData_API* ImageData::AsImageData_API() {
+::ppapi::thunk::PPB_ImageData_API* ImageData::AsPPB_ImageData_API() {
return this;
}
diff --git a/ppapi/proxy/ppb_image_data_proxy.h b/ppapi/proxy/ppb_image_data_proxy.h
index 6bd97a5ad..366b6b4 100644
--- a/ppapi/proxy/ppb_image_data_proxy.h
+++ b/ppapi/proxy/ppb_image_data_proxy.h
@@ -55,7 +55,7 @@ class ImageData : public PluginResource,
virtual ~ImageData();
// ResourceObjectBase overrides.
- virtual ::ppapi::thunk::PPB_ImageData_API* AsImageData_API();
+ virtual ::ppapi::thunk::PPB_ImageData_API* AsPPB_ImageData_API();
// Resource overrides.
virtual ImageData* AsImageData();
diff --git a/ppapi/proxy/resource_creation_proxy.cc b/ppapi/proxy/resource_creation_proxy.cc
index 0045bbb..8d26528 100644
--- a/ppapi/proxy/resource_creation_proxy.cc
+++ b/ppapi/proxy/resource_creation_proxy.cc
@@ -16,6 +16,9 @@
#include "ppapi/proxy/ppb_audio_proxy.h"
#include "ppapi/proxy/ppb_buffer_proxy.h"
#include "ppapi/proxy/ppb_broker_proxy.h"
+#include "ppapi/proxy/ppb_file_chooser_proxy.h"
+#include "ppapi/proxy/ppb_file_ref_proxy.h"
+#include "ppapi/proxy/ppb_file_system_proxy.h"
#include "ppapi/proxy/ppb_font_proxy.h"
#include "ppapi/proxy/ppb_graphics_2d_proxy.h"
#include "ppapi/proxy/ppb_image_data_proxy.h"
@@ -37,7 +40,7 @@ ResourceCreationProxy::~ResourceCreationProxy() {
}
::ppapi::thunk::ResourceCreationAPI*
-ResourceCreationProxy::AsResourceCreation() {
+ResourceCreationProxy::AsResourceCreationAPI() {
return this;
}
@@ -72,6 +75,34 @@ PP_Resource ResourceCreationProxy::CreateBuffer(PP_Instance instance,
return PPB_Buffer_Proxy::CreateProxyResource(instance, size);
}
+PP_Resource ResourceCreationProxy::CreateDirectoryReader(
+ PP_Resource directory_ref) {
+ // Not proxied yet.
+ return 0;
+}
+
+PP_Resource ResourceCreationProxy::CreateFileChooser(
+ PP_Instance instance,
+ const PP_FileChooserOptions_Dev* options) {
+ return PPB_FileChooser_Proxy::CreateProxyResource(instance, options);
+}
+
+PP_Resource ResourceCreationProxy::CreateFileIO(PP_Instance instance) {
+ // Not proxied yet.
+ return 0;
+}
+
+PP_Resource ResourceCreationProxy::CreateFileRef(PP_Resource file_system,
+ const char* path) {
+ return PPB_FileRef_Proxy::CreateProxyResource(file_system, path);
+}
+
+PP_Resource ResourceCreationProxy::CreateFileSystem(
+ PP_Instance instance,
+ PP_FileSystemType_Dev type) {
+ return PPB_FileSystem_Proxy::CreateProxyResource(instance, type);
+}
+
PP_Resource ResourceCreationProxy::CreateFontObject(
PP_Instance instance,
const PP_FontDescription_Dev* description) {
@@ -83,22 +114,11 @@ PP_Resource ResourceCreationProxy::CreateFontObject(
return PluginResourceTracker::GetInstance()->AddResource(object);
}
-PP_Resource ResourceCreationProxy::CreateGraphics2D(PP_Instance pp_instance,
+PP_Resource ResourceCreationProxy::CreateGraphics2D(PP_Instance instance,
const PP_Size& size,
PP_Bool is_always_opaque) {
- PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(pp_instance);
- if (!dispatcher)
- return PP_ERROR_BADARGUMENT;
-
- HostResource result;
- dispatcher->Send(new PpapiHostMsg_ResourceCreation_Graphics2D(
- INTERFACE_ID_RESOURCE_CREATION, pp_instance, size, is_always_opaque,
- &result));
- if (result.is_null())
- return 0;
- linked_ptr<Graphics2D> graphics_2d(new Graphics2D(result, size,
- is_always_opaque));
- return PluginResourceTracker::GetInstance()->AddResource(graphics_2d);
+ return PPB_Graphics2D_Proxy::CreateProxyResource(instance, size,
+ is_always_opaque);
}
PP_Resource ResourceCreationProxy::CreateImageData(PP_Instance instance,
diff --git a/ppapi/proxy/resource_creation_proxy.h b/ppapi/proxy/resource_creation_proxy.h
index bd24bda..501e70b 100644
--- a/ppapi/proxy/resource_creation_proxy.h
+++ b/ppapi/proxy/resource_creation_proxy.h
@@ -29,7 +29,7 @@ class ResourceCreationProxy : public ::ppapi::FunctionGroupBase,
ResourceCreationProxy(Dispatcher* dispatcher);
virtual ~ResourceCreationProxy();
- virtual ::ppapi::thunk::ResourceCreationAPI* AsResourceCreation() OVERRIDE;
+ virtual ::ppapi::thunk::ResourceCreationAPI* AsResourceCreationAPI() OVERRIDE;
// ResourceCreationAPI (called in plugin).
virtual PP_Resource CreateAudio(PP_Instance instance,
@@ -43,6 +43,15 @@ class ResourceCreationProxy : public ::ppapi::FunctionGroupBase,
virtual PP_Resource CreateBroker(PP_Instance instance) OVERRIDE;
virtual PP_Resource CreateBuffer(PP_Instance instance,
uint32_t size) OVERRIDE;
+ virtual PP_Resource CreateDirectoryReader(PP_Resource directory_ref) OVERRIDE;
+ virtual PP_Resource CreateFileChooser(
+ PP_Instance instance,
+ const PP_FileChooserOptions_Dev* options) OVERRIDE;
+ virtual PP_Resource CreateFileIO(PP_Instance instance) OVERRIDE;
+ virtual PP_Resource CreateFileRef(PP_Resource file_system,
+ const char* path) OVERRIDE;
+ virtual PP_Resource CreateFileSystem(PP_Instance instance,
+ PP_FileSystemType_Dev type) OVERRIDE;
virtual PP_Resource CreateFontObject(
PP_Instance instance,
const PP_FontDescription_Dev* description) OVERRIDE;