/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "FqInstance.h" #include namespace android { static const char INSTANCE_SEP = '/'; const std::string& FqInstance::getPackage() const { return mFqName.package(); } bool FqInstance::hasPackage() const { return !getPackage().empty(); } size_t FqInstance::getMajorVersion() const { return hasVersion() ? mFqName.getPackageMajorVersion() : 0; } size_t FqInstance::getMinorVersion() const { return hasVersion() ? mFqName.getPackageMinorVersion() : 0; } std::pair FqInstance::getVersion() const { return mFqName.getVersion(); } bool FqInstance::hasVersion() const { return mFqName.hasVersion(); } const std::string& FqInstance::getInterface() const { return mFqName.getInterfaceName(); } bool FqInstance::hasInterface() const { return mFqName.isInterfaceName(); } const std::string& FqInstance::getInstance() const { return mInstance; } bool FqInstance::hasInstance() const { return !mInstance.empty(); } const FQName& FqInstance::getFqName() const { return mFqName; } bool FqInstance::isValid() const { bool hasPkg = hasPackage(); bool hasVer = hasVersion(); bool hasIntf = hasInterface(); bool hasInst = hasInstance(); // android.hardware.foo@1.0::IFoo/default if (hasPkg && hasVer && hasIntf && hasInst) { return true; } // @1.0::IFoo/default if (!hasPkg && hasVer && hasIntf && hasInst) { return true; } // IFoo/default if (!hasPkg && !hasVer && hasIntf && hasInst) { return true; } // Other cases are covered by FQName::setTo, but instance name should be empty. return !hasInst; } bool FqInstance::setTo(const std::string& s) { auto pos = s.find(INSTANCE_SEP); if (!mFqName.setTo(s.substr(0, pos))) return false; mInstance = pos == std::string::npos ? std::string{} : s.substr(pos + 1); return isValid(); } bool FqInstance::setTo(const FQName& fqName, const std::string& instance) { mFqName = fqName; mInstance = instance; return isValid(); } bool FqInstance::setTo(const std::string& package, size_t majorVer, size_t minorVer, const std::string& interface, const std::string& instance) { if (!mFqName.setTo(package, majorVer, minorVer, interface)) return false; mInstance = instance; return isValid(); } bool FqInstance::setTo(size_t majorVer, size_t minorVer, const std::string& interface, const std::string& instance) { return setTo("", majorVer, minorVer, interface, instance); } bool FqInstance::setTo(const std::string& interface, const std::string& instance) { return setTo(0u, 0u, interface, instance); } std::string FqInstance::string() const { std::string ret = mFqName.string(); if (hasInstance()) ret += INSTANCE_SEP + mInstance; return ret; } bool FqInstance::operator<(const FqInstance& other) const { return string() < other.string(); } bool FqInstance::operator==(const FqInstance& other) const { return string() == other.string(); } bool FqInstance::operator!=(const FqInstance& other) const { return !(*this == other); } bool FqInstance::inPackage(const std::string& package) const { return mFqName.inPackage(package); } } // namespace android