repoindex/alpm/packagefinder.cpp

54 lines
1.4 KiB
C++
Raw Normal View History

#include "./packagefinder.h"
#include "./manager.h"
#include "../network/userrepository.h"
#include <cassert>
namespace RepoIndex {
PackageFinder::PackageFinder(Manager &manager, const QList<Dependency> &dependencies, QObject *parent)
: QObject(parent),
m_remainingReplies(0)
{
QStringList toRequest;
for(const auto &dependency : dependencies) {
if(auto *pkg = manager.packageProviding(dependency)) {
m_results << pkg;
} else {
toRequest << dependency.name;
}
}
if(manager.userRepository()) {
QReadLocker locker(manager.userRepository()->lock());
auto *reply = manager.userRepository()->requestFullPackageInfo(toRequest);
if(reply) {
++m_remainingReplies;
connect(reply, &PackageReply::resultsAvailable, this, &PackageFinder::addResults);
}
}
}
void PackageFinder::addResults()
{
assert(m_remainingReplies);
// 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