| Index: ipc/ipc_forwarding_message_filter.h
|
| diff --git a/ipc/ipc_forwarding_message_filter.h b/ipc/ipc_forwarding_message_filter.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5b404c504675636849627cf45474b154d3a9a954
|
| --- /dev/null
|
| +++ b/ipc/ipc_forwarding_message_filter.h
|
| @@ -0,0 +1,75 @@
|
| +// 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 <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
|
| +// based on routing_id as well as type (see message_ids_to_filter and AddRoute
|
| +// and RemoveRoute).
|
| +//
|
| +// 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,
|
| + const Handler& handler);
|
| +
|
| + // Define the message routes to be filtered.
|
| + void AddRoute(int routing_id);
|
| + void RemoveRoute(int routing_id);
|
| +
|
| + // ChannelProxy::MessageFilter methods:
|
| + virtual bool OnMessageReceived(const Message& message) OVERRIDE;
|
| +
|
| + private:
|
| + friend class ChannelProxy::MessageFilter;
|
| + virtual ~ForwardingMessageFilter();
|
| +
|
| + void ForwardToHandler(const Message& message);
|
| +
|
| + 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_;
|
| + Handler handler_;
|
| +
|
| + // Protects access to routes_.
|
| + base::Lock routes_lock_;
|
| +
|
| + // Indicates the routing_ids for which messages should be filtered.
|
| + std::set<int> routes_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ForwardingMessageFilter);
|
| +};
|
| +
|
| +} // namespace IPC
|
| +
|
| +#endif // IPC_IPC_FORWARDING_MESSAGE_FILTER_H_
|
|
|