| Index: ipc/ipc_channel_posix.h
|
| diff --git a/ipc/ipc_channel_posix.h b/ipc/ipc_channel_posix.h
|
| index 7d26e9b168cc6b4d245dbfc1fa76bca92d5a37ba..028e5d934ccc06814b5139e06dea9f774a919c17 100644
|
| --- a/ipc/ipc_channel_posix.h
|
| +++ b/ipc/ipc_channel_posix.h
|
| @@ -16,6 +16,7 @@
|
|
|
| #include "base/message_loop.h"
|
| #include "ipc/file_descriptor_set_posix.h"
|
| +#include "ipc/ipc_channel_reader.h"
|
|
|
| #if !defined(OS_MACOSX)
|
| // On Linux, the seccomp sandbox makes it very expensive to call
|
| @@ -47,7 +48,8 @@
|
|
|
| namespace IPC {
|
|
|
| -class Channel::ChannelImpl : public MessageLoopForIO::Watcher {
|
| +class Channel::ChannelImpl : public internal::ChannelReader,
|
| + public MessageLoopForIO::Watcher {
|
| public:
|
| // Mirror methods of Channel, see ipc_channel.h for description.
|
| ChannelImpl(const IPC::ChannelHandle& channel_handle, Mode mode,
|
| @@ -55,7 +57,6 @@ class Channel::ChannelImpl : public MessageLoopForIO::Watcher {
|
| virtual ~ChannelImpl();
|
| bool Connect();
|
| void Close();
|
| - void set_listener(Listener* listener) { listener_ = listener; }
|
| bool Send(Message* message);
|
| int GetClientFileDescriptor();
|
| int TakeClientFileDescriptor();
|
| @@ -70,38 +71,22 @@ class Channel::ChannelImpl : public MessageLoopForIO::Watcher {
|
| #endif // OS_LINUX
|
|
|
| private:
|
| - enum ReadState { READ_SUCCEEDED, READ_FAILED, READ_PENDING };
|
| -
|
| bool CreatePipe(const IPC::ChannelHandle& channel_handle);
|
|
|
| - bool ProcessIncomingMessages();
|
| bool ProcessOutgoingMessages();
|
|
|
| bool AcceptConnection();
|
| void ClosePipeOnError();
|
| int GetHelloMessageProcId();
|
| void QueueHelloMessage();
|
| - bool IsHelloMessage(const Message* m) const;
|
|
|
| - // Populates the given buffer with data from the pipe.
|
| - //
|
| - // Returns the state of the read. On READ_SUCCESS, the number of bytes
|
| - // read will be placed into |*bytes_read| (which can be less than the
|
| - // buffer size). On READ_FAILED, the channel will be closed.
|
| - //
|
| - // If the return value is READ_PENDING, it means that there was no data
|
| - // ready for reading. The implementation is then responsible for either
|
| - // calling AsyncReadComplete with the number of bytes read into the
|
| - // buffer, or ProcessIncomingMessages to try the read again (depending
|
| - // on whether the platform's async I/O is "try again" or "write
|
| - // asynchronously into your buffer").
|
| - ReadState ReadData(char* buffer, int buffer_len, int* bytes_read);
|
| -
|
| - // 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);
|
| + // ChannelReader implementation.
|
| + virtual ReadState ReadData(char* buffer,
|
| + int buffer_len,
|
| + int* bytes_read) OVERRIDE;
|
| + virtual bool WillDispatchInputMessage(Message* msg) OVERRIDE;
|
| + virtual bool DidEmptyInputBuffers() OVERRIDE;
|
| + virtual void HandleHelloMessage(const Message& msg) OVERRIDE;
|
|
|
| #if defined(IPC_USES_READWRITE)
|
| // Reads the next message from the fd_pipe_ and appends them to the
|
| @@ -111,17 +96,6 @@ class Channel::ChannelImpl : public MessageLoopForIO::Watcher {
|
| bool ReadFileDescriptorsFromFDPipe();
|
| #endif
|
|
|
| - // Loads the required file desciptors into the given message. Returns true
|
| - // on success. False means a fatal channel error.
|
| - //
|
| - // This will read from the input_fds_ and read more handles from the FD
|
| - // pipe if necessary.
|
| - bool WillDispatchInputMessage(Message* msg);
|
| -
|
| - // Performs post-dispatch checks. Called when all input buffers are empty,
|
| - // though there could be more data ready to be read from the OS.
|
| - bool DidEmptyInputBuffers();
|
| -
|
| // Finds the set of file descriptors in the given message. On success,
|
| // appends the descriptors to the input_fds_ member and returns true
|
| //
|
| @@ -133,9 +107,6 @@ class Channel::ChannelImpl : public MessageLoopForIO::Watcher {
|
| // used to clean up handles in error conditions to avoid leaking the handles.
|
| void ClearInputFDs();
|
|
|
| - // Handles the first message sent over the pipe which contains setup info.
|
| - void HandleHelloMessage(const Message& msg);
|
| -
|
| // MessageLoopForIO::Watcher implementation.
|
| virtual void OnFileCanReadWithoutBlocking(int fd) OVERRIDE;
|
| virtual void OnFileCanWriteWithoutBlocking(int fd) OVERRIDE;
|
| @@ -178,19 +149,9 @@ class Channel::ChannelImpl : public MessageLoopForIO::Watcher {
|
| // the pipe. On POSIX it's used as a key in a local map of file descriptors.
|
| std::string pipe_name_;
|
|
|
| - Listener* listener_;
|
| -
|
| // Messages to be sent are queued here.
|
| std::queue<Message*> output_queue_;
|
|
|
| - // We read from the pipe into this buffer. Managed by DispatchInputData, do
|
| - // not access directly outside that function.
|
| - char input_buf_[Channel::kReadBufferSize];
|
| -
|
| - // Large messages that span multiple pipe buffers, get built-up using
|
| - // this buffer.
|
| - std::string input_overflow_buf_;
|
| -
|
| // We assume a worst case: kReadBufferSize bytes of messages, where each
|
| // message has no payload and a full complement of descriptors.
|
| static const size_t kMaxReadFDs =
|
|
|