checkmodules.cpp 3.28 KB
#include "checkmodules.h"

CheckModules::CheckModules(const QString &workingPath)
{
    oCacic.setCacicMainFolder(workingPath);
    QJsonObject configFile;
    configFile = oCacic.getJsonFromFile(workingPath + "/getConfig.json");
    if (!configFile.isEmpty()) {
        //pega url do gerente.
        this->applicationUrl = configFile["agentcomputer"].toObject()["metodoDownload"].toObject()["url"].toString();
//        qDebug() << applicationUrl;
        QJsonArray modulos;
        //pega o jsonarray dos módulos
        modulos = configFile["agentcomputer"].toObject()["modulos"].toObject()["cacic"].toArray();
        foreach (QJsonValue modulo, modulos){
            //grava o nome com o hash de cada modulo
            modules[modulo.toObject()["nome"].toString()] = modulo.toObject()["hash"].toString();
        }
    }
    //TODO: Completar constructor. Agora que tenho os nomes dos módulos e os hashs, fazer a verificação.

    QDir tempPath(oCacic.getCacicMainFolder() + "/temp");
    if (!tempPath.exists()){
//        qDebug() << "criando diretório temporário";
        tempPath.mkdir(oCacic.getCacicMainFolder() + "/temp");
    }
}

QVariantMap CheckModules::getModules() const {
    return modules;
}

bool CheckModules::start(){
    if (!modules.isEmpty()){
        QVariantMap::const_iterator i = modules.constBegin();
        do {
//            qDebug() << "Módulo: " << i.key() << " | Hash: " << i.value().toString();
            this->verificaModulo(i.key(), i.value().toString());
            i++;
        } while (i != modules.constEnd());
    }
    return true;
}

bool CheckModules::verificaModulo(const QString &moduloName, const QString &moduloHash)
{
    QFile *modulo;
    bool downloadOk = false;
    //pega o arquivo do módulo selecionado
    modulo = new QFile(oCacic.getCacicMainFolder() + "/" + moduloName);
    //verifica se o módulo existe, se o tamaho é maior que 1 byte e se o hash é igual ao informado pelo json
    if (!(modulo->exists() && modulo->size()>1 && oCacic.Md5IsEqual(QVariant::fromValue(modulo), moduloHash))){
        QFile *novoModulo;
        QJsonObject metodoDownload;
        //verifica o tipo de download e tenta baixar o módulo para a pasta temporária.
        metodoDownload = oCacic.getJsonFromFile("getConfig.json")["agentcomputer"].toObject()["metodoDownload"].toObject();
        oCacicComm.setFtpUser(metodoDownload["usuario"].toString());
        oCacicComm.setFtpPass(metodoDownload["senha"].toString());

        downloadOk = oCacicComm.fileDownload(metodoDownload["tipo"].toString(),
                                            this->applicationUrl,
                                            metodoDownload["path"].toString() + "/" + moduloName,
                                            oCacic.getCacicMainFolder() + "/temp/");

        if (downloadOk){
            //faz uma verificação do novo módulo.
            novoModulo = new QFile(oCacic.getCacicMainFolder() + "/temp/" + moduloName);
            if (!(novoModulo->exists() && novoModulo->size()>1)){
                qDebug() << moduloName << "falha no download..";
                novoModulo->remove();
                return false;
            } else {
                qDebug() << moduloName << "Sucesso!";
                return true;
            }
        } else {
            return false;
        }

    }
}