15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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_PROXY_PLUGIN_MESSAGE_FILTER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_PROXY_PLUGIN_MESSAGE_FILTER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_instance.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/proxy/ppapi_proxy_export.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ResourceMessageReplyParams;
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ResourceReplyThreadRegistrar;
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Listens for messages on the I/O thread of the plugin and handles some of
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// them to avoid needing to block on the plugin.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There is one instance of this class for each renderer channel (same as for
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the PluginDispatchers).
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass PPAPI_PROXY_EXPORT PluginMessageFilter : public IPC::MessageFilter,
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                               public IPC::Sender {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |seen_instance_ids| is a pointer to a set that will be used to uniquify
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // PP_Instances across all renderer channels. The same pointer should be
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // passed to each MessageFilter to ensure uniqueness, and the value should
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // outlive this class. It could be NULL if this filter is for a browser
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // channel.
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |thread_registrar| is used to look up handling threads for resource
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // reply messages. It shouldn't be NULL.
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PluginMessageFilter(
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::set<PP_Instance>* seen_instance_ids,
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_refptr<ResourceReplyThreadRegistrar> thread_registrar);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PluginMessageFilter();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MessageFilter implementation.
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnFilterAdded(IPC::Sender* sender) OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnFilterRemoved() OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Sender implementation.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* msg) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulates an incoming resource reply that is handled on the calling thread.
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // For testing only.
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void DispatchResourceReplyForTest(
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const ResourceMessageReplyParams& reply_params,
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const IPC::Message& nested_msg);
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnMsgReserveInstanceId(PP_Instance instance, bool* usable);
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnMsgResourceReply(const ResourceMessageReplyParams& reply_params,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          const IPC::Message& nested_msg);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Dispatches the given resource reply to the appropriate resource in the
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // plugin process.
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void DispatchResourceReply(
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const ResourceMessageReplyParams& reply_params,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const IPC::Message& nested_msg);
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // All instance IDs ever queried by any renderer on this plugin. This is used
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // to make sure that new instance IDs are unique. This is a non-owning
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // pointer. It is managed by PluginDispatcher::PluginDelegate.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<PP_Instance>* seen_instance_ids_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<ResourceReplyThreadRegistrar> resource_reply_thread_registrar_;
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The IPC sender to the renderer. May be NULL if we're not currently
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // attached as a filter.
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  IPC::Sender* sender_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_PROXY_PLUGIN_MESSAGE_FILTER_H_
84