| /* |
| * 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. |
| */ |
| |
| #ifndef ANDROID_FQINSTANCE_H_ |
| |
| #define ANDROID_FQINSTANCE_H_ |
| |
| #include <optional> |
| #include <string> |
| #include <utility> |
| |
| #include <hidl-util/FQName.h> |
| |
| namespace android { |
| |
| // A wrapper around FQName to include instance name as well. |
| // FqInstance::setTo also recognizes all FQName formats, including enum names |
| // etc. |
| // Typical usage: |
| // FqInstance fqInstance; |
| // if (!fqInstance.setTo("...")) { |
| // // error handling |
| // } |
| // LOG(WARNING) << fqInstance.string(); |
| class FqInstance { |
| public: |
| const std::string& getPackage() const; |
| size_t getMajorVersion() const; |
| size_t getMinorVersion() const; |
| std::pair<size_t, size_t> getVersion() const; |
| const std::string& getInterface() const; |
| const std::string& getInstance() const; |
| const FQName& getFqName() const; |
| |
| bool hasPackage() const; |
| bool hasVersion() const; |
| bool hasInterface() const; |
| bool hasInstance() const; |
| |
| // If this is android.hardware@1.0::IFoo |
| // package = "and" -> false |
| // package = "android" -> true |
| // package = "android.hardware@1.0" -> false |
| bool inPackage(const std::string& package) const; |
| |
| // Return true if valid: |
| // android.hardware.foo@1.0::IFoo/instance |
| // @1.0::IFoo/instance |
| // IFoo/instance |
| // android.hardware.foo@1.0::IFoo.Type |
| // @1.0::IFoo.Type |
| // android.hardware.foo@1.0 |
| // IFoo.Type |
| // Type |
| // android.hardware.foo@1.0::IFoo.Type:MY_ENUM_VALUE |
| // @1.0::IFoo.Type:MY_ENUM_VALUE |
| // IFoo.Type:MY_ENUM_VALUE |
| // |
| // If no "/instance", hasInstance() will return false afterwards. |
| __attribute__((warn_unused_result)) bool setTo(const std::string& s); |
| |
| // Convenience method when an FQName and instance are already available. |
| __attribute__((warn_unused_result)) bool setTo(const FQName& fqName, |
| const std::string& instance); |
| |
| // Convenience method for the following formats: |
| // android.hardware.foo@1.0 |
| // android.hardware.foo@1.0::IFoo |
| // android.hardware.foo@1.0::IFoo/default |
| __attribute__((warn_unused_result)) bool setTo(const std::string& package, size_t majorVer, |
| size_t minorVer, |
| const std::string& interface = "", |
| const std::string& instance = ""); |
| // Convenience method for the following formats: |
| // @1.0::IFoo |
| // @1.0::IFoo/default |
| __attribute__((warn_unused_result)) bool setTo(size_t majorVer, size_t minorVer, |
| const std::string& interface, |
| const std::string& instance = ""); |
| // Convenience method for the following formats: |
| // IFoo/default |
| __attribute__((warn_unused_result)) bool setTo(const std::string& interface, |
| const std::string& instance); |
| |
| // Same as creating an FqInstance then call setTo. See setTo for all valid signatures. |
| // If setTo returns false, this function returns nullopt. |
| template <typename... Args> |
| static std::optional<FqInstance> from(Args&&... args) { |
| FqInstance fqInstance; |
| if (fqInstance.setTo(std::forward<Args>(args)...)) return fqInstance; |
| return std::nullopt; |
| } |
| |
| // undefined behavior if: |
| // - Default constructor is called without setTo(); |
| // - setTo is called but returned false. |
| // Should only be called after setTo() returns true. |
| std::string string() const; |
| bool operator<(const FqInstance& other) const; |
| bool operator==(const FqInstance& other) const; |
| bool operator!=(const FqInstance& other) const; |
| |
| private: |
| FQName mFqName; |
| std::string mInstance; |
| |
| // helper to setTo() to determine that the FqInstance is actually valid. |
| bool isValid() const; |
| }; |
| |
| } // namespace android |
| |
| #endif // ANDROID_FQINSTANCE_H_ |