xref: /aosp_15_r20/system/libvintf/ManifestInstance.cpp (revision 70a7ec852fcefd15a4fb57f8f183a8b1c3aacb08)
1*70a7ec85SAndroid Build Coastguard Worker /*
2*70a7ec85SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*70a7ec85SAndroid Build Coastguard Worker  *
4*70a7ec85SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*70a7ec85SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*70a7ec85SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*70a7ec85SAndroid Build Coastguard Worker  *
8*70a7ec85SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*70a7ec85SAndroid Build Coastguard Worker  *
10*70a7ec85SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*70a7ec85SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*70a7ec85SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*70a7ec85SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*70a7ec85SAndroid Build Coastguard Worker  * limitations under the License.
15*70a7ec85SAndroid Build Coastguard Worker  */
16*70a7ec85SAndroid Build Coastguard Worker 
17*70a7ec85SAndroid Build Coastguard Worker #ifndef LIBVINTF_TARGET
18*70a7ec85SAndroid Build Coastguard Worker #define LOG_TAG "libvintf"
19*70a7ec85SAndroid Build Coastguard Worker #include <android-base/logging.h>
20*70a7ec85SAndroid Build Coastguard Worker #endif
21*70a7ec85SAndroid Build Coastguard Worker 
22*70a7ec85SAndroid Build Coastguard Worker #include "ManifestInstance.h"
23*70a7ec85SAndroid Build Coastguard Worker 
24*70a7ec85SAndroid Build Coastguard Worker #include <utility>
25*70a7ec85SAndroid Build Coastguard Worker 
26*70a7ec85SAndroid Build Coastguard Worker #include <android-base/logging.h>
27*70a7ec85SAndroid Build Coastguard Worker 
28*70a7ec85SAndroid Build Coastguard Worker #include "parse_string.h"
29*70a7ec85SAndroid Build Coastguard Worker 
30*70a7ec85SAndroid Build Coastguard Worker namespace android {
31*70a7ec85SAndroid Build Coastguard Worker namespace vintf {
32*70a7ec85SAndroid Build Coastguard Worker 
33*70a7ec85SAndroid Build Coastguard Worker ManifestInstance::ManifestInstance() = default;
34*70a7ec85SAndroid Build Coastguard Worker 
35*70a7ec85SAndroid Build Coastguard Worker ManifestInstance::ManifestInstance(const ManifestInstance&) = default;
36*70a7ec85SAndroid Build Coastguard Worker 
37*70a7ec85SAndroid Build Coastguard Worker ManifestInstance::ManifestInstance(ManifestInstance&&) noexcept = default;
38*70a7ec85SAndroid Build Coastguard Worker 
39*70a7ec85SAndroid Build Coastguard Worker ManifestInstance& ManifestInstance::operator=(const ManifestInstance&) = default;
40*70a7ec85SAndroid Build Coastguard Worker 
41*70a7ec85SAndroid Build Coastguard Worker ManifestInstance& ManifestInstance::operator=(ManifestInstance&&) noexcept = default;
42*70a7ec85SAndroid Build Coastguard Worker 
ManifestInstance(FqInstance && fqInstance,TransportArch && ta,HalFormat fmt,std::optional<std::string> && updatableViaApex,ExclusiveTo exclusiveTo,std::optional<std::string> && accessor,bool updatableViaSystem)43*70a7ec85SAndroid Build Coastguard Worker ManifestInstance::ManifestInstance(FqInstance&& fqInstance, TransportArch&& ta, HalFormat fmt,
44*70a7ec85SAndroid Build Coastguard Worker                                    std::optional<std::string>&& updatableViaApex,
45*70a7ec85SAndroid Build Coastguard Worker                                    ExclusiveTo exclusiveTo, std::optional<std::string>&& accessor,
46*70a7ec85SAndroid Build Coastguard Worker                                    bool updatableViaSystem)
47*70a7ec85SAndroid Build Coastguard Worker     : mFqInstance(std::move(fqInstance)),
48*70a7ec85SAndroid Build Coastguard Worker       mTransportArch(std::move(ta)),
49*70a7ec85SAndroid Build Coastguard Worker       mHalFormat(fmt),
50*70a7ec85SAndroid Build Coastguard Worker       mUpdatableViaApex(std::move(updatableViaApex)),
51*70a7ec85SAndroid Build Coastguard Worker       mExclusiveTo(std::move(exclusiveTo)),
52*70a7ec85SAndroid Build Coastguard Worker       mAccessor(std::move(accessor)),
53*70a7ec85SAndroid Build Coastguard Worker       mUpdatableViaSystem(std::move(updatableViaSystem)) {}
54*70a7ec85SAndroid Build Coastguard Worker 
ManifestInstance(const FqInstance & fqInstance,const TransportArch & ta,HalFormat fmt,const std::optional<std::string> & updatableViaApex,ExclusiveTo exclusiveTo,const std::optional<std::string> & accessor,bool updatableViaSystem)55*70a7ec85SAndroid Build Coastguard Worker ManifestInstance::ManifestInstance(const FqInstance& fqInstance, const TransportArch& ta,
56*70a7ec85SAndroid Build Coastguard Worker                                    HalFormat fmt,
57*70a7ec85SAndroid Build Coastguard Worker                                    const std::optional<std::string>& updatableViaApex,
58*70a7ec85SAndroid Build Coastguard Worker                                    ExclusiveTo exclusiveTo,
59*70a7ec85SAndroid Build Coastguard Worker                                    const std::optional<std::string>& accessor,
60*70a7ec85SAndroid Build Coastguard Worker                                    bool updatableViaSystem)
61*70a7ec85SAndroid Build Coastguard Worker     : mFqInstance(fqInstance),
62*70a7ec85SAndroid Build Coastguard Worker       mTransportArch(ta),
63*70a7ec85SAndroid Build Coastguard Worker       mHalFormat(fmt),
64*70a7ec85SAndroid Build Coastguard Worker       mUpdatableViaApex(updatableViaApex),
65*70a7ec85SAndroid Build Coastguard Worker       mExclusiveTo(exclusiveTo),
66*70a7ec85SAndroid Build Coastguard Worker       mAccessor(accessor),
67*70a7ec85SAndroid Build Coastguard Worker       mUpdatableViaSystem(updatableViaSystem) {}
68*70a7ec85SAndroid Build Coastguard Worker 
package() const69*70a7ec85SAndroid Build Coastguard Worker const std::string& ManifestInstance::package() const {
70*70a7ec85SAndroid Build Coastguard Worker     return mFqInstance.getPackage();
71*70a7ec85SAndroid Build Coastguard Worker }
72*70a7ec85SAndroid Build Coastguard Worker 
version() const73*70a7ec85SAndroid Build Coastguard Worker Version ManifestInstance::version() const {
74*70a7ec85SAndroid Build Coastguard Worker     return mFqInstance.getVersion();
75*70a7ec85SAndroid Build Coastguard Worker }
76*70a7ec85SAndroid Build Coastguard Worker 
interface() const77*70a7ec85SAndroid Build Coastguard Worker std::string ManifestInstance::interface() const {
78*70a7ec85SAndroid Build Coastguard Worker     return mFqInstance.getInterface();
79*70a7ec85SAndroid Build Coastguard Worker }
80*70a7ec85SAndroid Build Coastguard Worker 
instance() const81*70a7ec85SAndroid Build Coastguard Worker const std::string& ManifestInstance::instance() const {
82*70a7ec85SAndroid Build Coastguard Worker     return mFqInstance.getInstance();
83*70a7ec85SAndroid Build Coastguard Worker }
84*70a7ec85SAndroid Build Coastguard Worker 
transport() const85*70a7ec85SAndroid Build Coastguard Worker Transport ManifestInstance::transport() const {
86*70a7ec85SAndroid Build Coastguard Worker     return mTransportArch.transport;
87*70a7ec85SAndroid Build Coastguard Worker }
88*70a7ec85SAndroid Build Coastguard Worker 
arch() const89*70a7ec85SAndroid Build Coastguard Worker Arch ManifestInstance::arch() const {
90*70a7ec85SAndroid Build Coastguard Worker     return mTransportArch.arch;
91*70a7ec85SAndroid Build Coastguard Worker }
92*70a7ec85SAndroid Build Coastguard Worker 
ip() const93*70a7ec85SAndroid Build Coastguard Worker const std::optional<std::string> ManifestInstance::ip() const {
94*70a7ec85SAndroid Build Coastguard Worker     return mTransportArch.ip;
95*70a7ec85SAndroid Build Coastguard Worker }
96*70a7ec85SAndroid Build Coastguard Worker 
port() const97*70a7ec85SAndroid Build Coastguard Worker const std::optional<uint64_t> ManifestInstance::port() const {
98*70a7ec85SAndroid Build Coastguard Worker     return mTransportArch.port;
99*70a7ec85SAndroid Build Coastguard Worker }
100*70a7ec85SAndroid Build Coastguard Worker 
format() const101*70a7ec85SAndroid Build Coastguard Worker HalFormat ManifestInstance::format() const {
102*70a7ec85SAndroid Build Coastguard Worker     return mHalFormat;
103*70a7ec85SAndroid Build Coastguard Worker }
104*70a7ec85SAndroid Build Coastguard Worker 
updatableViaApex() const105*70a7ec85SAndroid Build Coastguard Worker const std::optional<std::string>& ManifestInstance::updatableViaApex() const {
106*70a7ec85SAndroid Build Coastguard Worker     return mUpdatableViaApex;
107*70a7ec85SAndroid Build Coastguard Worker }
108*70a7ec85SAndroid Build Coastguard Worker 
exclusiveTo() const109*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo ManifestInstance::exclusiveTo() const {
110*70a7ec85SAndroid Build Coastguard Worker     return mExclusiveTo;
111*70a7ec85SAndroid Build Coastguard Worker }
112*70a7ec85SAndroid Build Coastguard Worker 
accessor() const113*70a7ec85SAndroid Build Coastguard Worker const std::optional<std::string>& ManifestInstance::accessor() const {
114*70a7ec85SAndroid Build Coastguard Worker     return mAccessor;
115*70a7ec85SAndroid Build Coastguard Worker }
116*70a7ec85SAndroid Build Coastguard Worker 
getFqInstance() const117*70a7ec85SAndroid Build Coastguard Worker const FqInstance& ManifestInstance::getFqInstance() const {
118*70a7ec85SAndroid Build Coastguard Worker     return mFqInstance;
119*70a7ec85SAndroid Build Coastguard Worker }
120*70a7ec85SAndroid Build Coastguard Worker 
updatableViaSystem() const121*70a7ec85SAndroid Build Coastguard Worker bool ManifestInstance::updatableViaSystem() const {
122*70a7ec85SAndroid Build Coastguard Worker     return mUpdatableViaSystem;
123*70a7ec85SAndroid Build Coastguard Worker }
124*70a7ec85SAndroid Build Coastguard Worker 
operator ==(const ManifestInstance & other) const125*70a7ec85SAndroid Build Coastguard Worker bool ManifestInstance::operator==(const ManifestInstance& other) const {
126*70a7ec85SAndroid Build Coastguard Worker     return mFqInstance == other.mFqInstance && mTransportArch == other.mTransportArch &&
127*70a7ec85SAndroid Build Coastguard Worker            mHalFormat == other.mHalFormat && mUpdatableViaApex == other.mUpdatableViaApex &&
128*70a7ec85SAndroid Build Coastguard Worker            mUpdatableViaSystem == other.mUpdatableViaSystem && mAccessor == other.mAccessor;
129*70a7ec85SAndroid Build Coastguard Worker }
operator <(const ManifestInstance & other) const130*70a7ec85SAndroid Build Coastguard Worker bool ManifestInstance::operator<(const ManifestInstance& other) const {
131*70a7ec85SAndroid Build Coastguard Worker     if (mFqInstance < other.mFqInstance) return true;
132*70a7ec85SAndroid Build Coastguard Worker     if (other.mFqInstance < mFqInstance) return false;
133*70a7ec85SAndroid Build Coastguard Worker     if (mTransportArch < other.mTransportArch) return true;
134*70a7ec85SAndroid Build Coastguard Worker     if (other.mTransportArch < mTransportArch) return false;
135*70a7ec85SAndroid Build Coastguard Worker     if (mHalFormat < other.mHalFormat) return true;
136*70a7ec85SAndroid Build Coastguard Worker     if (other.mHalFormat < mHalFormat) return false;
137*70a7ec85SAndroid Build Coastguard Worker     if (mUpdatableViaApex < other.mUpdatableViaApex) return true;
138*70a7ec85SAndroid Build Coastguard Worker     if (other.mUpdatableViaApex < mUpdatableViaApex) return false;
139*70a7ec85SAndroid Build Coastguard Worker     if (mUpdatableViaSystem < other.mUpdatableViaSystem) return true;
140*70a7ec85SAndroid Build Coastguard Worker     if (other.mUpdatableViaSystem < mUpdatableViaSystem) return false;
141*70a7ec85SAndroid Build Coastguard Worker     return mAccessor < other.mAccessor;
142*70a7ec85SAndroid Build Coastguard Worker }
143*70a7ec85SAndroid Build Coastguard Worker 
getSimpleFqInstance() const144*70a7ec85SAndroid Build Coastguard Worker std::string ManifestInstance::getSimpleFqInstance() const {
145*70a7ec85SAndroid Build Coastguard Worker     FqInstance e;
146*70a7ec85SAndroid Build Coastguard Worker     bool success = false;
147*70a7ec85SAndroid Build Coastguard Worker     switch (format()) {
148*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::AIDL: {
149*70a7ec85SAndroid Build Coastguard Worker             // Hide fake version when printing to manifest XML <fqname> tag.
150*70a7ec85SAndroid Build Coastguard Worker             success = e.setTo(interface(), instance());
151*70a7ec85SAndroid Build Coastguard Worker         } break;
152*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::HIDL:
153*70a7ec85SAndroid Build Coastguard Worker             [[fallthrough]];
154*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::NATIVE: {
155*70a7ec85SAndroid Build Coastguard Worker             success = e.setTo(version().majorVer, version().minorVer, interface(), instance());
156*70a7ec85SAndroid Build Coastguard Worker         } break;
157*70a7ec85SAndroid Build Coastguard Worker     }
158*70a7ec85SAndroid Build Coastguard Worker #ifndef LIBVINTF_TARGET
159*70a7ec85SAndroid Build Coastguard Worker     CHECK(success) << "Cannot get simple fqinstnance from '" << mFqInstance.string() << "'";
160*70a7ec85SAndroid Build Coastguard Worker #endif
161*70a7ec85SAndroid Build Coastguard Worker     return success ? e.string() : "";
162*70a7ec85SAndroid Build Coastguard Worker }
163*70a7ec85SAndroid Build Coastguard Worker 
description() const164*70a7ec85SAndroid Build Coastguard Worker std::string ManifestInstance::description() const {
165*70a7ec85SAndroid Build Coastguard Worker     switch (format()) {
166*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::AIDL: {
167*70a7ec85SAndroid Build Coastguard Worker             return toAidlFqnameString(package(), interface(), instance()) + " (@" +
168*70a7ec85SAndroid Build Coastguard Worker                    aidlVersionToString(version()) + ")";
169*70a7ec85SAndroid Build Coastguard Worker         } break;
170*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::HIDL:
171*70a7ec85SAndroid Build Coastguard Worker             [[fallthrough]];
172*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::NATIVE: {
173*70a7ec85SAndroid Build Coastguard Worker             return getFqInstance().string();
174*70a7ec85SAndroid Build Coastguard Worker         } break;
175*70a7ec85SAndroid Build Coastguard Worker     }
176*70a7ec85SAndroid Build Coastguard Worker }
177*70a7ec85SAndroid Build Coastguard Worker 
descriptionWithoutPackage() const178*70a7ec85SAndroid Build Coastguard Worker std::string ManifestInstance::descriptionWithoutPackage() const {
179*70a7ec85SAndroid Build Coastguard Worker     switch (format()) {
180*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::AIDL: {
181*70a7ec85SAndroid Build Coastguard Worker             return toFQNameString(interface(), instance()) + " (@" +
182*70a7ec85SAndroid Build Coastguard Worker                    aidlVersionToString(version()) + ")";
183*70a7ec85SAndroid Build Coastguard Worker         } break;
184*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::HIDL:
185*70a7ec85SAndroid Build Coastguard Worker             [[fallthrough]];
186*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::NATIVE: {
187*70a7ec85SAndroid Build Coastguard Worker             return getSimpleFqInstance();
188*70a7ec85SAndroid Build Coastguard Worker         } break;
189*70a7ec85SAndroid Build Coastguard Worker     }
190*70a7ec85SAndroid Build Coastguard Worker }
191*70a7ec85SAndroid Build Coastguard Worker 
nameWithVersion() const192*70a7ec85SAndroid Build Coastguard Worker std::string ManifestInstance::nameWithVersion() const {
193*70a7ec85SAndroid Build Coastguard Worker     switch (format()) {
194*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::HIDL:
195*70a7ec85SAndroid Build Coastguard Worker             [[fallthrough]];
196*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::NATIVE:
197*70a7ec85SAndroid Build Coastguard Worker             return toFQNameString(package(), version());
198*70a7ec85SAndroid Build Coastguard Worker             break;
199*70a7ec85SAndroid Build Coastguard Worker         case HalFormat::AIDL:
200*70a7ec85SAndroid Build Coastguard Worker             return package() + "@" + aidlVersionToString(version());
201*70a7ec85SAndroid Build Coastguard Worker             break;
202*70a7ec85SAndroid Build Coastguard Worker     }
203*70a7ec85SAndroid Build Coastguard Worker }
204*70a7ec85SAndroid Build Coastguard Worker 
withVersion(const Version & v) const205*70a7ec85SAndroid Build Coastguard Worker ManifestInstance ManifestInstance::withVersion(const Version& v) const {
206*70a7ec85SAndroid Build Coastguard Worker     FqInstance fqInstance;
207*70a7ec85SAndroid Build Coastguard Worker     CHECK(fqInstance.setTo(getFqInstance().getPackage(), v.majorVer, v.minorVer,
208*70a7ec85SAndroid Build Coastguard Worker                            getFqInstance().getInterface(), getFqInstance().getInstance()));
209*70a7ec85SAndroid Build Coastguard Worker     return ManifestInstance(std::move(fqInstance), mTransportArch, format(), mUpdatableViaApex,
210*70a7ec85SAndroid Build Coastguard Worker                             mExclusiveTo, mAccessor, mUpdatableViaSystem);
211*70a7ec85SAndroid Build Coastguard Worker }
212*70a7ec85SAndroid Build Coastguard Worker 
213*70a7ec85SAndroid Build Coastguard Worker }  // namespace vintf
214*70a7ec85SAndroid Build Coastguard Worker }  // namespace android
215