| // 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. |
| |
| #ifndef SRC_DEVELOPER_FORENSICS_UTILS_INSPECT_NODE_MANAGER_H_ |
| #define SRC_DEVELOPER_FORENSICS_UTILS_INSPECT_NODE_MANAGER_H_ |
| |
| #include <lib/inspect/cpp/vmo/types.h> |
| |
| #include <map> |
| #include <string> |
| #include <vector> |
| |
| #include "src/lib/fxl/macros.h" |
| |
| namespace forensics { |
| |
| // Manage Inspect nodes, allowing access using paths relative to the inspect root. Nodes are |
| // created lazily upon request to get a node or one of its children. |
| class InspectNodeManager { |
| public: |
| InspectNodeManager(inspect::Node* root_node) : root_(root_node) {} |
| |
| // Get the Inspect node at the provided path, creating nodes along the way if need be. |
| inspect::Node& Get(const std::string& path); |
| |
| // Remove an Inspect node at the provided path. |
| // |
| // Return false, if any node in the path doesn't exist. |
| bool Remove(const std::string& path); |
| |
| // Replaces all backslashes in |input| with a character that will later be replaced with a |
| // backslash when the string is written to Inspect. |
| static std::string SanitizeString(std::string str); |
| |
| private: |
| std::vector<std::string> SplitAndDesanitize(const std::string& path); |
| |
| class ManagedNode; |
| |
| class ManagedNodeBase { |
| public: |
| // Return true if the current node contains child. |
| bool HasChild(const std::string& child) const; |
| |
| // Get a child of the current node. If the child doesn't exist, create it. |
| ManagedNode& GetChild(const std::string& child); |
| |
| // Remove a child of the current node. If the child doesn't exist, return false. |
| bool RemoveChild(const std::string& child); |
| |
| virtual inspect::Node& GetNode() = 0; |
| |
| protected: |
| std::map<std::string, ManagedNode> children_; |
| }; |
| |
| class ManagedNode : public ManagedNodeBase { |
| public: |
| ManagedNode(inspect::Node node) : node_(std::move(node)) {} |
| |
| // Allow moving, disallow copying. |
| ManagedNode(ManagedNode&& other) = default; |
| ManagedNode& operator=(ManagedNode&& other) noexcept; |
| ManagedNode(const ManagedNode& other) = delete; |
| ManagedNode& operator=(const ManagedNode other) = delete; |
| |
| inspect::Node& GetNode() override { return node_; } |
| |
| private: |
| inspect::Node node_; |
| }; |
| |
| class RootManagedNode : public ManagedNodeBase { |
| public: |
| RootManagedNode(inspect::Node* root_node) : node_(root_node) {} |
| |
| inspect::Node& GetNode() override { return *node_; } |
| |
| private: |
| inspect::Node* node_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(RootManagedNode); |
| }; |
| |
| RootManagedNode root_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(InspectNodeManager); |
| }; |
| |
| } // namespace forensics |
| |
| #endif // SRC_DEVELOPER_FORENSICS_UTILS_INSPECT_NODE_MANAGER_H_ |