// 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. #ifndef IPC_IPC_FORWARDING_MESSAGE_FILTER_H_ #define IPC_IPC_FORWARDING_MESSAGE_FILTER_H_ #include <map> #include <set> #include "base/bind.h" #include "base/callback_forward.h" #include "base/synchronization/lock.h" #include "base/task_runner.h" #include "ipc/ipc_channel_proxy.h" namespace IPC { // This class can be used to intercept routed messages and // deliver them to a different task runner than they would otherwise // be sent. Messages are filtered based on type. To route these messages, // add a MessageRouter to the handler. // // The user of this class implements ForwardingMessageFilter::Client, // which will receive the intercepted messages, on the specified target thread. class IPC_EXPORT ForwardingMessageFilter : public ChannelProxy::MessageFilter { public: // The handler is invoked on the thread associated with // |target_task_runner| with messages that were intercepted by this filter. typedef base::Callback<void(const Message&)> Handler; // This filter will intercept |message_ids_to_filter| and post // them to the provided |target_task_runner|, where they will be given // to |handler|. // // The caller must ensure that |handler| outlives the lifetime of the filter. ForwardingMessageFilter( const uint32* message_ids_to_filter, size_t num_message_ids_to_filter, base::TaskRunner* target_task_runner); // Define the message routes to be filtered. void AddRoute(int routing_id, const Handler& handler); void RemoveRoute(int routing_id); // ChannelProxy::MessageFilter methods: virtual bool OnMessageReceived(const Message& message) OVERRIDE; private: friend class ChannelProxy::MessageFilter; virtual ~ForwardingMessageFilter(); std::set<int> message_ids_to_filter_; // The handler_ only gets Run on the thread corresponding to // target_task_runner_. scoped_refptr<base::TaskRunner> target_task_runner_; // Protects access to routes_. base::Lock handlers_lock_; // Indicates the routing_ids for which messages should be filtered. std::map<int, Handler> handlers_; DISALLOW_COPY_AND_ASSIGN(ForwardingMessageFilter); }; } // namespace IPC #endif // IPC_IPC_FORWARDING_MESSAGE_FILTER_H_