1/* 2 * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7#include "ResolvableFamily.h" 8 9#include "Package.h" 10#include "Volume.h" 11 12 13void 14ResolvableFamily::AddResolvable(Resolvable* resolvable, 15 ResolvableDependencyList& dependenciesToUpdate) 16{ 17 // Find the insertion point in the list. We sort by mount type -- the more 18 // specific the higher the priority. 19 MountType mountType 20 = resolvable->Package()->Volume()->MountType(); 21 Resolvable* otherResolvable = NULL; 22 for (FamilyResolvableList::Iterator it = fResolvables.GetIterator(); 23 (otherResolvable = it.Next()) != NULL;) { 24 if (otherResolvable->Package()->Volume()->MountType() 25 <= mountType) { 26 break; 27 } 28 } 29 30 fResolvables.InsertBefore(otherResolvable, resolvable); 31 resolvable->SetFamily(this); 32 33 // all dependencies after the inserted resolvable potentially need to be 34 // updated 35 while ((resolvable = fResolvables.GetNext(resolvable)) != NULL) 36 resolvable->MoveDependencies(dependenciesToUpdate); 37} 38 39 40void 41ResolvableFamily::RemoveResolvable(Resolvable* resolvable, 42 ResolvableDependencyList& dependenciesToUpdate) 43{ 44 resolvable->SetFamily(NULL); 45 fResolvables.Remove(resolvable); 46 47 // the removed resolvable's dependencies need to be updated 48 resolvable->MoveDependencies(dependenciesToUpdate); 49} 50 51 52bool 53ResolvableFamily::ResolveDependency(Dependency* dependency) 54{ 55 for (FamilyResolvableList::Iterator it = fResolvables.GetIterator(); 56 Resolvable* resolvable = it.Next();) { 57 if (!dependency->ResolvableVersionMatches(resolvable->Version())) 58 continue; 59 60 Version* compatibleVersion = resolvable->CompatibleVersion() != NULL 61 ? resolvable->CompatibleVersion() : resolvable->Version(); 62 if (dependency->ResolvableCompatibleVersionMatches(compatibleVersion)) { 63 resolvable->AddDependency(dependency); 64 return true; 65 } 66 } 67 68 return false; 69} 70