Home | History | Annotate | Download | only in utils
      1 /*
      2  * Copyright (C) 2018 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 #include "FqInstance.h"
     18 
     19 #include <sstream>
     20 
     21 namespace android {
     22 
     23 static const char INSTANCE_SEP = '/';
     24 
     25 const std::string& FqInstance::getPackage() const {
     26     return mFqName.package();
     27 }
     28 
     29 bool FqInstance::hasPackage() const {
     30     return !getPackage().empty();
     31 }
     32 
     33 size_t FqInstance::getMajorVersion() const {
     34     return hasVersion() ? mFqName.getPackageMajorVersion() : 0;
     35 }
     36 
     37 size_t FqInstance::getMinorVersion() const {
     38     return hasVersion() ? mFqName.getPackageMinorVersion() : 0;
     39 }
     40 
     41 std::pair<size_t, size_t> FqInstance::getVersion() const {
     42     return {getMajorVersion(), getMinorVersion()};
     43 }
     44 
     45 bool FqInstance::hasVersion() const {
     46     return mFqName.hasVersion();
     47 }
     48 
     49 const std::string& FqInstance::getInterface() const {
     50     return mFqName.getInterfaceName();
     51 }
     52 
     53 bool FqInstance::hasInterface() const {
     54     return mFqName.isInterfaceName();
     55 }
     56 
     57 const std::string& FqInstance::getInstance() const {
     58     return mInstance;
     59 }
     60 
     61 bool FqInstance::hasInstance() const {
     62     return !mInstance.empty();
     63 }
     64 
     65 bool FqInstance::setTo(const std::string& s) {
     66     auto pos = s.find(INSTANCE_SEP);
     67     if (!mFqName.setTo(s.substr(0, pos))) return false;
     68     mInstance = pos == std::string::npos ? std::string{} : s.substr(pos + 1);
     69 
     70     bool hasPkg = hasPackage();
     71     bool hasVer = hasVersion();
     72     bool hasIntf = hasInterface();
     73     bool hasInst = hasInstance();
     74 
     75     // android.hardware.foo (at) 1.0::IFoo/default
     76     if (hasPkg && hasVer && hasIntf && hasInst) {
     77         return true;
     78     }
     79 
     80     // @1.0::IFoo/default
     81     if (!hasPkg && hasVer && hasIntf && hasInst) {
     82         return true;
     83     }
     84 
     85     // IFoo/default
     86     if (!hasPkg && !hasVer && hasIntf && hasInst) {
     87         return true;
     88     }
     89 
     90     // Other cases are covered by FQName::setTo, but instance name should be empty.
     91     return !hasInst;
     92 }
     93 
     94 bool FqInstance::setTo(const std::string& package, size_t majorVer, size_t minorVer,
     95                        const std::string& interface, const std::string& instance) {
     96     std::stringstream ss;
     97     ss << package << "@" << majorVer << "." << minorVer << "::" << interface << INSTANCE_SEP
     98        << instance;
     99     return setTo(ss.str());
    100 }
    101 
    102 bool FqInstance::setTo(size_t majorVer, size_t minorVer, const std::string& interface,
    103                        const std::string& instance) {
    104     return setTo("", majorVer, minorVer, interface, instance);
    105 }
    106 
    107 bool FqInstance::setTo(const std::string& interface, const std::string& instance) {
    108     return setTo(interface + INSTANCE_SEP + instance);
    109 }
    110 
    111 std::string FqInstance::string() const {
    112     std::string ret = mFqName.string();
    113     if (hasInstance()) ret += INSTANCE_SEP + mInstance;
    114     return ret;
    115 }
    116 
    117 bool FqInstance::operator<(const FqInstance& other) const {
    118     return string() < other.string();
    119 }
    120 
    121 bool FqInstance::operator==(const FqInstance& other) const {
    122     return string() == other.string();
    123 }
    124 
    125 bool FqInstance::operator!=(const FqInstance& other) const {
    126     return !(*this == other);
    127 }
    128 
    129 }  // namespace android
    130