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 17 namespace IPC { 18 class Message; 19 } 20 21 namespace ppapi { 22 namespace host { 23 24 struct HostMessageContext; 25 class PpapiHost; 26 class 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. 31 class PPAPI_HOST_EXPORT ResourceHost : public ResourceMessageHandler { 32 public: 33 ResourceHost(PpapiHost* host, PP_Instance instance, PP_Resource resource); 34 virtual ~ResourceHost(); 35 host()36 PpapiHost* host() { return host_; } pp_instance()37 PP_Instance pp_instance() const { return pp_instance_; } pp_resource()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. DidConnectPendingHostToResource()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