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

Unified Diff: ipc/mojo/ipc_message_pipe_reader.h

Issue 382333002: Introduce ChannelMojo (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Another build fix Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
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_

Powered by Google App Engine
This is Rietveld 408576698