// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef PPAPI_HOST_PPAPI_HOST_H_ #define PPAPI_HOST_PPAPI_HOST_H_ #include <map> #include <vector> #include "base/compiler_specific.h" #include "base/memory/linked_ptr.h" #include "base/memory/scoped_ptr.h" #include "base/memory/scoped_vector.h" #include "base/observer_list.h" #include "ipc/ipc_listener.h" #include "ipc/ipc_sender.h" #include "ppapi/c/pp_instance.h" #include "ppapi/c/pp_resource.h" #include "ppapi/host/ppapi_host_export.h" #include "ppapi/shared_impl/ppapi_permissions.h" namespace ppapi { namespace proxy { class ResourceMessageCallParams; class ResourceMessageReplyParams; class SerializedHandle; } namespace host { class HostFactory; struct HostMessageContext; class InstanceMessageFilter; struct ReplyMessageContext; class ResourceHost; // The host provides routing and tracking for resource message calls that // come from the plugin to the host (browser or renderer), and the // corresponding replies. class PPAPI_HOST_EXPORT PpapiHost : public IPC::Sender, public IPC::Listener { public: // The sender is the channel to the plugin for outgoing messages. // Normally the creator will add filters for resource creation messages // (AddHostFactoryFilter) and instance messages (AddInstanceMessageFilter) // after construction. PpapiHost(IPC::Sender* sender, const PpapiPermissions& perms); virtual ~PpapiHost(); const PpapiPermissions& permissions() const { return permissions_; } // Sender implementation. Forwards to the sender_. virtual bool Send(IPC::Message* msg) OVERRIDE; // Listener implementation. virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; // Sends the given reply message to the plugin. void SendReply(const ReplyMessageContext& context, const IPC::Message& msg); // Sends the given unsolicited reply message to the plugin. void SendUnsolicitedReply(PP_Resource resource, const IPC::Message& msg); // Similar to |SendUnsolicitedReply()|, but also sends handles. void SendUnsolicitedReplyWithHandles( PP_Resource resource, const IPC::Message& msg, const std::vector<proxy::SerializedHandle>& handles); // Create a ResourceHost with the given |nested_msg|. scoped_ptr<ResourceHost> CreateResourceHost( const proxy::ResourceMessageCallParams& params, PP_Instance instance, const IPC::Message& nested_msg); // Adds the given host resource as a pending one (with no corresponding // PluginResource object and no PP_Resource ID yet). The pending resource ID // is returned. See PpapiHostMsg_AttachToPendingHost. int AddPendingResourceHost(scoped_ptr<ResourceHost> resource_host); // Adds the given host factory filter to the host. The PpapiHost will take // ownership of the pointer. void AddHostFactoryFilter(scoped_ptr<HostFactory> filter); // Adds the given message filter to the host. The PpapiHost will take // ownership of the pointer. void AddInstanceMessageFilter(scoped_ptr<InstanceMessageFilter> filter); // Returns null if the resource doesn't exist. host::ResourceHost* GetResourceHost(PP_Resource resource) const; private: friend class InstanceMessageFilter; void HandleResourceCall( const proxy::ResourceMessageCallParams& params, const IPC::Message& nested_msg, HostMessageContext* context); // Message handlers. void OnHostMsgResourceCall(const proxy::ResourceMessageCallParams& params, const IPC::Message& nested_msg); void OnHostMsgInProcessResourceCall( int routing_id, const proxy::ResourceMessageCallParams& params, const IPC::Message& nested_msg); void OnHostMsgResourceSyncCall( const proxy::ResourceMessageCallParams& params, const IPC::Message& nested_msg, IPC::Message* reply_msg); void OnHostMsgResourceCreated(const proxy::ResourceMessageCallParams& param, PP_Instance instance, const IPC::Message& nested_msg); void OnHostMsgAttachToPendingHost(PP_Resource resource, int pending_host_id); void OnHostMsgResourceDestroyed(PP_Resource resource); // Non-owning pointer. IPC::Sender* sender_; PpapiPermissions permissions_; // Filters for resource creation messages. Note that since we don't support // deleting these dynamically we don't need to worry about modifications // during iteration. If we add that capability, this should be replaced with // an ObserverList. ScopedVector<HostFactory> host_factory_filters_; // Filters for instance messages. Note that since we don't support deleting // these dynamically we don't need to worry about modifications during // iteration. If we add that capability, this should be replaced with an // ObserverList. ScopedVector<InstanceMessageFilter> instance_message_filters_; typedef std::map<PP_Resource, linked_ptr<ResourceHost> > ResourceMap; ResourceMap resources_; // Resources that have been created in the host and have not yet had the // corresponding PluginResource associated with them. // See PpapiHostMsg_AttachToPendingHost. typedef std::map<int, linked_ptr<ResourceHost> > PendingHostResourceMap; PendingHostResourceMap pending_resource_hosts_; int next_pending_resource_host_id_; DISALLOW_COPY_AND_ASSIGN(PpapiHost); }; } // namespace host } // namespace ppapi #endif // PPAPI_HOST_PPAPIE_HOST_H_