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