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_RESOURCE_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_HOST_RESOURCE_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/ppapi_host_export.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/resource_message_handler.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/host_resource.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace IPC {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Message;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace host {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HostMessageContext;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PpapiHost;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceMessageFilter;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Some (but not all) resources have a corresponding object in the host side
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that is kept alive as long as the resource in the plugin is alive. This is
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the base class for such objects.
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PPAPI_HOST_EXPORT ResourceHost : public ResourceMessageHandler {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResourceHost(PpapiHost* host, PP_Instance instance, PP_Resource resource);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ResourceHost();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiHost* host() { return host_; }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Instance pp_instance() const { return pp_instance_; }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource pp_resource() const { return pp_resource_; }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This runs any message filters in |message_filters_|. If the message is not
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // handled by these filters then the host's own message handler is run. True
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is always returned (the message will always be handled in some way).
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool HandleMessage(const IPC::Message& msg,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             HostMessageContext* context) OVERRIDE;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the PP_Resource ID when the plugin attaches to a pending resource
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // host. This will notify subclasses by calling
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DidConnectPendingHostToResource.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The current PP_Resource for all pending hosts should be 0. See
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PpapiHostMsg_AttachToPendingHost.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetPPResourceForPendingHost(PP_Resource pp_resource);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SendReply(const ReplyMessageContext& context,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const IPC::Message& msg) OVERRIDE;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Simple RTTI. A subclass that is a host for one of these APIs will override
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the appropriate function and return true.
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual bool IsCompositorHost();
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool IsFileRefHost();
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool IsFileSystemHost();
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool IsGraphics2DHost();
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual bool IsMediaStreamVideoTrackHost();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds a ResourceMessageFilter to handle resource messages. Incoming
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // messages will be passed to the handlers of these filters before being
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // handled by the resource host's own message handler. This allows
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ResourceHosts to easily handle messages on other threads.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddFilter(scoped_refptr<ResourceMessageFilter> filter);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when this resource host is pending and the corresponding plugin has
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // just connected to it. The host resource subclass can implement this
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // function if it wants to do processing (typically sending queued data).
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The PP_Resource will be valid for this call but not before.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidConnectPendingHostToResource() {}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The host that owns this object.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiHost* host_;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Instance pp_instance_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource pp_resource_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A vector of message filters which the host will forward incoming resource
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // messages to.
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<scoped_refptr<ResourceMessageFilter> > message_filters_;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceHost);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace host
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_HOST_RESOURCE_HOST_H_
97