| Index: ppapi/proxy/plugin_resource.h
|
| diff --git a/ppapi/proxy/plugin_resource.h b/ppapi/proxy/plugin_resource.h
|
| index 3bde7cbe349a05d352f3049061a38693696964bf..00c29a1711ac2d36e1ea46a9ab03925bf1bdf105 100644
|
| --- a/ppapi/proxy/plugin_resource.h
|
| +++ b/ppapi/proxy/plugin_resource.h
|
| @@ -5,9 +5,12 @@
|
| #ifndef PPAPI_PROXY_PLUGIN_RESOURCE_H_
|
| #define PPAPI_PROXY_PLUGIN_RESOURCE_H_
|
|
|
| +#include <map>
|
| +
|
| #include "base/compiler_specific.h"
|
| #include "ipc/ipc_sender.h"
|
| #include "ppapi/proxy/connection.h"
|
| +#include "ppapi/proxy/plugin_resource_callback.h"
|
| #include "ppapi/proxy/ppapi_proxy_export.h"
|
| #include "ppapi/shared_impl/resource.h"
|
|
|
| @@ -31,6 +34,11 @@ class PPAPI_PROXY_EXPORT PluginResource : public Resource {
|
| bool sent_create_to_browser() const { return sent_create_to_browser_; }
|
| bool sent_create_to_renderer() const { return sent_create_to_renderer_; }
|
|
|
| + // This handles a reply to a resource call. It works by looking up the
|
| + // callback that was registered when CallBrowser/CallRenderer was called
|
| + // and calling it with |params| and |msg|.
|
| + virtual void OnReplyReceived(const proxy::ResourceMessageReplyParams& params,
|
| + const IPC::Message& msg) OVERRIDE;
|
| protected:
|
| // Sends a create message to the browser or renderer for the current resource.
|
| void SendCreateToBrowser(const IPC::Message& msg);
|
| @@ -41,15 +49,27 @@ class PPAPI_PROXY_EXPORT PluginResource : public Resource {
|
| void PostToBrowser(const IPC::Message& msg);
|
| void PostToRenderer(const IPC::Message& msg);
|
|
|
| - // Like PostToBrowser/Renderer but expects a response.
|
| + // Like PostToBrowser/Renderer but expects a response. |callback| is
|
| + // a |base::Callback| that will be run when a reply message with a sequence
|
| + // number matching that of the call is received. |ReplyMsgClass| is the type
|
| + // of the reply message that is expected. An example of usage:
|
| + //
|
| + // CallBrowser<PpapiPluginMsg_MyResourceType_MyReplyMessage>(
|
| + // PpapiHostMsg_MyResourceType_MyRequestMessage(),
|
| + // base::Bind(&MyPluginResource::ReplyHandler, this));
|
| + //
|
| + // If a reply message to this call is received whose type does not match
|
| + // |ReplyMsgClass| (for example, in the case of an error), the callback will
|
| + // still be invoked but with the default values of the message parameters.
|
| //
|
| // Returns the new request's sequence number which can be used to identify
|
| - // the callback. The host will reply and ppapi::Resource::OnReplyReceived
|
| - // will be called.
|
| + // the callback.
|
| //
|
| // Note that all integers (including 0 and -1) are valid request IDs.
|
| - int32_t CallBrowser(const IPC::Message& msg);
|
| - int32_t CallRenderer(const IPC::Message& msg);
|
| + template<typename ReplyMsgClass, typename CallbackType>
|
| + int32_t CallBrowser(const IPC::Message& msg, const CallbackType& callback);
|
| + template<typename ReplyMsgClass, typename CallbackType>
|
| + int32_t CallRenderer(const IPC::Message& msg, const CallbackType& callback);
|
|
|
| // Call the browser/renderer with sync messages. The pepper error code from
|
| // the call is returned and the reply message is stored in |reply_msg|.
|
| @@ -57,6 +77,18 @@ class PPAPI_PROXY_EXPORT PluginResource : public Resource {
|
| int32_t CallRendererSync(const IPC::Message& msg, IPC::Message* reply_msg);
|
|
|
| private:
|
| + // Helper function to send a |PpapiHostMsg_ResourceCall| to the given sender
|
| + // with |nested_msg| and |call_params|.
|
| + bool SendResourceCall(IPC::Sender* sender,
|
| + const ResourceMessageCallParams& call_params,
|
| + const IPC::Message& nested_msg);
|
| +
|
| + // Helper function to make a Resource Call to a host with a callback.
|
| + template<typename ReplyMsgClass, typename CallbackType>
|
| + int32_t CallHost(IPC::Sender* sender,
|
| + const IPC::Message& msg,
|
| + const CallbackType& callback);
|
| +
|
| Connection connection_;
|
|
|
| int32_t next_sequence_number_;
|
| @@ -64,9 +96,43 @@ class PPAPI_PROXY_EXPORT PluginResource : public Resource {
|
| bool sent_create_to_browser_;
|
| bool sent_create_to_renderer_;
|
|
|
| + typedef std::map<int32_t, scoped_refptr<PluginResourceCallbackBase> >
|
| + CallbackMap;
|
| + CallbackMap callbacks_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(PluginResource);
|
| };
|
|
|
| +template<typename ReplyMsgClass, typename CallbackType>
|
| +int32_t PluginResource::CallBrowser(const IPC::Message& msg,
|
| + const CallbackType& callback) {
|
| + return CallHost<ReplyMsgClass, CallbackType>(
|
| + connection_.browser_sender, msg, callback);
|
| +}
|
| +
|
| +template<typename ReplyMsgClass, typename CallbackType>
|
| +int32_t PluginResource::CallRenderer(const IPC::Message& msg,
|
| + const CallbackType& callback) {
|
| + return CallHost<ReplyMsgClass, CallbackType>(
|
| + connection_.renderer_sender, msg, callback);
|
| +}
|
| +
|
| +template<typename ReplyMsgClass, typename CallbackType>
|
| +int32_t PluginResource::CallHost(IPC::Sender* sender,
|
| + const IPC::Message& msg,
|
| + const CallbackType& callback) {
|
| + ResourceMessageCallParams params(pp_resource(),
|
| + next_sequence_number_++);
|
| + // Stash the |callback| in |callbacks_| identified by the sequence number of
|
| + // the call.
|
| + scoped_refptr<PluginResourceCallbackBase> plugin_callback(
|
| + new PluginResourceCallback<ReplyMsgClass, CallbackType>(callback));
|
| + callbacks_.insert(std::make_pair(params.sequence(), plugin_callback));
|
| + params.set_has_callback();
|
| + SendResourceCall(sender, params, msg);
|
| + return params.sequence();
|
| +}
|
| +
|
| } // namespace proxy
|
| } // namespace ppapi
|
|
|
|
|