repoindex/alpm/packagefinder.cpp

90 lines
2.5 KiB
C++

#include "./packagefinder.h"
#include "./manager.h"
#include "../network/userrepository.h"
#include <cassert>
namespace RepoIndex {
PackageFinder::PackageFinder(Manager &manager, const QList<Dependency> &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<PackageReply *>(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