| // Copyright 2017 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/component_context_impl.h" |
| |
| #include <lib/syslog/cpp/macros.h> |
| |
| #include <utility> |
| |
| #include "src/modular/bin/sessionmgr/agent_runner/agent_runner.h" |
| #include "src/modular/lib/fidl/array_to_string.h" |
| |
| namespace modular { |
| namespace { |
| void LogConnectionError(const std::string& url, const std::vector<std::string>& agents) { |
| FX_LOGS(ERROR) << "Attempting to connect to agent " << url |
| << " which is not listed as a session agent."; |
| FX_LOGS(ERROR) << "Session agents are:"; |
| for (const auto& agent : agents) { |
| FX_LOGS(ERROR) << " - " << agent; |
| } |
| FX_LOGS(ERROR) << "To fix this error, please add " << url |
| << "to the modular configuration's 'session_agents'."; |
| } |
| } // namespace |
| |
| ComponentContextImpl::ComponentContextImpl(const ComponentContextInfo& info, |
| std::string component_instance_id, |
| std::string component_url) |
| : agent_runner_(info.agent_runner), |
| session_agents_(info.session_agents), |
| component_instance_id_(std::move(component_instance_id)), |
| component_url_(std::move(component_url)) { |
| FX_DCHECK(agent_runner_); |
| } |
| |
| ComponentContextImpl::~ComponentContextImpl() = default; |
| |
| void ComponentContextImpl::Connect( |
| fidl::InterfaceRequest<fuchsia::modular::ComponentContext> request) { |
| bindings_.AddBinding(this, std::move(request)); |
| } |
| |
| fuchsia::modular::ComponentContextPtr ComponentContextImpl::NewBinding() { |
| fuchsia::modular::ComponentContextPtr ptr; |
| Connect(ptr.NewRequest()); |
| return ptr; |
| } |
| |
| void ComponentContextImpl::DeprecatedConnectToAgent( |
| std::string url, |
| fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services_request, |
| fidl::InterfaceRequest<fuchsia::modular::AgentController> agent_controller_request) { |
| if (!AgentIsSessionAgent(url)) { |
| LogConnectionError(url, session_agents_); |
| return; |
| } |
| agent_runner_->ConnectToAgent(component_instance_id_, url, std::move(incoming_services_request), |
| std::move(agent_controller_request)); |
| } |
| |
| void ComponentContextImpl::DeprecatedConnectToAgentService( |
| fuchsia::modular::AgentServiceRequest request) { |
| if (request.has_handler() && !AgentIsSessionAgent(request.handler())) { |
| LogConnectionError(request.handler(), session_agents_); |
| return; |
| } |
| agent_runner_->ConnectToAgentService(component_instance_id_, std::move(request)); |
| } |
| |
| bool ComponentContextImpl::AgentIsSessionAgent(const std::string& agent_url) { |
| return std::find(session_agents_.begin(), session_agents_.end(), agent_url) != |
| session_agents_.end(); |
| } |
| |
| } // namespace modular |