Fold //ipc/mojo into //ipc.

BUG=604282
NOPRESUBMIT=true

Review-Url: https://codereview.chromium.org/2069803003
Cr-Commit-Position: refs/heads/master@{#401559}
diff --git a/ipc/ipc_message_pipe_reader.h b/ipc/ipc_message_pipe_reader.h
new file mode 100644
index 0000000..b15579d
--- /dev/null
+++ b/ipc/ipc_message_pipe_reader.h
@@ -0,0 +1,124 @@
+// 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 <stdint.h>
+
+#include <memory>
+#include <vector>
+
+#include "base/atomicops.h"
+#include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "base/threading/thread_checker.h"
+#include "ipc/ipc.mojom.h"
+#include "ipc/ipc_message.h"
+#include "mojo/public/cpp/bindings/associated_binding.h"
+#include "mojo/public/cpp/system/core.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+
+namespace IPC {
+namespace internal {
+
+class AsyncHandleWaiter;
+
+// 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.
+//  * Create the subclass instance with a MessagePipeHandle.
+//    The constructor automatically start listening on the pipe.
+//
+// All functions must be called on the IO thread, except for Send(), which can
+// be called on any thread. All |Delegate| functions will be called on the IO
+// thread.
+//
+class MessagePipeReader : public mojom::Channel {
+ public:
+  class Delegate {
+   public:
+    virtual void OnMessageReceived(const Message& message) = 0;
+    virtual void OnPipeError() = 0;
+  };
+
+  // Delay the object deletion using the current message loop.
+  // This is intended to used by MessagePipeReader owners.
+  class DelayedDeleter {
+   public:
+    typedef std::default_delete<MessagePipeReader> DefaultType;
+
+    static void DeleteNow(MessagePipeReader* ptr) { delete ptr; }
+
+    DelayedDeleter() {}
+    explicit DelayedDeleter(const DefaultType&) {}
+    DelayedDeleter& operator=(const DefaultType&) { return *this; }
+
+    void operator()(MessagePipeReader* ptr) const;
+  };
+
+  // Builds a reader that reads messages from |receive_handle| and lets
+  // |delegate| know.
+  //
+  // |pipe| is the message pipe handle corresponding to the channel's master
+  // interface. This is the message pipe underlying both |sender| and
+  // |receiver|.
+  //
+  // Both |sender| and |receiver| must be non-null.
+  //
+  // Note that MessagePipeReader doesn't delete |delegate|.
+  MessagePipeReader(mojo::MessagePipeHandle pipe,
+                    mojom::ChannelAssociatedPtr sender,
+                    mojo::AssociatedInterfaceRequest<mojom::Channel> receiver,
+                    base::ProcessId peer_pid,
+                    Delegate* delegate);
+  ~MessagePipeReader() override;
+
+  // Close and destroy the MessagePipe.
+  void Close();
+
+  // Return true if the MessagePipe is alive.
+  bool IsValid() { return sender_; }
+
+  // Sends an IPC::Message to the other end of the pipe. Safe to call from any
+  // thread.
+  bool Send(std::unique_ptr<Message> message);
+
+  base::ProcessId GetPeerPid() const { return peer_pid_; }
+
+ protected:
+  void OnPipeClosed();
+  void OnPipeError(MojoResult error);
+
+ private:
+  // mojom::Channel:
+  void Receive(mojo::Array<uint8_t> data,
+               mojo::Array<mojom::SerializedHandlePtr> handles) override;
+
+  // |delegate_| is null once the message pipe is closed.
+  Delegate* delegate_;
+  base::ProcessId peer_pid_;
+  mojom::ChannelAssociatedPtr sender_;
+  mojo::AssociatedBinding<mojom::Channel> binding_;
+
+  // Raw message pipe handle and interface ID we use to send legacy IPC messages
+  // over the associated pipe.
+  const uint32_t sender_interface_id_;
+  const mojo::MessagePipeHandle sender_pipe_;
+
+  base::ThreadChecker thread_checker_;
+
+  DISALLOW_COPY_AND_ASSIGN(MessagePipeReader);
+};
+
+}  // namespace internal
+}  // namespace IPC
+
+#endif  // IPC_IPC_MESSAGE_PIPE_READER_H_