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
17namespace IPC {
18class MessageFilter;
19}
20
21namespace ppapi {
22namespace proxy {
23
24Dispatcher::Dispatcher(PP_GetInterface_Func local_get_interface,
25                       const PpapiPermissions& permissions)
26    : local_get_interface_(local_get_interface),
27      permissions_(permissions) {
28}
29
30Dispatcher::~Dispatcher() {
31}
32
33InterfaceProxy* 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
50void 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
58bool 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
73void Dispatcher::SetSerializationRules(
74    VarSerializationRules* var_serialization_rules) {
75  serialization_rules_ = var_serialization_rules;
76}
77
78void Dispatcher::OnInvalidMessageReceived() {
79}
80
81}  // namespace proxy
82}  // namespace ppapi
83