InstalledPackageVersion* InstalledPackages::find(const QString& package, const Version& version) const { this->mutex.lock(); InstalledPackageVersion* ipv = this->data.value( PackageVersion::getStringId(package, version)); if (ipv) ipv = ipv->clone(); this->mutex.unlock(); return ipv; }
QList<InstalledPackageVersion*> InstalledPackages::getAll() const { this->mutex.lock(); QList<InstalledPackageVersion*> all = this->data.values(); QList<InstalledPackageVersion*> r; for (int i = 0; i < all.count(); i++) { InstalledPackageVersion* ipv = all.at(i); if (ipv->installed()) r.append(ipv->clone()); } this->mutex.unlock(); return r; }
QList<InstalledPackageVersion *> AbstractRepository::findAllInstalledMatches( const Dependency &dep) const { QList<InstalledPackageVersion*> r; InstalledPackages* ip = InstalledPackages::getDefault(); QList<InstalledPackageVersion*> installed = ip->getAll(); for (int i = 0; i < installed.count(); i++) { InstalledPackageVersion* ipv = installed.at(i); if (ipv->package == dep.package && dep.test(ipv->version)) { r.append(ipv->clone()); } } qDeleteAll(installed); return r; }
InstalledPackageVersion *AbstractRepository::findHighestInstalledMatch( const Dependency &dep) const { QList<InstalledPackageVersion*> list = findAllInstalledMatches(dep); InstalledPackageVersion* res = 0; for (int i = 0; i < list.count(); i++) { InstalledPackageVersion* ipv = list.at(i); if (res == 0 || ipv->version.compare(res->version) > 0) res = ipv; } if (res) res = res->clone(); qDeleteAll(list); return res; }
InstalledPackageVersion* InstalledPackages::getNewestInstalled( const QString &package) const { this->mutex.lock(); QList<InstalledPackageVersion*> all = this->data.values(); InstalledPackageVersion* r = 0; for (int i = 0; i < all.count(); i++) { InstalledPackageVersion* ipv = all.at(i); if (ipv->package == package && ipv->installed()) { if (!r || r->version < ipv->version) r = ipv; } } if (r) r = r->clone(); this->mutex.unlock(); return r; }
InstalledPackageVersion* InstalledPackages::findFirstWithMissingDependency() const { InstalledPackageVersion* r = 0; this->mutex.lock(); DBRepository* dbr = DBRepository::getDefault(); QList<InstalledPackageVersion*> all = this->data.values(); for (int i = 0; i < all.count(); i++) { InstalledPackageVersion* ipv = all.at(i); if (ipv->installed()) { QString err; QScopedPointer<PackageVersion> pv(dbr->findPackageVersion_( ipv->package, ipv->version, &err)); // TODO: remove if (!pv.data()) { qDebug() << "cannot find" << ipv->package << ipv->version.getVersionString(); } if (err.isEmpty() && pv.data()) { for (int j = 0; j < pv->dependencies.size(); j++) { if (!isInstalled(*pv->dependencies.at(j))) { r = ipv->clone(); break; } } } } if (r) break; } this->mutex.unlock(); return r; }
InstalledPackageVersion *InstalledPackages::findOwner( const QString &filePath) const { this->mutex.lock(); InstalledPackageVersion* f = 0; QList<InstalledPackageVersion*> ipvs = this->data.values(); for (int i = 0; i < ipvs.count(); ++i) { InstalledPackageVersion* ipv = ipvs.at(i); QString dir = ipv->getDirectory(); if (!dir.isEmpty() && (WPMUtils::pathEquals(filePath, dir) || WPMUtils::isUnder(filePath, dir))) { f = ipv; break; } } if (f) f = f->clone(); this->mutex.unlock(); return f; }
QString InstalledPackages::readRegistryDatabase() { // qDebug() << "start reading registry database"; // "data" is only used at the bottom of this method QString err; WindowsRegistry packagesWR; LONG e; err = packagesWR.open(HKEY_LOCAL_MACHINE, "SOFTWARE\\Npackd\\Npackd\\Packages", false, KEY_READ, &e); QList<InstalledPackageVersion*> ipvs; if (e == ERROR_FILE_NOT_FOUND || e == ERROR_PATH_NOT_FOUND) { err = ""; } else if (err.isEmpty()) { QStringList entries = packagesWR.list(&err); for (int i = 0; i < entries.count(); ++i) { QString name = entries.at(i); int pos = name.lastIndexOf("-"); if (pos <= 0) continue; QString packageName = name.left(pos); if (!Package::isValidName(packageName)) continue; QString versionName = name.right(name.length() - pos - 1); Version version; if (!version.setVersion(versionName)) continue; WindowsRegistry entryWR; err = entryWR.open(packagesWR, name, KEY_READ); if (!err.isEmpty()) continue; QString p = entryWR.get("Path", &err).trimmed(); if (!err.isEmpty()) continue; QString dir; if (p.isEmpty()) dir = ""; else { QDir d(p); if (d.exists()) { dir = p; } else { dir = ""; } } if (dir.isEmpty()) { packagesWR.remove(name); } else { dir = WPMUtils::normalizePath(dir, false); InstalledPackageVersion* ipv = new InstalledPackageVersion( packageName, version, dir); ipv->detectionInfo = entryWR.get("DetectionInfo", &err); if (!err.isEmpty()) { // ignore ipv->detectionInfo = ""; err = ""; } if (!ipv->directory.isEmpty()) { /* qDebug() << "adding " << ipv->package << ipv->version.getVersionString() << "in" << ipv->directory;*/ ipvs.append(ipv); } else { delete ipv; } } } } this->mutex.lock(); qDeleteAll(this->data); this->data.clear(); for (int i = 0; i < ipvs.count(); i++) { InstalledPackageVersion* ipv = ipvs.at(i); this->data.insert(PackageVersion::getStringId(ipv->package, ipv->version), ipv->clone()); } this->mutex.unlock(); for (int i = 0; i < ipvs.count(); i++) { InstalledPackageVersion* ipv = ipvs.at(i); fireStatusChanged(ipv->package, ipv->version); } qDeleteAll(ipvs); // qDebug() << "stop reading"; return err; }