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_DISPATCHER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_PROXY_DISPATCHER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h" 1634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include "ipc/message_filter.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_instance.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_module.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/proxy_channel.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/interface_list.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/interface_proxy.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_var_tracker.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/api_id.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace IPC { 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MessageFilter; 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VarSerializationRules; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface proxy can represent either end of a cross-process interface 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// call. The "source" side is where the call is invoked, and the "target" side 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is where the call ends up being executed. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Plugin side | Browser side 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -------------------------------------|-------------------------------------- 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Source" | "Target" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InterfaceProxy ----------------------> InterfaceProxy 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Target" | "Source" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InterfaceProxy <---------------------- InterfaceProxy 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// | 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_PROXY_EXPORT Dispatcher : public ProxyChannel { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Dispatcher(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the dispatcher is on the plugin side, or false if it's the 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser side. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsPlugin() const = 0; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VarSerializationRules* serialization_rules() const { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return serialization_rules_.get(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a non-owning pointer to the interface proxy for the given ID, or 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL if the ID isn't found. This will create the proxy if it hasn't been 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created so far. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InterfaceProxy* GetInterfaceProxy(ApiID id); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) // Adds the given filter to the IO thread. 6734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) void AddIOThreadMessageFilter(scoped_refptr<IPC::MessageFilter> filter); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IPC::Listener implementation. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_GetInterface_Func local_get_interface() const { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return local_get_interface_; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PpapiPermissions& permissions() const { return permissions_; } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit Dispatcher(PP_GetInterface_Func local_get_interface, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PpapiPermissions& permissions); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setter for the derived classes to set the appropriate var serialization. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes one reference of the given pointer, which must be on the heap. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetSerializationRules(VarSerializationRules* var_serialization_rules); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when an invalid message is received from the remote site. The 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // default implementation does nothing, derived classes can override. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnInvalidMessageReceived(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class PluginDispatcherTest; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lists all lazily-created interface proxies. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<InterfaceProxy> proxies_[API_ID_COUNT]; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_GetInterface_Func local_get_interface_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<VarSerializationRules> serialization_rules_; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiPermissions permissions_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Dispatcher); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // PPAPI_PROXY_DISPATCHER_H_ 109