cacic_software.cpp 5.57 KB
#include "cacic_software.h"

cacic_software::cacic_software()
{
}

void cacic_software::iniciaColeta()
{
#ifdef Q_OS_WIN
    this->coletaSoftware = coletaWin();
#elif defined(Q_OS_LINUX)
    this->coletaSoftware = coletaLinux();

#endif
}

#if defined(Q_OS_WIN)
using namespace voidrealms::win32;
QJsonObject cacic_software::coletaWin()
{
    QJsonObject softwaresJson;
    QStringList regedit;
    regedit.append("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
    regedit.append("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\");
    foreach(QString registry, regedit){
        VRegistry reg;
        reg.OpenKey(HKEY_LOCAL_MACHINE, registry);
        QStringList keys = reg.enum_Keys();
        foreach(QString key, keys){
            QVariantMap software;
            VRegistry subReg;
            subReg.OpenKey(HKEY_LOCAL_MACHINE, registry + key);
            if (!subReg.get_REG_SZ("DisplayName").isEmpty())
                software["DisplayName"] = subReg.get_REG_SZ("DisplayName");
            if (!subReg.get_REG_SZ("Publisher").isEmpty())
                software["Publisher"] = subReg.get_REG_SZ("Publisher");
            if (!subReg.get_REG_SZ("InstallLocation").isEmpty())
                software["InstallLocation"] = subReg.get_REG_SZ("InstallLocation");
            if (!subReg.get_REG_SZ("InstallDate").isEmpty())
                software["InstallDate"] = subReg.get_REG_SZ("InstallDate");
            if (!subReg.get_REG_SZ("URLInfoAbout").isEmpty())
                software["URLInfoAbout"] = subReg.get_REG_SZ("URLInfoAbout");
            if (!subReg.get_REG_EXPAND_SZ("UninstallString").isEmpty())
                software["UninstallString"] = subReg.get_REG_EXPAND_SZ("UninstallString");
            if (!subReg.get_REG_EXPAND_SZ("QuietUninstallString").isEmpty())
                software["QuietUninstallString"] = subReg.get_REG_EXPAND_SZ("QuietUninstallString");
            if (!subReg.get_REG_SZ("DisplayVersion").isEmpty())
                software["DisplayVersion"] = subReg.get_REG_SZ("DisplayVersion");

            softwaresJson[key] = QJsonObject::fromVariantMap(software);
        }
//        qDebug() << softwaesJson;
    }
    return softwaresJson;
}

#elif defined(Q_OS_LINUX)
QJsonObject cacic_software::coletaLinux()
{

    OperatingSystem operatingSystem;

    if( operatingSystem.getIdOs() == OperatingSystem::LINUX_ARCH ) {
        return coletaArch();
    } else if ( operatingSystem.getIdOs() == OperatingSystem::LINUX_DEBIAN ||
                operatingSystem.getIdOs() == OperatingSystem::LINUX_UBUNTU ) {
        return coletaDebian();
    }

    return QJsonObject();
}

QJsonObject cacic_software::coletaArch()
{
    ConsoleObject console;
    QJsonObject softwaresJson;

    QStringList packages = console("pacman -Qe").split("\n");

    foreach(QString package, packages) {
        QString packageName = package.split(" ")[0];
        QJsonObject packageJson;

        QStringList packageInfo = console(QString("pacman -Qi ").append(packageName)).split("\n");
//            qDebug() << packageInfo;

        packageJson["name"] = QJsonValue::fromVariant(QString(packageName));
        foreach(QString line, packageInfo) {
            if(line.contains("Version"))
                packageJson["version"] = line.split(":")[1].mid(1);
            if(line.contains("Description"))
                packageJson["description"] = line.split(":")[1].mid(1);
            if(line.contains("URL")) {
                QStringList url = line.split(":");
                QString urlString;

                for(int i = 1 ; i < url.size() ; ++i){
                    urlString.append(url[i]);
                    if(i == 1 ) urlString.append(":");
                }

                packageJson["url"] = urlString.mid(1);
            }
            if(line.contains("Installed size"))
                packageJson["installedSize"] = line.split(":")[1].mid(1);
            if(line.contains("Install Date"))
                packageJson["installDate"] = line.split(":")[1].mid(1);
        }
        softwaresJson[packageName] = packageJson;
    }
    return softwaresJson;
}

QJsonObject cacic_software::coletaDebian()
{
    ConsoleObject console;
    QJsonObject softwaresJson;

    QStringList packages = console("dpkg --get-selections | grep -v '\^lib\\|\^fonts'").split("\n");

    foreach(QString package, packages) {
        QString packageName = package.split("\t")[0];
        QJsonObject packageJson;

        QStringList packageInfo = console(QString("apt-cache show ").append(packageName)).split("\n");
//            qDebug() << packageInfo;

        packageJson["name"] = QJsonValue::fromVariant(QString(packageName));
        foreach(QString line, packageInfo) {
            if(line.contains("Version:"))
                packageJson["version"] = line.split(":")[1].mid(1);
            if(line.contains("Description-en:"))
                packageJson["description"] = line.split(":")[1].mid(1);
            if(line.contains("Homepage:")) {
                QStringList url = line.split(":");
                QString urlString;

                for(int i = 1 ; i < url.size() ; ++i){
                    urlString.append(url[i]);
                    if(i == 1 ) urlString.append(":");
                }

                packageJson["url"] = urlString.mid(1);
            }
            if(line.contains("Installed-Size:"))
                packageJson["installed_size"] = line.split(":")[1].mid(1);
        }
        softwaresJson[packageName] = packageJson;
        int counterPackages = softwaresJson.size();
    }

    return softwaresJson;
}
#endif

QJsonObject cacic_software::toJsonObject()
{
    return coletaSoftware;
}