resource_message_filter.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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/host/resource_message_filter.h" 6 7#include "base/message_loop.h" 8#include "base/message_loop_proxy.h" 9#include "base/task_runner.h" 10#include "ipc/ipc_message.h" 11#include "ppapi/c/pp_errors.h" 12#include "ppapi/host/ppapi_host.h" 13#include "ppapi/host/resource_host.h" 14 15namespace ppapi { 16namespace host { 17 18ResourceMessageFilter::ResourceMessageFilter() 19 : reply_thread_message_loop_proxy_( 20 base::MessageLoop::current()->message_loop_proxy()), 21 resource_host_(NULL) {} 22 23ResourceMessageFilter::ResourceMessageFilter( 24 scoped_refptr<base::MessageLoopProxy> reply_thread_message_loop_proxy) 25 : reply_thread_message_loop_proxy_(reply_thread_message_loop_proxy), 26 resource_host_(NULL) { 27} 28 29ResourceMessageFilter::~ResourceMessageFilter() { 30} 31 32void ResourceMessageFilter::OnFilterAdded(ResourceHost* resource_host) { 33 resource_host_ = resource_host; 34} 35 36void ResourceMessageFilter::OnFilterDestroyed() { 37 resource_host_ = NULL; 38} 39 40bool ResourceMessageFilter::HandleMessage(const IPC::Message& msg, 41 HostMessageContext* context) { 42 scoped_refptr<base::TaskRunner> runner = OverrideTaskRunnerForMessage(msg); 43 if (runner) { 44 // TODO(raymes): We need to make a copy so the context can be used on other 45 // threads. It would be better to have a thread-safe refcounted context. 46 HostMessageContext context_copy = *context; 47 runner->PostTask(FROM_HERE, base::Bind( 48 &ResourceMessageFilter::DispatchMessage, this, msg, context_copy)); 49 return true; 50 } 51 52 return false; 53} 54 55void ResourceMessageFilter::SendReply(const ReplyMessageContext& context, 56 const IPC::Message& msg) { 57 if (!reply_thread_message_loop_proxy_->BelongsToCurrentThread()) { 58 reply_thread_message_loop_proxy_->PostTask(FROM_HERE, 59 base::Bind(&ResourceMessageFilter::SendReply, this, context, msg)); 60 return; 61 } 62 if (resource_host_) 63 resource_host_->SendReply(context, msg); 64} 65 66scoped_refptr<base::TaskRunner> 67ResourceMessageFilter::OverrideTaskRunnerForMessage(const IPC::Message& msg) { 68 return NULL; 69} 70 71void ResourceMessageFilter::DispatchMessage(const IPC::Message& msg, 72 HostMessageContext context) { 73 RunMessageHandlerAndReply(msg, &context); 74} 75 76} // namespace host 77} // namespace ppapi 78