Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: mojo/edk/embedder/pending_process_connection.h

Issue 2680973006: Mojo EDK: Add safe process connection API (Closed)
Patch Set: . Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
6 #define MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
7
8 #include <string>
9
10 #include "base/callback.h"
11 #include "base/macros.h"
12 #include "base/process/process_handle.h"
13 #include "mojo/edk/embedder/scoped_platform_handle.h"
14 #include "mojo/edk/system/system_impl_export.h"
15 #include "mojo/public/cpp/system/message_pipe.h"
16
17 namespace mojo {
18 namespace edk {
19
20 using ProcessErrorCallback = base::Callback<void(const std::string& error)>;
21
22 // Represents a potential connection to an external process. Use this object
23 // to make other processes reachable from this one via Mojo IPC. Typical usage
24 // might look something like:
25 //
26 // PendingProcessConnection connection;
27 //
28 // std::string pipe_token;
29 // ScopedMessagePipeHandle pipe = connection.CreateMessagePipe(&pipe_token);
30 //
31 // // New pipes to the process are fully functional and can be used right
32 // // away, even if the process doesn't exist yet.
33 // GoDoSomethingInteresting(std::move(pipe));
34 //
35 // ScopedPlatformChannelPair channel;
36 //
37 // // Give the pipe token to the child process via command-line.
38 // child_command_line.AppendSwitchASCII("yer-pipe", pipe_token);
39 //
40 // // Magic child process launcher which gives one end of the pipe to the
41 // // new process.
42 // LaunchProcess(child_command_line, channel.PassClientHandle());
43 //
44 // // Some time later...
45 // connection.Connect(new_process, channel.PassServerHandle());
46 //
47 // If at any point during the above process, |connection| is destroyed before
48 // Connect() can be called, |pipe| will imminently behave as if its peer has
49 // been closed.
50 //
51 // Otherwise, if the remote process in this example eventually calls:
52 //
53 // mojo::edk::SetParentPipeHandle(std::move(client_channel_handle));
54 //
55 // std::string token = command_line.GetSwitchValueASCII("yer-pipe");
56 // ScopedMessagePipeHandle pipe = mojo::edk::CreateChildMessagePipe(token);
57 //
58 // it will be connected to this process, and its |pipe| will be connected to
59 // this process's |pipe|.
60 //
61 // If the remote process exits or otherwise closes its client channel handle
62 // before calling CreateChildMessagePipe for a given message pipe token,
63 // this process's end of the corresponding message pipe will imminently behave
64 // as if its peer has been closed.
65 //
66 class MOJO_SYSTEM_IMPL_EXPORT PendingProcessConnection {
67 public:
68 PendingProcessConnection();
69 ~PendingProcessConnection();
70
71 // Creates a message pipe associated with a new globally unique string value
72 // which will be placed in |*token|.
73 //
74 // The other end of the new pipe is obtainable in the remote process (or in
75 // this process, to facilitate "single-process mode" in some applications) by
76 // passing the new |*token| value to mojo::edk::CreateChildMessagePipe. It's
77 // the caller's responsibility to communicate the value of |*token| to the
78 // remote process by any means available, e.g. a command-line argument on
79 // process launch, or some other out-of-band communication channel for an
80 // existing process.
81 //
82 // NOTES: This may be called any number of times to create multiple message
83 // pipes to the same remote process. This call ALWAYS succeeds, returning
84 // a valid message pipe handle and populating |*token| with a new unique
85 // string value.
86 ScopedMessagePipeHandle CreateMessagePipe(std::string* token);
87
88 // Connects to the process. This must be called at most once, with the process
89 // handle in |process|.
90 //
91 // |channel| is the platform handle of an OS pipe which can be used to
92 // communicate with the connected process. The other end of that pipe must
93 // ultimately be passed to mojo::edk::SetParentPipeHandle in the remote
94 // process, and getting that end of the pipe into the other process is the
95 // embedder's responsibility.
96 //
97 // If this method is not called by the time the PendingProcessConnection is
98 // destroyed, it's assumed that the process is unavailable (e.g. process
99 // launch failed or the process has otherwise been terminated early), and
100 // any associated resources, such as remote endpoints of messages pipes
101 // created by CreateMessagePipe above) will be cleaned up at that time.
102 void Connect(
103 base::ProcessHandle process,
104 ScopedPlatformHandle channel,
105 const ProcessErrorCallback& error_callback = ProcessErrorCallback());
106
107 private:
108 // A GUID representing a potential new process to be connected to this one.
109 const std::string process_token_;
110
111 // Indicates whether this object has been used to create new message pipes.
112 bool has_message_pipes_ = false;
113
114 // Indicates whether Connect() has been called yet.
115 bool connected_ = false;
116
117 DISALLOW_COPY_AND_ASSIGN(PendingProcessConnection);
118 };
119
120 } // namespace edk
121 } // namespace mojo
122
123 #endif // MOJO_EDK_EMBEDDER_PENDING_PROCESS_CONNECTION_H_
OLDNEW
« no previous file with comments | « mojo/edk/embedder/named_platform_channel_pair.h ('k') | mojo/edk/embedder/pending_process_connection.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698