blob: be4e2d4b750b838fc95161855868372cce87a5e6 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 "garnet/bin/guest/pkg/biscotti_guest/bin/linux_component.h"
#include <lib/async/default.h>
#include <zircon/status.h>
namespace biscotti {
// static
std::unique_ptr<LinuxComponent> LinuxComponent::Create(
TerminationCallback termination_callback, fuchsia::sys::Package package,
fuchsia::sys::StartupInfo startup_info,
fidl::InterfaceRequest<fuchsia::sys::ComponentController> controller,
fuchsia::ui::app::ViewProviderPtr remote_view_provider) {
FXL_DCHECK(remote_view_provider) << "Missing remote_view_provider";
return std::unique_ptr<LinuxComponent>(
new LinuxComponent(std::move(termination_callback), std::move(package),
std::move(startup_info), std::move(controller),
std::move(remote_view_provider)));
}
LinuxComponent::LinuxComponent(
TerminationCallback termination_callback, fuchsia::sys::Package package,
fuchsia::sys::StartupInfo startup_info,
fidl::InterfaceRequest<fuchsia::sys::ComponentController>
application_controller_request,
fuchsia::ui::app::ViewProviderPtr remote_view_provider)
: termination_callback_(std::move(termination_callback)),
application_controller_(this),
remote_view_provider_(std::move(remote_view_provider)) {
application_controller_.set_error_handler(
[this](zx_status_t status) { Kill(); });
auto& launch_info = startup_info.launch_info;
if (launch_info.directory_request) {
outgoing_.Serve(std::move(launch_info.directory_request));
}
outgoing_.AddPublicService<fuchsia::ui::app::ViewProvider>(
view_bindings_.GetHandler(this));
outgoing_.AddPublicService<fuchsia::ui::viewsv1::ViewProvider>(
v1_view_bindings_.GetHandler(this));
}
LinuxComponent::~LinuxComponent() = default;
// |fuchsia::sys::ComponentController|
void LinuxComponent::Kill() {
application_controller_.events().OnTerminated(
0, fuchsia::sys::TerminationReason::EXITED);
termination_callback_(this);
// WARNING: Don't do anything past this point as this instance may have been
// collected.
}
// |fuchsia::sys::ComponentController|
void LinuxComponent::Detach() {
application_controller_.set_error_handler(nullptr);
}
// |fuchsia::ui::viewsv1::ViewProvider|
void LinuxComponent::CreateView(
fidl::InterfaceRequest<fuchsia::ui::viewsv1token::ViewOwner> view_owner,
fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services) {
CreateView(zx::eventpair(view_owner.TakeChannel().release()),
std::move(services), nullptr);
}
// |fuchsia::ui::app::ViewProvider|
void LinuxComponent::CreateView(
zx::eventpair view_token,
fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services,
fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services) {
remote_view_provider_->CreateView(std::move(view_token),
std::move(incoming_services),
std::move(outgoing_services));
}
} // namespace biscotti