1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef PPAPI_HOST_RESOURCE_HOST_H_
6#define PPAPI_HOST_RESOURCE_HOST_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/memory/ref_counted.h"
12#include "ppapi/c/pp_resource.h"
13#include "ppapi/host/ppapi_host_export.h"
14#include "ppapi/host/resource_message_handler.h"
15#include "ppapi/shared_impl/host_resource.h"
16
17namespace IPC {
18class Message;
19}
20
21namespace ppapi {
22namespace host {
23
24struct HostMessageContext;
25class PpapiHost;
26class ResourceMessageFilter;
27
28// Some (but not all) resources have a corresponding object in the host side
29// that is kept alive as long as the resource in the plugin is alive. This is
30// the base class for such objects.
31class PPAPI_HOST_EXPORT ResourceHost : public ResourceMessageHandler {
32 public:
33  ResourceHost(PpapiHost* host, PP_Instance instance, PP_Resource resource);
34  virtual ~ResourceHost();
35
36  PpapiHost* host() { return host_; }
37  PP_Instance pp_instance() const { return pp_instance_; }
38  PP_Resource pp_resource() const { return pp_resource_; }
39
40  // This runs any message filters in |message_filters_|. If the message is not
41  // handled by these filters then the host's own message handler is run. True
42  // is always returned (the message will always be handled in some way).
43  virtual bool HandleMessage(const IPC::Message& msg,
44                             HostMessageContext* context) OVERRIDE;
45
46  // Sets the PP_Resource ID when the plugin attaches to a pending resource
47  // host. This will notify subclasses by calling
48  // DidConnectPendingHostToResource.
49  //
50  // The current PP_Resource for all pending hosts should be 0. See
51  // PpapiHostMsg_AttachToPendingHost.
52  void SetPPResourceForPendingHost(PP_Resource pp_resource);
53
54  virtual void SendReply(const ReplyMessageContext& context,
55                         const IPC::Message& msg) OVERRIDE;
56
57  // Simple RTTI. A subclass that is a host for one of these APIs will override
58  // the appropriate function and return true.
59  virtual bool IsCompositorHost();
60  virtual bool IsFileRefHost();
61  virtual bool IsFileSystemHost();
62  virtual bool IsGraphics2DHost();
63  virtual bool IsMediaStreamVideoTrackHost();
64
65 protected:
66  // Adds a ResourceMessageFilter to handle resource messages. Incoming
67  // messages will be passed to the handlers of these filters before being
68  // handled by the resource host's own message handler. This allows
69  // ResourceHosts to easily handle messages on other threads.
70  void AddFilter(scoped_refptr<ResourceMessageFilter> filter);
71
72  // Called when this resource host is pending and the corresponding plugin has
73  // just connected to it. The host resource subclass can implement this
74  // function if it wants to do processing (typically sending queued data).
75  //
76  // The PP_Resource will be valid for this call but not before.
77  virtual void DidConnectPendingHostToResource() {}
78
79 private:
80  // The host that owns this object.
81  PpapiHost* host_;
82
83  PP_Instance pp_instance_;
84  PP_Resource pp_resource_;
85
86  // A vector of message filters which the host will forward incoming resource
87  // messages to.
88  std::vector<scoped_refptr<ResourceMessageFilter> > message_filters_;
89
90  DISALLOW_COPY_AND_ASSIGN(ResourceHost);
91};
92
93}  // namespace host
94}  // namespace ppapi
95
96#endif  // PPAPI_HOST_RESOURCE_HOST_H_
97