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 #pragma once 18*70a7ec85SAndroid Build Coastguard Worker 19*70a7ec85SAndroid Build Coastguard Worker #include <string> 20*70a7ec85SAndroid Build Coastguard Worker #include <vector> 21*70a7ec85SAndroid Build Coastguard Worker 22*70a7ec85SAndroid Build Coastguard Worker namespace android::vintf::details { 23*70a7ec85SAndroid Build Coastguard Worker 24*70a7ec85SAndroid Build Coastguard Worker struct FQName { 25*70a7ec85SAndroid Build Coastguard Worker __attribute__((warn_unused_result)) static bool parse(const std::string& s, FQName* into); 26*70a7ec85SAndroid Build Coastguard Worker 27*70a7ec85SAndroid Build Coastguard Worker explicit FQName(); 28*70a7ec85SAndroid Build Coastguard Worker 29*70a7ec85SAndroid Build Coastguard Worker FQName(const std::string& package, const std::string& version, const std::string& name = ""); 30*70a7ec85SAndroid Build Coastguard Worker 31*70a7ec85SAndroid Build Coastguard Worker // Returns false if string isn't a valid FQName object. 32*70a7ec85SAndroid Build Coastguard Worker __attribute__((warn_unused_result)) bool setTo(const std::string& s); 33*70a7ec85SAndroid Build Coastguard Worker __attribute__((warn_unused_result)) bool setTo(const std::string& package, size_t majorVer, 34*70a7ec85SAndroid Build Coastguard Worker size_t minorVer, const std::string& name = ""); 35*70a7ec85SAndroid Build Coastguard Worker 36*70a7ec85SAndroid Build Coastguard Worker const std::string& package() const; 37*70a7ec85SAndroid Build Coastguard Worker // Return version in the form "1.0" if it is present, otherwise empty string. 38*70a7ec85SAndroid Build Coastguard Worker std::string version() const; 39*70a7ec85SAndroid Build Coastguard Worker // Return true only if version is present. 40*70a7ec85SAndroid Build Coastguard Worker bool hasVersion() const; 41*70a7ec85SAndroid Build Coastguard Worker // Return pair of (major, minor) version. Defaults to 0, 0. 42*70a7ec85SAndroid Build Coastguard Worker std::pair<size_t, size_t> getVersion() const; 43*70a7ec85SAndroid Build Coastguard Worker 44*70a7ec85SAndroid Build Coastguard Worker // The next method return the name part of the FQName, that is, the 45*70a7ec85SAndroid Build Coastguard Worker // part after the version field. For example: 46*70a7ec85SAndroid Build Coastguard Worker // 47*70a7ec85SAndroid Build Coastguard Worker // package [email protected]; 48*70a7ec85SAndroid Build Coastguard Worker // interface IFoo { 49*70a7ec85SAndroid Build Coastguard Worker // struct bar { 50*70a7ec85SAndroid Build Coastguard Worker // struct baz { 51*70a7ec85SAndroid Build Coastguard Worker // ... 52*70a7ec85SAndroid Build Coastguard Worker // }; 53*70a7ec85SAndroid Build Coastguard Worker // }; 54*70a7ec85SAndroid Build Coastguard Worker // }; 55*70a7ec85SAndroid Build Coastguard Worker // 56*70a7ec85SAndroid Build Coastguard Worker // package [email protected]; 57*70a7ec85SAndroid Build Coastguard Worker // import [email protected]; 58*70a7ec85SAndroid Build Coastguard Worker // interface { 59*70a7ec85SAndroid Build Coastguard Worker // struct boo { 60*70a7ec85SAndroid Build Coastguard Worker // IFoo.bar.baz base; 61*70a7ec85SAndroid Build Coastguard Worker // }; 62*70a7ec85SAndroid Build Coastguard Worker // } 63*70a7ec85SAndroid Build Coastguard Worker // 64*70a7ec85SAndroid Build Coastguard Worker // The FQName for base is [email protected]::IFoo.bar.baz; so 65*70a7ec85SAndroid Build Coastguard Worker // FQName::name() will return "IFoo.bar.baz". 66*70a7ec85SAndroid Build Coastguard Worker const std::string& name() const; 67*70a7ec85SAndroid Build Coastguard Worker 68*70a7ec85SAndroid Build Coastguard Worker // Interface names start with 'I' 69*70a7ec85SAndroid Build Coastguard Worker bool isInterfaceName() const; 70*70a7ec85SAndroid Build Coastguard Worker 71*70a7ec85SAndroid Build Coastguard Worker std::string string() const; 72*70a7ec85SAndroid Build Coastguard Worker 73*70a7ec85SAndroid Build Coastguard Worker bool operator<(const FQName& other) const; 74*70a7ec85SAndroid Build Coastguard Worker bool operator==(const FQName& other) const; 75*70a7ec85SAndroid Build Coastguard Worker bool operator!=(const FQName& other) const; 76*70a7ec85SAndroid Build Coastguard Worker 77*70a7ec85SAndroid Build Coastguard Worker // Must be called on an interface 78*70a7ec85SAndroid Build Coastguard Worker // [email protected]::IBar 79*70a7ec85SAndroid Build Coastguard Worker // -> IBar 80*70a7ec85SAndroid Build Coastguard Worker const std::string& getInterfaceName() const; 81*70a7ec85SAndroid Build Coastguard Worker 82*70a7ec85SAndroid Build Coastguard Worker // [email protected]::Abc.Type:VALUE 83*70a7ec85SAndroid Build Coastguard Worker // -> [email protected] 84*70a7ec85SAndroid Build Coastguard Worker FQName getPackageAndVersion() const; 85*70a7ec85SAndroid Build Coastguard Worker 86*70a7ec85SAndroid Build Coastguard Worker // If this is [email protected]::IFoo 87*70a7ec85SAndroid Build Coastguard Worker // package = "and" -> false 88*70a7ec85SAndroid Build Coastguard Worker // package = "android" -> true 89*70a7ec85SAndroid Build Coastguard Worker // package = "[email protected]" -> false 90*70a7ec85SAndroid Build Coastguard Worker bool inPackage(const std::string& package) const; 91*70a7ec85SAndroid Build Coastguard Worker 92*70a7ec85SAndroid Build Coastguard Worker // return major and minor version if they exist, else abort program. 93*70a7ec85SAndroid Build Coastguard Worker // Existence of version can be checked via hasVersion(). 94*70a7ec85SAndroid Build Coastguard Worker size_t getPackageMajorVersion() const; 95*70a7ec85SAndroid Build Coastguard Worker size_t getPackageMinorVersion() const; 96*70a7ec85SAndroid Build Coastguard Worker 97*70a7ec85SAndroid Build Coastguard Worker private: 98*70a7ec85SAndroid Build Coastguard Worker bool mIsIdentifier; 99*70a7ec85SAndroid Build Coastguard Worker std::string mPackage; 100*70a7ec85SAndroid Build Coastguard Worker // mMajor == 0 means empty. 101*70a7ec85SAndroid Build Coastguard Worker size_t mMajor = 0; 102*70a7ec85SAndroid Build Coastguard Worker size_t mMinor = 0; 103*70a7ec85SAndroid Build Coastguard Worker std::string mName; 104*70a7ec85SAndroid Build Coastguard Worker 105*70a7ec85SAndroid Build Coastguard Worker void clear(); 106*70a7ec85SAndroid Build Coastguard Worker 107*70a7ec85SAndroid Build Coastguard Worker __attribute__((warn_unused_result)) bool setVersion(const std::string& v); 108*70a7ec85SAndroid Build Coastguard Worker __attribute__((warn_unused_result)) bool parseVersion(const std::string& majorStr, 109*70a7ec85SAndroid Build Coastguard Worker const std::string& minorStr); 110*70a7ec85SAndroid Build Coastguard Worker __attribute__((warn_unused_result)) static bool parseVersion(const std::string& majorStr, 111*70a7ec85SAndroid Build Coastguard Worker const std::string& minorStr, 112*70a7ec85SAndroid Build Coastguard Worker size_t* majorVer, 113*70a7ec85SAndroid Build Coastguard Worker size_t* minorVer); 114*70a7ec85SAndroid Build Coastguard Worker __attribute__((warn_unused_result)) static bool parseVersion(const std::string& v, 115*70a7ec85SAndroid Build Coastguard Worker size_t* majorVer, 116*70a7ec85SAndroid Build Coastguard Worker size_t* minorVer); 117*70a7ec85SAndroid Build Coastguard Worker static void clearVersion(size_t* majorVer, size_t* minorVer); 118*70a7ec85SAndroid Build Coastguard Worker 119*70a7ec85SAndroid Build Coastguard Worker void clearVersion(); 120*70a7ec85SAndroid Build Coastguard Worker 121*70a7ec85SAndroid Build Coastguard Worker bool isIdentifier() const; 122*70a7ec85SAndroid Build Coastguard Worker // Return version in the form "@1.0" if it is present, otherwise empty string. 123*70a7ec85SAndroid Build Coastguard Worker std::string atVersion() const; 124*70a7ec85SAndroid Build Coastguard Worker 125*70a7ec85SAndroid Build Coastguard Worker std::vector<std::string> getPackageComponents() const; 126*70a7ec85SAndroid Build Coastguard Worker }; 127*70a7ec85SAndroid Build Coastguard Worker 128*70a7ec85SAndroid Build Coastguard Worker } // namespace android::vintf::details 129