# HG changeset patch # User Matti Hamalainen # Date 1503908682 -10800 # Node ID 2a8c97753381754e889ca155a3cdb2c421b8e610 # Parent fd960e586678220ea0d99296d1fc87e3c0ad647e Make the backup stuff compile-time optional. diff -r fd960e586678 -r 2a8c97753381 Makefile --- a/Makefile Mon Aug 28 11:11:16 2017 +0300 +++ b/Makefile Mon Aug 28 11:24:42 2017 +0300 @@ -2,9 +2,11 @@ ### Configuration settings for Linux and generic UNIX ### See other Makefile.* files for more options. ### +USE_QTHTTP ?= yes + # Miscellaneous -QT5_MODULES = Core Gui Widgets Sql PrintSupport Network +QT5_MODULES = Core Gui Widgets Sql PrintSupport QT5_PREFIX = BINTOOL_PREFIX = @@ -14,7 +16,11 @@ EXEEXT = # Compiler flags and linker flags -DEFINES = +ifeq ($(USE_QTHTTP),yes) +QT5_MODULES += Network +DEFINES += -DUSE_QTHTTP +endif +DEFINES += INCPATH = -I. `pkg-config --cflags $(addprefix Qt5,$(QT5_MODULES))` CFLAGS += -pipe -O2 -Wall -W -D_REENTRANT -fPIC diff -r fd960e586678 -r 2a8c97753381 Makefile.cross-mingw-win32 --- a/Makefile.cross-mingw-win32 Mon Aug 28 11:11:16 2017 +0300 +++ b/Makefile.cross-mingw-win32 Mon Aug 28 11:24:42 2017 +0300 @@ -1,9 +1,11 @@ ### ### For win32 version cross-compilation with MinGW suite @ Linux ### +USE_QTHTTP ?= yes + # Miscellaneous -QT5_MODULES = Core Gui Widgets Sql PrintSupport Network +QT5_MODULES = Core Gui Widgets Sql PrintSupport QT5_PREFIX ?= /misc/packages/qt5-src QT5_BASE ?= $(QT5_PREFIX)/qtbase BINTOOL_PREFIX ?= i686-w64-mingw32- @@ -14,6 +16,10 @@ # Compiler flags and linker flags DEFINES = -DUNICODE -DQT_NEEDS_QMAIN +ifeq ($(USE_QTHTTP),yes) +QT5_MODULES += Network +DEFINES += -DUSE_QTHTTP +endif INCPATH = -I. \ -I$(QT5_BASE)/include \ $(addprefix -I$(QT5_BASE)/include/Qt,$(QT5_MODULES)) \ diff -r fd960e586678 -r 2a8c97753381 src/main.cpp --- a/src/main.cpp Mon Aug 28 11:11:16 2017 +0300 +++ b/src/main.cpp Mon Aug 28 11:24:42 2017 +0300 @@ -28,6 +28,9 @@ double uiScale; // Global UI scale factor QString dataPath; // Application data path/directory + + // Backup related settings + int dbBackupMode; QString dbBackupURL; QString dbBackupSecret; } settings; @@ -246,14 +249,16 @@ settings.uiPos = tmpst.value("pos", QPoint(100, 100)).toPoint(); settings.uiSize = tmpst.value("size", QSize(1000, 600)).toSize(); settings.uiScale = tmpst.value("scale", 1.0f).toDouble(); + settings.dbBackupMode = BACKUP_NONE; settings.dbBackupURL = tmpst.value("dbBackupURL", QString()).toString(); settings.dbBackupSecret = tmpst.value("dbBackupSecret", QString()).toString(); // Check commandline arguments for configuring backup settings - if (argc >= 4 && strcmp(argv[1], "config") == 0) + if (argc >= 5 && strcmp(argv[1], "config") == 0) { - settings.dbBackupURL = QString(argv[2]); - settings.dbBackupSecret = QString(argv[3]); + settings.dbBackupMode = QString(argv[2]).toInt(); + settings.dbBackupURL = QString(argv[3]); + settings.dbBackupSecret = QString(argv[4]); } // Also possibility of resetting the UI settings @@ -447,7 +452,8 @@ QSqlDatabase::database().close(); // Back up the database - backupDatabase(); + if (settings.dbBackupMode != BACKUP_NONE) + backupDatabase(); } @@ -455,7 +461,6 @@ { QString dbFilename = settings.dataPath + QDir::separator() + APP_SQLITE_FILE; QString backupFilename = APP_SQLITE_FILE; - backupReply = NULL; backupDialog = NULL; if (settings.dbBackupURL == QString() || settings.dbBackupURL == "") @@ -470,73 +475,92 @@ return; } - // Check for network access - QNetworkAccessManager *manager = new QNetworkAccessManager(); - if (manager->networkAccessible() != QNetworkAccessManager::Accessible) - { - slLog("ERROR", QStringLiteral("Network not available, cannot backup the database.")); - return; - } - - // Attempt to open the database file - QFile *file = new QFile(dbFilename); - if (!file->open(QIODevice::ReadOnly)) + if (settings.dbBackupMode == BACKUP_HTTP) { - slLog("ERROR", QStringLiteral("Failed to open database file '%1' for backup.").arg(dbFilename)); - return; - } +#ifdef USE_QTHTTP + // Check for network access + httpBackupReply = NULL; - // Okay, we seem to be "go" .. - slLog("INFO", - QStringLiteral("Attempting database backup from '%1' to '%2'."). - arg(dbFilename).arg(settings.dbBackupURL)); + QNetworkAccessManager *manager = new QNetworkAccessManager(); + if (manager->networkAccessible() != QNetworkAccessManager::Accessible) + { + slLog("ERROR", QStringLiteral("Network not available, cannot backup the database.")); + return; + } + + // Attempt to open the database file + QFile *file = new QFile(dbFilename); + if (!file->open(QIODevice::ReadOnly)) + { + slLog("ERROR", QStringLiteral("Failed to open database file '%1' for backup.").arg(dbFilename)); + return; + } - // Create the HTTP POST request - QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); + // Okay, we seem to be "go" .. + slLog("INFO", + QStringLiteral("Attempting database backup from '%1' to '%2'."). + arg(dbFilename).arg(settings.dbBackupURL)); + + // Create the HTTP POST request + QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); - // The "secret" key as POST parameter - QHttpPart postPart; - postPart.setHeader(QNetworkRequest::ContentDispositionHeader, - QVariant("form-data; name=\"secret\";")); - postPart.setBody(QByteArray(settings.dbBackupSecret.toUtf8())); + // The "secret" key as POST parameter + QHttpPart postPart; + postPart.setHeader(QNetworkRequest::ContentDispositionHeader, + QVariant("form-data; name=\"secret\";")); + postPart.setBody(QByteArray(settings.dbBackupSecret.toUtf8())); + + // Actual data as binary octet-stream + QHttpPart dataPart; + dataPart.setHeader(QNetworkRequest::ContentTypeHeader, + QVariant("binary/octet-stream")); + + dataPart.setHeader(QNetworkRequest::ContentDispositionHeader, + QVariant("form-data; name=\"file\"; filename=\""+ backupFilename +"\"")); - // Actual data as binary octet-stream - QHttpPart dataPart; - dataPart.setHeader(QNetworkRequest::ContentTypeHeader, - QVariant("binary/octet-stream")); + dataPart.setBodyDevice(file); + file->setParent(multiPart); // we cannot delete the QFile object now, so delete it with the multiPart + + multiPart->append(postPart); + multiPart->append(dataPart); - dataPart.setHeader(QNetworkRequest::ContentDispositionHeader, - QVariant("form-data; name=\"file\"; filename=\""+ backupFilename +"\"")); + // Attempt to POST the whole thing + QUrl url(settings.dbBackupURL); + QNetworkRequest request(url); + httpBackupReply = manager->post(request, multiPart); + multiPart->setParent(httpBackupReply); - dataPart.setBodyDevice(file); - file->setParent(multiPart); // we cannot delete the QFile object now, so delete it with the multiPart - - multiPart->append(postPart); - multiPart->append(dataPart); + connect( + httpBackupReply, + SIGNAL(finished()), + this, + SLOT(httpBackupFinished())); - // Attempt to POST the whole thing - QUrl url(settings.dbBackupURL); - QNetworkRequest request(url); - backupReply = manager->post(request, multiPart); - multiPart->setParent(backupReply); - - connect( - backupReply, - SIGNAL(finished()), - this, - SLOT(backupFinished())); + connect( + httpBackupReply, + SIGNAL(uploadProgress(qint64, qint64)), + this, + SLOT(httpBackupProgress(qint64, qint64))); - connect( - backupReply, - SIGNAL(uploadProgress(qint64, qint64)), - this, - SLOT(backupProgress(qint64, qint64))); - - connect( - backupReply, - SIGNAL(error(QNetworkReply::NetworkError)), - this, - SLOT(backupError(QNetworkReply::NetworkError))); + connect( + httpBackupReply, + SIGNAL(error(QNetworkReply::NetworkError)), + this, + SLOT(httpBackupError(QNetworkReply::NetworkError))); +#else + slLog("ERROR", QStringLiteral("Backup method is HTTP/HTTPS, but support is not compiled in!")); + return; +#endif + } + else + if (settings.dbBackupMode == BACKUP_CURL_SFTP) + { +#ifdef USE_LIBCURL +#else + slLog("ERROR", QStringLiteral("Backup method is SFTP via libcurl, but support is not compiled in!")); + return; +#endif + } // Create progress dialog backupDialog = new QProgressDialog( @@ -553,7 +577,8 @@ } -void SyntilistaMainWindow::backupProgress(qint64 bytesSent, qint64 bytesTotal) +#ifdef USE_QTHTTP +void SyntilistaMainWindow::httpBackupProgress(qint64 bytesSent, qint64 bytesTotal) { if (bytesTotal > 0) { @@ -567,7 +592,7 @@ } -void SyntilistaMainWindow::backupError(QNetworkReply::NetworkError code) +void SyntilistaMainWindow::httpBackupError(QNetworkReply::NetworkError code) { slLog("ERROR", QStringLiteral("Backup failed with network error %1."). @@ -576,11 +601,11 @@ } -void SyntilistaMainWindow::backupFinished() +void SyntilistaMainWindow::httpBackupFinished() { - if (backupReply) + if (httpBackupReply) { - QVariant status = backupReply->attribute(QNetworkRequest::HttpStatusCodeAttribute); + QVariant status = httpBackupReply->attribute(QNetworkRequest::HttpStatusCodeAttribute); if (status.isValid()) { int code = status.toInt(); @@ -597,7 +622,7 @@ default: slLog("ERROR", QStringLiteral("Backup server responded with error:\n")+ - QString::fromUtf8(backupReply->readAll())); + QString::fromUtf8(httpBackupReply->readAll())); break; } } @@ -609,6 +634,7 @@ backupDialog->close(); } +#endif // diff -r fd960e586678 -r 2a8c97753381 src/main.h --- a/src/main.h Mon Aug 28 11:11:16 2017 +0300 +++ b/src/main.h Mon Aug 28 11:24:42 2017 +0300 @@ -17,10 +17,15 @@ #include #include #include -#include -#include -#include -#include +#ifdef USE_QTHTTP +# include +# include +# include +# include +#endif +#ifdef USE_LIBCURL +# include +#endif // @@ -37,6 +42,11 @@ #define SQL_LEN_LAST_NAME 128 #define SQL_LEN_EXTRA_INFO 2048 +// Supported database backup modes +#define BACKUP_NONE 0 // No backup +#define BACKUP_HTTP 1 // HTTP(s) POST to a PHP script +#define BACKUP_CURL_SFTP 2 // SFTP via libcurl + // // Custom SQL models @@ -178,16 +188,20 @@ void printDocument(QPrinter *printer); - void backupProgress(qint64 bytesSent, qint64 bytesTotal); - void backupFinished(); - void backupError(QNetworkReply::NetworkError code); +#ifdef USE_QTHTTP + void httpBackupProgress(qint64 bytesSent, qint64 bytesTotal); + void httpBackupFinished(); + void httpBackupError(QNetworkReply::NetworkError code); +#endif private: Ui::SyntilistaMainWindow *ui; QProgressDialog *backupDialog; - QNetworkReply *backupReply; +#ifdef USE_QTHTTP + QNetworkReply *httpBackupReply; +#endif TransactionSQLModel *model_Latest; PersonInfo currPerson;