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