90 lines
2.5 KiB
C++
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
|
|
|