diff --git a/src/Acid.Cam.v2.OpenCV3.pro b/src/Acid.Cam.v2.OpenCV3.pro index c2f920d..7659e09 100644 --- a/src/Acid.Cam.v2.OpenCV3.pro +++ b/src/Acid.Cam.v2.OpenCV3.pro @@ -4,7 +4,7 @@ TEMPLATE = app TARGET = Acid_Cam_v2_Qt -QT += core gui widgets +QT += core gui widgets network DEPENDPATH += . INCLUDEPATH += . /usr/include/ /usr/local/include LIBS += `pkg-config acidcam opencv --libs` @@ -14,5 +14,5 @@ QMAKE_CXXFLAGS += -std=c++11 `pkg-config acidcam opencv --cflags` RESOURCES += qresource.qrc # Input -HEADERS += main_window.h new_dialog.h plugin.h qtheaders.h select_image.h display_window.h playback_thread.h search_box.h goto_window.h chroma_window.h user_define.h -SOURCES += main.cpp main_window.cpp new_dialog.cpp plugin.cpp select_image.cpp display_window.cpp playback_thread.cpp search_box.cpp goto_window.cpp chroma_window.cpp user_define.cpp +HEADERS += main_window.h new_dialog.h plugin.h qtheaders.h select_image.h display_window.h playback_thread.h search_box.h goto_window.h chroma_window.h user_define.h dl-man.h +SOURCES += main.cpp main_window.cpp new_dialog.cpp plugin.cpp select_image.cpp display_window.cpp playback_thread.cpp search_box.cpp goto_window.cpp chroma_window.cpp user_define.cpp dl-man.cpp diff --git a/src/Acid.Cam.v2.OpenCV4.pro b/src/Acid.Cam.v2.OpenCV4.pro index e0b61c8..6110eeb 100644 --- a/src/Acid.Cam.v2.OpenCV4.pro +++ b/src/Acid.Cam.v2.OpenCV4.pro @@ -4,7 +4,7 @@ TEMPLATE = app TARGET = Acid_Cam_v2_Qt -QT += core gui widgets +QT += core gui widgets network DEPENDPATH += . INCLUDEPATH += . /usr/include/ /usr/local/include LIBS += `pkg-config acidcam opencv4 --libs` @@ -14,5 +14,5 @@ QMAKE_CXXFLAGS += -std=c++11 `pkg-config acidcam opencv4 --cflags` RESOURCES += qresource.qrc # Input -HEADERS += main_window.h new_dialog.h plugin.h qtheaders.h select_image.h display_window.h playback_thread.h search_box.h goto_window.h chroma_window.h user_define.h -SOURCES += main.cpp main_window.cpp new_dialog.cpp plugin.cpp select_image.cpp display_window.cpp playback_thread.cpp search_box.cpp goto_window.cpp chroma_window.cpp user_define.cpp +HEADERS += main_window.h new_dialog.h plugin.h qtheaders.h select_image.h display_window.h playback_thread.h search_box.h goto_window.h chroma_window.h user_define.h dl-man.h +SOURCES += main.cpp main_window.cpp new_dialog.cpp plugin.cpp select_image.cpp display_window.cpp playback_thread.cpp search_box.cpp goto_window.cpp chroma_window.cpp user_define.cpp dl-man.cpp diff --git a/src/dl-man.cpp b/src/dl-man.cpp new file mode 100644 index 0000000..20d136a --- /dev/null +++ b/src/dl-man.cpp @@ -0,0 +1,116 @@ + +// From Qt5 Examples/Docs + +#include"dl-man.h" + +DownloadManager::DownloadManager() +{ + connect(&manager, SIGNAL(finished(QNetworkReply*)), + SLOT(downloadFinished(QNetworkReply*))); +} + +void DownloadManager::doDownload(const QUrl &url) +{ + QNetworkRequest request(url); + QNetworkReply *reply = manager.get(request); + +#if QT_CONFIG(ssl) + connect(reply, SIGNAL(sslErrors(QList)), + SLOT(sslErrors(QList))); +#endif + + currentDownloads.append(reply); +} + +QString DownloadManager::saveFileName(const QUrl &url) +{ + QString path = url.path(); + QString basename = QFileInfo(path).fileName(); + + if (basename.isEmpty()) + basename = "download"; + + if (QFile::exists(basename)) { + // already exists, don't overwrite + int i = 0; + basename += '.'; + while (QFile::exists(basename + QString::number(i))) + ++i; + + basename += QString::number(i); + } + + return basename; +} + +bool DownloadManager::saveToDisk(const QString &filename, QIODevice *data) +{ + QFile file(filename); + if (!file.open(QIODevice::WriteOnly)) { + fprintf(stderr, "Could not open %s for writing: %s\n", + qPrintable(filename), + qPrintable(file.errorString())); + return false; + } + + file.write(data->readAll()); + file.close(); + + return true; +} + +bool DownloadManager::isHttpRedirect(QNetworkReply *reply) +{ + int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + return statusCode == 301 || statusCode == 302 || statusCode == 303 + || statusCode == 305 || statusCode == 307 || statusCode == 308; +} + +void DownloadManager::execute() +{ + QStringList args = QCoreApplication::instance()->arguments(); + args.takeFirst(); // skip the first argument, which is the program's name + if (args.isEmpty()) { + QCoreApplication::instance()->quit(); + return; + } + + for (const QString &arg : qAsConst(args)) { + QUrl url = QUrl::fromEncoded(arg.toLocal8Bit()); + doDownload(url); + } +} + +void DownloadManager::sslErrors(const QList &sslErrors) +{ +#if QT_CONFIG(ssl) + for (const QSslError &error : sslErrors) + fprintf(stderr, "SSL error: %s\n", qPrintable(error.errorString())); +#else + Q_UNUSED(sslErrors); +#endif +} + +void DownloadManager::downloadFinished(QNetworkReply *reply) +{ + QUrl url = reply->url(); + if (reply->error()) { + fprintf(stderr, "Download of %s failed: %s\n", + url.toEncoded().constData(), + qPrintable(reply->errorString())); + } else { + if (isHttpRedirect(reply)) { + fputs("Request was redirected.\n", stderr); + } else { + QString filename = saveFileName(url); + if (saveToDisk(filename, reply)) { + printf("Download of %s succeeded (saved to %s)\n", + url.toEncoded().constData(), qPrintable(filename)); + } + } + } + + currentDownloads.removeAll(reply); + reply->deleteLater(); +} + diff --git a/src/dl-man.h b/src/dl-man.h new file mode 100644 index 0000000..fe1a5c7 --- /dev/null +++ b/src/dl-man.h @@ -0,0 +1,32 @@ +//This class is from QT examples/docs +#ifndef __DL_MAIN__H___ +#define __DL_MAIN__H___ + +#include +#include +#include + +class QSslError; + +using namespace std; + +class DownloadManager: public QObject +{ + Q_OBJECT + QNetworkAccessManager manager; + QVector currentDownloads; + +public: + DownloadManager(); + void doDownload(const QUrl &url); + static QString saveFileName(const QUrl &url); + bool saveToDisk(const QString &filename, QIODevice *data); + static bool isHttpRedirect(QNetworkReply *reply); + + public slots: + void execute(); + void downloadFinished(QNetworkReply *reply); + void sslErrors(const QList &errors); +}; + +#endif diff --git a/src/main_window.cpp b/src/main_window.cpp index 0412abc..bd58565 100644 --- a/src/main_window.cpp +++ b/src/main_window.cpp @@ -111,6 +111,10 @@ AC_MainWindow::AC_MainWindow(QWidget *parent) : QMainWindow(parent) { define_window = new DefineWindow(this); define_window->hide(); define_window->main_window = this; + + QString arg = "http://lostsidedead.com/ac/version.txt"; + QUrl url = QUrl::fromEncoded(arg.toLocal8Bit()); + dl.doDownload(url); } @@ -155,9 +159,9 @@ void AC_MainWindow::createControls() { filter_single = new QRadioButton(tr("Single Filter"), this); - filter_single->setGeometry(30, 40, 100, 15); + filter_single->setGeometry(30, 40, 200, 15); filter_custom = new QRadioButton(tr("Custom Filter"), this); - filter_custom->setGeometry(30, 65, 100, 15); + filter_custom->setGeometry(30, 65, 200, 15); filter_single->setChecked(true); @@ -172,12 +176,12 @@ void AC_MainWindow::createControls() { btn_clr = new QPushButton(tr("Clear Sub"), this); btn_load = new QPushButton(tr("Load"), this); btn_save = new QPushButton(tr("Save"), this); - btn_add->setGeometry(10, 215, 100, 20); - btn_remove->setGeometry(400, 215, 60, 20); - btn_moveup->setGeometry(465, 215, 60, 20); - btn_movedown->setGeometry(530, 215, 60, 20); - btn_load->setGeometry(655+20, 215, 55, 20); - btn_save->setGeometry(655+60+20, 215, 55, 20); + btn_add->setGeometry(10, 215, 100, 25); + btn_remove->setGeometry(390, 215, 80, 25); + btn_moveup->setGeometry(460, 215, 80, 25); + btn_movedown->setGeometry(530, 215, 80, 25); + btn_load->setGeometry(655+20, 215, 60, 25); + btn_save->setGeometry(655+60+20, 215, 60, 25); btn_sub->setGeometry(10, 165, 100, 20); btn_clr->setGeometry(115, 165, 100, 20); connect(btn_add, SIGNAL(clicked()), this, SLOT(addClicked())); diff --git a/src/main_window.h b/src/main_window.h index 40dbf4b..a61ca07 100644 --- a/src/main_window.h +++ b/src/main_window.h @@ -16,7 +16,7 @@ #include "goto_window.h" #include "chroma_window.h" #include "user_define.h" - +#include "dl-man.h" class SearchWindow; @@ -141,6 +141,7 @@ private: bool loading; int speed_index; cv::ocl::Context context; + DownloadManager dl; }; extern const char *filer_names[]; diff --git a/src/qtheaders.h b/src/qtheaders.h index fd3c134..300d406 100644 --- a/src/qtheaders.h +++ b/src/qtheaders.h @@ -6,7 +6,7 @@ #ifndef _QT_HEADERS__ #define _QT_HEADERS__ -#define ac_version "v1.39.0" +#define ac_version "v1.40.0" #include #include #include