Chromium Code Reviews| Index: ipc/mojo/ipc_message_pipe_reader.h |
| diff --git a/ipc/mojo/ipc_message_pipe_reader.h b/ipc/mojo/ipc_message_pipe_reader.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7feca0eae70be5358572db0dc13a8c4e172f3d1d |
| --- /dev/null |
| +++ b/ipc/mojo/ipc_message_pipe_reader.h |
| @@ -0,0 +1,101 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef IPC_IPC_MESSAGE_PIPE_READER_H_ |
| +#define IPC_IPC_MESSAGE_PIPE_READER_H_ |
| + |
| +#include <vector> |
| + |
| +#include "base/memory/scoped_ptr.h" |
| +#include "mojo/public/c/environment/async_waiter.h" |
| +#include "mojo/public/cpp/system/core.h" |
| + |
| +namespace IPC { |
| +namespace internal { |
| + |
| +// A helper class to handle bytestream directly over mojo::MessagePipe |
| +// in template-method pattern. MessagePipeReader manages the lifetime |
| +// of given MessagePipe and participates the event loop, and |
| +// read the stream and call the client when it is ready. |
| +// |
| +// Each client has to: |
| +// |
| +// * Provide a subclass implemenation of a specific use of a MessagePipe |
| +// and implement callbacks. |
| +// * SetPipe() to activate the reader. |
| +// |
| +// MessageReader has to be used in IO thread. It isn't thread-safe. |
| +// |
| +class MessagePipeReader { |
| + public: |
| + // Delay the object deletion using the current message loop. |
| + // This is intended to used by MessagePipeReader owners. |
| + class DelayedDeleter { |
| + public: |
| + typedef base::DefaultDeleter<MessagePipeReader> DefaultType; |
| + |
| + static void DeleteNow(MessagePipeReader* ptr) { delete ptr; } |
| + |
| + DelayedDeleter() {} |
| + DelayedDeleter(const DefaultType&) {} |
| + DelayedDeleter& operator=(const DefaultType&) { return *this; } |
| + |
| + void operator()(MessagePipeReader* ptr) const; |
| + }; |
| + |
| + MessagePipeReader(); |
| + virtual ~MessagePipeReader(); |
| + |
| + MojoHandle handle() const { return pipe_.get().value(); } |
| + |
| + // Returns received bytes. |
| + const std::vector<char>& data_buffer() const { |
| + return data_buffer_; |
| + } |
| + |
| + // Returns received handles. The lifetime should be taken over by |
|
viettrungluu
2014/07/17 15:11:54
If that's the case, maybe you should have a method
Hajime Morrita
2014/07/17 18:32:13
Done.
|
| + // the client before next OnMessageArrived(). They will leak |
| + // otherwise. |
| + const std::vector<MojoHandle>& handle_buffer() const { |
| + return handle_buffer_; |
| + } |
| + |
| + // The the pipe and participate to current event loop with the pipe. |
|
viettrungluu
2014/07/17 15:11:54
I can't make sense of this comment.
Hajime Morrita
2014/07/17 18:32:12
Turned out that this could be part of the construc
|
| + void SetPipe(mojo::ScopedMessagePipeHandle handle); |
| + |
| + // Close and destroy the MessagePipe. |
| + void Close(); |
| + // Close the mesage pipe with notifying the client with the error. |
| + void CloseWithError(MojoResult error); |
| + // Return true if the MessagePipe is alive. |
| + bool IsValid() { return pipe_.is_valid(); } |
| + |
| + // |
| + // The client have to implment these callback to get the readiness |
|
viettrungluu
2014/07/17 15:11:54
Why not just leave these be pure virtual?
Hajime Morrita
2014/07/17 18:32:12
Done.
|
| + // event from the reader |
| + // |
| + virtual void OnMessageArrived() {} |
|
viettrungluu
2014/07/17 15:11:54
May "received" is a better name than "arrived"?
Hajime Morrita
2014/07/17 18:32:12
Done.
|
| + virtual void OnPipeClosed() {} |
| + virtual void OnPipeError(MojoResult error) {} |
| + |
| + protected: |
|
viettrungluu
2014/07/17 15:11:54
Why do you need protected members (which are frown
Hajime Morrita
2014/07/17 18:32:12
My bad :-( Fixed.
|
| + std::vector<char> data_buffer_; |
|
viettrungluu
2014/07/17 15:11:54
nit: extra space
Hajime Morrita
2014/07/17 18:32:13
Done.
|
| + std::vector<MojoHandle> handle_buffer_; |
| + |
| + private: |
| + static void InvokePipeIsReady(void* closure, MojoResult result); |
| + |
| + MojoResult ReadMessageBytes(); |
| + void PipeIsReady(MojoResult wait_result); |
| + void StartWaiting(); |
| + void StopWaiting(); |
| + |
| + MojoAsyncWaitID pipe_wait_id_; |
| + mojo::ScopedMessagePipeHandle pipe_; |
| +}; |
|
viettrungluu
2014/07/17 15:11:54
DISALLOW_COPY_AND_ASSIGN
Hajime Morrita
2014/07/17 18:32:12
Done.
|
| + |
| +} // namespace internal |
| +} // namespace IPC |
| + |
| +#endif // IPC_IPC_MESSAGE_PIPE_READER_H_ |