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