⛏️ index : haiku.git

/*
 * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */


#include "ResolvableFamily.h"

#include "Package.h"
#include "Volume.h"


void
ResolvableFamily::AddResolvable(Resolvable* resolvable,
	ResolvableDependencyList& dependenciesToUpdate)
{
	// Find the insertion point in the list. We sort by mount type -- the more
	// specific the higher the priority.
	MountType mountType
		= resolvable->Package()->Volume()->MountType();
	Resolvable* otherResolvable = NULL;
	for (FamilyResolvableList::Iterator it = fResolvables.GetIterator();
			(otherResolvable = it.Next()) != NULL;) {
		if (otherResolvable->Package()->Volume()->MountType()
				<= mountType) {
			break;
		}
	}

	fResolvables.InsertBefore(otherResolvable, resolvable);
	resolvable->SetFamily(this);

	// all dependencies after the inserted resolvable potentially need to be
	// updated
	while ((resolvable = fResolvables.GetNext(resolvable)) != NULL)
		resolvable->MoveDependencies(dependenciesToUpdate);
}


void
ResolvableFamily::RemoveResolvable(Resolvable* resolvable,
	ResolvableDependencyList& dependenciesToUpdate)
{
	resolvable->SetFamily(NULL);
	fResolvables.Remove(resolvable);

	// the removed resolvable's dependencies need to be updated
	resolvable->MoveDependencies(dependenciesToUpdate);
}


bool
ResolvableFamily::ResolveDependency(Dependency* dependency)
{
	for (FamilyResolvableList::Iterator it = fResolvables.GetIterator();
			Resolvable* resolvable = it.Next();) {
		if (!dependency->ResolvableVersionMatches(resolvable->Version()))
			continue;

		Version* compatibleVersion = resolvable->CompatibleVersion() != NULL
			? resolvable->CompatibleVersion() : resolvable->Version();
		if (dependency->ResolvableCompatibleVersionMatches(compatibleVersion)) {
			resolvable->AddDependency(dependency);
			return true;
		}
	}

	return false;
}