/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef HIDUTIL_HIDTREE_H_ #define HIDUTIL_HIDTREE_H_ #include "HidReport.h" #include <cstddef> #include <vector> #include <iostream> namespace HidUtil { // HID report parser output tree node class HidTreeNode { friend std::ostream& operator<<(std::ostream& os, const HidTreeNode& n); public: enum { TYPE_UNINITIALIZED = 0, TYPE_NORMAL = 1, TYPE_REPORT = 2 // can be cast to HidReportNode }; HidTreeNode(); HidTreeNode(std::shared_ptr<HidTreeNode> parent, uint32_t data, uint32_t fullUsage); virtual ~HidTreeNode() = default; // make a deep copy of tree at and below this node and attach it to specified parent node virtual std::shared_ptr<HidTreeNode> deepCopy( std::shared_ptr<HidTreeNode> parent = nullptr) const; // add child to this node std::shared_ptr<HidTreeNode> addChild(std::shared_ptr<HidTreeNode> child); // get all children of a node std::vector<std::shared_ptr<HidTreeNode>>& getChildren(); const std::vector<std::shared_ptr<HidTreeNode>>& getChildren() const; // get parent (nullptr if it is root node or if lock weak_ptr failed) std::shared_ptr<HidTreeNode> getParent() const; // access usage of this node unsigned int getFullUsage() const; bool isReportCollection() const; bool isUsageCollection() const; int getNodeType() const; protected: // for derived class to define different nodeType HidTreeNode(std::shared_ptr<HidTreeNode> parent, uint32_t data, uint32_t fullUsage, int nodeType); // helper for stream output void insertIndentation(std::ostream &os, int level) const; private: // helper for stream output virtual void outputRecursive(std::ostream& os, int level) const; int mNodeType; uint32_t mData; uint32_t mFullUsage; std::vector<std::shared_ptr<HidTreeNode>> mChildren; std::weak_ptr<HidTreeNode> mParent; }; // Tree node that corresponds to an input, output or feature report class HidReportNode : public HidTreeNode { public: HidReportNode(std::shared_ptr<HidTreeNode> parent, const HidReport &report); virtual std::shared_ptr<HidTreeNode> deepCopy( std::shared_ptr<HidTreeNode> parent = nullptr) const override; // obtain HidReport attached to this node const HidReport& getReport() const; // reset usage of node and set underlying report to collapsed void collapse(unsigned int newUsage); private: virtual void outputRecursive(std::ostream &os, int level) const override; HidReport mReport; }; std::ostream& operator<<(std::ostream& os, const HidTreeNode& n); } // namespace HidUtil #endif // HIDUTIL_HIDTREE_H_