QString InstalledPackages::saveToRegistry(InstalledPackageVersion *ipv) { WindowsRegistry machineWR(HKEY_LOCAL_MACHINE, false); QString r; QString keyName = "SOFTWARE\\Npackd\\Npackd\\Packages"; Version v = ipv->version; v.normalize(); QString pn = ipv->package + "-" + v.getVersionString(); /*WPMUtils::outputTextConsole( "InstalledPackages::saveToRegistry " + ipv->directory + " " + ipv->package + " " + ipv->version.getVersionString() + " " + ipv->detectionInfo + "\r\n");*/ if (!ipv->directory.isEmpty()) { WindowsRegistry wr = machineWR.createSubKey(keyName + "\\" + pn, &r); if (r.isEmpty()) { wr.set("DetectionInfo", ipv->detectionInfo); // for compatibility with Npackd 1.16 and earlier. They // see all package versions by default as "externally installed" wr.setDWORD("External", 0); r = wr.set("Path", ipv->directory); } // qDebug() << "saveToRegistry 1 " << r; } else { // qDebug() << "deleting " << pn; WindowsRegistry packages; r = packages.open(machineWR, keyName, KEY_ALL_ACCESS); if (r.isEmpty()) { r = packages.remove(pn); } // qDebug() << "saveToRegistry 2 " << r; } //qDebug() << "InstalledPackageVersion::save " << pn << " " << // this->directory; // qDebug() << "saveToRegistry returns " << r; return r; }
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; }