| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ppapi/proxy/dispatcher.h" |
| |
| #include <string.h> // For memset. |
| |
| #include <map> |
| |
| #include "base/compiler_specific.h" |
| #include "base/logging.h" |
| #include "base/memory/singleton.h" |
| #include "ppapi/proxy/ppapi_messages.h" |
| #include "ppapi/proxy/var_serialization_rules.h" |
| |
| namespace IPC { |
| class MessageFilter; |
| } |
| |
| namespace ppapi { |
| namespace proxy { |
| |
| Dispatcher::Dispatcher(PP_GetInterface_Func local_get_interface, |
| const PpapiPermissions& permissions) |
| : local_get_interface_(local_get_interface), |
| permissions_(permissions) { |
| } |
| |
| Dispatcher::~Dispatcher() { |
| } |
| |
| InterfaceProxy* Dispatcher::GetInterfaceProxy(ApiID id) { |
| InterfaceProxy* proxy = proxies_[id].get(); |
| if (!proxy) { |
| // Handle the first time for a given API by creating the proxy for it. |
| InterfaceProxy::Factory factory = |
| InterfaceList::GetInstance()->GetFactoryForID(id); |
| if (!factory) { |
| NOTREACHED(); |
| return NULL; |
| } |
| proxy = factory(this); |
| DCHECK(proxy); |
| proxies_[id].reset(proxy); |
| } |
| return proxy; |
| } |
| |
| void Dispatcher::AddIOThreadMessageFilter(IPC::MessageFilter* filter) { |
| // Our filter is refcounted. The channel will call the destruct method on the |
| // filter when the channel is done with it, so the corresponding Release() |
| // happens there. |
| channel()->AddFilter(filter); |
| } |
| |
| bool Dispatcher::OnMessageReceived(const IPC::Message& msg) { |
| if (msg.routing_id() <= 0 || msg.routing_id() >= API_ID_COUNT) { |
| OnInvalidMessageReceived(); |
| return true; |
| } |
| |
| InterfaceProxy* proxy = GetInterfaceProxy( |
| static_cast<ApiID>(msg.routing_id())); |
| if (!proxy) { |
| NOTREACHED(); |
| return true; |
| } |
| return proxy->OnMessageReceived(msg); |
| } |
| |
| void Dispatcher::SetSerializationRules( |
| VarSerializationRules* var_serialization_rules) { |
| serialization_rules_ = var_serialization_rules; |
| } |
| |
| void Dispatcher::OnInvalidMessageReceived() { |
| } |
| |
| } // namespace proxy |
| } // namespace ppapi |