xref: /aosp_15_r20/external/cronet/ipc/ipc_channel_mojo.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_CHANNEL_MOJO_H_
6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_CHANNEL_MOJO_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 <map>
11*6777b538SAndroid Build Coastguard Worker #include <memory>
12*6777b538SAndroid Build Coastguard Worker #include <string>
13*6777b538SAndroid Build Coastguard Worker #include <vector>
14*6777b538SAndroid Build Coastguard Worker 
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/ref_counted.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/lock.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/task/task_runner.h"
22*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
23*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc.mojom.h"
24*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_channel.h"
25*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_channel_factory.h"
26*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_message_pipe_reader.h"
27*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_mojo_bootstrap.h"
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker namespace IPC {
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker class UrgentMessageObserver;
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker // Mojo-based IPC::Channel implementation over a Mojo message pipe.
34*6777b538SAndroid Build Coastguard Worker //
35*6777b538SAndroid Build Coastguard Worker // ChannelMojo builds a Mojo MessagePipe using the provided message pipe
36*6777b538SAndroid Build Coastguard Worker // |handle| and builds an associated interface for each direction on the
37*6777b538SAndroid Build Coastguard Worker // channel.
38*6777b538SAndroid Build Coastguard Worker //
39*6777b538SAndroid Build Coastguard Worker // TODO(morrita): Add APIs to create extra MessagePipes to let
40*6777b538SAndroid Build Coastguard Worker //                Mojo-based objects talk over this Channel.
41*6777b538SAndroid Build Coastguard Worker //
COMPONENT_EXPORT(IPC)42*6777b538SAndroid Build Coastguard Worker class COMPONENT_EXPORT(IPC) ChannelMojo
43*6777b538SAndroid Build Coastguard Worker     : public Channel,
44*6777b538SAndroid Build Coastguard Worker       public Channel::AssociatedInterfaceSupport,
45*6777b538SAndroid Build Coastguard Worker       public internal::MessagePipeReader::Delegate {
46*6777b538SAndroid Build Coastguard Worker  public:
47*6777b538SAndroid Build Coastguard Worker   // Creates a ChannelMojo.
48*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<ChannelMojo> Create(
49*6777b538SAndroid Build Coastguard Worker       mojo::ScopedMessagePipeHandle handle,
50*6777b538SAndroid Build Coastguard Worker       Mode mode,
51*6777b538SAndroid Build Coastguard Worker       Listener* listener,
52*6777b538SAndroid Build Coastguard Worker       const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
53*6777b538SAndroid Build Coastguard Worker       const scoped_refptr<base::SingleThreadTaskRunner>& proxy_task_runner);
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   // Create a factory object for ChannelMojo.
56*6777b538SAndroid Build Coastguard Worker   // The factory is used to create Mojo-based ChannelProxy family.
57*6777b538SAndroid Build Coastguard Worker   // |host| must not be null.
58*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<ChannelFactory> CreateServerFactory(
59*6777b538SAndroid Build Coastguard Worker       mojo::ScopedMessagePipeHandle handle,
60*6777b538SAndroid Build Coastguard Worker       const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
61*6777b538SAndroid Build Coastguard Worker       const scoped_refptr<base::SingleThreadTaskRunner>& proxy_task_runner);
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<ChannelFactory> CreateClientFactory(
64*6777b538SAndroid Build Coastguard Worker       mojo::ScopedMessagePipeHandle handle,
65*6777b538SAndroid Build Coastguard Worker       const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
66*6777b538SAndroid Build Coastguard Worker       const scoped_refptr<base::SingleThreadTaskRunner>& proxy_task_runner);
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker   ChannelMojo(const ChannelMojo&) = delete;
69*6777b538SAndroid Build Coastguard Worker   ChannelMojo& operator=(const ChannelMojo&) = delete;
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   ~ChannelMojo() override;
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   // Channel implementation
74*6777b538SAndroid Build Coastguard Worker   bool Connect() override;
75*6777b538SAndroid Build Coastguard Worker   void Pause() override;
76*6777b538SAndroid Build Coastguard Worker   void Unpause(bool flush) override;
77*6777b538SAndroid Build Coastguard Worker   void Flush() override;
78*6777b538SAndroid Build Coastguard Worker   void Close() override;
79*6777b538SAndroid Build Coastguard Worker   bool Send(Message* message) override;
80*6777b538SAndroid Build Coastguard Worker   Channel::AssociatedInterfaceSupport* GetAssociatedInterfaceSupport() override;
81*6777b538SAndroid Build Coastguard Worker   void SetUrgentMessageObserver(UrgentMessageObserver* observer) override;
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   // These access protected API of IPC::Message, which has ChannelMojo
84*6777b538SAndroid Build Coastguard Worker   // as a friend class.
85*6777b538SAndroid Build Coastguard Worker   static MojoResult WriteToMessageAttachmentSet(
86*6777b538SAndroid Build Coastguard Worker       std::optional<std::vector<mojo::native::SerializedHandlePtr>> handles,
87*6777b538SAndroid Build Coastguard Worker       Message* message);
88*6777b538SAndroid Build Coastguard Worker   static MojoResult ReadFromMessageAttachmentSet(
89*6777b538SAndroid Build Coastguard Worker       Message* message,
90*6777b538SAndroid Build Coastguard Worker       std::optional<std::vector<mojo::native::SerializedHandlePtr>>* handles);
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker   // MessagePipeReader::Delegate
93*6777b538SAndroid Build Coastguard Worker   void OnPeerPidReceived(int32_t peer_pid) override;
94*6777b538SAndroid Build Coastguard Worker   void OnMessageReceived(const Message& message) override;
95*6777b538SAndroid Build Coastguard Worker   void OnBrokenDataReceived() override;
96*6777b538SAndroid Build Coastguard Worker   void OnPipeError() override;
97*6777b538SAndroid Build Coastguard Worker   void OnAssociatedInterfaceRequest(
98*6777b538SAndroid Build Coastguard Worker       mojo::GenericPendingAssociatedReceiver receiver) override;
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker  private:
101*6777b538SAndroid Build Coastguard Worker   ChannelMojo(
102*6777b538SAndroid Build Coastguard Worker       mojo::ScopedMessagePipeHandle handle,
103*6777b538SAndroid Build Coastguard Worker       Mode mode,
104*6777b538SAndroid Build Coastguard Worker       Listener* listener,
105*6777b538SAndroid Build Coastguard Worker       const scoped_refptr<base::SingleThreadTaskRunner>& ipc_task_runner,
106*6777b538SAndroid Build Coastguard Worker       const scoped_refptr<base::SingleThreadTaskRunner>& proxy_task_runner);
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   void ForwardMessage(mojo::Message message);
109*6777b538SAndroid Build Coastguard Worker 
110*6777b538SAndroid Build Coastguard Worker   // Channel::AssociatedInterfaceSupport:
111*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<mojo::ThreadSafeForwarder<mojom::Channel>>
112*6777b538SAndroid Build Coastguard Worker   CreateThreadSafeChannel() override;
113*6777b538SAndroid Build Coastguard Worker   void AddGenericAssociatedInterface(
114*6777b538SAndroid Build Coastguard Worker       const std::string& name,
115*6777b538SAndroid Build Coastguard Worker       const GenericAssociatedInterfaceFactory& factory) override;
116*6777b538SAndroid Build Coastguard Worker   void GetRemoteAssociatedInterface(
117*6777b538SAndroid Build Coastguard Worker       mojo::GenericPendingAssociatedReceiver receiver) override;
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker   void FinishConnectOnIOThread();
120*6777b538SAndroid Build Coastguard Worker 
121*6777b538SAndroid Build Coastguard Worker   base::WeakPtr<ChannelMojo> weak_ptr_;
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker   // A TaskRunner which runs tasks on the ChannelMojo's owning thread.
124*6777b538SAndroid Build Coastguard Worker   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   const mojo::MessagePipeHandle pipe_;
127*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<MojoBootstrap> bootstrap_;
128*6777b538SAndroid Build Coastguard Worker   raw_ptr<Listener, DanglingUntriaged> listener_;
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<internal::MessagePipeReader> message_reader_;
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker   base::Lock associated_interface_lock_;
133*6777b538SAndroid Build Coastguard Worker   std::map<std::string, GenericAssociatedInterfaceFactory>
134*6777b538SAndroid Build Coastguard Worker       associated_interfaces_;
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<ChannelMojo> weak_factory_{this};
137*6777b538SAndroid Build Coastguard Worker };
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker }  // namespace IPC
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker #endif  // IPC_IPC_CHANNEL_MOJO_H_
142