1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 #ifndef ANDROID_VINTF_MANIFEST_HAL_H
19 #define ANDROID_VINTF_MANIFEST_HAL_H
20 
21 #include <map>
22 #include <optional>
23 #include <set>
24 #include <string>
25 #include <vector>
26 
27 #include <hidl-util/FqInstance.h>
28 
29 #include "HalFormat.h"
30 #include "HalInterface.h"
31 #include "Level.h"
32 #include "ManifestInstance.h"
33 #include "TransportArch.h"
34 #include "Version.h"
35 #include "WithFileName.h"
36 
37 namespace android {
38 namespace vintf {
39 
40 // A component of HalManifest.
41 struct ManifestHal : public WithFileName {
42     using InstanceType = ManifestInstance;
43 
44     ManifestHal() = default;
45 
ManifestHalManifestHal46     ManifestHal(HalFormat fmt, std::string&& n, std::vector<Version>&& vs, TransportArch ta,
47                 std::map<std::string, HalInterface>&& intf)
48         : format(fmt),
49           name(std::move(n)),
50           versions(std::move(vs)),
51           transportArch(ta),
52           interfaces(std::move(intf)) {}
53 
54     bool operator==(const ManifestHal &other) const;
55 
56     HalFormat format = HalFormat::HIDL;
57     std::string name;
58     std::vector<Version> versions;
59     TransportArch transportArch;
60     std::map<std::string, HalInterface> interfaces;
61 
transportManifestHal62     inline Transport transport() const {
63         return transportArch.transport;
64     }
65 
archManifestHal66     inline Arch arch() const { return transportArch.arch; }
67 
getNameManifestHal68     inline const std::string& getName() const { return name; }
69 
70     // Assume isValid().
71     bool forEachInstance(const std::function<bool(const ManifestInstance&)>& func) const;
72 
isOverrideManifestHal73     bool isOverride() const { return mIsOverride; }
updatableViaApexManifestHal74     const std::optional<std::string>& updatableViaApex() const { return mUpdatableViaApex; }
75 
76     // When true, the existence of this <hal> tag means the component does NOT
77     // exist on the device. This is useful for ODM manifests to specify that
78     // a HAL is disabled on certain products.
79     bool isDisabledHal() const;
80 
getMaxLevelManifestHal81     Level getMaxLevel() const { return mMaxLevel; }
82 
83    private:
84     friend struct LibVintfTest;
85     friend struct ManifestHalConverter;
86     friend struct HalManifest;
87     friend bool parse(const std::string &s, ManifestHal *hal);
88 
89     // Whether this hal is a valid one. Note that an empty ManifestHal
90     // (constructed via ManifestHal()) is valid.
91     bool isValid(std::string* error = nullptr) const;
92 
93     // Return all versions mentioned by <version>s and <fqname>s.
94     void appendAllVersions(std::set<Version>* ret) const;
95 
96     // insert instances to mAdditionalInstances.
97     // Existing instances will be ignored.
98     // Pre: all instances to be inserted must satisfy
99     // !hasPackage() && hasVersion() && hasInterface() && hasInstance()
100     bool insertInstance(const FqInstance& fqInstance, std::string* error = nullptr);
101     bool insertInstances(const std::set<FqInstance>& fqInstances, std::string* error = nullptr);
102 
103     // Verify instance before inserting.
104     bool verifyInstance(const FqInstance& fqInstance, std::string* error = nullptr) const;
105 
106     bool mIsOverride = false;
107     std::optional<std::string> mUpdatableViaApex;
108     // Additional instances to <version> x <interface> x <instance>.
109     std::set<ManifestInstance> mAdditionalInstances;
110 
111     // Max level of this HAL. Only valid for framework manifest HALs.
112     // If set, HALs with max-level < target FCM version in device manifest is
113     // disabled.
114     Level mMaxLevel = Level::UNSPECIFIED;
115 };
116 
117 } // namespace vintf
118 } // namespace android
119 
120 #endif // ANDROID_VINTF_MANIFEST_HAL_H
121