[email protected] | 67600b9 | 2012-03-10 06:51:48 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. | ||||
4 | |||||
5 | #include "ppapi/proxy/dispatcher.h" | ||||
6 | |||||
7 | #include <string.h> // For memset. | ||||
8 | |||||
9 | #include <map> | ||||
10 | |||||
[email protected] | 709a847e | 2010-11-10 01:16:11 | [diff] [blame] | 11 | #include "base/compiler_specific.h" |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 12 | #include "base/logging.h" |
[email protected] | 3b63f8f4 | 2011-03-28 01:54:15 | [diff] [blame] | 13 | #include "base/memory/singleton.h" |
[email protected] | 9ca952d | 2010-11-11 20:43:50 | [diff] [blame] | 14 | #include "ppapi/proxy/ppapi_messages.h" |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 15 | #include "ppapi/proxy/var_serialization_rules.h" |
16 | |||||
[email protected] | 7412204 | 2014-04-25 00:07:30 | [diff] [blame] | 17 | namespace IPC { |
18 | class MessageFilter; | ||||
19 | } | ||||
20 | |||||
[email protected] | 4d2efd2 | 2011-08-18 21:58:02 | [diff] [blame] | 21 | namespace ppapi { |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 22 | namespace proxy { |
23 | |||||
[email protected] | 195d4cde | 2012-10-02 18:12:41 | [diff] [blame] | 24 | Dispatcher::Dispatcher(PP_GetInterface_Func local_get_interface, |
25 | const PpapiPermissions& permissions) | ||||
26 | : local_get_interface_(local_get_interface), | ||||
27 | permissions_(permissions) { | ||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 28 | } |
29 | |||||
30 | Dispatcher::~Dispatcher() { | ||||
31 | } | ||||
32 | |||||
[email protected] | ac4b54d | 2011-10-20 23:09:28 | [diff] [blame] | 33 | InterfaceProxy* Dispatcher::GetInterfaceProxy(ApiID id) { |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 34 | InterfaceProxy* proxy = proxies_[id].get(); |
35 | if (!proxy) { | ||||
36 | // Handle the first time for a given API by creating the proxy for it. | ||||
37 | InterfaceProxy::Factory factory = | ||||
38 | InterfaceList::GetInstance()->GetFactoryForID(id); | ||||
39 | if (!factory) { | ||||
40 | NOTREACHED(); | ||||
41 | return NULL; | ||||
42 | } | ||||
43 | proxy = factory(this); | ||||
44 | DCHECK(proxy); | ||||
45 | proxies_[id].reset(proxy); | ||||
46 | } | ||||
47 | return proxy; | ||||
48 | } | ||||
49 | |||||
dmichael | 6b328f3d | 2014-09-29 23:49:02 | [diff] [blame] | 50 | void Dispatcher::AddIOThreadMessageFilter( |
51 | scoped_refptr<IPC::MessageFilter> filter) { | ||||
[email protected] | 8be4584 | 2012-04-13 19:49:29 | [diff] [blame] | 52 | // Our filter is refcounted. The channel will call the destruct method on the |
53 | // filter when the channel is done with it, so the corresponding Release() | ||||
54 | // happens there. | ||||
dmichael | 6b328f3d | 2014-09-29 23:49:02 | [diff] [blame] | 55 | channel()->AddFilter(filter.get()); |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 56 | } |
57 | |||||
[email protected] | a95986a8 | 2010-12-24 06:19:28 | [diff] [blame] | 58 | bool Dispatcher::OnMessageReceived(const IPC::Message& msg) { |
[email protected] | ac4b54d | 2011-10-20 23:09:28 | [diff] [blame] | 59 | if (msg.routing_id() <= 0 || msg.routing_id() >= API_ID_COUNT) { |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 60 | OnInvalidMessageReceived(); |
61 | return true; | ||||
62 | } | ||||
[email protected] | 465faa2 | 2011-02-08 16:31:46 | [diff] [blame] | 63 | |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 64 | InterfaceProxy* proxy = GetInterfaceProxy( |
[email protected] | ac4b54d | 2011-10-20 23:09:28 | [diff] [blame] | 65 | static_cast<ApiID>(msg.routing_id())); |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 66 | if (!proxy) { |
67 | NOTREACHED(); | ||||
68 | return true; | ||||
69 | } | ||||
70 | return proxy->OnMessageReceived(msg); | ||||
[email protected] | 465faa2 | 2011-02-08 16:31:46 | [diff] [blame] | 71 | } |
72 | |||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 73 | void Dispatcher::SetSerializationRules( |
74 | VarSerializationRules* var_serialization_rules) { | ||||
[email protected] | 67600b9 | 2012-03-10 06:51:48 | [diff] [blame] | 75 | serialization_rules_ = var_serialization_rules; |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 76 | } |
77 | |||||
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 78 | void Dispatcher::OnInvalidMessageReceived() { |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 79 | } |
80 | |||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 81 | } // namespace proxy |
[email protected] | 4d2efd2 | 2011-08-18 21:58:02 | [diff] [blame] | 82 | } // namespace ppapi |