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_PROXY_DISPATCHER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_PROXY_DISPATCHER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracked_objects.h"
1634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include "ipc/message_filter.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_instance.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_module.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/proxy_channel.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/interface_list.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/interface_proxy.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_var_tracker.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/api_id.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace IPC {
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MessageFilter;
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VarSerializationRules;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface proxy can represent either end of a cross-process interface
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// call. The "source" side is where the call is invoked, and the "target" side
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is where the call ends up being executed.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Plugin side                          | Browser side
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -------------------------------------|--------------------------------------
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                      |
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    "Source"                          |    "Target"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    InterfaceProxy ----------------------> InterfaceProxy
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                      |
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                      |
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    "Target"                          |    "Source"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    InterfaceProxy <---------------------- InterfaceProxy
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                                      |
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_PROXY_EXPORT Dispatcher : public ProxyChannel {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Dispatcher();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the dispatcher is on the plugin side, or false if it's the
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser side.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsPlugin() const = 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VarSerializationRules* serialization_rules() const {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return serialization_rules_.get();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a non-owning pointer to the interface proxy for the given ID, or
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NULL if the ID isn't found. This will create the proxy if it hasn't been
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // created so far.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterfaceProxy* GetInterfaceProxy(ApiID id);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Adds the given filter to the IO thread.
6734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  void AddIOThreadMessageFilter(scoped_refptr<IPC::MessageFilter> filter);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Listener implementation.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_GetInterface_Func local_get_interface() const {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return local_get_interface_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PpapiPermissions& permissions() const { return permissions_; }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Dispatcher(PP_GetInterface_Func local_get_interface,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const PpapiPermissions& permissions);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setter for the derived classes to set the appropriate var serialization.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes one reference of the given pointer, which must be on the heap.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSerializationRules(VarSerializationRules* var_serialization_rules);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when an invalid message is received from the remote site. The
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default implementation does nothing, derived classes can override.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnInvalidMessageReceived();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class PluginDispatcherTest;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lists all lazily-created interface proxies.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<InterfaceProxy> proxies_[API_ID_COUNT];
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_GetInterface_Func local_get_interface_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<VarSerializationRules> serialization_rules_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiPermissions permissions_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Dispatcher);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_PROXY_DISPATCHER_H_
109