You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
4.5 KiB
127 lines
4.5 KiB
/*
|
|
* 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_
|