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

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: Fixing Mac build failure 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..b3cec8c468788ac9fe228dac5e692522b916f5a3
--- /dev/null
+++ b/ipc/mojo/ipc_message_pipe_reader.h
@@ -0,0 +1,101 @@
+// Copyright (c) 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
+ // 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.
+ 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
+ // event from the reader
+ //
+ virtual void OnMessageArrived() {}
+ virtual void OnPipeClosed() {}
+ virtual void OnPipeError(MojoResult error) {}
+
+ protected:
+ std::vector<char> data_buffer_;
+ 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_;
+};
+
+} // namespace internal
+} // namespace IPC
+
+#endif // IPC_IPC_MESSAGE_PIPE_READER_H_

Powered by Google App Engine
This is Rietveld 408576698