1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ppapi/proxy/dispatcher.h"
7 #include <string.h> // For memset.
11 #include "base/compiler_specific.h"
12 #include "base/logging.h"
13 #include "base/memory/singleton.h"
14 #include "ppapi/proxy/ppapi_messages.h"
15 #include "ppapi/proxy/var_serialization_rules.h"
24 Dispatcher::Dispatcher(PP_GetInterface_Func local_get_interface
,
25 const PpapiPermissions
& permissions
)
26 : local_get_interface_(local_get_interface
),
27 permissions_(permissions
) {
30 Dispatcher::~Dispatcher() {
33 InterfaceProxy
* Dispatcher::GetInterfaceProxy(ApiID id
) {
34 InterfaceProxy
* proxy
= proxies_
[id
].get();
36 // Handle the first time for a given API by creating the proxy for it.
37 InterfaceProxy::Factory factory
=
38 InterfaceList::GetInstance()->GetFactoryForID(id
);
43 proxy
= factory(this);
45 proxies_
[id
].reset(proxy
);
50 void Dispatcher::AddIOThreadMessageFilter(
51 scoped_refptr
<IPC::MessageFilter
> filter
) {
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()
55 channel()->AddFilter(filter
.get());
58 bool Dispatcher::OnMessageReceived(const IPC::Message
& msg
) {
59 if (msg
.routing_id() <= 0 || msg
.routing_id() >= API_ID_COUNT
) {
60 OnInvalidMessageReceived();
64 InterfaceProxy
* proxy
= GetInterfaceProxy(
65 static_cast<ApiID
>(msg
.routing_id()));
70 return proxy
->OnMessageReceived(msg
);
73 void Dispatcher::SetSerializationRules(
74 VarSerializationRules
* var_serialization_rules
) {
75 serialization_rules_
= var_serialization_rules
;
78 void Dispatcher::OnInvalidMessageReceived() {