1/*
2 * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "Dependency.h"
8
9#include <stdlib.h>
10#include <string.h>
11
12#include "Version.h"
13
14
15Dependency::Dependency(::Package* package)
16	:
17	fPackage(package),
18	fFamily(NULL),
19	fResolvable(NULL),
20	fName(NULL),
21	fVersion(NULL),
22	fVersionOperator(B_PACKAGE_RESOLVABLE_OP_EQUAL)
23{
24}
25
26
27Dependency::~Dependency()
28{
29	free(fName);
30	delete fVersion;
31}
32
33
34status_t
35Dependency::Init(const char* name)
36{
37	fName = strdup(name);
38	if (fName == NULL)
39		return B_NO_MEMORY;
40
41	return B_OK;
42}
43
44
45void
46Dependency::SetVersionRequirement(BPackageResolvableOperator op,
47	Version* version)
48{
49	fVersionOperator = op;
50	fVersion = version;
51}
52
53
54bool
55Dependency::ResolvableVersionMatches(Version* resolvableVersion) const
56{
57	if (fVersion == NULL)
58		return true;
59
60	return resolvableVersion != NULL
61		&& resolvableVersion->Compare(fVersionOperator, *fVersion);
62}
63
64
65bool
66Dependency::ResolvableCompatibleVersionMatches(Version* resolvableVersion) const
67{
68	if (fVersion == NULL)
69		return true;
70
71	// Only compare the versions, if the operator indicates that our version is
72	// some kind of minimum required version. Only in that case the resolvable's
73	// actual version is required to be greater (or equal) and the backwards
74	// compatibility check makes sense.
75	if (fVersionOperator == B_PACKAGE_RESOLVABLE_OP_GREATER_EQUAL
76		|| fVersionOperator == B_PACKAGE_RESOLVABLE_OP_GREATER) {
77		return resolvableVersion != NULL
78			&& fVersion->Compare(*resolvableVersion) >= 0;
79	}
80
81	return true;
82}
83