Fold //ipc/mojo into //ipc.
BUG=604282
NOPRESUBMIT=true
Review-Url: https://codereview.chromium.org/2069803003
Cr-Commit-Position: refs/heads/master@{#401559}
CrOS-Libchrome-Original-Commit: d4aa70da301b278a8713c43a0d8bbf9b75ef6981
diff --git a/ipc/ipc_channel_mojo.h b/ipc/ipc_channel_mojo.h
new file mode 100644
index 0000000..774a82a
--- /dev/null
+++ b/ipc/ipc_channel_mojo.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_CHANNEL_MOJO_H_
+#define IPC_IPC_CHANNEL_MOJO_H_
+
+#include <stdint.h>
+
+#include <memory>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_vector.h"
+#include "base/memory/weak_ptr.h"
+#include "base/synchronization/lock.h"
+#include "base/task_runner.h"
+#include "build/build_config.h"
+#include "ipc/ipc_channel.h"
+#include "ipc/ipc_channel_factory.h"
+#include "ipc/ipc_export.h"
+#include "ipc/ipc_message_pipe_reader.h"
+#include "ipc/ipc_mojo_bootstrap.h"
+#include "mojo/public/cpp/system/core.h"
+
+namespace IPC {
+
+// Mojo-based IPC::Channel implementation over a Mojo message pipe.
+//
+// ChannelMojo builds a Mojo MessagePipe using the provided message pipe
+// |handle| and builds an associated interface for each direction on the
+// channel.
+//
+// TODO(morrita): Add APIs to create extra MessagePipes to let
+// Mojo-based objects talk over this Channel.
+//
+class IPC_EXPORT ChannelMojo
+ : public Channel,
+ public MojoBootstrap::Delegate,
+ public NON_EXPORTED_BASE(internal::MessagePipeReader::Delegate) {
+ public:
+ // Creates a ChannelMojo.
+ static std::unique_ptr<ChannelMojo>
+ Create(mojo::ScopedMessagePipeHandle handle, Mode mode, Listener* listener);
+
+ // Create a factory object for ChannelMojo.
+ // The factory is used to create Mojo-based ChannelProxy family.
+ // |host| must not be null.
+ static std::unique_ptr<ChannelFactory> CreateServerFactory(
+ mojo::ScopedMessagePipeHandle handle);
+
+ static std::unique_ptr<ChannelFactory> CreateClientFactory(
+ mojo::ScopedMessagePipeHandle handle);
+
+ ~ChannelMojo() override;
+
+ // Channel implementation
+ bool Connect() override;
+ void Close() override;
+ bool Send(Message* message) override;
+ bool IsSendThreadSafe() const override;
+ base::ProcessId GetPeerPID() const override;
+ base::ProcessId GetSelfPID() const override;
+
+#if defined(OS_POSIX) && !defined(OS_NACL_SFI)
+ int GetClientFileDescriptor() const override;
+ base::ScopedFD TakeClientFileDescriptor() override;
+#endif // defined(OS_POSIX) && !defined(OS_NACL_SFI)
+
+ // These access protected API of IPC::Message, which has ChannelMojo
+ // as a friend class.
+ static MojoResult WriteToMessageAttachmentSet(
+ mojo::Array<mojom::SerializedHandlePtr> handle_buffer,
+ Message* message);
+ static MojoResult ReadFromMessageAttachmentSet(
+ Message* message,
+ mojo::Array<mojom::SerializedHandlePtr>* handles);
+
+ // MojoBootstrapDelegate implementation
+ void OnPipesAvailable(mojom::ChannelAssociatedPtrInfo send_channel,
+ mojom::ChannelAssociatedRequest receive_channel,
+ int32_t peer_pid) override;
+ void OnBootstrapError() override;
+
+ // MessagePipeReader::Delegate
+ void OnMessageReceived(const Message& message) override;
+ void OnPipeError() override;
+
+ private:
+ ChannelMojo(mojo::ScopedMessagePipeHandle handle,
+ Mode mode,
+ Listener* listener);
+
+ void InitMessageReader(mojom::ChannelAssociatedPtrInfo sender,
+ mojom::ChannelAssociatedRequest receiver,
+ base::ProcessId peer_pid);
+
+ // ChannelMojo needs to kill its MessagePipeReader in delayed manner
+ // because the channel wants to kill these readers during the
+ // notifications invoked by them.
+ typedef internal::MessagePipeReader::DelayedDeleter ReaderDeleter;
+
+ // A TaskRunner which runs tasks on the ChannelMojo's owning thread.
+ scoped_refptr<base::TaskRunner> task_runner_;
+
+ const mojo::MessagePipeHandle pipe_;
+ std::unique_ptr<MojoBootstrap> bootstrap_;
+ Listener* listener_;
+
+ // Guards access to the fields below.
+ mutable base::Lock lock_;
+ std::unique_ptr<internal::MessagePipeReader, ReaderDeleter> message_reader_;
+ std::vector<std::unique_ptr<Message>> pending_messages_;
+ bool waiting_connect_;
+
+ base::WeakPtrFactory<ChannelMojo> weak_factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(ChannelMojo);
+};
+
+} // namespace IPC
+
+#endif // IPC_IPC_CHANNEL_MOJO_H_