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) // ¶m_1, ¶m_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