* Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include "Dependency.h"
#include <stdlib.h>
#include <string.h>
#include <AutoDeleter.h>
#include "Version.h"
Dependency::Dependency(::Package* package)
:
fPackage(package),
fFamily(NULL),
fResolvable(NULL),
fName(),
fFileName(),
fVersion(NULL),
fVersionOperator(B_PACKAGE_RESOLVABLE_OP_EQUAL)
{
}
Dependency::~Dependency()
{
delete fVersion;
}
status_t
Dependency::Init(const char* name)
{
if (!fName.SetTo(name))
return B_NO_MEMORY;
if (strchr(name, ':') != NULL) {
char* fileName = strdup(name);
if (fileName == NULL)
return B_NO_MEMORY;
MemoryDeleter fileNameDeleter(fileName);
char* remainder = fileName;
while (char* colon = strchr(remainder, ':')) {
*colon = '~';
remainder = colon + 1;
}
if (!fFileName.SetTo(fileName))
return B_NO_MEMORY;
} else
fFileName = fName;
return B_OK;
}
void
Dependency::SetVersionRequirement(BPackageResolvableOperator op,
Version* version)
{
fVersionOperator = op;
fVersion = version;
}
bool
Dependency::ResolvableVersionMatches(Version* resolvableVersion) const
{
if (fVersion == NULL)
return true;
return resolvableVersion != NULL
&& resolvableVersion->Compare(fVersionOperator, *fVersion);
}
bool
Dependency::ResolvableCompatibleVersionMatches(Version* resolvableVersion) const
{
if (fVersion == NULL)
return true;
if (fVersionOperator == B_PACKAGE_RESOLVABLE_OP_GREATER_EQUAL
|| fVersionOperator == B_PACKAGE_RESOLVABLE_OP_GREATER) {
return resolvableVersion != NULL
&& fVersion->Compare(*resolvableVersion) >= 0;
}
return true;
}