Index: ipc/ipc_channel_proxy.cc |
diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc |
index d906dbfa204a3263b252a532c9a67a2119359d8b..7c96c83e30c825f140fe842bcb2df55b825b95c5 100644 |
--- a/ipc/ipc_channel_proxy.cc |
+++ b/ipc/ipc_channel_proxy.cc |
@@ -2,140 +2,25 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "ipc/ipc_channel_proxy.h" |
+ |
#include "base/bind.h" |
#include "base/compiler_specific.h" |
-#include "base/debug/trace_event.h" |
#include "base/location.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/single_thread_task_runner.h" |
#include "base/thread_task_runner_handle.h" |
-#include "ipc/ipc_channel_proxy.h" |
#include "ipc/ipc_listener.h" |
#include "ipc/ipc_logging.h" |
#include "ipc/ipc_message_macros.h" |
-#include "ipc/ipc_message_start.h" |
-#include "ipc/ipc_message_utils.h" |
+#include "ipc/message_filter.h" |
+#include "ipc/message_filter_router.h" |
namespace IPC { |
//------------------------------------------------------------------------------ |
-class ChannelProxy::Context::MessageFilterRouter { |
- public: |
- typedef std::vector<MessageFilter*> MessageFilters; |
- |
- MessageFilterRouter() {} |
- ~MessageFilterRouter() {} |
- |
- void AddFilter(MessageFilter* filter) { |
- // Determine if the filter should be applied to all messages, or only |
- // messages of a certain class. |
- std::vector<uint32> supported_message_classes; |
- if (filter->GetSupportedMessageClasses(&supported_message_classes)) { |
- DCHECK(!supported_message_classes.empty()); |
- for (size_t i = 0; i < supported_message_classes.size(); ++i) { |
- const int message_class = supported_message_classes[i]; |
- DCHECK(ValidMessageClass(message_class)); |
- // Safely ignore repeated subscriptions to a given message class for the |
- // current filter being added. |
- if (!message_class_filters_[message_class].empty() && |
- message_class_filters_[message_class].back() == filter) { |
- continue; |
- } |
- message_class_filters_[message_class].push_back(filter); |
- } |
- } else { |
- global_filters_.push_back(filter); |
- } |
- } |
- |
- void RemoveFilter(MessageFilter* filter) { |
- if (RemoveFilter(global_filters_, filter)) |
- return; |
- |
- for (size_t i = 0; i < arraysize(message_class_filters_); ++i) |
- RemoveFilter(message_class_filters_[i], filter); |
- } |
- |
- bool TryFilters(const Message& message) { |
- if (TryFilters(global_filters_, message)) |
- return true; |
- |
- const int message_class = IPC_MESSAGE_CLASS(message); |
- if (!ValidMessageClass(message_class)) |
- return false; |
- |
- return TryFilters(message_class_filters_[message_class], message); |
- } |
- |
- void Clear() { |
- global_filters_.clear(); |
- for (size_t i = 0; i < arraysize(message_class_filters_); ++i) |
- message_class_filters_[i].clear(); |
- } |
- |
- private: |
- static bool TryFilters(MessageFilters& filters, const IPC::Message& message) { |
- for (size_t i = 0; i < filters.size(); ++i) { |
- if (filters[i]->OnMessageReceived(message)) { |
- return true; |
- } |
- } |
- return false; |
- } |
- |
- static bool RemoveFilter(MessageFilters& filters, MessageFilter* filter) { |
- MessageFilters::iterator it = |
- std::remove(filters.begin(), filters.end(), filter); |
- if (it == filters.end()) |
- return false; |
- |
- filters.erase(it, filters.end()); |
- return true; |
- } |
- |
- static bool ValidMessageClass(int message_class) { |
- return message_class >= 0 && message_class < LastIPCMsgStart; |
- } |
- |
- // List of global and selective filters; a given filter will exist in either |
- // |message_global_filters_| OR |message_class_filters_|, but not both. |
- // Note that |message_global_filters_| will be given first offering of any |
- // given message. It's the filter implementer and installer's |
- // responsibility to ensure that a filter is either global or selective to |
- // ensure proper message filtering order. |
- MessageFilters global_filters_; |
- MessageFilters message_class_filters_[LastIPCMsgStart]; |
-}; |
- |
-//------------------------------------------------------------------------------ |
- |
-ChannelProxy::MessageFilter::MessageFilter() {} |
- |
-void ChannelProxy::MessageFilter::OnFilterAdded(Channel* channel) {} |
- |
-void ChannelProxy::MessageFilter::OnFilterRemoved() {} |
- |
-void ChannelProxy::MessageFilter::OnChannelConnected(int32 peer_pid) {} |
- |
-void ChannelProxy::MessageFilter::OnChannelError() {} |
- |
-void ChannelProxy::MessageFilter::OnChannelClosing() {} |
- |
-bool ChannelProxy::MessageFilter::OnMessageReceived(const Message& message) { |
- return false; |
-} |
- |
-bool ChannelProxy::MessageFilter::GetSupportedMessageClasses( |
- std::vector<uint32>* /*supported_message_classes*/) const { |
- return false; |
-} |
- |
-ChannelProxy::MessageFilter::~MessageFilter() {} |
- |
-//------------------------------------------------------------------------------ |
- |
ChannelProxy::Context::Context(Listener* listener, |
base::SingleThreadTaskRunner* ipc_task_runner) |
: listener_task_runner_(base::ThreadTaskRunnerHandle::Get()), |