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_HOST_PPAPI_HOST_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_HOST_PPAPI_HOST_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_listener.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_instance.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/ppapi_host_export.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_permissions.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceMessageCallParams; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceMessageReplyParams; 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SerializedHandle; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace host { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HostFactory; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HostMessageContext; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InstanceMessageFilter; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ReplyMessageContext; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceHost; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The host provides routing and tracking for resource message calls that 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// come from the plugin to the host (browser or renderer), and the 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// corresponding replies. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_HOST_EXPORT PpapiHost : public IPC::Sender, public IPC::Listener { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The sender is the channel to the plugin for outgoing messages. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Normally the creator will add filters for resource creation messages 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (AddHostFactoryFilter) and instance messages (AddInstanceMessageFilter) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after construction. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiHost(IPC::Sender* sender, const PpapiPermissions& perms); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PpapiHost(); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PpapiPermissions& permissions() const { return permissions_; } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sender implementation. Forwards to the sender_. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Send(IPC::Message* msg) OVERRIDE; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Listener implementation. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends the given reply message to the plugin. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendReply(const ReplyMessageContext& context, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& msg); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sends the given unsolicited reply message to the plugin. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendUnsolicitedReply(PP_Resource resource, const IPC::Message& msg); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Similar to |SendUnsolicitedReply()|, but also sends handles. 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SendUnsolicitedReplyWithHandles( 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Resource resource, 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const IPC::Message& msg, 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<proxy::SerializedHandle>& handles); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Create a ResourceHost with the given |nested_msg|. 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<ResourceHost> CreateResourceHost( 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const proxy::ResourceMessageCallParams& params, 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PP_Instance instance, 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const IPC::Message& nested_msg); 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Adds the given host resource as a pending one (with no corresponding 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PluginResource object and no PP_Resource ID yet). The pending resource ID 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is returned. See PpapiHostMsg_AttachToPendingHost. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int AddPendingResourceHost(scoped_ptr<ResourceHost> resource_host); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the given host factory filter to the host. The PpapiHost will take 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ownership of the pointer. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddHostFactoryFilter(scoped_ptr<HostFactory> filter); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the given message filter to the host. The PpapiHost will take 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ownership of the pointer. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddInstanceMessageFilter(scoped_ptr<InstanceMessageFilter> filter); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns null if the resource doesn't exist. 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host::ResourceHost* GetResourceHost(PP_Resource resource) const; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class InstanceMessageFilter; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HandleResourceCall( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const proxy::ResourceMessageCallParams& params, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& nested_msg, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostMessageContext* context); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message handlers. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnHostMsgResourceCall(const proxy::ResourceMessageCallParams& params, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& nested_msg); 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void OnHostMsgInProcessResourceCall( 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int routing_id, 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const proxy::ResourceMessageCallParams& params, 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const IPC::Message& nested_msg); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnHostMsgResourceSyncCall( 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const proxy::ResourceMessageCallParams& params, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& nested_msg, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Message* reply_msg); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnHostMsgResourceCreated(const proxy::ResourceMessageCallParams& param, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& nested_msg); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnHostMsgAttachToPendingHost(PP_Resource resource, int pending_host_id); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnHostMsgResourceDestroyed(PP_Resource resource); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Non-owning pointer. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Sender* sender_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiPermissions permissions_; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filters for resource creation messages. Note that since we don't support 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleting these dynamically we don't need to worry about modifications 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // during iteration. If we add that capability, this should be replaced with 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an ObserverList. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<HostFactory> host_factory_filters_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filters for instance messages. Note that since we don't support deleting 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these dynamically we don't need to worry about modifications during 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // iteration. If we add that capability, this should be replaced with an 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ObserverList. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<InstanceMessageFilter> instance_message_filters_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<PP_Resource, linked_ptr<ResourceHost> > ResourceMap; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceMap resources_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resources that have been created in the host and have not yet had the 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // corresponding PluginResource associated with them. 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See PpapiHostMsg_AttachToPendingHost. 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<int, linked_ptr<ResourceHost> > PendingHostResourceMap; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PendingHostResourceMap pending_resource_hosts_; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_pending_resource_host_id_; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PpapiHost); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace host 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // PPAPI_HOST_PPAPIE_HOST_H_ 153