// Copyright 2019 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. #ifndef FUCHSIA_BASE_AGENT_MANAGER_H_ #define FUCHSIA_BASE_AGENT_MANAGER_H_ #include #include #include #include "base/containers/flat_map.h" #include "base/macros.h" #include "base/strings/string_piece.h" namespace cr_fuchsia { // Connects to the ComponentContext service from the supplied ServiceDirectory, // and uses it to connect-to and manage one or more Agents used by the caller. class AgentManager { public: explicit AgentManager(const sys::ServiceDirectory* incoming); ~AgentManager(); // Connects to |agent| so satisfying the specified |request|. // |agent| will be kept alive until this AgentManager is destroyed. template void ConnectToAgentService(base::StringPiece agent, fidl::InterfaceRequest request) { ConnectToAgentServiceUnsafe(agent, Interface::Name_, request.TakeChannel()); } template fidl::InterfacePtr ConnectToAgentService(base::StringPiece agent) { fidl::InterfacePtr ptr; ConnectToAgentService(agent, ptr.NewRequest()); return ptr; } private: // Holds a pointer to Agent-provided services, and keeps the Agent alive. struct AgentConnection { AgentConnection(); AgentConnection(AgentConnection&& other); ~AgentConnection(); AgentConnection& operator=(AgentConnection&& other); fuchsia::sys::ServiceProviderPtr services; fuchsia::modular::AgentControllerPtr controller; }; void ConnectToAgentServiceUnsafe(base::StringPiece agent, base::StringPiece interface, zx::channel request); const fuchsia::modular::ComponentContextPtr component_context_; // Cache of resources for Agents which we're actively using. All |agents_| // are kept alive until the AgentManager is torn down, for now. base::flat_map agents_; DISALLOW_COPY_AND_ASSIGN(AgentManager); }; } // namespace cr_fuchsia #endif // FUCHSIA_BASE_AGENT_MANAGER_H_