From cb33ac1f3ebc8011fe178439eb93e2a8230457d1 Mon Sep 17 00:00:00 2001 From: Thiago Rocha Date: Thu, 18 Sep 2014 12:11:39 -0300 Subject: [PATCH] Métodos de download de arquivos por ftp e http terminados. --- cacic-daemon/cacicD/cacicD.pro | 1 + cacic-teste/cacic-teste.pro | 1 + cacic-teste/testcacic.cpp | 6 +++--- src/cacic_comm.cpp | 273 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cacic_comm.h | 250 +++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 5 files changed, 309 insertions(+), 222 deletions(-) create mode 100644 src/cacic_comm.cpp diff --git a/cacic-daemon/cacicD/cacicD.pro b/cacic-daemon/cacicD/cacicD.pro index 601ce17..5f66133 100644 --- a/cacic-daemon/cacicD/cacicD.pro +++ b/cacic-daemon/cacicD/cacicD.pro @@ -24,6 +24,7 @@ TEMPLATE = app SOURCES += main.cpp \ cacicd.cpp \ cacictimer.cpp \ + ../../src/cacic_comm.cpp \ ../../src/ccacic.cpp \ ../../src/wmi.cpp \ ../../src/cacic_computer.cpp \ diff --git a/cacic-teste/cacic-teste.pro b/cacic-teste/cacic-teste.pro index fcbad59..3f17a71 100644 --- a/cacic-teste/cacic-teste.pro +++ b/cacic-teste/cacic-teste.pro @@ -23,6 +23,7 @@ SOURCES += \ testcacic.cpp \ ../src/ccacic.cpp \ ../src/cacic_computer.cpp \ + ../src/cacic_comm.cpp \ ../src/operatingsystem.cpp \ ../src/cacic_software.cpp \ ../src/cacic_hardware.cpp \ diff --git a/cacic-teste/testcacic.cpp b/cacic-teste/testcacic.cpp index a99e349..a9830f5 100644 --- a/cacic-teste/testcacic.cpp +++ b/cacic-teste/testcacic.cpp @@ -323,9 +323,9 @@ void CTestCacic::testFtpDownload() OCacicComm->ftpDownload("ftp://ftp.unicamp.br", "/pub/gnu/Licenses/gpl-2.0.txt"); QFile downloaded("gpl-2.0.txt"); - QVERIFY( !downloaded.open(QIODevice::ReadOnly) && - downloaded.exists() && - downloaded.readAll() != "" ); + QVERIFY( downloaded.open(QIODevice::ReadOnly) ); + QVERIFY( downloaded.exists() ); + QVERIFY( downloaded.readAll() != "" ); } void CTestCacic::cleanupTestCase() diff --git a/src/cacic_comm.cpp b/src/cacic_comm.cpp new file mode 100644 index 0000000..36a8af9 --- /dev/null +++ b/src/cacic_comm.cpp @@ -0,0 +1,273 @@ +#include "cacic_comm.h" + +CacicComm::CacicComm () +{ +} + +CacicComm::CacicComm (QString urlGerente, QString operatingSystem, QString computerSystem, QString csCipher, + QString csDebug, QString csCompress, QString httpUserAgent, QString moduleFolderName, + QString moduleProgramName, QString networkConfiguration,QString phpAuthPw, QString phpAuthUser, + QString so, QString cacicVersion, QString gercolsVersion) +{ + this->setUrlGerente(urlGerente); + params.addQueryItem("OperatingSystem", operatingSystem); + params.addQueryItem("ComputerSystem",computerSystem); + params.addQueryItem("cs_cipher",csCipher); + params.addQueryItem("cs_debug",csDebug); + params.addQueryItem("cs_compress",csCompress); + params.addQueryItem("HTTP_USER_AGENT",httpUserAgent); + params.addQueryItem("ModuleFolderName",moduleFolderName); + params.addQueryItem("ModuleProgramName",moduleProgramName); + params.addQueryItem("NetworkAdapterConfiguration",networkConfiguration); + params.addQueryItem("PHP_AUTH_PW",phpAuthPw); + params.addQueryItem("PHP_AUTH_USER",phpAuthUser); + params.addQueryItem("te_so",so); + params.addQueryItem("te_versao_cacic",cacicVersion); + params.addQueryItem("te_versao_gercols",gercolsVersion); + + +} + +QJsonObject CacicComm::comm(QString route, bool *ok, const QJsonObject &json, bool isSsl) +{ + *ok = false; + QByteArray data; + QNetworkRequest req; + QUrl url; + QString strReply; + QJsonObject jsonObj; + if (isSsl){ + url = urlSsl.isEmpty() ? "https://" + this->urlGerente + route : this->urlSsl + route; + if (!url.isValid()){ + jsonObj["error"] = QVariant("Invalid Url").toJsonValue(); + return jsonObj; + } + req.setSslConfiguration(QSslConfiguration::defaultConfiguration()); + } else + url = "http://" + urlGerente + route; + req.setUrl(url); + req.setHeader(QNetworkRequest::LocationHeader, "Cacic Agente"); + if (json.empty()){ + //se não for passado QJson, será mandado os valores do get/test antigo. (Será retirado depois) + req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); + data.append(params.toString()); + } else { + // Add JSON + QJsonDocument d(json); + data.append(d.toJson()); + req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + } + QEventLoop eventLoop; + QNetworkAccessManager mgr; + QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); + + QNetworkReply *reply = mgr.post(req, data); + if (!reply->sslConfiguration().isNull()){ + reply->ignoreSslErrors(); + } + eventLoop.exec(); // sai do looping chamando o "finished()". + + jsonObj.insert("codestatus", QJsonValue::fromVariant(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute))); + + if (reply->error() == QNetworkReply::NoError) { + //se não houver erro, grava o retorno; + QVariant replyVariant = reply->readAll(); + QJsonDocument replyDocument = QJsonDocument::fromJson(replyVariant.toByteArray()); + jsonObj["reply"] = (!replyDocument.isNull()) ? + replyDocument.object() : + QJsonValue::fromVariant(replyVariant.toString()); + *ok = true; + delete reply; + } else { + strReply = reply->errorString(); + jsonObj.insert("error", QJsonValue::fromVariant(strReply)); + delete reply; + } + return jsonObj; +} + + +/* commStatus + * execulta um teste do tipo GET na urlGerente; + * @return retorna o resultado da conexão HTTP: + * exemplo: 200 OK + */ +bool CacicComm::commStatus(){ + // cria um event-loop temporario + QEventLoop eventLoop; + // "quit()" o event-loop, when the network request "finished()" + QNetworkAccessManager mgr; + QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); + // a requisição HTTP + QUrl url = "http://" + urlGerente; + QNetworkRequest req( url ); + req.setHeader(QNetworkRequest::LocationHeader, "Cacic Agente"); + QNetworkReply *reply = mgr.get(req); + eventLoop.exec(); // sai do looping chamando o "finished()". + + QString reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString(); + if (reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).isValid()){ +// qDebug() << "Status:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() << reason; + return true; + }else{ + reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString(); +// qDebug() << "Error:" << reason; + return false; + } +} + +/* login + * realiza login com usuario e senha + * @return retorna json com sessão e chave de criptografia + */ +QJsonObject CacicComm::login(bool *ok) { + *ok = false; + // Cria dados de login + QVariantMap login; + login["user"] = this->usuario; + login["password"] = this->password; + // Cria conexão e retorna Json da sessão + QJsonObject retorno = this->comm("/ws/neo/getLogin", ok, QJsonObject::fromVariantMap(login), true); + if (*ok) + this->session = retorno["reply"].toObject()["session"].toString(); + return retorno; +} + +/* fileDownload( QString path ) + * + * Faz o download de um arquivo usando o protocolo mode + * a partir da url do gerente e do caminho até o arquivo. + */ +bool CacicComm::fileDownload(const QString &mode, const QString &path){ + QEventLoop eventLoop; + QNetworkAccessManager manager; + QNetworkRequest request; + QNetworkReply *reply; + + QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(fileDownloadFinished(QNetworkReply*)) ); + QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()) ); + + QStringList splitPath = path.split("/"); + + fileHandler = new QFile(splitPath[splitPath.size() - 1]); + if( !fileHandler->open(QIODevice::WriteOnly) ) { + qDebug() << "ftpDownload: fileHandler nâo pode abrir arquivo."; + return false; + } + + QUrl url(urlGerente); + url.setScheme(mode); + url.setPath(path); + request.setUrl(url); + + reply = manager.get(request); + + eventLoop.exec(); + + delete fileHandler; + delete reply; + + return true; +} + +/* fileDownload( QString urlServer, QString path ) + * + * Faz o download de um arquivo usando o protocolo mode + * a partir da url recebida e do caminho até o arquivo. + */ +bool CacicComm::fileDownload(const QString &mode, const QString &urlServer, const QString &path){ + QEventLoop eventLoop; + QNetworkAccessManager manager; + QNetworkRequest request; + QNetworkReply *reply; + + QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(fileDownloadFinished(QNetworkReply*)) ); + QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()) ); + + QStringList splitPath = path.split("/"); + + fileHandler = new QFile(splitPath[splitPath.size() - 1]); + if( !fileHandler->open(QIODevice::WriteOnly) ) { + qDebug() << "ftpDownload: fileHandler nâo pode abrir arquivo."; + return false; + } + + QUrl url(urlServer); + url.setScheme(mode); + url.setPath(path); + request.setUrl(url); + + reply = manager.get(request); + + eventLoop.exec(); + + delete fileHandler; + delete reply; + + return true; +} + +bool CacicComm::ftpDownload( const QString &path ){ + return fileDownload("ftp", path); +} + +bool CacicComm::ftpDownload( const QString &urlServer, const QString &path ){ + return fileDownload("ftp", urlServer, path); +} + +bool CacicComm::httpDownload( const QString &path ){ + return fileDownload("http", path); +} + +bool CacicComm::httpDownload( const QString &urlServer, const QString &path ){ + return fileDownload("http", urlServer, path); +} + +QString CacicComm::getUrlSsl (){ + return this->urlSsl; +} + +void CacicComm::setUrlSsl(QString value){ + this->urlSsl = value; +} + +QString CacicComm::getUrlGerente (){ + return this->urlGerente; +} + +void CacicComm::setUrlGerente(QString value){ + if (value.contains("://", Qt::CaseInsensitive)){ + value = value.mid(value.indexOf("://") + 3); + } + if (value.endsWith("/")){ + value.remove(value.size()-1, 1); + } + this->urlGerente = value; +} + +QString CacicComm::getPassword() +{ + return this->password; +} + +void CacicComm::setPassword(QString value) +{ + this->password = value; +} +QString CacicComm::getUsuario() +{ + return this->usuario; +} + +void CacicComm::setUsuario(QString value) +{ + this->usuario = value; +} + +void CacicComm::fileDownloadFinished(QNetworkReply* reply) +{ + QTextStream out(fileHandler); + out << reply->readAll(); + fileHandler->close(); + reply->close(); +} diff --git a/src/cacic_comm.h b/src/cacic_comm.h index 72dbee2..8d39219 100644 --- a/src/cacic_comm.h +++ b/src/cacic_comm.h @@ -16,240 +16,52 @@ class CacicComm : public QObject{ Q_OBJECT -private: - QFile *fileHandler; - QUrlQuery params; - QString urlGerente; - QString urlSsl; - QString usuario; - QString password; - QString session; public: - CacicComm (){ - } + CacicComm (); CacicComm (QString urlGerente, QString operatingSystem, QString computerSystem, QString csCipher, QString csDebug, QString csCompress, QString httpUserAgent, QString moduleFolderName, QString moduleProgramName, QString networkConfiguration,QString phpAuthPw, QString phpAuthUser, - QString so, QString cacicVersion, QString gercolsVersion) - { - this->setUrlGerente(urlGerente); - params.addQueryItem("OperatingSystem", operatingSystem); - params.addQueryItem("ComputerSystem",computerSystem); - params.addQueryItem("cs_cipher",csCipher); - params.addQueryItem("cs_debug",csDebug); - params.addQueryItem("cs_compress",csCompress); - params.addQueryItem("HTTP_USER_AGENT",httpUserAgent); - params.addQueryItem("ModuleFolderName",moduleFolderName); - params.addQueryItem("ModuleProgramName",moduleProgramName); - params.addQueryItem("NetworkAdapterConfiguration",networkConfiguration); - params.addQueryItem("PHP_AUTH_PW",phpAuthPw); - params.addQueryItem("PHP_AUTH_USER",phpAuthUser); - params.addQueryItem("te_so",so); - params.addQueryItem("te_versao_cacic",cacicVersion); - params.addQueryItem("te_versao_gercols",gercolsVersion); - - - } - - QJsonObject comm(QString route, bool *ok, const QJsonObject &json = QJsonObject(), bool isSsl = false) - { - *ok = false; - QByteArray data; - QNetworkRequest req; - QUrl url; - QString strReply; - QJsonObject jsonObj; - if (isSsl){ - url = urlSsl.isEmpty() ? "https://" + this->urlGerente + route : this->urlSsl + route; - if (!url.isValid()){ - jsonObj["error"] = QVariant("Invalid Url").toJsonValue(); - return jsonObj; - } - req.setSslConfiguration(QSslConfiguration::defaultConfiguration()); - } else - url = "http://" + urlGerente + route; - req.setUrl(url); - req.setHeader(QNetworkRequest::LocationHeader, "Cacic Agente"); - if (json.empty()){ - //se não for passado QJson, será mandado os valores do get/test antigo. (Será retirado depois) - req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - data.append(params.toString()); - } else { - // Add JSON - QJsonDocument d(json); - data.append(d.toJson()); - req.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); - } - QEventLoop eventLoop; - QNetworkAccessManager mgr; - QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); - - QNetworkReply *reply = mgr.post(req, data); - if (!reply->sslConfiguration().isNull()){ - reply->ignoreSslErrors(); - } - eventLoop.exec(); // sai do looping chamando o "finished()". - - jsonObj.insert("codestatus", QJsonValue::fromVariant(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute))); - - if (reply->error() == QNetworkReply::NoError) { - //se não houver erro, grava o retorno; - QVariant replyVariant = reply->readAll(); - QJsonDocument replyDocument = QJsonDocument::fromJson(replyVariant.toByteArray()); - jsonObj["reply"] = (!replyDocument.isNull()) ? - replyDocument.object() : - QJsonValue::fromVariant(replyVariant.toString()); - *ok = true; - delete reply; - } else { - strReply = reply->errorString(); - jsonObj.insert("error", QJsonValue::fromVariant(strReply)); - delete reply; - } - return jsonObj; - } - - - /* commStatus - * execulta um teste do tipo GET na urlGerente; - * @return retorna o resultado da conexão HTTP: - * exemplo: 200 OK - */ - bool commStatus(){ - // cria um event-loop temporario - QEventLoop eventLoop; - // "quit()" o event-loop, when the network request "finished()" - QNetworkAccessManager mgr; - QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); - // a requisição HTTP - QUrl url = "http://" + urlGerente; - QNetworkRequest req( url ); - req.setHeader(QNetworkRequest::LocationHeader, "Cacic Agente"); - QNetworkReply *reply = mgr.get(req); - eventLoop.exec(); // sai do looping chamando o "finished()". - - QString reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString(); - if (reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ).isValid()){ -// qDebug() << "Status:" << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() << reason; - return true; - }else{ - reason = reply->attribute( QNetworkRequest::HttpReasonPhraseAttribute ).toString(); -// qDebug() << "Error:" << reason; - return false; - } - } - - /* login - * realiza login com usuario e senha - * @return retorna json com sessão e chave de criptografia - */ - QJsonObject login(bool *ok) { - *ok = false; - // Cria dados de login - QVariantMap login; - login["user"] = this->usuario; - login["password"] = this->password; - // Cria conexão e retorna Json da sessão - QJsonObject retorno = this->comm("/ws/neo/getLogin", ok, QJsonObject::fromVariantMap(login), true); - if (*ok) - this->session = retorno["reply"].toObject()["session"].toString(); - return retorno; - } - - bool ftpDownload(QString path){ - QUrl url(urlGerente); - url.setScheme("ftp"); - url.setPath(path); - - return false; - } - - bool ftpDownload(QString urlServer, QString path){ - QNetworkAccessManager manager; - QNetworkRequest req; - QNetworkReply *reply; + QString so, QString cacicVersion, QString gercolsVersion); + QJsonObject comm(QString route, bool *ok, const QJsonObject &json = QJsonObject(), bool isSsl = false); + bool commStatus(); + QJsonObject login(bool *ok); + bool ftpDownload(const QString &path); + bool ftpDownload(const QString &urlServer, const QString &path); + bool httpDownload(const QString &path); + bool httpDownload(const QString &urlServer, const QString &path); + QString getUrlSsl (); + void setUrlSsl(QString value); + QString getUrlGerente (); + void setUrlGerente(QString value); + QString getPassword(); + void setPassword(QString value); + QString getUsuario(); + void setUsuario(QString value); - QStringList splitPath = path.split("/"); - fileHandler = new QFile(splitPath[splitPath.size() - 1]); - if( !fileHandler->open(QIODevice::WriteOnly) ) { - return false; - } - QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(ftpDownloadFinished(QNetworkReply*)) ); -// QObject::connect(reply, SIGNAL(finished()), this, SIGNAL(finished(reply)) ); -// QObject::connect(this, SIGNAL(finished(reply)), this, SLOT(ftpDownloadFinished(reply)) ); - - QUrl url(urlServer); - url.setScheme("ftp"); - url.setPath(path); - req.setUrl(url); - - reply = manager.get(req); - - return true; - } - - bool httpDownload( QString urlServer, QString path ){ - return false; - } - - QString getUrlSsl (){ - return this->urlSsl; - } - - void setUrlSsl(QString value){ - this->urlSsl = value; - } - - QString getUrlGerente (){ - return this->urlGerente; - } - - void setUrlGerente(QString value){ - if (value.contains("://", Qt::CaseInsensitive)){ - value = value.mid(value.indexOf("://") + 3); - } - if (value.endsWith("/")){ - value.remove(value.size()-1, 1); - } - this->urlGerente = value; - } - - QString getPassword() - { - return this->password; - } +signals: +// void finished(QNetworkReply* reply); - void setPassword(QString value) - { - this->password = value; - } - QString getUsuario() - { - return this->usuario; - } +private slots: - void setUsuario(QString value) - { - this->usuario = value; - } + void fileDownloadFinished(QNetworkReply* reply); +private: -signals: - void finished(QNetworkReply* reply); + bool fileDownload(const QString &mode, const QString &path); + bool fileDownload(const QString &mode, const QString &urlServer, const QString &path); -private slots: + QUrlQuery params; + QString urlGerente; + QString urlSsl; + QString usuario; + QString password; + QString session; - void ftpDownloadFinished(QNetworkReply* reply) - { - qDebug() << "Entrou no SLOT."; + QFile *fileHandler; - QTextStream out(fileHandler); - out << reply->readAll(); - fileHandler->close(); - } }; #endif // CACIC_COMM_H -- libgit2 0.21.2