blob: c3c84fdbdf9f691f512c2cffd452619e48ff1cb8 [file] [log] [blame]
// Copyright 2016 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 "src/modular/bin/sessionmgr/story_runner/module_context_impl.h"
#include <fuchsia/intl/cpp/fidl.h>
#include <lib/fidl/cpp/interface_request.h>
#include <lib/sys/inspect/cpp/component.h>
#include <string>
#include "src/lib/fxl/strings/join_strings.h"
#include "src/modular/bin/sessionmgr/agent_runner/agent_runner.h"
#include "src/modular/bin/sessionmgr/storage/encode_module_path.h"
#include "src/modular/bin/sessionmgr/story_runner/story_controller_impl.h"
namespace modular {
ModuleContextImpl::ModuleContextImpl(
const ModuleContextInfo& info, fuchsia::modular::ModuleData module_data,
fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> service_provider_request)
: module_data_(std::move(module_data)),
story_controller_impl_(info.story_controller_impl),
session_environment_(info.session_environment),
component_context_impl_(info.component_context_info,
EncodeModulePath(module_data_.module_path()),
module_data_.module_url()) {
info.component_context_info.agent_runner->PublishAgentServices(
component_context_impl_.component_instance_id(), &service_provider_impl_);
service_provider_impl_.AddService<fuchsia::modular::ComponentContext>(
[this](fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request) {
component_context_impl_.Connect(std::move(request));
});
service_provider_impl_.AddService<fuchsia::modular::ModuleContext>(
[this](fidl::InterfaceRequest<fuchsia::modular::ModuleContext> request) {
bindings_.AddBinding(this, std::move(request));
});
// Forward sessionmgr service requests to the session environment's service provider.
// See SessionmgrImpl::InitializeSessionEnvironment.
service_provider_impl_.AddService<fuchsia::intl::PropertyProvider>(
[this](fidl::InterfaceRequest<fuchsia::intl::PropertyProvider> request) {
fuchsia::sys::ServiceProviderPtr service_provider;
session_environment_->environment()->GetServices(service_provider.NewRequest());
service_provider->ConnectToService(fuchsia::intl::PropertyProvider::Name_,
request.TakeChannel());
});
if (module_data_.has_additional_services() &&
module_data_.additional_services().host_directory.is_valid()) {
additional_services_dir_ = std::make_unique<sys::ServiceDirectory>(
std::move(module_data_.mutable_additional_services()->host_directory));
for (const auto& service_name : module_data_.additional_services().names) {
service_provider_impl_.AddServiceForName(
[this, service_name](auto request) {
auto status = additional_services_dir_->Connect(service_name, std::move(request));
if (status != ZX_OK) {
FX_PLOGS(ERROR, status)
<< "Could not connect to module additional service: " << service_name;
}
},
service_name);
}
} else if (module_data_.has_additional_services() &&
!module_data_.additional_services().host_directory.is_valid()) {
FX_LOGS(ERROR) << "ModuleData.additional_services does not have a valid host_directory. "
"Module "
<< EncodeModulePath(module_data_.module_path()) << " (URL "
<< module_data_.module_url()
<< ") will not be able to connect to additional services.";
}
service_provider_impl_.AddBinding(std::move(service_provider_request));
}
ModuleContextImpl::~ModuleContextImpl() = default;
void ModuleContextImpl::RemoveSelfFromStory() {
story_controller_impl_->RemoveModuleFromStory(module_data_.module_path());
}
} // namespace modular