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

Side by Side Diff: examples/native_run_app/native_run_app.cc

Issue 1682113003: Mojo C++ bindings: Generate InterfaceHandle<> instead of InterfacePtr<>. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: rebase ontop of master, address trung's comments Created 4 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This is a terminal client (i.e., a "raw" |mojo.terminal.Terminal| -- e.g., 5 // This is a terminal client (i.e., a "raw" |mojo.terminal.Terminal| -- e.g.,
6 // moterm -- can be asked to talk to this) that prompts the user for a native 6 // moterm -- can be asked to talk to this) that prompts the user for a native
7 // (Linux) binary to run and then does so (via mojo:native_support). 7 // (Linux) binary to run and then does so (via mojo:native_support).
8 // 8 //
9 // E.g., first run mojo:moterm_example_app (embedded by a window manager). Then, 9 // E.g., first run mojo:moterm_example_app (embedded by a window manager). Then,
10 // at the prompt, enter "mojo:native_run_app". At the next prompt, enter "bash" 10 // at the prompt, enter "mojo:native_run_app". At the next prompt, enter "bash"
11 // (or "echo hello mojo"). 11 // (or "echo hello mojo").
12 // 12 //
13 // TODO(vtl): Maybe it should optionally be able to extract the binary path (and 13 // TODO(vtl): Maybe it should optionally be able to extract the binary path (and
14 // args) from the connection URL? 14 // args) from the connection URL?
15 15
16 #include <string.h> 16 #include <string.h>
17 17
18 #include <string> 18 #include <string>
19 #include <utility>
19 #include <vector> 20 #include <vector>
20 21
21 #include "base/logging.h" 22 #include "base/logging.h"
22 #include "base/macros.h" 23 #include "base/macros.h"
23 #include "base/strings/string_split.h" 24 #include "base/strings/string_split.h"
24 #include "mojo/application/application_runner_chromium.h" 25 #include "mojo/application/application_runner_chromium.h"
25 #include "mojo/public/c/system/main.h" 26 #include "mojo/public/c/system/main.h"
26 #include "mojo/public/cpp/application/application_connection.h" 27 #include "mojo/public/cpp/application/application_connection.h"
27 #include "mojo/public/cpp/application/application_delegate.h" 28 #include "mojo/public/cpp/application/application_delegate.h"
28 #include "mojo/public/cpp/application/application_impl.h" 29 #include "mojo/public/cpp/application/application_impl.h"
(...skipping 10 matching lines...) Expand all
39 using mojo::terminal::TerminalClient; 40 using mojo::terminal::TerminalClient;
40 41
41 mojo::Array<uint8_t> ToByteArray(const std::string& s) { 42 mojo::Array<uint8_t> ToByteArray(const std::string& s) {
42 auto rv = mojo::Array<uint8_t>::New(s.size()); 43 auto rv = mojo::Array<uint8_t>::New(s.size());
43 memcpy(rv.data(), s.data(), s.size()); 44 memcpy(rv.data(), s.data(), s.size());
44 return rv; 45 return rv;
45 } 46 }
46 47
47 class TerminalConnection { 48 class TerminalConnection {
48 public: 49 public:
49 explicit TerminalConnection(mojo::files::FilePtr terminal, 50 explicit TerminalConnection(mojo::InterfaceHandle<mojo::files::File> terminal,
50 native_support::Process* native_support_process) 51 native_support::Process* native_support_process)
51 : terminal_(terminal.Pass()), 52 : terminal_(mojo::files::FilePtr::Create(std::move(terminal))),
52 native_support_process_(native_support_process) { 53 native_support_process_(native_support_process) {
53 terminal_.set_connection_error_handler([this]() { delete this; }); 54 terminal_.set_connection_error_handler([this]() { delete this; });
54 Start(); 55 Start();
55 } 56 }
56 ~TerminalConnection() {} 57 ~TerminalConnection() {}
57 58
58 private: 59 private:
59 void Write(const char* s, mojo::files::File::WriteCallback callback) { 60 void Write(const char* s, mojo::files::File::WriteCallback callback) {
60 size_t length = strlen(s); 61 size_t length = strlen(s);
61 auto a = mojo::Array<uint8_t>::New(length); 62 auto a = mojo::Array<uint8_t>::New(length);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 } 150 }
150 151
151 // Now, we can spawn. 152 // Now, we can spawn.
152 mojo::Array<mojo::Array<uint8_t>> argv; 153 mojo::Array<mojo::Array<uint8_t>> argv;
153 for (const auto& arg : command_line_) 154 for (const auto& arg : command_line_)
154 argv.push_back(ToByteArray(arg)); 155 argv.push_back(ToByteArray(arg));
155 156
156 // TODO(vtl): If the |InterfacePtr| underlying |native_support_process_| 157 // TODO(vtl): If the |InterfacePtr| underlying |native_support_process_|
157 // encounters an error, then we're sort of dead in the water. 158 // encounters an error, then we're sort of dead in the water.
158 native_support_process_->SpawnWithTerminal( 159 native_support_process_->SpawnWithTerminal(
159 ToByteArray(command_line_[0]), argv.Pass(), nullptr, terminal_.Pass(), 160 ToByteArray(command_line_[0]), argv.Pass(), nullptr,
160 GetProxy(&process_controller_), [this](mojo::files::Error error) { 161 terminal_.PassInterfaceHandle(), GetProxy(&process_controller_),
162 [this](mojo::files::Error error) {
161 this->DidSpawnWithTerminal(error); 163 this->DidSpawnWithTerminal(error);
162 }); 164 });
163 process_controller_.set_connection_error_handler([this]() { delete this; }); 165 process_controller_.set_connection_error_handler([this]() { delete this; });
164 } 166 }
165 void DidSpawnWithTerminal(mojo::files::Error error) { 167 void DidSpawnWithTerminal(mojo::files::Error error) {
166 if (error != mojo::files::Error::OK) { 168 if (error != mojo::files::Error::OK) {
167 LOG(ERROR) << "SpawnWithTerminal() error: " << error; 169 LOG(ERROR) << "SpawnWithTerminal() error: " << error;
168 delete this; 170 delete this;
169 return; 171 return;
170 } 172 }
(...skipping 23 matching lines...) Expand all
194 196
195 class TerminalClientImpl : public TerminalClient { 197 class TerminalClientImpl : public TerminalClient {
196 public: 198 public:
197 TerminalClientImpl(mojo::InterfaceRequest<TerminalClient> request, 199 TerminalClientImpl(mojo::InterfaceRequest<TerminalClient> request,
198 native_support::Process* native_support_process) 200 native_support::Process* native_support_process)
199 : binding_(this, request.Pass()), 201 : binding_(this, request.Pass()),
200 native_support_process_(native_support_process) {} 202 native_support_process_(native_support_process) {}
201 ~TerminalClientImpl() override {} 203 ~TerminalClientImpl() override {}
202 204
203 // |TerminalClient| implementation: 205 // |TerminalClient| implementation:
204 void ConnectToTerminal(mojo::files::FilePtr terminal) override { 206 void ConnectToTerminal(
207 mojo::InterfaceHandle<mojo::files::File> terminal) override {
205 if (terminal) { 208 if (terminal) {
206 // Owns itself. 209 // Owns itself.
207 new TerminalConnection(terminal.Pass(), native_support_process_); 210 new TerminalConnection(std::move(terminal), native_support_process_);
208 } else { 211 } else {
209 LOG(ERROR) << "No terminal"; 212 LOG(ERROR) << "No terminal";
210 } 213 }
211 } 214 }
212 215
213 private: 216 private:
214 mojo::StrongBinding<TerminalClient> binding_; 217 mojo::StrongBinding<TerminalClient> binding_;
215 native_support::Process* native_support_process_; 218 native_support::Process* native_support_process_;
216 219
217 DISALLOW_COPY_AND_ASSIGN(TerminalClientImpl); 220 DISALLOW_COPY_AND_ASSIGN(TerminalClientImpl);
(...skipping 29 matching lines...) Expand all
247 mojo::ApplicationImpl* application_impl_; 250 mojo::ApplicationImpl* application_impl_;
248 native_support::ProcessPtr native_support_process_; 251 native_support::ProcessPtr native_support_process_;
249 252
250 DISALLOW_COPY_AND_ASSIGN(NativeRunApp); 253 DISALLOW_COPY_AND_ASSIGN(NativeRunApp);
251 }; 254 };
252 255
253 MojoResult MojoMain(MojoHandle application_request) { 256 MojoResult MojoMain(MojoHandle application_request) {
254 mojo::ApplicationRunnerChromium runner(new NativeRunApp()); 257 mojo::ApplicationRunnerChromium runner(new NativeRunApp());
255 return runner.Run(application_request); 258 return runner.Run(application_request);
256 } 259 }
OLDNEW
« no previous file with comments | « examples/moterm_example_app/moterm_example_app.cc ('k') | examples/notification_generator/notification_generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698