xref: /aosp_15_r20/external/libchrome/mojo/public/cpp/system/invitation.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "mojo/public/cpp/system/invitation.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include "base/numerics/safe_conversions.h"
8*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
9*635a8641SAndroid Build Coastguard Worker #include "mojo/public/c/system/invitation.h"
10*635a8641SAndroid Build Coastguard Worker #include "mojo/public/c/system/platform_handle.h"
11*635a8641SAndroid Build Coastguard Worker #include "mojo/public/cpp/system/platform_handle.h"
12*635a8641SAndroid Build Coastguard Worker 
13*635a8641SAndroid Build Coastguard Worker namespace mojo {
14*635a8641SAndroid Build Coastguard Worker 
15*635a8641SAndroid Build Coastguard Worker namespace {
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker static constexpr base::StringPiece kIsolatedPipeName = {"\0\0\0\0", 4};
18*635a8641SAndroid Build Coastguard Worker 
ProcessHandleToMojoProcessHandle(base::ProcessHandle target_process,MojoPlatformProcessHandle * handle)19*635a8641SAndroid Build Coastguard Worker void ProcessHandleToMojoProcessHandle(base::ProcessHandle target_process,
20*635a8641SAndroid Build Coastguard Worker                                       MojoPlatformProcessHandle* handle) {
21*635a8641SAndroid Build Coastguard Worker   handle->struct_size = sizeof(*handle);
22*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
23*635a8641SAndroid Build Coastguard Worker   handle->value =
24*635a8641SAndroid Build Coastguard Worker       static_cast<uint64_t>(reinterpret_cast<uintptr_t>(target_process));
25*635a8641SAndroid Build Coastguard Worker #else
26*635a8641SAndroid Build Coastguard Worker   handle->value = static_cast<uint64_t>(target_process);
27*635a8641SAndroid Build Coastguard Worker #endif
28*635a8641SAndroid Build Coastguard Worker }
29*635a8641SAndroid Build Coastguard Worker 
PlatformHandleToTransportEndpoint(PlatformHandle platform_handle,MojoPlatformHandle * endpoint_handle,MojoInvitationTransportEndpoint * endpoint)30*635a8641SAndroid Build Coastguard Worker void PlatformHandleToTransportEndpoint(
31*635a8641SAndroid Build Coastguard Worker     PlatformHandle platform_handle,
32*635a8641SAndroid Build Coastguard Worker     MojoPlatformHandle* endpoint_handle,
33*635a8641SAndroid Build Coastguard Worker     MojoInvitationTransportEndpoint* endpoint) {
34*635a8641SAndroid Build Coastguard Worker   PlatformHandle::ToMojoPlatformHandle(std::move(platform_handle),
35*635a8641SAndroid Build Coastguard Worker                                        endpoint_handle);
36*635a8641SAndroid Build Coastguard Worker   CHECK_NE(endpoint_handle->type, MOJO_PLATFORM_HANDLE_TYPE_INVALID);
37*635a8641SAndroid Build Coastguard Worker 
38*635a8641SAndroid Build Coastguard Worker   endpoint->struct_size = sizeof(*endpoint);
39*635a8641SAndroid Build Coastguard Worker   endpoint->num_platform_handles = 1;
40*635a8641SAndroid Build Coastguard Worker   endpoint->platform_handles = endpoint_handle;
41*635a8641SAndroid Build Coastguard Worker }
42*635a8641SAndroid Build Coastguard Worker 
RunErrorCallback(uintptr_t context,const MojoProcessErrorDetails * details)43*635a8641SAndroid Build Coastguard Worker void RunErrorCallback(uintptr_t context,
44*635a8641SAndroid Build Coastguard Worker                       const MojoProcessErrorDetails* details) {
45*635a8641SAndroid Build Coastguard Worker   auto* callback = reinterpret_cast<ProcessErrorCallback*>(context);
46*635a8641SAndroid Build Coastguard Worker   std::string error_message;
47*635a8641SAndroid Build Coastguard Worker   if (details->error_message) {
48*635a8641SAndroid Build Coastguard Worker     error_message =
49*635a8641SAndroid Build Coastguard Worker         std::string(details->error_message, details->error_message_length - 1);
50*635a8641SAndroid Build Coastguard Worker     callback->Run(error_message);
51*635a8641SAndroid Build Coastguard Worker   } else if (details->flags & MOJO_PROCESS_ERROR_FLAG_DISCONNECTED) {
52*635a8641SAndroid Build Coastguard Worker     delete callback;
53*635a8641SAndroid Build Coastguard Worker   }
54*635a8641SAndroid Build Coastguard Worker }
55*635a8641SAndroid Build Coastguard Worker 
SendInvitation(ScopedInvitationHandle invitation,base::ProcessHandle target_process,PlatformHandle endpoint_handle,MojoInvitationTransportType transport_type,MojoSendInvitationFlags flags,const ProcessErrorCallback & error_callback,base::StringPiece isolated_connection_name)56*635a8641SAndroid Build Coastguard Worker void SendInvitation(ScopedInvitationHandle invitation,
57*635a8641SAndroid Build Coastguard Worker                     base::ProcessHandle target_process,
58*635a8641SAndroid Build Coastguard Worker                     PlatformHandle endpoint_handle,
59*635a8641SAndroid Build Coastguard Worker                     MojoInvitationTransportType transport_type,
60*635a8641SAndroid Build Coastguard Worker                     MojoSendInvitationFlags flags,
61*635a8641SAndroid Build Coastguard Worker                     const ProcessErrorCallback& error_callback,
62*635a8641SAndroid Build Coastguard Worker                     base::StringPiece isolated_connection_name) {
63*635a8641SAndroid Build Coastguard Worker   MojoPlatformProcessHandle process_handle;
64*635a8641SAndroid Build Coastguard Worker   ProcessHandleToMojoProcessHandle(target_process, &process_handle);
65*635a8641SAndroid Build Coastguard Worker 
66*635a8641SAndroid Build Coastguard Worker   MojoPlatformHandle platform_handle;
67*635a8641SAndroid Build Coastguard Worker   MojoInvitationTransportEndpoint endpoint;
68*635a8641SAndroid Build Coastguard Worker   PlatformHandleToTransportEndpoint(std::move(endpoint_handle),
69*635a8641SAndroid Build Coastguard Worker                                     &platform_handle, &endpoint);
70*635a8641SAndroid Build Coastguard Worker   endpoint.type = transport_type;
71*635a8641SAndroid Build Coastguard Worker 
72*635a8641SAndroid Build Coastguard Worker   MojoProcessErrorHandler error_handler = nullptr;
73*635a8641SAndroid Build Coastguard Worker   uintptr_t error_handler_context = 0;
74*635a8641SAndroid Build Coastguard Worker   if (error_callback) {
75*635a8641SAndroid Build Coastguard Worker     error_handler = &RunErrorCallback;
76*635a8641SAndroid Build Coastguard Worker 
77*635a8641SAndroid Build Coastguard Worker     // NOTE: The allocated callback is effectively owned by the error handler,
78*635a8641SAndroid Build Coastguard Worker     // which will delete it on the final invocation for this context (i.e.
79*635a8641SAndroid Build Coastguard Worker     // process disconnection).
80*635a8641SAndroid Build Coastguard Worker     error_handler_context =
81*635a8641SAndroid Build Coastguard Worker         reinterpret_cast<uintptr_t>(new ProcessErrorCallback(error_callback));
82*635a8641SAndroid Build Coastguard Worker   }
83*635a8641SAndroid Build Coastguard Worker 
84*635a8641SAndroid Build Coastguard Worker   MojoSendInvitationOptions options;
85*635a8641SAndroid Build Coastguard Worker   options.struct_size = sizeof(options);
86*635a8641SAndroid Build Coastguard Worker   options.flags = flags;
87*635a8641SAndroid Build Coastguard Worker   if (flags & MOJO_SEND_INVITATION_FLAG_ISOLATED) {
88*635a8641SAndroid Build Coastguard Worker     options.isolated_connection_name = isolated_connection_name.data();
89*635a8641SAndroid Build Coastguard Worker     options.isolated_connection_name_length =
90*635a8641SAndroid Build Coastguard Worker         static_cast<uint32_t>(isolated_connection_name.size());
91*635a8641SAndroid Build Coastguard Worker   }
92*635a8641SAndroid Build Coastguard Worker   MojoResult result =
93*635a8641SAndroid Build Coastguard Worker       MojoSendInvitation(invitation.get().value(), &process_handle, &endpoint,
94*635a8641SAndroid Build Coastguard Worker                          error_handler, error_handler_context, &options);
95*635a8641SAndroid Build Coastguard Worker   // If successful, the invitation handle is already closed for us.
96*635a8641SAndroid Build Coastguard Worker   if (result == MOJO_RESULT_OK)
97*635a8641SAndroid Build Coastguard Worker     ignore_result(invitation.release());
98*635a8641SAndroid Build Coastguard Worker }
99*635a8641SAndroid Build Coastguard Worker 
100*635a8641SAndroid Build Coastguard Worker }  // namespace
101*635a8641SAndroid Build Coastguard Worker 
OutgoingInvitation()102*635a8641SAndroid Build Coastguard Worker OutgoingInvitation::OutgoingInvitation() {
103*635a8641SAndroid Build Coastguard Worker   MojoHandle invitation_handle;
104*635a8641SAndroid Build Coastguard Worker   MojoResult result = MojoCreateInvitation(nullptr, &invitation_handle);
105*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(result, MOJO_RESULT_OK);
106*635a8641SAndroid Build Coastguard Worker 
107*635a8641SAndroid Build Coastguard Worker   handle_.reset(InvitationHandle(invitation_handle));
108*635a8641SAndroid Build Coastguard Worker }
109*635a8641SAndroid Build Coastguard Worker 
110*635a8641SAndroid Build Coastguard Worker OutgoingInvitation::OutgoingInvitation(OutgoingInvitation&& other) = default;
111*635a8641SAndroid Build Coastguard Worker 
112*635a8641SAndroid Build Coastguard Worker OutgoingInvitation::~OutgoingInvitation() = default;
113*635a8641SAndroid Build Coastguard Worker 
114*635a8641SAndroid Build Coastguard Worker OutgoingInvitation& OutgoingInvitation::operator=(OutgoingInvitation&& other) =
115*635a8641SAndroid Build Coastguard Worker     default;
116*635a8641SAndroid Build Coastguard Worker 
AttachMessagePipe(base::StringPiece name)117*635a8641SAndroid Build Coastguard Worker ScopedMessagePipeHandle OutgoingInvitation::AttachMessagePipe(
118*635a8641SAndroid Build Coastguard Worker     base::StringPiece name) {
119*635a8641SAndroid Build Coastguard Worker   DCHECK(!name.empty());
120*635a8641SAndroid Build Coastguard Worker   DCHECK(base::IsValueInRangeForNumericType<uint32_t>(name.size()));
121*635a8641SAndroid Build Coastguard Worker   MojoHandle message_pipe_handle;
122*635a8641SAndroid Build Coastguard Worker   MojoResult result = MojoAttachMessagePipeToInvitation(
123*635a8641SAndroid Build Coastguard Worker       handle_.get().value(), name.data(), static_cast<uint32_t>(name.size()),
124*635a8641SAndroid Build Coastguard Worker       nullptr, &message_pipe_handle);
125*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(MOJO_RESULT_OK, result);
126*635a8641SAndroid Build Coastguard Worker   return ScopedMessagePipeHandle(MessagePipeHandle(message_pipe_handle));
127*635a8641SAndroid Build Coastguard Worker }
128*635a8641SAndroid Build Coastguard Worker 
AttachMessagePipe(uint64_t name)129*635a8641SAndroid Build Coastguard Worker ScopedMessagePipeHandle OutgoingInvitation::AttachMessagePipe(uint64_t name) {
130*635a8641SAndroid Build Coastguard Worker   return AttachMessagePipe(
131*635a8641SAndroid Build Coastguard Worker       base::StringPiece(reinterpret_cast<const char*>(&name), sizeof(name)));
132*635a8641SAndroid Build Coastguard Worker }
133*635a8641SAndroid Build Coastguard Worker 
ExtractMessagePipe(base::StringPiece name)134*635a8641SAndroid Build Coastguard Worker ScopedMessagePipeHandle OutgoingInvitation::ExtractMessagePipe(
135*635a8641SAndroid Build Coastguard Worker     base::StringPiece name) {
136*635a8641SAndroid Build Coastguard Worker   DCHECK(!name.empty());
137*635a8641SAndroid Build Coastguard Worker   DCHECK(base::IsValueInRangeForNumericType<uint32_t>(name.size()));
138*635a8641SAndroid Build Coastguard Worker   MojoHandle message_pipe_handle;
139*635a8641SAndroid Build Coastguard Worker   MojoResult result = MojoExtractMessagePipeFromInvitation(
140*635a8641SAndroid Build Coastguard Worker       handle_.get().value(), name.data(), static_cast<uint32_t>(name.size()),
141*635a8641SAndroid Build Coastguard Worker       nullptr, &message_pipe_handle);
142*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(MOJO_RESULT_OK, result);
143*635a8641SAndroid Build Coastguard Worker   return ScopedMessagePipeHandle(MessagePipeHandle(message_pipe_handle));
144*635a8641SAndroid Build Coastguard Worker }
145*635a8641SAndroid Build Coastguard Worker 
ExtractMessagePipe(uint64_t name)146*635a8641SAndroid Build Coastguard Worker ScopedMessagePipeHandle OutgoingInvitation::ExtractMessagePipe(uint64_t name) {
147*635a8641SAndroid Build Coastguard Worker   return ExtractMessagePipe(
148*635a8641SAndroid Build Coastguard Worker       base::StringPiece(reinterpret_cast<const char*>(&name), sizeof(name)));
149*635a8641SAndroid Build Coastguard Worker }
150*635a8641SAndroid Build Coastguard Worker 
151*635a8641SAndroid Build Coastguard Worker // static
Send(OutgoingInvitation invitation,base::ProcessHandle target_process,PlatformChannelEndpoint channel_endpoint,const ProcessErrorCallback & error_callback)152*635a8641SAndroid Build Coastguard Worker void OutgoingInvitation::Send(OutgoingInvitation invitation,
153*635a8641SAndroid Build Coastguard Worker                               base::ProcessHandle target_process,
154*635a8641SAndroid Build Coastguard Worker                               PlatformChannelEndpoint channel_endpoint,
155*635a8641SAndroid Build Coastguard Worker                               const ProcessErrorCallback& error_callback) {
156*635a8641SAndroid Build Coastguard Worker   SendInvitation(std::move(invitation.handle_), target_process,
157*635a8641SAndroid Build Coastguard Worker                  channel_endpoint.TakePlatformHandle(),
158*635a8641SAndroid Build Coastguard Worker                  MOJO_INVITATION_TRANSPORT_TYPE_CHANNEL,
159*635a8641SAndroid Build Coastguard Worker                  MOJO_SEND_INVITATION_FLAG_NONE, error_callback, "");
160*635a8641SAndroid Build Coastguard Worker }
161*635a8641SAndroid Build Coastguard Worker 
162*635a8641SAndroid Build Coastguard Worker // static
Send(OutgoingInvitation invitation,base::ProcessHandle target_process,PlatformChannelServerEndpoint server_endpoint,const ProcessErrorCallback & error_callback)163*635a8641SAndroid Build Coastguard Worker void OutgoingInvitation::Send(OutgoingInvitation invitation,
164*635a8641SAndroid Build Coastguard Worker                               base::ProcessHandle target_process,
165*635a8641SAndroid Build Coastguard Worker                               PlatformChannelServerEndpoint server_endpoint,
166*635a8641SAndroid Build Coastguard Worker                               const ProcessErrorCallback& error_callback) {
167*635a8641SAndroid Build Coastguard Worker   SendInvitation(std::move(invitation.handle_), target_process,
168*635a8641SAndroid Build Coastguard Worker                  server_endpoint.TakePlatformHandle(),
169*635a8641SAndroid Build Coastguard Worker                  MOJO_INVITATION_TRANSPORT_TYPE_CHANNEL_SERVER,
170*635a8641SAndroid Build Coastguard Worker                  MOJO_SEND_INVITATION_FLAG_NONE, error_callback, "");
171*635a8641SAndroid Build Coastguard Worker }
172*635a8641SAndroid Build Coastguard Worker 
173*635a8641SAndroid Build Coastguard Worker // static
SendIsolated(PlatformChannelEndpoint channel_endpoint,base::StringPiece connection_name)174*635a8641SAndroid Build Coastguard Worker ScopedMessagePipeHandle OutgoingInvitation::SendIsolated(
175*635a8641SAndroid Build Coastguard Worker     PlatformChannelEndpoint channel_endpoint,
176*635a8641SAndroid Build Coastguard Worker     base::StringPiece connection_name) {
177*635a8641SAndroid Build Coastguard Worker   mojo::OutgoingInvitation invitation;
178*635a8641SAndroid Build Coastguard Worker   ScopedMessagePipeHandle pipe =
179*635a8641SAndroid Build Coastguard Worker       invitation.AttachMessagePipe(kIsolatedPipeName);
180*635a8641SAndroid Build Coastguard Worker   SendInvitation(std::move(invitation.handle_), base::kNullProcessHandle,
181*635a8641SAndroid Build Coastguard Worker                  channel_endpoint.TakePlatformHandle(),
182*635a8641SAndroid Build Coastguard Worker                  MOJO_INVITATION_TRANSPORT_TYPE_CHANNEL,
183*635a8641SAndroid Build Coastguard Worker                  MOJO_SEND_INVITATION_FLAG_ISOLATED, ProcessErrorCallback(),
184*635a8641SAndroid Build Coastguard Worker                  connection_name);
185*635a8641SAndroid Build Coastguard Worker   return pipe;
186*635a8641SAndroid Build Coastguard Worker }
187*635a8641SAndroid Build Coastguard Worker 
188*635a8641SAndroid Build Coastguard Worker // static
SendIsolated(PlatformChannelServerEndpoint server_endpoint,base::StringPiece connection_name)189*635a8641SAndroid Build Coastguard Worker ScopedMessagePipeHandle OutgoingInvitation::SendIsolated(
190*635a8641SAndroid Build Coastguard Worker     PlatformChannelServerEndpoint server_endpoint,
191*635a8641SAndroid Build Coastguard Worker     base::StringPiece connection_name) {
192*635a8641SAndroid Build Coastguard Worker   mojo::OutgoingInvitation invitation;
193*635a8641SAndroid Build Coastguard Worker   ScopedMessagePipeHandle pipe =
194*635a8641SAndroid Build Coastguard Worker       invitation.AttachMessagePipe(kIsolatedPipeName);
195*635a8641SAndroid Build Coastguard Worker   SendInvitation(std::move(invitation.handle_), base::kNullProcessHandle,
196*635a8641SAndroid Build Coastguard Worker                  server_endpoint.TakePlatformHandle(),
197*635a8641SAndroid Build Coastguard Worker                  MOJO_INVITATION_TRANSPORT_TYPE_CHANNEL_SERVER,
198*635a8641SAndroid Build Coastguard Worker                  MOJO_SEND_INVITATION_FLAG_ISOLATED, ProcessErrorCallback(),
199*635a8641SAndroid Build Coastguard Worker                  connection_name);
200*635a8641SAndroid Build Coastguard Worker   return pipe;
201*635a8641SAndroid Build Coastguard Worker }
202*635a8641SAndroid Build Coastguard Worker 
203*635a8641SAndroid Build Coastguard Worker IncomingInvitation::IncomingInvitation() = default;
204*635a8641SAndroid Build Coastguard Worker 
205*635a8641SAndroid Build Coastguard Worker IncomingInvitation::IncomingInvitation(IncomingInvitation&& other) = default;
206*635a8641SAndroid Build Coastguard Worker 
IncomingInvitation(ScopedInvitationHandle handle)207*635a8641SAndroid Build Coastguard Worker IncomingInvitation::IncomingInvitation(ScopedInvitationHandle handle)
208*635a8641SAndroid Build Coastguard Worker     : handle_(std::move(handle)) {}
209*635a8641SAndroid Build Coastguard Worker 
210*635a8641SAndroid Build Coastguard Worker IncomingInvitation::~IncomingInvitation() = default;
211*635a8641SAndroid Build Coastguard Worker 
212*635a8641SAndroid Build Coastguard Worker IncomingInvitation& IncomingInvitation::operator=(IncomingInvitation&& other) =
213*635a8641SAndroid Build Coastguard Worker     default;
214*635a8641SAndroid Build Coastguard Worker 
215*635a8641SAndroid Build Coastguard Worker // static
Accept(PlatformChannelEndpoint channel_endpoint)216*635a8641SAndroid Build Coastguard Worker IncomingInvitation IncomingInvitation::Accept(
217*635a8641SAndroid Build Coastguard Worker     PlatformChannelEndpoint channel_endpoint) {
218*635a8641SAndroid Build Coastguard Worker   MojoPlatformHandle endpoint_handle;
219*635a8641SAndroid Build Coastguard Worker   PlatformHandle::ToMojoPlatformHandle(channel_endpoint.TakePlatformHandle(),
220*635a8641SAndroid Build Coastguard Worker                                        &endpoint_handle);
221*635a8641SAndroid Build Coastguard Worker   CHECK_NE(endpoint_handle.type, MOJO_PLATFORM_HANDLE_TYPE_INVALID);
222*635a8641SAndroid Build Coastguard Worker 
223*635a8641SAndroid Build Coastguard Worker   MojoInvitationTransportEndpoint transport_endpoint;
224*635a8641SAndroid Build Coastguard Worker   transport_endpoint.struct_size = sizeof(transport_endpoint);
225*635a8641SAndroid Build Coastguard Worker   transport_endpoint.type = MOJO_INVITATION_TRANSPORT_TYPE_CHANNEL;
226*635a8641SAndroid Build Coastguard Worker   transport_endpoint.num_platform_handles = 1;
227*635a8641SAndroid Build Coastguard Worker   transport_endpoint.platform_handles = &endpoint_handle;
228*635a8641SAndroid Build Coastguard Worker 
229*635a8641SAndroid Build Coastguard Worker   MojoHandle invitation_handle;
230*635a8641SAndroid Build Coastguard Worker   MojoResult result =
231*635a8641SAndroid Build Coastguard Worker       MojoAcceptInvitation(&transport_endpoint, nullptr, &invitation_handle);
232*635a8641SAndroid Build Coastguard Worker   if (result != MOJO_RESULT_OK)
233*635a8641SAndroid Build Coastguard Worker     return IncomingInvitation();
234*635a8641SAndroid Build Coastguard Worker 
235*635a8641SAndroid Build Coastguard Worker   return IncomingInvitation(
236*635a8641SAndroid Build Coastguard Worker       ScopedInvitationHandle(InvitationHandle(invitation_handle)));
237*635a8641SAndroid Build Coastguard Worker }
238*635a8641SAndroid Build Coastguard Worker 
239*635a8641SAndroid Build Coastguard Worker // static
AcceptIsolated(PlatformChannelEndpoint channel_endpoint)240*635a8641SAndroid Build Coastguard Worker ScopedMessagePipeHandle IncomingInvitation::AcceptIsolated(
241*635a8641SAndroid Build Coastguard Worker     PlatformChannelEndpoint channel_endpoint) {
242*635a8641SAndroid Build Coastguard Worker   MojoPlatformHandle endpoint_handle;
243*635a8641SAndroid Build Coastguard Worker   PlatformHandle::ToMojoPlatformHandle(channel_endpoint.TakePlatformHandle(),
244*635a8641SAndroid Build Coastguard Worker                                        &endpoint_handle);
245*635a8641SAndroid Build Coastguard Worker   CHECK_NE(endpoint_handle.type, MOJO_PLATFORM_HANDLE_TYPE_INVALID);
246*635a8641SAndroid Build Coastguard Worker 
247*635a8641SAndroid Build Coastguard Worker   MojoInvitationTransportEndpoint transport_endpoint;
248*635a8641SAndroid Build Coastguard Worker   transport_endpoint.struct_size = sizeof(transport_endpoint);
249*635a8641SAndroid Build Coastguard Worker   transport_endpoint.type = MOJO_INVITATION_TRANSPORT_TYPE_CHANNEL;
250*635a8641SAndroid Build Coastguard Worker   transport_endpoint.num_platform_handles = 1;
251*635a8641SAndroid Build Coastguard Worker   transport_endpoint.platform_handles = &endpoint_handle;
252*635a8641SAndroid Build Coastguard Worker 
253*635a8641SAndroid Build Coastguard Worker   MojoAcceptInvitationOptions options;
254*635a8641SAndroid Build Coastguard Worker   options.struct_size = sizeof(options);
255*635a8641SAndroid Build Coastguard Worker   options.flags = MOJO_ACCEPT_INVITATION_FLAG_ISOLATED;
256*635a8641SAndroid Build Coastguard Worker 
257*635a8641SAndroid Build Coastguard Worker   MojoHandle invitation_handle;
258*635a8641SAndroid Build Coastguard Worker   MojoResult result =
259*635a8641SAndroid Build Coastguard Worker       MojoAcceptInvitation(&transport_endpoint, &options, &invitation_handle);
260*635a8641SAndroid Build Coastguard Worker   if (result != MOJO_RESULT_OK)
261*635a8641SAndroid Build Coastguard Worker     return ScopedMessagePipeHandle();
262*635a8641SAndroid Build Coastguard Worker 
263*635a8641SAndroid Build Coastguard Worker   IncomingInvitation invitation{
264*635a8641SAndroid Build Coastguard Worker       ScopedInvitationHandle(InvitationHandle(invitation_handle))};
265*635a8641SAndroid Build Coastguard Worker   return invitation.ExtractMessagePipe(kIsolatedPipeName);
266*635a8641SAndroid Build Coastguard Worker }
267*635a8641SAndroid Build Coastguard Worker 
ExtractMessagePipe(base::StringPiece name)268*635a8641SAndroid Build Coastguard Worker ScopedMessagePipeHandle IncomingInvitation::ExtractMessagePipe(
269*635a8641SAndroid Build Coastguard Worker     base::StringPiece name) {
270*635a8641SAndroid Build Coastguard Worker   DCHECK(!name.empty());
271*635a8641SAndroid Build Coastguard Worker   DCHECK(base::IsValueInRangeForNumericType<uint32_t>(name.size()));
272*635a8641SAndroid Build Coastguard Worker   DCHECK(handle_.is_valid());
273*635a8641SAndroid Build Coastguard Worker   MojoHandle message_pipe_handle;
274*635a8641SAndroid Build Coastguard Worker   MojoResult result = MojoExtractMessagePipeFromInvitation(
275*635a8641SAndroid Build Coastguard Worker       handle_.get().value(), name.data(), static_cast<uint32_t>(name.size()),
276*635a8641SAndroid Build Coastguard Worker       nullptr, &message_pipe_handle);
277*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(MOJO_RESULT_OK, result);
278*635a8641SAndroid Build Coastguard Worker   return ScopedMessagePipeHandle(MessagePipeHandle(message_pipe_handle));
279*635a8641SAndroid Build Coastguard Worker }
280*635a8641SAndroid Build Coastguard Worker 
ExtractMessagePipe(uint64_t name)281*635a8641SAndroid Build Coastguard Worker ScopedMessagePipeHandle IncomingInvitation::ExtractMessagePipe(uint64_t name) {
282*635a8641SAndroid Build Coastguard Worker   return ExtractMessagePipe(
283*635a8641SAndroid Build Coastguard Worker       base::StringPiece(reinterpret_cast<const char*>(&name), sizeof(name)));
284*635a8641SAndroid Build Coastguard Worker }
285*635a8641SAndroid Build Coastguard Worker 
286*635a8641SAndroid Build Coastguard Worker }  // namespace mojo
287