15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PPAPI_PROXY_PLUGIN_RESOURCE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_PROXY_PLUGIN_RESOURCE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/connection.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_resource_callback.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_message_utils.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_export.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/resource_message_params.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/proxy/resource_reply_thread_registrar.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginDispatcher;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_PROXY_EXPORT PluginResource : public Resource {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum Destination {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RENDERER = 0,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BROWSER = 1
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PluginResource(Connection connection, PP_Instance instance);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PluginResource();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if we've previously sent a create message to the browser
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or renderer. Generally resources will use these to tell if they should
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // lazily send create messages.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sent_create_to_browser() const { return sent_create_to_browser_; }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sent_create_to_renderer() const { return sent_create_to_renderer_; }
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This handles a reply to a resource call. It works by looking up the
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback that was registered when CallBrowser/CallRenderer was called
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and calling it with |params| and |msg|.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnReplyReceived(const proxy::ResourceMessageReplyParams& params,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const IPC::Message& msg) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resource overrides.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: Subclasses shouldn't override these methods directly. Instead, they
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should implement LastPluginRefWasDeleted() or InstanceWasDeleted() to get
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notified.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyLastPluginRefWasDeleted() OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyInstanceWasDeleted() OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends a create message to the browser or renderer for the current resource.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SendCreate(Destination dest, const IPC::Message& msg);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When the host returnes a resource to the plugin, it will create a pending
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ResourceHost and send an ID back to the plugin that identifies the pending
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // object. The plugin uses this function to connect the plugin resource with
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the pending host resource. See also PpapiHostMsg_AttachToPendingHost. This
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is in lieu of sending a create message.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AttachToPendingHost(Destination dest, int pending_host_id);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends the given IPC message as a resource request to the host
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // corresponding to this resource object and does not expect a reply.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Post(Destination dest, const IPC::Message& msg);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Like Post() but expects a response. |callback| is a |base::Callback| that
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will be run when a reply message with a sequence number matching that of
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the call is received. |ReplyMsgClass| is the type of the reply message that
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is expected. An example of usage:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call<PpapiPluginMsg_MyResourceType_MyReplyMessage>(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     BROWSER,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     PpapiHostMsg_MyResourceType_MyRequestMessage(),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     base::Bind(&MyPluginResource::ReplyHandler, base::Unretained(this)));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a reply message to this call is received whose type does not match
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |ReplyMsgClass| (for example, in the case of an error), the callback will
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // still be invoked but with the default values of the message parameters.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the new request's sequence number which can be used to identify
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the callback. This value will never be 0, which you can use to identify
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an invalid callback.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: 1) When all plugin references to this resource are gone or the
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //          corresponding plugin instance is deleted, all pending callbacks
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //          are abandoned.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //       2) It is *not* recommended to let |callback| hold any reference to
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //          |this|, in which it will be stored. Otherwise, this object will
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //          live forever if we fail to clean up the callback. It is safe to
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //          use base::Unretained(this) or a weak pointer, because this object
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //          will outlive the callback.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template<typename ReplyMsgClass, typename CallbackType>
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t Call(Destination dest,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const IPC::Message& msg,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const CallbackType& callback);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Comparing with the previous Call() method, this method takes
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |reply_thread_hint| as a hint to determine which thread to handle the reply
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // message.
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If |reply_thread_hint| is non-blocking, the reply message will be handled
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // on the target thread of the callback; otherwise, it will be handled on the
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // main thread.
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // If handling a reply message will cause a TrackedCallback to be run, it is
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // recommended to use this version of Call(). It eliminates unnecessary
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // thread switching and therefore has better performance.
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  template<typename ReplyMsgClass, typename CallbackType>
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int32_t Call(Destination dest,
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               const IPC::Message& msg,
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               const CallbackType& callback,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               scoped_refptr<TrackedCallback> reply_thread_hint);
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls the browser/renderer with sync messages. Returns the pepper error
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // code from the call.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |ReplyMsgClass| is the type of the reply message that is expected. If it
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // carries x parameters, then the method with x out parameters should be used.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // An example of usage:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // // Assuming the reply message carries a string and an integer.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // std::string param_1;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // int param_2 = 0;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // int32_t result = SyncCall<PpapiPluginMsg_MyResourceType_MyReplyMessage>(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     RENDERER, PpapiHostMsg_MyResourceType_MyRequestMessage(),
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     &param_1, &param_2);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class ReplyMsgClass>
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t SyncCall(Destination dest, const IPC::Message& msg);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class ReplyMsgClass, class A>
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t SyncCall(Destination dest, const IPC::Message& msg, A* a);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class ReplyMsgClass, class A, class B>
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t SyncCall(Destination dest, const IPC::Message& msg, A* a, B* b);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class ReplyMsgClass, class A, class B, class C>
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t SyncCall(Destination dest, const IPC::Message& msg, A* a, B* b, C* c);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class ReplyMsgClass, class A, class B, class C, class D>
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t SyncCall(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Destination dest, const IPC::Message& msg, A* a, B* b, C* c, D* d);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class ReplyMsgClass, class A, class B, class C, class D, class E>
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t SyncCall(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Destination dest, const IPC::Message& msg, A* a, B* b, C* c, D* d, E* e);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t GenericSyncCall(Destination dest,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          const IPC::Message& msg,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          IPC::Message* reply_msg,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          ResourceMessageReplyParams* reply_params);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  const Connection& connection() { return connection_; }
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPC::Sender* GetSender(Destination dest) {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return dest == RENDERER ? connection_.renderer_sender :
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              connection_.browser_sender;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function to send a |PpapiHostMsg_ResourceCall| to the given
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destination with |nested_msg| and |call_params|.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SendResourceCall(Destination dest,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const ResourceMessageCallParams& call_params,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const IPC::Message& nested_msg);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t GetNextSequence();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Connection connection_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use GetNextSequence to retrieve the next value.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t next_sequence_number_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sent_create_to_browser_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool sent_create_to_renderer_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<int32_t, scoped_refptr<PluginResourceCallbackBase> >
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CallbackMap;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CallbackMap callbacks_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<ResourceReplyThreadRegistrar> resource_reply_thread_registrar_;
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PluginResource);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename ReplyMsgClass, typename CallbackType>
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t PluginResource::Call(Destination dest,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const IPC::Message& msg,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const CallbackType& callback) {
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return Call<ReplyMsgClass>(dest, msg, callback, NULL);
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template<typename ReplyMsgClass, typename CallbackType>
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t PluginResource::Call(
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Destination dest,
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const IPC::Message& msg,
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const CallbackType& callback,
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<TrackedCallback> reply_thread_hint) {
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TRACE_EVENT2("ppapi proxy", "PluginResource::Call",
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               "Class", IPC_MESSAGE_ID_CLASS(msg.type()),
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               "Line", IPC_MESSAGE_ID_LINE(msg.type()));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceMessageCallParams params(pp_resource(), next_sequence_number_++);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stash the |callback| in |callbacks_| identified by the sequence number of
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the call.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginResourceCallbackBase> plugin_callback(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PluginResourceCallback<ReplyMsgClass, CallbackType>(callback));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callbacks_.insert(std::make_pair(params.sequence(), plugin_callback));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.set_has_callback();
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (resource_reply_thread_registrar_) {
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    resource_reply_thread_registrar_->Register(
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        pp_resource(), params.sequence(), reply_thread_hint);
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SendResourceCall(dest, params, msg);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return params.sequence();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class ReplyMsgClass>
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t PluginResource::SyncCall(Destination dest, const IPC::Message& msg) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message reply;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceMessageReplyParams reply_params;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GenericSyncCall(dest, msg, &reply, &reply_params);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class ReplyMsgClass, class A>
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t PluginResource::SyncCall(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Destination dest, const IPC::Message& msg, A* a) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message reply;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceMessageReplyParams reply_params;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t result = GenericSyncCall(dest, msg, &reply, &reply_params);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UnpackMessage<ReplyMsgClass>(reply, a))
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_ERROR_FAILED;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class ReplyMsgClass, class A, class B>
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t PluginResource::SyncCall(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Destination dest, const IPC::Message& msg, A* a, B* b) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message reply;
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceMessageReplyParams reply_params;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t result = GenericSyncCall(dest, msg, &reply, &reply_params);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UnpackMessage<ReplyMsgClass>(reply, a, b))
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_ERROR_FAILED;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class ReplyMsgClass, class A, class B, class C>
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t PluginResource::SyncCall(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Destination dest, const IPC::Message& msg, A* a, B* b, C* c) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message reply;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceMessageReplyParams reply_params;
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t result = GenericSyncCall(dest, msg, &reply, &reply_params);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UnpackMessage<ReplyMsgClass>(reply, a, b, c))
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_ERROR_FAILED;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class ReplyMsgClass, class A, class B, class C, class D>
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t PluginResource::SyncCall(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Destination dest, const IPC::Message& msg, A* a, B* b, C* c, D* d) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message reply;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceMessageReplyParams reply_params;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t result = GenericSyncCall(dest, msg, &reply, &reply_params);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UnpackMessage<ReplyMsgClass>(reply, a, b, c, d))
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_ERROR_FAILED;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class ReplyMsgClass, class A, class B, class C, class D, class E>
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t PluginResource::SyncCall(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Destination dest, const IPC::Message& msg, A* a, B* b, C* c, D* d, E* e) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message reply;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceMessageReplyParams reply_params;
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int32_t result = GenericSyncCall(dest, msg, &reply, &reply_params);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (UnpackMessage<ReplyMsgClass>(reply, a, b, c, d, e))
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_ERROR_FAILED;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_PROXY_PLUGIN_RESOURCE_H_
289