123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- // 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/component_export.h"
- #include "base/memory/raw_ptr.h"
- #include "base/memory/weak_ptr.h"
- #include "base/process/process_handle.h"
- #include "base/threading/thread_checker.h"
- #include "ipc/ipc.mojom.h"
- #include "ipc/ipc_message.h"
- #include "mojo/public/cpp/bindings/associated_receiver.h"
- #include "mojo/public/cpp/bindings/associated_remote.h"
- #include "mojo/public/cpp/bindings/generic_pending_associated_receiver.h"
- #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
- #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
- #include "mojo/public/cpp/bindings/shared_remote.h"
- #include "mojo/public/cpp/system/core.h"
- #include "mojo/public/cpp/system/message_pipe.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.
- // * 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 COMPONENT_EXPORT(IPC) MessagePipeReader : public mojom::Channel {
- public:
- class Delegate {
- public:
- virtual void OnPeerPidReceived(int32_t peer_pid) = 0;
- virtual void OnMessageReceived(const Message& message) = 0;
- virtual void OnBrokenDataReceived() = 0;
- virtual void OnPipeError() = 0;
- virtual void OnAssociatedInterfaceRequest(
- mojo::GenericPendingAssociatedReceiver receiver) = 0;
- };
- // Builds a reader that reads messages from |receive_handle| and lets
- // |delegate| know.
- //
- // |pipe| is the message pipe handle corresponding to the channel's primary
- // 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,
- mojo::PendingAssociatedRemote<mojom::Channel> sender,
- mojo::PendingAssociatedReceiver<mojom::Channel> receiver,
- scoped_refptr<base::SequencedTaskRunner> task_runner,
- Delegate* delegate);
- MessagePipeReader(const MessagePipeReader&) = delete;
- MessagePipeReader& operator=(const MessagePipeReader&) = delete;
- ~MessagePipeReader() override;
- void FinishInitializationOnIOThread(base::ProcessId self_pid);
- // Close and destroy the MessagePipe.
- void Close();
- // Return true if the MessagePipe is alive.
- bool IsValid() { return sender_.is_bound(); }
- // Sends an IPC::Message to the other end of the pipe. Safe to call from any
- // thread.
- bool Send(std::unique_ptr<Message> message);
- // Requests an associated interface from the other end of the pipe.
- void GetRemoteInterface(mojo::GenericPendingAssociatedReceiver receiver);
- mojo::AssociatedRemote<mojom::Channel>& sender() { return sender_; }
- mojom::Channel& thread_safe_sender() { return thread_safe_sender_->proxy(); }
- protected:
- void OnPipeClosed();
- void OnPipeError(MojoResult error);
- private:
- // mojom::Channel:
- void SetPeerPid(int32_t peer_pid) override;
- void Receive(MessageView message_view) override;
- void GetAssociatedInterface(
- mojo::GenericPendingAssociatedReceiver receiver) override;
- void ForwardMessage(mojo::Message message);
- // |delegate_| is null once the message pipe is closed.
- raw_ptr<Delegate> delegate_;
- mojo::AssociatedRemote<mojom::Channel> sender_;
- std::unique_ptr<mojo::ThreadSafeForwarder<mojom::Channel>>
- thread_safe_sender_;
- mojo::AssociatedReceiver<mojom::Channel> receiver_;
- base::ThreadChecker thread_checker_;
- base::WeakPtrFactory<MessagePipeReader> weak_ptr_factory_{this};
- };
- } // namespace internal
- } // namespace IPC
- #endif // IPC_IPC_MESSAGE_PIPE_READER_H_
|