| Index: mojo/shell/app_container.cc
|
| diff --git a/mojo/shell/app_container.cc b/mojo/shell/app_container.cc
|
| index 221c871c1f99cb5dc7e2e96e794eba53b7b83555..6699b1a833887e42938d48af66d36204b05397e6 100644
|
| --- a/mojo/shell/app_container.cc
|
| +++ b/mojo/shell/app_container.cc
|
| @@ -23,38 +23,9 @@ typedef MojoResult (*MojoMainFunction)(mojo::Handle pipe);
|
| namespace mojo {
|
| namespace shell {
|
|
|
| -void LaunchAppOnThread(
|
| - const base::FilePath& app_path,
|
| - Handle app_handle_raw) {
|
| - base::ScopedClosureRunner app_deleter(
|
| - base::Bind(base::IgnoreResult(&base::DeleteFile), app_path, false));
|
| - ScopedHandle app_handle(app_handle_raw);
|
| -
|
| - base::ScopedNativeLibrary app_library(
|
| - base::LoadNativeLibrary(app_path, NULL));
|
| - if (!app_library.is_valid()) {
|
| - LOG(ERROR) << "Failed to load library: " << app_path.value().c_str();
|
| - return;
|
| - }
|
| -
|
| - MojoMainFunction main_function = reinterpret_cast<MojoMainFunction>(
|
| - app_library.GetFunctionPointer("MojoMain"));
|
| - if (!main_function) {
|
| - LOG(ERROR) << "Entrypoint MojoMain not found.";
|
| - return;
|
| - }
|
| -
|
| - MojoResult result = main_function(app_handle.get());
|
| - if (result < MOJO_RESULT_OK) {
|
| - LOG(ERROR) << "MojoMain returned an error: " << result;
|
| - return;
|
| - }
|
| -
|
| - LOG(INFO) << "MojoMain succeeded: " << result;
|
| -}
|
| -
|
| AppContainer::AppContainer(Context* context)
|
| : context_(context),
|
| + app_handle_raw_(mojo::kInvalidHandle),
|
| weak_factory_(this) {
|
| }
|
|
|
| @@ -67,40 +38,64 @@ void AppContainer::Load(const GURL& app_url) {
|
|
|
| void AppContainer::DidCompleteLoad(const GURL& app_url,
|
| const base::FilePath& app_path) {
|
| - Handle app_handle;
|
| - MojoResult result = CreateMessagePipe(&shell_handle_, &app_handle);
|
| + Handle shell_handle;
|
| + MojoResult result = CreateMessagePipe(&shell_handle, &app_handle_raw_);
|
| if (result < MOJO_RESULT_OK) {
|
| // Failure..
|
| }
|
|
|
| + hello_world_service_.reset(
|
| + new examples::HelloWorldServiceImpl(shell_handle));
|
| +
|
| // Launch the app on its own thread.
|
| // TODO(beng): Create a unique thread name.
|
| - thread_.reset(new base::Thread("app_thread"));
|
| + app_path_ = app_path;
|
| + ack_closure_ =
|
| + base::Bind(&AppContainer::AppCompleted, weak_factory_.GetWeakPtr());
|
| + thread_.reset(new base::DelegateSimpleThread(this, "app_thread"));
|
| thread_->Start();
|
| - thread_->message_loop_proxy()->PostTaskAndReply(
|
| - FROM_HERE,
|
| - base::Bind(&LaunchAppOnThread, app_path, app_handle),
|
| - base::Bind(&AppContainer::AppCompleted, weak_factory_.GetWeakPtr()));
|
| -
|
| - const char* hello_msg = "Hello";
|
| - result = WriteMessage(shell_handle_, hello_msg,
|
| - static_cast<uint32_t>(strlen(hello_msg)+1),
|
| - NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE);
|
| - if (result < MOJO_RESULT_OK) {
|
| - // Failure..
|
| - }
|
|
|
| // TODO(beng): This should be created on demand by the NativeViewportService
|
| // when it is retrieved by the app.
|
| - native_viewport_controller_.reset(
|
| - new services::NativeViewportController(context_, shell_handle_));
|
| + // native_viewport_controller_.reset(
|
| + // new services::NativeViewportController(context_, shell_handle_));
|
| +}
|
| +
|
| +void AppContainer::Run() {
|
| + base::ScopedClosureRunner app_deleter(
|
| + base::Bind(base::IgnoreResult(&base::DeleteFile), app_path_, false));
|
| + ScopedHandle app_handle(app_handle_raw_);
|
| +
|
| + base::ScopedNativeLibrary app_library(
|
| + base::LoadNativeLibrary(app_path_, NULL));
|
| + if (!app_library.is_valid()) {
|
| + LOG(ERROR) << "Failed to load library: " << app_path_.value().c_str();
|
| + return;
|
| + }
|
| +
|
| + MojoMainFunction main_function = reinterpret_cast<MojoMainFunction>(
|
| + app_library.GetFunctionPointer("MojoMain"));
|
| + if (!main_function) {
|
| + LOG(ERROR) << "Entrypoint MojoMain not found.";
|
| + return;
|
| + }
|
| +
|
| + MojoResult result = main_function(app_handle.get());
|
| + if (result < MOJO_RESULT_OK) {
|
| + LOG(ERROR) << "MojoMain returned an error: " << result;
|
| + return;
|
| + }
|
| + LOG(INFO) << "MojoMain succeeded: " << result;
|
| + context_->task_runners()->ui_runner()->PostTask(FROM_HERE, ack_closure_);
|
| }
|
|
|
| void AppContainer::AppCompleted() {
|
| - native_viewport_controller_->Close();
|
| + hello_world_service_.reset();
|
| + // TODO(aa): This code gets replaced once we have a service manager.
|
| + // native_viewport_controller_->Close();
|
|
|
| + thread_->Join();
|
| thread_.reset();
|
| - Close(shell_handle_);
|
| }
|
|
|
| } // namespace shell
|
|
|