diff --git a/headers/os/package/PackageResolvableExpression.h b/headers/os/package/PackageResolvableExpression.h index 6eb7b0b8af..ea48808e43 100644 --- a/headers/os/package/PackageResolvableExpression.h +++ b/headers/os/package/PackageResolvableExpression.h @@ -21,6 +21,9 @@ namespace BHPKG { using BHPKG::BPackageResolvableExpressionData; +class BPackageResolvable; + + /* * Expresses a constraint on a specific resolvable, either just a name * or a name plus a relational operator and a version. @@ -64,6 +67,12 @@ public: = BPackageVersion()); void Clear(); + bool Matches(const BPackageVersion& version, + const BPackageVersion& compatibleVersion) + const; + bool Matches(const BPackageResolvable& provides) + const; + public: static const char* kOperatorNames[]; diff --git a/src/kits/package/PackageResolvableExpression.cpp b/src/kits/package/PackageResolvableExpression.cpp index 4d14e73822..ee2202317c 100644 --- a/src/kits/package/PackageResolvableExpression.cpp +++ b/src/kits/package/PackageResolvableExpression.cpp @@ -7,6 +7,7 @@ #include #include +#include namespace BPackageKit { @@ -122,4 +123,63 @@ BPackageResolvableExpression::Clear() } +bool +BPackageResolvableExpression::Matches(const BPackageVersion& version, + const BPackageVersion& compatibleVersion) const +{ + // If no particular version is required, we always match. + if (fVersion.InitCheck() != B_OK) + return true; + + if (version.InitCheck() != B_OK) + return false; + + int compare = version.Compare(fVersion); + bool matches = false; + switch (fOperator) { + case B_PACKAGE_RESOLVABLE_OP_LESS: + matches = compare < 0; + break; + case B_PACKAGE_RESOLVABLE_OP_LESS_EQUAL: + matches = compare <= 0; + break; + case B_PACKAGE_RESOLVABLE_OP_EQUAL: + matches = compare == 0; + break; + case B_PACKAGE_RESOLVABLE_OP_NOT_EQUAL: + matches = compare != 0; + break; + case B_PACKAGE_RESOLVABLE_OP_GREATER_EQUAL: + matches = compare >= 0; + break; + case B_PACKAGE_RESOLVABLE_OP_GREATER: + matches = compare > 0; + break; + default: + break; + } + if (!matches) + return false; + + // Check compatible version. If not specified, the match must be exact. + // Otherwise fVersion must be >= compatibleVersion. + if (compatibleVersion.InitCheck() != B_OK) + return compare == 0; + + // Since compatibleVersion <= version, we can save the comparison, if + // version <= fVersion. + return compare <= 0 || compatibleVersion.Compare(fVersion) <= 0; +} + + +bool +BPackageResolvableExpression::Matches(const BPackageResolvable& provides) const +{ + if (provides.Name() != fName) + return false; + + return Matches(provides.Version(), provides.CompatibleVersion()); +} + + } // namespace BPackageKit