| // Copyright 2021 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. |
| |
| #ifndef SRC_DEVELOPER_DEBUG_DEBUG_AGENT_COMPONENT_MANAGER_H_ |
| #define SRC_DEVELOPER_DEBUG_DEBUG_AGENT_COMPONENT_MANAGER_H_ |
| |
| #include <optional> |
| #include <string> |
| #include <vector> |
| |
| #include "src/developer/debug/debug_agent/stdio_handles.h" |
| #include "src/developer/debug/ipc/records.h" |
| #include "src/developer/debug/shared/status.h" |
| |
| namespace debug_agent { |
| |
| class DebugAgent; |
| class Filter; |
| class ProcessHandle; |
| class SystemInterface; |
| |
| // This class manages launching and monitoring Fuchsia components. It is a singleton owned by the |
| // DebugAgent. |
| class ComponentManager { |
| public: |
| // ComponentManager needs |SystemInterface::GetParentJobKoid| for |FindComponentInfo|. |
| explicit ComponentManager(SystemInterface* system_interface) |
| : system_interface_(system_interface) {} |
| virtual ~ComponentManager() = default; |
| |
| // Find the component information if the job is the root job of an ELF component. |
| virtual std::vector<debug_ipc::ComponentInfo> FindComponentInfo(zx_koid_t job_koid) const = 0; |
| |
| // Returns the current set of component information in the system that is not associated with an |
| // ELF process - e.g. it doesn't have a job or a process to key the lookup off of. |
| virtual const std::map<std::string, debug_ipc::ComponentInfo>& GetNonElfComponentInfo() const = 0; |
| |
| // Find the component information if the process runs in the context of a component. |
| std::vector<debug_ipc::ComponentInfo> FindComponentInfo(const ProcessHandle& process) const; |
| |
| // Finds the component info that matches the given moniker or url. Note that there may be multiple |
| // components that match the same url, but there will never be multiple matches for a full |
| // component moniker. |
| std::optional<debug_ipc::ComponentInfo> FindComponentInfoByMoniker( |
| const std::string& moniker) const; |
| std::vector<debug_ipc::ComponentInfo> FindComponentInfoByUrl(const std::string& url) const; |
| |
| // Set the debug_agent. ComponentManager needs a debug_agent to notify component starting and |
| // exiting events. |
| virtual void SetDebugAgent(DebugAgent* debug_agent) = 0; |
| |
| // Launches the component. |
| virtual debug::Status LaunchComponent(std::string url) = 0; |
| |
| // Launches a test. |
| virtual debug::Status LaunchTest(std::string url, std::optional<std::string> realm, |
| std::vector<std::string> case_filters) = 0; |
| |
| // Notification that a process has started. |
| // |
| // If the process starts because of a |LaunchComponent|, this function will fill in the given |
| // stdio handles and return true. |
| // |
| // If it was not a component launch, returns false (the caller normally won't know if a launch is |
| // a component without asking us, so it isn't necessarily an error). |
| // |
| // |process_name_override| allows the component manager to override the process name observed |
| // by the client and is optional. |
| virtual bool OnProcessStart(const ProcessHandle& process, StdioHandles* out_stdio, |
| std::string* process_name_override) = 0; |
| |
| private: |
| // This function contains the implementation details of |FindComponentInfoBy{Url,Moniker}|, while |
| // allowing for sharing a common comparison functor. |
| virtual std::vector<debug_ipc::ComponentInfo> FindComponentInfoWithComparator( |
| fit::function<bool(const debug_ipc::ComponentInfo&)>) const = 0; |
| |
| // Find the component information matching the given component info. Only populated fields are |
| // considered part of the search. Note that this can return multiple components if searching by |
| // URL only, but if moniker is included then it is expected to have exactly one match. |
| std::vector<debug_ipc::ComponentInfo> FindComponentInfo( |
| const debug_ipc::ComponentInfo& needle) const; |
| |
| SystemInterface* system_interface_; |
| }; |
| |
| } // namespace debug_agent |
| |
| #endif // SRC_DEVELOPER_DEBUG_DEBUG_AGENT_COMPONENT_MANAGER_H_ |