Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ppapi / proxy / dispatcher.cc
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.
4
5 #include "ppapi/proxy/dispatcher.h"
6
7 #include <string.h>  // For memset.
8
9 #include <map>
10
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"
16
17 namespace IPC {
18 class MessageFilter;
19 }
20
21 namespace ppapi {
22 namespace proxy {
23
24 Dispatcher::Dispatcher(PP_GetInterface_Func local_get_interface,
25                        const PpapiPermissions& permissions)
26     : local_get_interface_(local_get_interface),
27       permissions_(permissions) {
28 }
29
30 Dispatcher::~Dispatcher() {
31 }
32
33 InterfaceProxy* Dispatcher::GetInterfaceProxy(ApiID id) {
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 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()
54   // happens there.
55   channel()->AddFilter(filter.get());
56 }
57
58 bool Dispatcher::OnMessageReceived(const IPC::Message& msg) {
59   if (msg.routing_id() <= 0 || msg.routing_id() >= API_ID_COUNT) {
60     OnInvalidMessageReceived();
61     return true;
62   }
63
64   InterfaceProxy* proxy = GetInterfaceProxy(
65       static_cast<ApiID>(msg.routing_id()));
66   if (!proxy) {
67     NOTREACHED();
68     return true;
69   }
70   return proxy->OnMessageReceived(msg);
71 }
72
73 void Dispatcher::SetSerializationRules(
74     VarSerializationRules* var_serialization_rules) {
75   serialization_rules_ = var_serialization_rules;
76 }
77
78 void Dispatcher::OnInvalidMessageReceived() {
79 }
80
81 }  // namespace proxy
82 }  // namespace ppapi