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

Side by Side Diff: ipc/ipc_message_filter.cc

Issue 245443005: Move IPC::MessageFilter and router to a separate file (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: small cleanup 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
« ipc/ipc_message_filter.h ('K') | « ipc/ipc_message_filter.h ('k') | no next file » | 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/ipc_message_filter.h"
6
7 #include "base/memory/ref_counted.h"
8 #include "ipc/ipc_channel.h"
9 #include "ipc/ipc_message_macros.h"
10 #include "ipc/ipc_message_utils.h"
11
12 namespace IPC {
13
14 namespace {
15
16 bool TryFiltersImpl(MessageFilterRouter::MessageFilters& filters,
17 const IPC::Message& message) {
18 for (size_t i = 0; i < filters.size(); ++i) {
19 if (filters[i]->OnMessageReceived(message)) {
20 return true;
21 }
22 }
23 return false;
24 }
25
26 bool RemoveFilterImpl(MessageFilterRouter::MessageFilters& filters,
27 MessageFilter* filter) {
28 MessageFilterRouter::MessageFilters::iterator it =
29 std::remove(filters.begin(), filters.end(), filter);
30 if (it == filters.end())
31 return false;
32
33 filters.erase(it, filters.end());
34 return true;
35 }
36
37 bool ValidMessageClass(int message_class) {
38 return message_class >= 0 && message_class < LastIPCMsgStart;
39 }
40
41 } // namespace
42
43 MessageFilter::MessageFilter() {}
44
45 void MessageFilter::OnFilterAdded(Channel* channel) {}
46
47 void MessageFilter::OnFilterRemoved() {}
48
49 void MessageFilter::OnChannelConnected(int32 peer_pid) {}
50
51 void MessageFilter::OnChannelError() {}
52
53 void MessageFilter::OnChannelClosing() {}
54
55 bool MessageFilter::OnMessageReceived(const Message& message) {
56 return false;
57 }
58
59 bool MessageFilter::GetSupportedMessageClasses(
60 std::vector<uint32>* /*supported_message_classes*/) const {
61 return false;
62 }
63
64 MessageFilter::~MessageFilter() {}
65
66 //------------------------------------------------------------------------------
67
68 MessageFilterRouter::MessageFilterRouter() {}
69 MessageFilterRouter::~MessageFilterRouter() {}
70
71 void MessageFilterRouter::AddFilter(MessageFilter* filter) {
72 // Determine if the filter should be applied to all messages, or only
73 // messages of a certain class.
74 std::vector<uint32> supported_message_classes;
75 if (filter->GetSupportedMessageClasses(&supported_message_classes)) {
76 DCHECK(!supported_message_classes.empty());
77 for (size_t i = 0; i < supported_message_classes.size(); ++i) {
78 const int message_class = supported_message_classes[i];
79 DCHECK(ValidMessageClass(message_class));
80 // Safely ignore repeated subscriptions to a given message class for the
81 // current filter being added.
82 if (!message_class_filters_[message_class].empty() &&
83 message_class_filters_[message_class].back() == filter) {
84 continue;
85 }
86 message_class_filters_[message_class].push_back(filter);
87 }
88 } else {
89 global_filters_.push_back(filter);
90 }
91 }
92
93 void MessageFilterRouter::RemoveFilter(MessageFilter* filter) {
94 if (RemoveFilterImpl(global_filters_, filter))
95 return;
96
97 for (size_t i = 0; i < arraysize(message_class_filters_); ++i)
98 RemoveFilterImpl(message_class_filters_[i], filter);
99 }
100
101 bool MessageFilterRouter::TryFilters(const Message& message) {
102 if (TryFiltersImpl(global_filters_, message))
103 return true;
104
105 const int message_class = IPC_MESSAGE_CLASS(message);
106 if (!ValidMessageClass(message_class))
107 return false;
108
109 return TryFiltersImpl(message_class_filters_[message_class], message);
110 }
111
112 void MessageFilterRouter::Clear() {
113 global_filters_.clear();
114 for (size_t i = 0; i < arraysize(message_class_filters_); ++i)
115 message_class_filters_[i].clear();
116 }
117
118 } // namespace IPC
OLDNEW
« ipc/ipc_message_filter.h ('K') | « ipc/ipc_message_filter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698