[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] | 4d2efd2 | 2011-08-18 21:58:02 | [diff] [blame] | 17 | namespace ppapi { |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 18 | namespace proxy { |
19 | |||||
[email protected] | 195d4cde | 2012-10-02 18:12:41 | [diff] [blame] | 20 | Dispatcher::Dispatcher(PP_GetInterface_Func local_get_interface, |
21 | const PpapiPermissions& permissions) | ||||
22 | : local_get_interface_(local_get_interface), | ||||
23 | permissions_(permissions) { | ||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 24 | } |
25 | |||||
26 | Dispatcher::~Dispatcher() { | ||||
27 | } | ||||
28 | |||||
[email protected] | 4dec580 | 2012-06-30 05:26:52 | [diff] [blame] | 29 | void Dispatcher::AddFilter(IPC::Listener* listener) { |
30 | filters_.push_back(listener); | ||||
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 | |||||
50 | base::MessageLoopProxy* Dispatcher::GetIPCMessageLoop() { | ||||
51 | return delegate()->GetIPCMessageLoop(); | ||||
52 | } | ||||
53 | |||||
54 | void Dispatcher::AddIOThreadMessageFilter( | ||||
55 | IPC::ChannelProxy::MessageFilter* filter) { | ||||
[email protected] | 8be4584 | 2012-04-13 19:49:29 | [diff] [blame] | 56 | // Our filter is refcounted. The channel will call the destruct method on the |
57 | // filter when the channel is done with it, so the corresponding Release() | ||||
58 | // happens there. | ||||
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 59 | channel()->AddFilter(filter); |
60 | } | ||||
61 | |||||
[email protected] | a95986a8 | 2010-12-24 06:19:28 | [diff] [blame] | 62 | bool Dispatcher::OnMessageReceived(const IPC::Message& msg) { |
[email protected] | ac4b54d | 2011-10-20 23:09:28 | [diff] [blame] | 63 | if (msg.routing_id() <= 0 || msg.routing_id() >= API_ID_COUNT) { |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 64 | OnInvalidMessageReceived(); |
65 | return true; | ||||
66 | } | ||||
[email protected] | 465faa2 | 2011-02-08 16:31:46 | [diff] [blame] | 67 | |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 68 | InterfaceProxy* proxy = GetInterfaceProxy( |
[email protected] | ac4b54d | 2011-10-20 23:09:28 | [diff] [blame] | 69 | static_cast<ApiID>(msg.routing_id())); |
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 70 | if (!proxy) { |
71 | NOTREACHED(); | ||||
72 | return true; | ||||
73 | } | ||||
74 | return proxy->OnMessageReceived(msg); | ||||
[email protected] | 465faa2 | 2011-02-08 16:31:46 | [diff] [blame] | 75 | } |
76 | |||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 77 | void Dispatcher::SetSerializationRules( |
78 | VarSerializationRules* var_serialization_rules) { | ||||
[email protected] | 67600b9 | 2012-03-10 06:51:48 | [diff] [blame] | 79 | serialization_rules_ = var_serialization_rules; |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 80 | } |
81 | |||||
[email protected] | 5c96602 | 2011-09-13 18:09:37 | [diff] [blame] | 82 | void Dispatcher::OnInvalidMessageReceived() { |
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 83 | } |
84 | |||||
[email protected] | c2932f5e | 2010-11-03 03:22:33 | [diff] [blame] | 85 | } // namespace proxy |
[email protected] | 4d2efd2 | 2011-08-18 21:58:02 | [diff] [blame] | 86 | } // namespace ppapi |