1*70a7ec85SAndroid Build Coastguard Worker /*
2*70a7ec85SAndroid Build Coastguard Worker * Copyright (C) 2023 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 #include <vintf/FqInstance.h>
18*70a7ec85SAndroid Build Coastguard Worker
19*70a7ec85SAndroid Build Coastguard Worker #include <sstream>
20*70a7ec85SAndroid Build Coastguard Worker
21*70a7ec85SAndroid Build Coastguard Worker namespace android::vintf {
22*70a7ec85SAndroid Build Coastguard Worker
23*70a7ec85SAndroid Build Coastguard Worker using details::FQName;
24*70a7ec85SAndroid Build Coastguard Worker
25*70a7ec85SAndroid Build Coastguard Worker static const char INSTANCE_SEP = '/';
26*70a7ec85SAndroid Build Coastguard Worker
getPackage() const27*70a7ec85SAndroid Build Coastguard Worker const std::string& FqInstance::getPackage() const {
28*70a7ec85SAndroid Build Coastguard Worker return mFqName.package();
29*70a7ec85SAndroid Build Coastguard Worker }
30*70a7ec85SAndroid Build Coastguard Worker
hasPackage() const31*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::hasPackage() const {
32*70a7ec85SAndroid Build Coastguard Worker return !getPackage().empty();
33*70a7ec85SAndroid Build Coastguard Worker }
34*70a7ec85SAndroid Build Coastguard Worker
getMajorVersion() const35*70a7ec85SAndroid Build Coastguard Worker size_t FqInstance::getMajorVersion() const {
36*70a7ec85SAndroid Build Coastguard Worker return hasVersion() ? mFqName.getPackageMajorVersion() : 0;
37*70a7ec85SAndroid Build Coastguard Worker }
38*70a7ec85SAndroid Build Coastguard Worker
getMinorVersion() const39*70a7ec85SAndroid Build Coastguard Worker size_t FqInstance::getMinorVersion() const {
40*70a7ec85SAndroid Build Coastguard Worker return hasVersion() ? mFqName.getPackageMinorVersion() : 0;
41*70a7ec85SAndroid Build Coastguard Worker }
42*70a7ec85SAndroid Build Coastguard Worker
getVersion() const43*70a7ec85SAndroid Build Coastguard Worker std::pair<size_t, size_t> FqInstance::getVersion() const {
44*70a7ec85SAndroid Build Coastguard Worker return mFqName.getVersion();
45*70a7ec85SAndroid Build Coastguard Worker }
46*70a7ec85SAndroid Build Coastguard Worker
hasVersion() const47*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::hasVersion() const {
48*70a7ec85SAndroid Build Coastguard Worker return mFqName.hasVersion();
49*70a7ec85SAndroid Build Coastguard Worker }
50*70a7ec85SAndroid Build Coastguard Worker
getInterface() const51*70a7ec85SAndroid Build Coastguard Worker std::string FqInstance::getInterface() const {
52*70a7ec85SAndroid Build Coastguard Worker return hasInterface() ? mFqName.getInterfaceName() : "";
53*70a7ec85SAndroid Build Coastguard Worker }
54*70a7ec85SAndroid Build Coastguard Worker
hasInterface() const55*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::hasInterface() const {
56*70a7ec85SAndroid Build Coastguard Worker return mFqName.isInterfaceName();
57*70a7ec85SAndroid Build Coastguard Worker }
58*70a7ec85SAndroid Build Coastguard Worker
getInstance() const59*70a7ec85SAndroid Build Coastguard Worker const std::string& FqInstance::getInstance() const {
60*70a7ec85SAndroid Build Coastguard Worker return mInstance;
61*70a7ec85SAndroid Build Coastguard Worker }
62*70a7ec85SAndroid Build Coastguard Worker
hasInstance() const63*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::hasInstance() const {
64*70a7ec85SAndroid Build Coastguard Worker return !mInstance.empty();
65*70a7ec85SAndroid Build Coastguard Worker }
66*70a7ec85SAndroid Build Coastguard Worker
getFqNameString() const67*70a7ec85SAndroid Build Coastguard Worker std::string FqInstance::getFqNameString() const {
68*70a7ec85SAndroid Build Coastguard Worker return mFqName.string();
69*70a7ec85SAndroid Build Coastguard Worker }
70*70a7ec85SAndroid Build Coastguard Worker
isValid() const71*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::isValid() const {
72*70a7ec85SAndroid Build Coastguard Worker bool hasPkg = hasPackage();
73*70a7ec85SAndroid Build Coastguard Worker bool hasVer = hasVersion();
74*70a7ec85SAndroid Build Coastguard Worker bool hasIntf = hasInterface();
75*70a7ec85SAndroid Build Coastguard Worker bool hasInst = hasInstance();
76*70a7ec85SAndroid Build Coastguard Worker
77*70a7ec85SAndroid Build Coastguard Worker // [email protected]::IFoo/default
78*70a7ec85SAndroid Build Coastguard Worker // [email protected]/default
79*70a7ec85SAndroid Build Coastguard Worker if (hasPkg && hasVer && hasInst) {
80*70a7ec85SAndroid Build Coastguard Worker return true;
81*70a7ec85SAndroid Build Coastguard Worker }
82*70a7ec85SAndroid Build Coastguard Worker
83*70a7ec85SAndroid Build Coastguard Worker // @1.0::IFoo/default
84*70a7ec85SAndroid Build Coastguard Worker // @1.0/default
85*70a7ec85SAndroid Build Coastguard Worker if (!hasPkg && hasVer && hasInst) {
86*70a7ec85SAndroid Build Coastguard Worker return true;
87*70a7ec85SAndroid Build Coastguard Worker }
88*70a7ec85SAndroid Build Coastguard Worker
89*70a7ec85SAndroid Build Coastguard Worker // IFoo/default
90*70a7ec85SAndroid Build Coastguard Worker if (!hasPkg && !hasVer && hasIntf && hasInst) {
91*70a7ec85SAndroid Build Coastguard Worker return true;
92*70a7ec85SAndroid Build Coastguard Worker }
93*70a7ec85SAndroid Build Coastguard Worker
94*70a7ec85SAndroid Build Coastguard Worker return false;
95*70a7ec85SAndroid Build Coastguard Worker }
96*70a7ec85SAndroid Build Coastguard Worker
setTo(const std::string & s)97*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::setTo(const std::string& s) {
98*70a7ec85SAndroid Build Coastguard Worker auto pos = s.find(INSTANCE_SEP);
99*70a7ec85SAndroid Build Coastguard Worker if (!mFqName.setTo(s.substr(0, pos))) return false;
100*70a7ec85SAndroid Build Coastguard Worker mInstance = pos == std::string::npos ? std::string{} : s.substr(pos + 1);
101*70a7ec85SAndroid Build Coastguard Worker
102*70a7ec85SAndroid Build Coastguard Worker return isValid();
103*70a7ec85SAndroid Build Coastguard Worker }
104*70a7ec85SAndroid Build Coastguard Worker
setTo(const std::string & package,size_t majorVer,size_t minorVer,const std::string & interface,const std::string & instance)105*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::setTo(const std::string& package, size_t majorVer, size_t minorVer,
106*70a7ec85SAndroid Build Coastguard Worker const std::string& interface, const std::string& instance) {
107*70a7ec85SAndroid Build Coastguard Worker if (!mFqName.setTo(package, majorVer, minorVer, interface)) return false;
108*70a7ec85SAndroid Build Coastguard Worker mInstance = instance;
109*70a7ec85SAndroid Build Coastguard Worker return isValid();
110*70a7ec85SAndroid Build Coastguard Worker }
111*70a7ec85SAndroid Build Coastguard Worker
setTo(size_t majorVer,size_t minorVer,const std::string & interface,const std::string & instance)112*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::setTo(size_t majorVer, size_t minorVer, const std::string& interface,
113*70a7ec85SAndroid Build Coastguard Worker const std::string& instance) {
114*70a7ec85SAndroid Build Coastguard Worker return setTo("", majorVer, minorVer, interface, instance);
115*70a7ec85SAndroid Build Coastguard Worker }
116*70a7ec85SAndroid Build Coastguard Worker
setTo(const std::string & interface,const std::string & instance)117*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::setTo(const std::string& interface, const std::string& instance) {
118*70a7ec85SAndroid Build Coastguard Worker return setTo(0u, 0u, interface, instance);
119*70a7ec85SAndroid Build Coastguard Worker }
120*70a7ec85SAndroid Build Coastguard Worker
string() const121*70a7ec85SAndroid Build Coastguard Worker std::string FqInstance::string() const {
122*70a7ec85SAndroid Build Coastguard Worker std::string ret = mFqName.string();
123*70a7ec85SAndroid Build Coastguard Worker if (hasInstance()) ret += INSTANCE_SEP + mInstance;
124*70a7ec85SAndroid Build Coastguard Worker return ret;
125*70a7ec85SAndroid Build Coastguard Worker }
126*70a7ec85SAndroid Build Coastguard Worker
operator <(const FqInstance & other) const127*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::operator<(const FqInstance& other) const {
128*70a7ec85SAndroid Build Coastguard Worker return string() < other.string();
129*70a7ec85SAndroid Build Coastguard Worker }
130*70a7ec85SAndroid Build Coastguard Worker
operator ==(const FqInstance & other) const131*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::operator==(const FqInstance& other) const {
132*70a7ec85SAndroid Build Coastguard Worker return string() == other.string();
133*70a7ec85SAndroid Build Coastguard Worker }
134*70a7ec85SAndroid Build Coastguard Worker
operator !=(const FqInstance & other) const135*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::operator!=(const FqInstance& other) const {
136*70a7ec85SAndroid Build Coastguard Worker return !(*this == other);
137*70a7ec85SAndroid Build Coastguard Worker }
138*70a7ec85SAndroid Build Coastguard Worker
inPackage(const std::string & package) const139*70a7ec85SAndroid Build Coastguard Worker bool FqInstance::inPackage(const std::string& package) const {
140*70a7ec85SAndroid Build Coastguard Worker return mFqName.inPackage(package);
141*70a7ec85SAndroid Build Coastguard Worker }
142*70a7ec85SAndroid Build Coastguard Worker
143*70a7ec85SAndroid Build Coastguard Worker } // namespace android::vintf
144