Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: ipc/message_filter_router.cc

Issue 245443005: Move IPC::MessageFilter and router to a separate file (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix gn build Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ipc/message_filter_router.h ('k') | ppapi/proxy/dispatcher.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2014 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 "ipc/message_filter_router.h"
6
7 #include "ipc/ipc_message_macros.h"
8 #include "ipc/ipc_message_utils.h"
9 #include "ipc/message_filter.h"
10
11 namespace IPC {
12
13 namespace {
14
15 bool TryFiltersImpl(MessageFilterRouter::MessageFilters& filters,
16 const IPC::Message& message) {
17 for (size_t i = 0; i < filters.size(); ++i) {
18 if (filters[i]->OnMessageReceived(message)) {
19 return true;
20 }
21 }
22 return false;
23 }
24
25 bool RemoveFilterImpl(MessageFilterRouter::MessageFilters& filters,
26 MessageFilter* filter) {
27 MessageFilterRouter::MessageFilters::iterator it =
28 std::remove(filters.begin(), filters.end(), filter);
29 if (it == filters.end())
30 return false;
31
32 filters.erase(it, filters.end());
33 return true;
34 }
35
36 bool ValidMessageClass(int message_class) {
37 return message_class >= 0 && message_class < LastIPCMsgStart;
38 }
39
40 } // namespace
41
42 MessageFilterRouter::MessageFilterRouter() {}
43 MessageFilterRouter::~MessageFilterRouter() {}
44
45 void MessageFilterRouter::AddFilter(MessageFilter* filter) {
46 // Determine if the filter should be applied to all messages, or only
47 // messages of a certain class.
48 std::vector<uint32> supported_message_classes;
49 if (filter->GetSupportedMessageClasses(&supported_message_classes)) {
50 DCHECK(!supported_message_classes.empty());
51 for (size_t i = 0; i < supported_message_classes.size(); ++i) {
52 const int message_class = supported_message_classes[i];
53 DCHECK(ValidMessageClass(message_class));
54 // Safely ignore repeated subscriptions to a given message class for the
55 // current filter being added.
56 if (!message_class_filters_[message_class].empty() &&
57 message_class_filters_[message_class].back() == filter) {
58 continue;
59 }
60 message_class_filters_[message_class].push_back(filter);
61 }
62 } else {
63 global_filters_.push_back(filter);
64 }
65 }
66
67 void MessageFilterRouter::RemoveFilter(MessageFilter* filter) {
68 if (RemoveFilterImpl(global_filters_, filter))
69 return;
70
71 for (size_t i = 0; i < arraysize(message_class_filters_); ++i)
72 RemoveFilterImpl(message_class_filters_[i], filter);
73 }
74
75 bool MessageFilterRouter::TryFilters(const Message& message) {
76 if (TryFiltersImpl(global_filters_, message))
77 return true;
78
79 const int message_class = IPC_MESSAGE_CLASS(message);
80 if (!ValidMessageClass(message_class))
81 return false;
82
83 return TryFiltersImpl(message_class_filters_[message_class], message);
84 }
85
86 void MessageFilterRouter::Clear() {
87 global_filters_.clear();
88 for (size_t i = 0; i < arraysize(message_class_filters_); ++i)
89 message_class_filters_[i].clear();
90 }
91
92 } // namespace IPC
OLDNEW
« no previous file with comments | « ipc/message_filter_router.h ('k') | ppapi/proxy/dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698