| Index: mojo/shell/launcher_main.cc
|
| diff --git a/mojo/shell/launcher_main.cc b/mojo/shell/launcher_main.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..dfe634cc386a8ace065b7aca428e31f8b68703de
|
| --- /dev/null
|
| +++ b/mojo/shell/launcher_main.cc
|
| @@ -0,0 +1,116 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/at_exit.h"
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| +#include "base/command_line.h"
|
| +#include "base/logging.h"
|
| +#include "base/macros.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/strings/string_split.h"
|
| +#include "mojo/edk/embedder/embedder.h"
|
| +#include "mojo/edk/embedder/process_delegate.h"
|
| +#include "mojo/edk/embedder/simple_platform_support.h"
|
| +#include "mojo/shell/in_process_native_runner.h"
|
| +#include "mojo/shell/init.h"
|
| +#include "mojo/shell/native_application_support.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace mojo {
|
| +namespace shell {
|
| +
|
| +const char kAppArgs[] = "app-args";
|
| +const char kAppPath[] = "app-path";
|
| +const char kAppURL[] = "app-url";
|
| +const char kShellPath[] = "shell-path";
|
| +
|
| +class Launcher : public embedder::ProcessDelegate {
|
| + public:
|
| + explicit Launcher(const base::CommandLine& command_line)
|
| + : app_path_(command_line.GetSwitchValuePath(kAppPath)),
|
| + app_url_(command_line.GetSwitchValueASCII(kAppURL)),
|
| + loop_(base::MessageLoop::TYPE_IO) {
|
| + // TODO(vtl): I guess this should be SLAVE, not NONE?
|
| + embedder::InitIPCSupport(embedder::ProcessType::NONE, loop_.task_runner(),
|
| + this, loop_.task_runner(),
|
| + embedder::ScopedPlatformHandle());
|
| +
|
| + base::SplitStringAlongWhitespace(command_line.GetSwitchValueASCII(kAppArgs),
|
| + &app_args_);
|
| + }
|
| +
|
| + ~Launcher() override {
|
| + DCHECK(!application_request_.is_pending());
|
| +
|
| + embedder::ShutdownIPCSupportOnIOThread();
|
| + }
|
| +
|
| + bool Connect() { return false; }
|
| +
|
| + bool Register() {
|
| + return application_request_.is_pending();
|
| + }
|
| +
|
| + void Run() {
|
| + DCHECK(application_request_.is_pending());
|
| + InProcessNativeRunner service_runner(nullptr);
|
| + base::RunLoop run_loop;
|
| + service_runner.Start(app_path_, NativeApplicationCleanup::DONT_DELETE,
|
| + application_request_.Pass(), run_loop.QuitClosure());
|
| + run_loop.Run();
|
| + }
|
| +
|
| + private:
|
| + void OnRegistered(base::RunLoop* run_loop,
|
| + InterfaceRequest<Application> application_request) {
|
| + application_request_ = application_request.Pass();
|
| + run_loop->Quit();
|
| + }
|
| +
|
| + // embedder::ProcessDelegate implementation:
|
| + void OnShutdownComplete() override {
|
| + NOTREACHED(); // Not called since we use ShutdownIPCSupportOnIOThread().
|
| + }
|
| +
|
| + const base::FilePath app_path_;
|
| + const GURL app_url_;
|
| + std::vector<std::string> app_args_;
|
| + base::MessageLoop loop_;
|
| + InterfaceRequest<Application> application_request_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Launcher);
|
| +};
|
| +
|
| +} // namespace shell
|
| +} // namespace mojo
|
| +
|
| +int main(int argc, char** argv) {
|
| + base::AtExitManager at_exit;
|
| + mojo::embedder::Init(
|
| + make_scoped_ptr(new mojo::embedder::SimplePlatformSupport()));
|
| +
|
| + base::CommandLine::Init(argc, argv);
|
| + const base::CommandLine* command_line =
|
| + base::CommandLine::ForCurrentProcess();
|
| + mojo::shell::InitializeLogging();
|
| +
|
| + mojo::shell::Launcher launcher(*command_line);
|
| + if (!launcher.Connect()) {
|
| + LOG(ERROR) << "Failed to connect on socket "
|
| + << command_line->GetSwitchValueASCII(mojo::shell::kShellPath);
|
| + return 1;
|
| + }
|
| +
|
| + if (!launcher.Register()) {
|
| + LOG(ERROR) << "Error registering "
|
| + << command_line->GetSwitchValueASCII(mojo::shell::kAppURL);
|
| + return 1;
|
| + }
|
| +
|
| + launcher.Run();
|
| + return 0;
|
| +}
|
|
|