QStringList AbstractRepository::getRepositoryURLs(HKEY hk, const QString& path, QString* err, bool* keyExists) { *keyExists = false; WindowsRegistry wr; *err = wr.open(hk, path, false, KEY_READ); QStringList urls; if (err->isEmpty()) { *keyExists = true; int size = wr.getDWORD("size", err); if (err->isEmpty()) { for (int i = 1; i <= size; i++) { WindowsRegistry er; *err = er.open(wr, QString("%1").arg(i), KEY_READ); if (err->isEmpty()) { QString url = er.get("repository", err); if (err->isEmpty()) urls.append(url); } } // ignore any errors while reading the entries *err = ""; } } return urls; }
void CBSThirdPartyPM:: detectCBSPackagesFrom(QList<InstalledPackageVersion*>* installed, Repository* rep, HKEY root, const QString& path, bool useWoWNode) const { WindowsRegistry wr; QString err; err = wr.open(root, path, useWoWNode, KEY_READ); if (err.isEmpty()) { QString fullPath; if (root == HKEY_CLASSES_ROOT) fullPath = "HKEY_CLASSES_ROOT"; else if (root == HKEY_CURRENT_USER) fullPath = "HKEY_CURRENT_USER"; else if (root == HKEY_LOCAL_MACHINE) fullPath = "HKEY_LOCAL_MACHINE"; else if (root == HKEY_USERS) fullPath = "HKEY_USERS"; else if (root == HKEY_PERFORMANCE_DATA) fullPath = "HKEY_PERFORMANCE_DATA"; else if (root == HKEY_CURRENT_CONFIG) fullPath = "HKEY_CURRENT_CONFIG"; else if (root == HKEY_DYN_DATA) fullPath = "HKEY_DYN_DATA"; else fullPath = QString("%1").arg((uintptr_t) root); fullPath += "\\" + path; QStringList entries = wr.list(&err); for (int i = 0; i < entries.count(); i++) { WindowsRegistry k; err = k.open(wr, entries.at(i), KEY_READ); if (err.isEmpty()) { detectOneCBSPackage(installed, rep, fullPath + "\\" + entries.at(i), k, entries.at(i)); } } } }
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; }
void AbstractRepository::setRepositoryURLs(QList<QUrl*>& urls, QString* err) { WindowsRegistry wr; *err = wr.open(HKEY_LOCAL_MACHINE, "", false, KEY_CREATE_SUB_KEY); if (err->isEmpty()) { WindowsRegistry wrr = wr.createSubKey( "Software\\Npackd\\Npackd\\Reps", err, KEY_ALL_ACCESS); if (err->isEmpty()) { wrr.setDWORD("size", urls.count()); for (int i = 0; i < urls.count(); i++) { WindowsRegistry r = wrr.createSubKey(QString("%1").arg(i + 1), err, KEY_ALL_ACCESS); if (err->isEmpty()) { r.set("repository", urls.at(i)->toString()); } } } } }
SettingsFrame::SettingsFrame(QWidget *parent) : QFrame(parent), ui(new Ui::SettingsFrame) { ui->setupUi(this); WindowsRegistry wr; QString err = wr.open(HKEY_LOCAL_MACHINE, "Software\\Npackd\\Npackd\\InstallationDirs", false, KEY_READ); QStringList dirs; if (err.isEmpty()) { dirs = wr.loadStringList(&err); } dirs.append(WPMUtils::getInstallationDirectory()); dirs.append(WPMUtils::getProgramFilesDir()); if (WPMUtils::is64BitWindows()) dirs.append(WPMUtils::getShellDir(CSIDL_PROGRAM_FILESX86)); dirs.removeDuplicates(); this->ui->comboBoxDir->addItems(dirs); }
QString InstalledPackages::findPath_npackdcl(const Dependency& dep) { QString ret; QString err; WindowsRegistry packagesWR; LONG e; err = packagesWR.open(HKEY_LOCAL_MACHINE, "SOFTWARE\\Npackd\\Npackd\\Packages", false, KEY_READ, &e); if (e == ERROR_FILE_NOT_FOUND || e == ERROR_PATH_NOT_FOUND) { err = ""; } else if (err.isEmpty()) { Version found = Version::EMPTY; 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 (packageName != dep.package) continue; QString versionName = name.right(name.length() - pos - 1); Version version; if (!version.setVersion(versionName)) continue; if (!dep.test(version)) continue; if (found != Version::EMPTY) { if (version.compare(found) < 0) 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()) continue; found = version; ret = dir; } } return ret; }
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; }
void CBSThirdPartyPM::detectOneCBSPackage( QList<InstalledPackageVersion*>* installed, Repository *rep, const QString& registryPath, WindowsRegistry& k, const QString& keyName) const { QString err; QStringList keyNameParts = keyName.split('~'); if (keyNameParts.size() != 5) { err = "Wrong number of parts"; } // find the package name QString package; if (err.isEmpty()) { package = keyNameParts.at(0); package.replace('-', '.'); package = WPMUtils::makeValidFullPackageName( "cbs." + package); } if (err.isEmpty()) { QString title = keyNameParts.at(0); title.replace('-', ' '); QScopedPointer<Package> p(new Package(package, title)); p->categories.append(QObject::tr("Component-Based Servicing")); rep->savePackage(p.data(), true); } // find the version number Version version; if (err.isEmpty()) { if (version.setVersion(keyNameParts.at(4))) { version.normalize(); } else { err = "Invalid version number"; } } if (err.isEmpty()) { QScopedPointer<PackageVersion> pv(new PackageVersion(package)); pv->version = version; PackageVersionFile* pvf = new PackageVersionFile( ".Npackd\\Uninstall.bat", "\r\n"); // TODO pv->files.append(pvf); rep->savePackageVersion(pv.data(), true); } DWORD state = 0; if (err.isEmpty()) { state = k.getDWORD("CurrentState", &err); } bool packageInstalled = false; if (err.isEmpty()) { if (state & 0x20) { InstalledPackageVersion* ipv = new InstalledPackageVersion(package, version, ""); ipv->detectionInfo = "cbs:" + registryPath; installed->append(ipv); packageInstalled = true; } } if (!err.isEmpty()) { qDebug() << keyName << err; } if (err.isEmpty()) { WindowsRegistry updates; err = updates.open(k, "Updates", KEY_READ); if (err.isEmpty()) detectOneCBSPackageUpdate(package, installed, rep, registryPath + "\\Updates", updates, packageInstalled); } }