1 #ifndef HAL_MANIFEST_H 2 #define HAL_MANIFEST_H 3 4 #include <array> 5 #include <map> 6 #include <optional> 7 #include <string> 8 #include <vector> 9 #include <sstream> 10 11 #if __has_include(<libxml/parser.h>) 12 #include <libxml/parser.h> 13 #include <libxml/xinclude.h> 14 #else 15 #error Require libxml2 library. Please add libxml2 to shared_libs or static_libs 16 #endif 17 18 #include "hal_manifest_enums.h" 19 20 namespace hal { 21 namespace manifest { 22 class Hal; 23 class Interface; 24 class Sepolicy; 25 class Vndk; 26 class VendorNdk; 27 class SystemSdk; 28 class Kernel; 29 class Manifest; 30 std::optional<Manifest> read(const char* configFile); 31 32 std::optional<Manifest> parse(const char* xml); 33 34 class Hal { 35 public: 36 class Transport { 37 private: 38 const std::optional<std::string> arch_; 39 const std::optional<std::string> ip_; 40 const std::optional<std::string> port_; 41 const std::optional<std::string> value_; 42 public: 43 Transport(std::optional<std::string> arch, std::optional<std::string> ip, std::optional<std::string> port, std::string value); 44 const std::string& getArch() const; 45 bool hasArch() const; 46 const std::string& getIp() const; 47 bool hasIp() const; 48 const std::string& getPort() const; 49 bool hasPort() const; 50 const std::string& getValue() const; 51 bool hasValue() const; 52 static Hal::Transport read(xmlNode *root); 53 }; 54 55 56 private: 57 const std::optional<std::string> name_; 58 const std::vector<Hal::Transport> transport_; 59 const std::vector<std::string> version_; 60 const std::vector<Interface> interface_; 61 const std::vector<std::string> fqname_; 62 const std::vector<std::string> accessor_; 63 const std::optional<std::string> format_; 64 const std::optional<std::string> exclusiveTo_; 65 const std::optional<std::string> override_; 66 const std::optional<std::string> updatableViaApex_; 67 const std::optional<std::string> updatableViaSystem_; 68 const std::optional<std::string> maxLevel_; 69 const std::optional<std::string> minLevel_; 70 public: 71 Hal(std::optional<std::string> name, std::vector<Transport> transport, std::vector<std::string> version, std::vector<Interface> interface, std::vector<std::string> fqname, std::vector<std::string> accessor, std::optional<std::string> format, std::optional<std::string> exclusiveTo, std::optional<std::string> override, std::optional<std::string> updatableViaApex, std::optional<std::string> updatableViaSystem, std::optional<std::string> maxLevel, std::optional<std::string> minLevel); 72 const std::string& getName() const; 73 bool hasName() const; 74 const std::vector<Hal::Transport>& getTransport() const; 75 bool hasTransport() const; 76 const Hal::Transport* getFirstTransport() const; 77 const std::vector<std::string>& getVersion() const; 78 bool hasVersion() const; 79 const std::string* getFirstVersion() const; 80 const std::vector<Interface>& getInterface() const; 81 bool hasInterface() const; 82 const Interface* getFirstInterface() const; 83 const std::vector<std::string>& getFqname() const; 84 bool hasFqname() const; 85 const std::string* getFirstFqname() const; 86 const std::vector<std::string>& getAccessor() const; 87 bool hasAccessor() const; 88 const std::string* getFirstAccessor() const; 89 const std::string& getFormat() const; 90 bool hasFormat() const; 91 const std::string& getExclusiveTo() const; 92 bool hasExclusiveTo() const; 93 const std::string& getOverride() const; 94 bool hasOverride() const; 95 const std::string& getUpdatableViaApex() const; 96 bool hasUpdatableViaApex() const; 97 const std::string& getUpdatableViaSystem() const; 98 bool hasUpdatableViaSystem() const; 99 const std::string& getMaxLevel() const; 100 bool hasMaxLevel() const; 101 const std::string& getMinLevel() const; 102 bool hasMinLevel() const; 103 static Hal read(xmlNode *root); 104 }; 105 106 class Interface { 107 private: 108 const std::optional<std::string> name_; 109 const std::vector<std::string> instance_; 110 public: 111 Interface(std::optional<std::string> name, std::vector<std::string> instance); 112 const std::string& getName() const; 113 bool hasName() const; 114 const std::vector<std::string>& getInstance() const; 115 bool hasInstance() const; 116 const std::string* getFirstInstance() const; 117 static Interface read(xmlNode *root); 118 }; 119 120 class Sepolicy { 121 private: 122 const std::optional<std::string> version_; 123 public: 124 explicit Sepolicy(std::optional<std::string> version); 125 const std::string& getVersion() const; 126 bool hasVersion() const; 127 static Sepolicy read(xmlNode *root); 128 }; 129 130 class Vndk { 131 private: 132 const std::optional<std::string> version_; 133 const std::vector<std::string> library_; 134 public: 135 Vndk(std::optional<std::string> version, std::vector<std::string> library); 136 const std::string& getVersion() const; 137 bool hasVersion() const; 138 const std::vector<std::string>& getLibrary() const; 139 bool hasLibrary() const; 140 const std::string* getFirstLibrary() const; 141 static Vndk read(xmlNode *root); 142 }; 143 144 class VendorNdk { 145 private: 146 const std::optional<std::string> version_; 147 const std::vector<std::string> library_; 148 public: 149 VendorNdk(std::optional<std::string> version, std::vector<std::string> library); 150 const std::string& getVersion() const; 151 bool hasVersion() const; 152 const std::vector<std::string>& getLibrary() const; 153 bool hasLibrary() const; 154 const std::string* getFirstLibrary() const; 155 static VendorNdk read(xmlNode *root); 156 }; 157 158 class SystemSdk { 159 private: 160 const std::vector<std::string> version_; 161 public: 162 explicit SystemSdk(std::vector<std::string> version); 163 const std::vector<std::string>& getVersion() const; 164 bool hasVersion() const; 165 const std::string* getFirstVersion() const; 166 static SystemSdk read(xmlNode *root); 167 }; 168 169 class Kernel { 170 public: 171 class Config { 172 private: 173 const std::optional<std::string> key_; 174 const std::optional<std::string> value_; 175 public: 176 Config(std::optional<std::string> key, std::optional<std::string> value); 177 const std::string& getKey() const; 178 bool hasKey() const; 179 const std::string& getValue() const; 180 bool hasValue() const; 181 static Kernel::Config read(xmlNode *root); 182 }; 183 184 185 private: 186 const std::vector<Kernel::Config> config_; 187 const std::optional<std::string> version_; 188 const std::optional<std::string> targetLevel_; 189 public: 190 Kernel(std::vector<Config> config, std::optional<std::string> version, std::optional<std::string> targetLevel); 191 const std::vector<Kernel::Config>& getConfig() const; 192 bool hasConfig() const; 193 const Kernel::Config* getFirstConfig() const; 194 const std::string& getVersion() const; 195 bool hasVersion() const; 196 const std::string& getTargetLevel() const; 197 bool hasTargetLevel() const; 198 static Kernel read(xmlNode *root); 199 }; 200 201 class Manifest { 202 private: 203 const std::vector<Hal> hal_; 204 const std::vector<Sepolicy> sepolicy_; 205 const std::vector<Kernel> kernel_; 206 const std::vector<Vndk> vndk_; 207 const std::vector<VendorNdk> vendorNdk_; 208 const std::vector<SystemSdk> systemSdk_; 209 const std::string version_; 210 const std::string type_; 211 const std::optional<std::string> targetLevel_; 212 public: 213 Manifest(std::vector<Hal> hal, std::vector<Sepolicy> sepolicy, std::vector<Kernel> kernel, std::vector<Vndk> vndk, std::vector<VendorNdk> vendorNdk, std::vector<SystemSdk> systemSdk, std::string version, std::string type, std::optional<std::string> targetLevel); 214 const std::vector<Hal>& getHal() const; 215 bool hasHal() const; 216 const Hal* getFirstHal() const; 217 const std::vector<Sepolicy>& getSepolicy() const; 218 bool hasSepolicy() const; 219 const Sepolicy* getFirstSepolicy() const; 220 const std::vector<Kernel>& getKernel() const; 221 bool hasKernel() const; 222 const Kernel* getFirstKernel() const; 223 const std::vector<Vndk>& getVndk() const; 224 bool hasVndk() const; 225 const Vndk* getFirstVndk() const; 226 const std::vector<VendorNdk>& getVendorNdk() const; 227 bool hasVendorNdk() const; 228 const VendorNdk* getFirstVendorNdk() const; 229 const std::vector<SystemSdk>& getSystemSdk() const; 230 bool hasSystemSdk() const; 231 const SystemSdk* getFirstSystemSdk() const; 232 const std::string& getVersion() const; 233 bool hasVersion() const; 234 const std::string& getType() const; 235 bool hasType() const; 236 const std::string& getTargetLevel() const; 237 bool hasTargetLevel() const; 238 static Manifest read(xmlNode *root); 239 }; 240 241 } // manifest 242 } // hal 243 #endif // HAL_MANIFEST_H 244