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