Chromium Code Reviews| Index: ipc/ipc_channel_reader.h |
| diff --git a/ipc/ipc_channel_reader.h b/ipc/ipc_channel_reader.h |
| index 02006d94ce681391d700b5da13c4f96bfae583b1..fe206b04922362dae30223e975c16649d233d2a9 100644 |
| --- a/ipc/ipc_channel_reader.h |
| +++ b/ipc/ipc_channel_reader.h |
| @@ -5,8 +5,13 @@ |
| #ifndef IPC_IPC_CHANNEL_READER_H_ |
| #define IPC_IPC_CHANNEL_READER_H_ |
| +#include <set> |
| + |
| #include "base/basictypes.h" |
| +#include "base/gtest_prod_util.h" |
| +#include "base/memory/scoped_vector.h" |
| #include "ipc/attachment_broker.h" |
| +#include "ipc/brokerable_attachment.h" |
| #include "ipc/ipc_channel.h" |
| #include "ipc/ipc_export.h" |
| @@ -25,24 +30,37 @@ namespace internal { |
| // functionality that would benefit from being factored out. If we add |
| // something like that in the future, it would be more appropriate to add it |
| // here (and rename appropriately) rather than writing a different class. |
| -class ChannelReader : public SupportsAttachmentBrokering { |
| +class IPC_EXPORT ChannelReader : public SupportsAttachmentBrokering, |
| + public AttachmentBroker::Observer { |
| public: |
| explicit ChannelReader(Listener* listener); |
| virtual ~ChannelReader(); |
| void set_listener(Listener* listener) { listener_ = listener; } |
| + // This type is returned by ProcessIncomingMessages to indicate the effect of |
| + // the method. |
| + enum DispatchState { |
| + // All messages were successfully dispatched, or there were no messages to |
| + // dispatch. |
| + DISPATCH_FINISHED, |
| + // There was a channel error. |
| + DISPATCH_ERROR, |
| + // Dispatching messages is blocked on receiving more information from the |
| + // broker. |
| + DISPATCH_WAITING_ON_BROKER, |
| + }; |
| + |
| // Call to process messages received from the IPC connection and dispatch |
| - // them. Returns false on channel error. True indicates that everything |
| - // succeeded, although there may not have been any messages processed. |
| - bool ProcessIncomingMessages(); |
| + // them. |
| + DispatchState ProcessIncomingMessages(); |
| // Handles asynchronously read data. |
| // |
| // Optionally call this after returning READ_PENDING from ReadData to |
| // indicate that buffer was filled with the given number of bytes of |
| // data. See ReadData for more. |
| - bool AsyncReadComplete(int bytes_read); |
| + DispatchState AsyncReadComplete(int bytes_read); |
| // Returns true if the given message is internal to the IPC implementation, |
| // like the "hello" message sent on channel set-up. |
| @@ -76,7 +94,12 @@ class ChannelReader : public SupportsAttachmentBrokering { |
| // |
| // This will read from the input_fds_ and read more handles from the FD |
| // pipe if necessary. |
| - virtual bool WillDispatchInputMessage(Message* msg) = 0; |
| + virtual bool ShouldDispatchInputMessage(Message* msg) = 0; |
| + |
| + // Overridden by subclasses to get attachments that are sent alongside the IPC |
| + // channel (as opposed to through a broker). |
| + // Returns true on success. False means a fatal channel error. |
| + virtual bool GetNonBrokeredAttachments(Message* msg) = 0; |
| // Performs post-dispatch checks. Called when all input buffers are empty, |
| // though there could be more data ready to be read from the OS. |
| @@ -85,12 +108,39 @@ class ChannelReader : public SupportsAttachmentBrokering { |
| // Handles internal messages, like the hello message sent on channel startup. |
| virtual void HandleInternalMessage(const Message& msg) = 0; |
| + // Exposed for testing purposes only. |
|
Tom Sepez
2015/07/13 18:28:47
nit: maybe these go into a subclass in the test fi
erikchen
2015/07/17 18:44:01
The Google C++ style guide indicates that data mem
|
| + ScopedVector<Message>* get_queued_messages() { return &queued_messages_; } |
| + |
| + // Exposed for testing purposes only. |
| + virtual void DispatchMessage(Message* m); |
| + |
| private: |
| - // Takes the given data received from the IPC channel and dispatches any |
| - // fully completed messages. |
| - // |
| - // Returns true on success. False means channel error. |
| - bool DispatchInputData(const char* input_data, int input_data_len); |
| + FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, AttachmentAlreadyBrokered); |
| + FRIEND_TEST_ALL_PREFIXES(ChannelReaderTest, AttachmentNotYetBrokered); |
| + |
| + typedef std::set<BrokerableAttachment::AttachmentId> AttachmentIdSet; |
| + |
| + // Takes the given data received from the IPC channel, translates it into |
| + // Messages, and puts them in queued_messages_. |
| + bool TranslateInputData(const char* input_data, int input_data_len); |
| + |
| + // Dispatches messages from queued_messages_ to listeners. Successfully |
| + // dispatched messages are removed from queued_messages_. |
| + DispatchState DispatchMessages(); |
| + |
| + // Attempts to fill in the brokerable attachments of |msg| with information |
| + // from the Attachment Broker. |
| + // Returns the set of ids that are still waiting to be brokered. |
| + AttachmentIdSet GetBrokeredAttachments(Message* msg); |
| + |
| + // AttachmentBroker::Observer overrides. |
| + void ReceivedBrokerableAttachmentWithId( |
| + const BrokerableAttachment::AttachmentId& id) override; |
| + |
| + // This class should observe the attachment broker if and only if blocked_ids_ |
| + // is not empty. |
| + void StartObservingAttachmentBroker(); |
| + void StopObservingAttachmentBroker(); |
| Listener* listener_; |
| @@ -102,6 +152,15 @@ class ChannelReader : public SupportsAttachmentBrokering { |
| // this buffer. |
| std::string input_overflow_buf_; |
| + // These messages are waiting to be dispatched. If this vector is non-empty, |
| + // then the front Message must be blocked on receiving an attachment from the |
| + // AttachmentBroker. |
| + ScopedVector<Message> queued_messages_; |
| + |
| + // If the next message to be processed is blocked by the broker, then this |
| + // set contains the AttachmentIds that are needed to unblock the message. |
| + AttachmentIdSet blocked_ids_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(ChannelReader); |
| }; |