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