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

Side by Side Diff: ipc/ipc_channel_reader.h

Issue 2473993003: Delete IPC::ChannelPosix, IPC::ChannelWin and IPC::AttachmentBroker. (Closed)
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « ipc/ipc_channel_posix_unittest.cc ('k') | ipc/ipc_channel_reader.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef IPC_IPC_CHANNEL_READER_H_ 5 #ifndef IPC_IPC_CHANNEL_READER_H_
6 #define IPC_IPC_CHANNEL_READER_H_ 6 #define IPC_IPC_CHANNEL_READER_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <set> 10 #include <set>
11 11
12 #include "base/gtest_prod_util.h" 12 #include "base/gtest_prod_util.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/memory/scoped_vector.h" 14 #include "base/memory/scoped_vector.h"
15 #include "ipc/attachment_broker.h"
16 #include "ipc/brokerable_attachment.h" 15 #include "ipc/brokerable_attachment.h"
17 #include "ipc/ipc_channel.h" 16 #include "ipc/ipc_channel.h"
18 #include "ipc/ipc_export.h" 17 #include "ipc/ipc_export.h"
19 18
20 namespace IPC { 19 namespace IPC {
21 namespace internal { 20 namespace internal {
22 21
23 // This class provides common pipe reading functionality for the 22 // This class provides common pipe reading functionality for the
24 // platform-specific IPC channel implementations. 23 // platform-specific IPC channel implementations.
25 // 24 //
26 // It does the common input buffer management and message dispatch, while the 25 // It does the common input buffer management and message dispatch, while the
27 // platform-specific parts provide the pipe management through a virtual 26 // platform-specific parts provide the pipe management through a virtual
28 // interface implemented on a per-platform basis. 27 // interface implemented on a per-platform basis.
29 // 28 //
30 // Note that there is no "writer" corresponding to this because the code for 29 // Note that there is no "writer" corresponding to this because the code for
31 // writing to the channel is much simpler and has very little common 30 // writing to the channel is much simpler and has very little common
32 // functionality that would benefit from being factored out. If we add 31 // functionality that would benefit from being factored out. If we add
33 // something like that in the future, it would be more appropriate to add it 32 // something like that in the future, it would be more appropriate to add it
34 // here (and rename appropriately) rather than writing a different class. 33 // here (and rename appropriately) rather than writing a different class.
35 class IPC_EXPORT ChannelReader : public SupportsAttachmentBrokering, 34 class IPC_EXPORT ChannelReader {
36 public AttachmentBroker::Observer {
37 public: 35 public:
38 explicit ChannelReader(Listener* listener); 36 explicit ChannelReader(Listener* listener);
39 virtual ~ChannelReader(); 37 virtual ~ChannelReader();
40 38
41 void set_listener(Listener* listener) { listener_ = listener; } 39 void set_listener(Listener* listener) { listener_ = listener; }
42 40
43 // This type is returned by ProcessIncomingMessages to indicate the effect of 41 // This type is returned by ProcessIncomingMessages to indicate the effect of
44 // the method. 42 // the method.
45 enum DispatchState { 43 enum DispatchState {
46 // All messages were successfully dispatched, or there were no messages to 44 // All messages were successfully dispatched, or there were no messages to
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 virtual bool GetNonBrokeredAttachments(Message* msg) = 0; 106 virtual bool GetNonBrokeredAttachments(Message* msg) = 0;
109 107
110 // Performs post-dispatch checks. Called when all input buffers are empty, 108 // Performs post-dispatch checks. Called when all input buffers are empty,
111 // though there could be more data ready to be read from the OS. 109 // though there could be more data ready to be read from the OS.
112 virtual bool DidEmptyInputBuffers() = 0; 110 virtual bool DidEmptyInputBuffers() = 0;
113 111
114 // Handles internal messages, like the hello message sent on channel startup. 112 // Handles internal messages, like the hello message sent on channel startup.
115 virtual void HandleInternalMessage(const Message& msg) = 0; 113 virtual void HandleInternalMessage(const Message& msg) = 0;
116 114
117 // Exposed for testing purposes only. 115 // Exposed for testing purposes only.
118 ScopedVector<Message>* get_queued_messages() { return &queued_messages_; }
119
120 // Exposed for testing purposes only.
121 virtual void DispatchMessage(Message* m); 116 virtual void DispatchMessage(Message* m);
122 117
123 // Get the process ID for the sender of the message. 118 // Get the process ID for the sender of the message.
124 virtual base::ProcessId GetSenderPID() = 0; 119 virtual base::ProcessId GetSenderPID() = 0;
125 120
126 // Whether the channel is an endpoint of attachment brokering.
127 virtual bool IsAttachmentBrokerEndpoint() = 0;
128
129 private: 121 private:
130 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, AttachmentAlreadyBrokered); 122 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, AttachmentAlreadyBrokered);
131 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, AttachmentNotYetBrokered); 123 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, AttachmentNotYetBrokered);
132 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, ResizeOverflowBuffer); 124 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, ResizeOverflowBuffer);
133 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, InvalidMessageSize); 125 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, InvalidMessageSize);
134 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, TrimBuffer); 126 FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, TrimBuffer);
135 127
136 using AttachmentIdSet = std::set<BrokerableAttachment::AttachmentId>;
137 using AttachmentIdVector = std::vector<BrokerableAttachment::AttachmentId>;
138
139 // Takes the data received from the IPC channel and translates it into 128 // Takes the data received from the IPC channel and translates it into
140 // Messages. Complete messages are passed to HandleTranslatedMessage(). 129 // Messages. Complete messages are passed to HandleTranslatedMessage().
141 // Returns |false| on unrecoverable error. 130 // Returns |false| on unrecoverable error.
142 bool TranslateInputData(const char* input_data, int input_data_len); 131 bool TranslateInputData(const char* input_data, int input_data_len);
143 132
144 // Internal messages and messages bound for the attachment broker are 133 // Internal messages and messages bound for the attachment broker are
145 // immediately dispatched. Other messages are passed to 134 // immediately dispatched. Other messages are passed to
146 // HandleExternalMessage(). 135 // HandleExternalMessage().
147 // Returns |false| on unrecoverable error. 136 // Returns |false| on unrecoverable error.
148 bool HandleTranslatedMessage(Message* translated_message, 137 bool HandleTranslatedMessage(Message* translated_message);
149 const AttachmentIdVector& attachment_ids);
150 138
151 // Populates the message with brokered and non-brokered attachments. If 139 // Populates the message with brokered and non-brokered attachments. If
152 // possible, the message is immediately dispatched. Otherwise, a deep copy of 140 // possible, the message is immediately dispatched. Otherwise, a deep copy of
153 // the message is added to |queued_messages_|. |blocked_ids_| are updated if 141 // the message is added to |queued_messages_|. |blocked_ids_| are updated if
154 // necessary. 142 // necessary.
155 bool HandleExternalMessage(Message* external_message, 143 bool HandleExternalMessage(Message* external_message);
156 const AttachmentIdVector& attachment_ids);
157 144
158 // If there was a dispatch error, informs |listener_|. 145 // If there was a dispatch error, informs |listener_|.
159 void HandleDispatchError(const Message& message); 146 void HandleDispatchError(const Message& message);
160 147
161 // Attachment broker messages should be dispatched out of band, since there
162 // are no ordering restrictions on them, and they may be required to dispatch
163 // the messages waiting in |queued_messages_|.
164 // Returns true if the attachment broker handled |message|.
165 bool DispatchAttachmentBrokerMessage(const Message& message);
166
167 // Dispatches messages from queued_messages_ to listeners. Successfully
168 // dispatched messages are removed from queued_messages_.
169 DispatchState DispatchMessages();
170
171 // Attempts to fill in the brokerable attachments of |msg| with information
172 // from the Attachment Broker.
173 // Returns the set of ids that are still waiting to be brokered.
174 AttachmentIdSet GetBrokeredAttachments(Message* msg);
175
176 // AttachmentBroker::Observer overrides.
177 void ReceivedBrokerableAttachmentWithId(
178 const BrokerableAttachment::AttachmentId& id) override;
179
180 // This class should observe the attachment broker if and only if blocked_ids_
181 // is not empty.
182 void StartObservingAttachmentBroker();
183 void StopObservingAttachmentBroker();
184
185 // Checks that |size| is a valid message size. Has side effects if it's not. 148 // Checks that |size| is a valid message size. Has side effects if it's not.
186 bool CheckMessageSize(size_t size); 149 bool CheckMessageSize(size_t size);
187 150
188 Listener* listener_; 151 Listener* listener_;
189 152
190 // We read from the pipe into this buffer. Managed by DispatchInputData, do 153 // We read from the pipe into this buffer. Managed by DispatchInputData, do
191 // not access directly outside that function. 154 // not access directly outside that function.
192 char input_buf_[Channel::kReadBufferSize]; 155 char input_buf_[Channel::kReadBufferSize];
193 156
194 // Large messages that span multiple pipe buffers, get built-up using 157 // Large messages that span multiple pipe buffers, get built-up using
195 // this buffer. 158 // this buffer.
196 std::string input_overflow_buf_; 159 std::string input_overflow_buf_;
197 160
198 // Maximum overflow buffer size, see Channel::kMaximumReadBufferSize. 161 // Maximum overflow buffer size, see Channel::kMaximumReadBufferSize.
199 // This is not a constant because we update it to reflect the reality 162 // This is not a constant because we update it to reflect the reality
200 // of std::string::reserve() implementation. 163 // of std::string::reserve() implementation.
201 size_t max_input_buffer_size_; 164 size_t max_input_buffer_size_;
202 165
203 // These messages are waiting to be dispatched. If this vector is non-empty,
204 // then the front Message must be blocked on receiving an attachment from the
205 // AttachmentBroker.
206 ScopedVector<Message> queued_messages_;
207
208 // If the next message to be processed is blocked by the broker, then this
209 // set contains the AttachmentIds that are needed to unblock the message.
210 AttachmentIdSet blocked_ids_;
211
212 DISALLOW_COPY_AND_ASSIGN(ChannelReader); 166 DISALLOW_COPY_AND_ASSIGN(ChannelReader);
213 }; 167 };
214 168
215 } // namespace internal 169 } // namespace internal
216 } // namespace IPC 170 } // namespace IPC
217 171
218 #endif // IPC_IPC_CHANNEL_READER_H_ 172 #endif // IPC_IPC_CHANNEL_READER_H_
OLDNEW
« no previous file with comments | « ipc/ipc_channel_posix_unittest.cc ('k') | ipc/ipc_channel_reader.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698