summaryrefslogtreecommitdiffstats
path: root/ipc/ipc_forwarding_message_filter.h
diff options
context:
space:
mode:
authornduca@chromium.org <nduca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-20 20:14:27 +0000
committernduca@chromium.org <nduca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-07-20 20:14:27 +0000
commit3051897f2c24104ab458961a350c3a3690cfad4d (patch)
tree5c46f2771ae0da5c201e33a5367d42ecc0128d8a /ipc/ipc_forwarding_message_filter.h
parent801fb650cad03a139ccb2b9d6da668ef8133f2c4 (diff)
downloadchromium_src-3051897f2c24104ab458961a350c3a3690cfad4d.zip
chromium_src-3051897f2c24104ab458961a350c3a3690cfad4d.tar.gz
chromium_src-3051897f2c24104ab458961a350c3a3690cfad4d.tar.bz2
Add IPC::ForwardingMessageFilter.
Review URL: https://chromiumcodereview.appspot.com/10796057 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@147708 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ipc/ipc_forwarding_message_filter.h')
-rw-r--r--ipc/ipc_forwarding_message_filter.h75
1 files changed, 75 insertions, 0 deletions
diff --git a/ipc/ipc_forwarding_message_filter.h b/ipc/ipc_forwarding_message_filter.h
new file mode 100644
index 0000000..5b404c5
--- /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_