resource_message_filter.cc revision 868fa2fe829687343ffae624259930155e16dbd8
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/resource_message_filter.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/message_loop.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/task_runner.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_message.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/ppapi_host.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/resource_host.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace host {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceMessageFilter::ResourceMessageFilter()
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : reply_thread_message_loop_proxy_(
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          base::MessageLoop::current()->message_loop_proxy()),
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      resource_host_(NULL) {}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceMessageFilter::ResourceMessageFilter(
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> reply_thread_message_loop_proxy)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : reply_thread_message_loop_proxy_(reply_thread_message_loop_proxy),
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      resource_host_(NULL) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceMessageFilter::~ResourceMessageFilter() {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceMessageFilter::OnFilterAdded(ResourceHost* resource_host) {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource_host_ = resource_host;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceMessageFilter::OnFilterDestroyed() {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  resource_host_ = NULL;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ResourceMessageFilter::HandleMessage(const IPC::Message& msg,
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          HostMessageContext* context) {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<base::TaskRunner> runner = OverrideTaskRunnerForMessage(msg);
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (runner.get()) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(raymes): We need to make a copy so the context can be used on other
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // threads. It would be better to have a thread-safe refcounted context.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HostMessageContext context_copy = *context;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    runner->PostTask(FROM_HERE, base::Bind(
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &ResourceMessageFilter::DispatchMessage, this, msg, context_copy));
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceMessageFilter::SendReply(const ReplyMessageContext& context,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const IPC::Message& msg) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!reply_thread_message_loop_proxy_->BelongsToCurrentThread()) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    reply_thread_message_loop_proxy_->PostTask(FROM_HERE,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&ResourceMessageFilter::SendReply, this, context, msg));
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (resource_host_)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    resource_host_->SendReply(context, msg);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_refptr<base::TaskRunner>
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ResourceMessageFilter::OverrideTaskRunnerForMessage(const IPC::Message& msg) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return NULL;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ResourceMessageFilter::DispatchMessage(const IPC::Message& msg,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            HostMessageContext context) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunMessageHandlerAndReply(msg, &context);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace host
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace ppapi
78