xref: /aosp_15_r20/external/cronet/ipc/ipc_message_pipe_reader.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef IPC_IPC_MESSAGE_PIPE_READER_H_
6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_MESSAGE_PIPE_READER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <memory>
11*6777b538SAndroid Build Coastguard Worker #include <vector>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/atomicops.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/component_export.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_checker.h"
21*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc.mojom.h"
22*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message.h"
23*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/bindings/associated_receiver.h"
24*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/bindings/associated_remote.h"
25*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/bindings/generic_pending_associated_receiver.h"
26*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
27*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
28*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/bindings/shared_remote.h"
29*6777b538SAndroid Build Coastguard Worker #include "mojo/public/cpp/system/message_pipe.h"
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker namespace IPC {
32*6777b538SAndroid Build Coastguard Worker namespace internal {
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker // A helper class to handle bytestream directly over mojo::MessagePipe
35*6777b538SAndroid Build Coastguard Worker // in template-method pattern. MessagePipeReader manages the lifetime
36*6777b538SAndroid Build Coastguard Worker // of given MessagePipe and participates the event loop, and
37*6777b538SAndroid Build Coastguard Worker // read the stream and call the client when it is ready.
38*6777b538SAndroid Build Coastguard Worker //
39*6777b538SAndroid Build Coastguard Worker // Each client has to:
40*6777b538SAndroid Build Coastguard Worker //
41*6777b538SAndroid Build Coastguard Worker //  * Provide a subclass implemenation of a specific use of a MessagePipe
42*6777b538SAndroid Build Coastguard Worker //    and implement callbacks.
43*6777b538SAndroid Build Coastguard Worker //  * Create the subclass instance with a MessagePipeHandle.
44*6777b538SAndroid Build Coastguard Worker //    The constructor automatically start listening on the pipe.
45*6777b538SAndroid Build Coastguard Worker //
46*6777b538SAndroid Build Coastguard Worker // All functions must be called on the IO thread, except for Send(), which can
47*6777b538SAndroid Build Coastguard Worker // be called on any thread. All |Delegate| functions will be called on the IO
48*6777b538SAndroid Build Coastguard Worker // thread.
49*6777b538SAndroid Build Coastguard Worker //
COMPONENT_EXPORT(IPC)50*6777b538SAndroid Build Coastguard Worker class COMPONENT_EXPORT(IPC) MessagePipeReader : public mojom::Channel {
51*6777b538SAndroid Build Coastguard Worker  public:
52*6777b538SAndroid Build Coastguard Worker   class Delegate {
53*6777b538SAndroid Build Coastguard Worker    public:
54*6777b538SAndroid Build Coastguard Worker     virtual void OnPeerPidReceived(int32_t peer_pid) = 0;
55*6777b538SAndroid Build Coastguard Worker     virtual void OnMessageReceived(const Message& message) = 0;
56*6777b538SAndroid Build Coastguard Worker     virtual void OnBrokenDataReceived() = 0;
57*6777b538SAndroid Build Coastguard Worker     virtual void OnPipeError() = 0;
58*6777b538SAndroid Build Coastguard Worker     virtual void OnAssociatedInterfaceRequest(
59*6777b538SAndroid Build Coastguard Worker         mojo::GenericPendingAssociatedReceiver receiver) = 0;
60*6777b538SAndroid Build Coastguard Worker   };
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   // Builds a reader that reads messages from |receive_handle| and lets
63*6777b538SAndroid Build Coastguard Worker   // |delegate| know.
64*6777b538SAndroid Build Coastguard Worker   //
65*6777b538SAndroid Build Coastguard Worker   // |pipe| is the message pipe handle corresponding to the channel's primary
66*6777b538SAndroid Build Coastguard Worker   // interface. This is the message pipe underlying both |sender| and
67*6777b538SAndroid Build Coastguard Worker   // |receiver|.
68*6777b538SAndroid Build Coastguard Worker   //
69*6777b538SAndroid Build Coastguard Worker   // Both |sender| and |receiver| must be non-null.
70*6777b538SAndroid Build Coastguard Worker   //
71*6777b538SAndroid Build Coastguard Worker   // Note that MessagePipeReader doesn't delete |delegate|.
72*6777b538SAndroid Build Coastguard Worker   MessagePipeReader(mojo::MessagePipeHandle pipe,
73*6777b538SAndroid Build Coastguard Worker                     mojo::PendingAssociatedRemote<mojom::Channel> sender,
74*6777b538SAndroid Build Coastguard Worker                     mojo::PendingAssociatedReceiver<mojom::Channel> receiver,
75*6777b538SAndroid Build Coastguard Worker                     scoped_refptr<base::SequencedTaskRunner> task_runner,
76*6777b538SAndroid Build Coastguard Worker                     Delegate* delegate);
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   MessagePipeReader(const MessagePipeReader&) = delete;
79*6777b538SAndroid Build Coastguard Worker   MessagePipeReader& operator=(const MessagePipeReader&) = delete;
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   ~MessagePipeReader() override;
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   void FinishInitializationOnIOThread(base::ProcessId self_pid);
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker   // Close and destroy the MessagePipe.
86*6777b538SAndroid Build Coastguard Worker   void Close();
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker   // Return true if the MessagePipe is alive.
89*6777b538SAndroid Build Coastguard Worker   bool IsValid() { return sender_.is_bound(); }
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker   // Sends an IPC::Message to the other end of the pipe. Safe to call from any
92*6777b538SAndroid Build Coastguard Worker   // thread.
93*6777b538SAndroid Build Coastguard Worker   bool Send(std::unique_ptr<Message> message);
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   // Requests an associated interface from the other end of the pipe.
96*6777b538SAndroid Build Coastguard Worker   void GetRemoteInterface(mojo::GenericPendingAssociatedReceiver receiver);
97*6777b538SAndroid Build Coastguard Worker 
98*6777b538SAndroid Build Coastguard Worker   mojo::AssociatedRemote<mojom::Channel>& sender() { return sender_; }
99*6777b538SAndroid Build Coastguard Worker   mojom::Channel& thread_safe_sender() { return thread_safe_sender_->proxy(); }
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker  protected:
102*6777b538SAndroid Build Coastguard Worker   void OnPipeClosed();
103*6777b538SAndroid Build Coastguard Worker   void OnPipeError(MojoResult error);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker  private:
106*6777b538SAndroid Build Coastguard Worker   // mojom::Channel:
107*6777b538SAndroid Build Coastguard Worker   void SetPeerPid(int32_t peer_pid) override;
108*6777b538SAndroid Build Coastguard Worker   void Receive(MessageView message_view) override;
109*6777b538SAndroid Build Coastguard Worker   void GetAssociatedInterface(
110*6777b538SAndroid Build Coastguard Worker       mojo::GenericPendingAssociatedReceiver receiver) override;
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker   void ForwardMessage(mojo::Message message);
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker   // |delegate_| is null once the message pipe is closed.
115*6777b538SAndroid Build Coastguard Worker   raw_ptr<Delegate> delegate_;
116*6777b538SAndroid Build Coastguard Worker   mojo::AssociatedRemote<mojom::Channel> sender_;
117*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<mojo::ThreadSafeForwarder<mojom::Channel>>
118*6777b538SAndroid Build Coastguard Worker       thread_safe_sender_;
119*6777b538SAndroid Build Coastguard Worker   mojo::AssociatedReceiver<mojom::Channel> receiver_;
120*6777b538SAndroid Build Coastguard Worker   base::ThreadChecker thread_checker_;
121*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<MessagePipeReader> weak_ptr_factory_{this};
122*6777b538SAndroid Build Coastguard Worker };
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker }  // namespace internal
125*6777b538SAndroid Build Coastguard Worker }  // namespace IPC
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker #endif  // IPC_IPC_MESSAGE_PIPE_READER_H_
128