#include "./packagefinder.h" #include "./manager.h" #include "../network/userrepository.h" #include namespace RepoIndex { PackageFinder::PackageFinder(Manager &manager, const QList &dependencies, bool sourcesRequired, QObject *parent) : QObject(parent), //m_sourcesRequired(sourcesRequired), m_remainingReplies(0) { QStringList toRequest; if(!sourcesRequired) { for(const auto &dependency : dependencies) { if(auto *pkg = manager.packageProviding(dependency)) { m_results << pkg; } else { toRequest << dependency.name; } } } else { toRequest.reserve(dependencies.size()); for(const auto &dependency : dependencies) { toRequest << dependency.name; } } if(manager.userRepository()) { QReadLocker locker(manager.userRepository()->lock()); if(auto *reply = manager.userRepository()->requestFullPackageInfo(toRequest)) { ++m_remainingReplies; connect(reply, &PackageReply::resultsAvailable, this, &PackageFinder::addResults); } else { for(const Dependency &dependency : dependencies) { if(auto *pkg = manager.userRepository()->packageProviding(dependency)) { m_results << pkg; } else { // shouldn't happen } } } } } Package *PackageFinder::packageProviding(const Dependency &dependency) { for(Package *package : m_results) { if(package->matches(dependency)) { // check whether package matches "directly" return package; } else { // check whether at least one of the provides matches for(const auto &provide : package->provides()) { if(Package::matches(provide.name, provide.version, dependency)) { return package; } } } } return nullptr; } void PackageFinder::addResults() { #ifdef DEBUG_BUILD assert(m_remainingReplies); #endif // add results auto *reply = static_cast(sender()); auto *repo = reply->repository(); { QReadLocker locker(repo->lock()); for(const auto &pkgName : reply->requestedPackages()) { if(auto *pkg = repo->packageByName(pkgName)) { m_results << pkg; } } } // finished? if(!--m_remainingReplies) { emit resultsAvailable(); } } } // namespace RepoIndex