From b605b48ce7f46243fb5b4bd980b1b121ce1f0043 Mon Sep 17 00:00:00 2001 From: Vadim Kurland Date: Mon, 11 Aug 2008 05:33:58 +0000 Subject: [PATCH] version checker --- doc/ChangeLog | 12 ++ src/gui/FWBSettings.cpp | 18 +++ src/gui/FWBSettings.h | 4 + src/gui/FWWindow.cpp | 45 ++++++- src/gui/FWWindow.h | 140 ++++++++++---------- src/gui/Help.cpp | 2 + src/gui/HttpGet.cpp | 105 +++++++++++++++ src/gui/HttpGet.h | 65 ++++++++++ src/gui/PrefsDialog.cpp | 49 +++++++ src/gui/PrefsDialog.h | 5 + src/gui/check_update_url.h | 36 ++++++ src/gui/global.h | 2 +- src/gui/gui.pro | 7 +- src/gui/main.cpp | 3 + src/gui/prefsdialog_q.ui | 256 ++++++++++++++++++++----------------- 15 files changed, 559 insertions(+), 190 deletions(-) create mode 100644 src/gui/HttpGet.cpp create mode 100644 src/gui/HttpGet.h create mode 100644 src/gui/check_update_url.h diff --git a/doc/ChangeLog b/doc/ChangeLog index 852a3e8e4..58f41b865 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,15 @@ +2008-08-10 Vadim Kurland + + * FWWindow.cpp (FWWindow::checkForUpgrade): the GUI checks if + updated version is available on startup by making simple HTTP GET + request to the web site at http://www.fwbuilder.org. This can be + turned off in the Preferences dialog. Preferences dialog also + provides a button to perform this query at any time. If function + is enabled in Preferences, it is performed at every time the GUI + is launched. The query does not transmit any data to the server, + but the URL of the query includes the version of the Firewall + Builder. + 2008-08-06 Vadim Kurland * new_object.cpp (newObject): fixed bug # 1997469: "Create a new diff --git a/src/gui/FWBSettings.cpp b/src/gui/FWBSettings.cpp index ff55cc0b8..6964f6cdf 100644 --- a/src/gui/FWBSettings.cpp +++ b/src/gui/FWBSettings.cpp @@ -105,6 +105,8 @@ const char* uiFont = SETTINGS_PATH_PREFIX "/UI/Fonts/UiFont"; const char* clipComment = SETTINGS_PATH_PREFIX "/UI/ClipComment"; +const char* checkUpdates = SETTINGS_PATH_PREFIX "/UI/CheckUpdates"; + FWBSettings::FWBSettings() : QSettings(QSettings::UserScope, "netcitadel.com", "Firewall Builder") { @@ -207,6 +209,10 @@ void FWBSettings::init() ok = contains(clipComment); if (!ok) setClipComment(true); + ok = contains(checkUpdates); + if (!ok) setCheckUpdates(true); + + #ifndef _WIN32 if (getSSHPath().isEmpty()) setSSHPath("ssh"); #endif @@ -657,3 +663,15 @@ void FWBSettings::setClipComment(bool clip) { setValue(clipComment, clip); } + +bool FWBSettings::getCheckUpdates() +{ + return value(checkUpdates).toBool(); +} + +void FWBSettings::setCheckUpdates(bool f) +{ + setValue(checkUpdates, f); +} + + diff --git a/src/gui/FWBSettings.h b/src/gui/FWBSettings.h index 739f833f1..b9d379a2e 100644 --- a/src/gui/FWBSettings.h +++ b/src/gui/FWBSettings.h @@ -157,6 +157,10 @@ class FWBSettings : public QSettings { bool getClipComment(); void setClipComment(bool); + + bool getCheckUpdates(); + void setCheckUpdates(bool); + private: QFont getFontByType(const char*type); }; diff --git a/src/gui/FWWindow.cpp b/src/gui/FWWindow.cpp index ab18ae524..023d1e2a6 100644 --- a/src/gui/FWWindow.cpp +++ b/src/gui/FWWindow.cpp @@ -26,10 +26,12 @@ #include "../../config.h" #include "global.h" +#include "check_update_url.h" #include "utils.h" #include "utils_no_qt.h" #include "FWWindow.h" +#include "ProjectPanel.h" #include "ObjectTreeView.h" #include "ObjectManipulator.h" #include "FWObjectClipboard.h" @@ -55,6 +57,7 @@ #include "instConf.h" #include "instDialog.h" +#include "HttpGet.h" #include "fwbuilder/FWReference.h" #include "fwbuilder/Policy.h" @@ -139,7 +142,7 @@ #include #include #include -#include "ProjectPanel.h" +#include using namespace libfwbuilder; @@ -173,7 +176,13 @@ FWWindow::FWWindow() : QMainWindow(), // QMainWindow(NULL, Qt::Desktop), printer = new QPrinter(QPrinter::HighResolution); - connect(instDialogOnScreenTimer, SIGNAL(timeout()), this, SLOT(killInstDialog())); + curent_version_http_getter = new HttpGet(); + connect(curent_version_http_getter, SIGNAL(done(const QString&)), + this, SLOT(checkForUpgrade(const QString&))); + + connect(instDialogOnScreenTimer, SIGNAL(timeout()), + this, SLOT(killInstDialog())); + instDialogOnScreenTimer->start(1000); @@ -188,7 +197,8 @@ FWWindow::FWWindow() : QMainWindow(), // QMainWindow(NULL, Qt::Desktop), connect( m_mainWindow->ObjectMenu, SIGNAL (aboutToShow() ), this, SLOT( prepareObjectMenu() )); - connect( m_space, SIGNAL(subWindowActivated (QMdiSubWindow *)),this, SLOT(changeActiveSubwindow())); + connect( m_space, SIGNAL(subWindowActivated (QMdiSubWindow *)), + this, SLOT(changeActiveSubwindow())); if (fwbdebug) qDebug("/FWWindow constructor"); @@ -262,6 +272,13 @@ void FWWindow::updateWindowTitle () void FWWindow::startupLoad() { + if (st->getCheckUpdates()) + { + // start http query to get latest version from the web site + curent_version_http_getter->get(QUrl(CHECK_UPDATE_URL)); + } + + if (activeProject()) { activeProject()->startupLoad(); @@ -1576,3 +1593,25 @@ void FWWindow::updateTreeFont () } } } + +void FWWindow::checkForUpgrade(const QString& server_response) +{ + if (curent_version_http_getter->getStatus()) + { + if (!server_response.trimmed().isEmpty()) + { + QMessageBox::warning( + this,"Firewall Builder", + tr("A new version of Firewall Builder is available at" + " http://www.fwbuilder.org")); + } + } else + { + if (fwbdebug) + qDebug("Update check error: %s", + curent_version_http_getter->getLastError(). + toLatin1().constData()); + } +} + + diff --git a/src/gui/FWWindow.h b/src/gui/FWWindow.h index 8e64e4077..b8d40d39a 100644 --- a/src/gui/FWWindow.h +++ b/src/gui/FWWindow.h @@ -30,6 +30,7 @@ #include #include "RCS.h" #include "ObjectEditor.h" +#include "HttpGet.h" #include #include @@ -65,20 +66,22 @@ class FWWindow : public QMainWindow { Q_OBJECT - QMdiArea *m_space; - QWidget *instd; + QMdiArea *m_space; + QWidget *instd; + HttpGet *curent_version_http_getter; - QTimer *autosaveTimer; - QTimer *instDialogOnScreenTimer; - QString noFirewalls; - QPrinter *printer; - libfwbuilder::FWObject *searchObject; - libfwbuilder::FWObject *replaceObject; + QTimer *autosaveTimer; + QTimer *instDialogOnScreenTimer; + QString noFirewalls; + QPrinter *printer; + libfwbuilder::FWObject *searchObject; + libfwbuilder::FWObject *replaceObject; //int lastFirewallIdx; void clearFirewallTabs(); ProjectPanel *newProjectPanel(); void showSub(ProjectPanel *projectW); + public: ProjectPanel* activeProject(); void recreateWindowsMenu (); @@ -86,83 +89,86 @@ public: QVector windowsTitles; QVector windowsPainters; void updateTreeFont (); + public slots: void selectActiveSubWindow (/*const QString & text*/); void minimize (); void maximize (); void changeActiveSubwindow ( ); - virtual void search(); + virtual void search(); - virtual void reopenFirewall(); - virtual void redrawRuleSets(); - virtual void changeInfoStyle(); - virtual void restoreRuleSetTab(); + virtual void reopenFirewall(); + virtual void redrawRuleSets(); + virtual void changeInfoStyle(); + virtual void restoreRuleSetTab(); - virtual void editFind(); - virtual void editRedo(); - virtual void editUndo(); - virtual void helpContents(); - virtual void helpContentsAction(); - virtual void helpIndex(); + virtual void editFind(); + virtual void editRedo(); + virtual void editUndo(); + virtual void helpContents(); + virtual void helpContentsAction(); + virtual void helpIndex(); - virtual void fileNew(); - virtual void fileOpen(); - virtual void fileClose(); - virtual void fileSave(); - virtual void fileSaveAs(); - virtual void fileDiscard(); - virtual void fileCommit(); - virtual void fileImport(); - virtual void fileExport(); - virtual void filePrint(); - virtual void fileExit(); - virtual void fileProp(); - virtual void fileAddToRCS(); - virtual void fileCompare(); - virtual void editCopy(); - virtual void editCut(); - virtual void editDelete(); - virtual void editPaste(); - virtual void editPrefs(); - virtual void importPolicy(); + virtual void fileNew(); + virtual void fileOpen(); + virtual void fileClose(); + virtual void fileSave(); + virtual void fileSaveAs(); + virtual void fileDiscard(); + virtual void fileCommit(); + virtual void fileImport(); + virtual void fileExport(); + virtual void filePrint(); + virtual void fileExit(); + virtual void fileProp(); + virtual void fileAddToRCS(); + virtual void fileCompare(); + virtual void editCopy(); + virtual void editCut(); + virtual void editDelete(); + virtual void editPaste(); + virtual void editPrefs(); + virtual void importPolicy(); - virtual void startupLoad(); + virtual void startupLoad(); - virtual void helpAbout(); - virtual void debug(); + virtual void helpAbout(); + virtual void debug(); - virtual void compile(std::set vf); - virtual void compile(); - virtual void install(std::set vf); - virtual void install(); + virtual void compile(std::set vf); + virtual void compile(); + virtual void install(std::set vf); + virtual void install(); - virtual void insertRule(); - virtual void addRuleAfterCurrent(); - virtual void moveRule(); - virtual void moveRuleUp(); - virtual void moveRuleDown(); - virtual void removeRule(); + virtual void insertRule(); + virtual void addRuleAfterCurrent(); + virtual void moveRule(); + virtual void moveRuleUp(); + virtual void moveRuleDown(); + virtual void removeRule(); - virtual void copyRule(); - virtual void cutRule(); - virtual void pasteRuleAbove(); - virtual void pasteRuleBelow(); + virtual void copyRule(); + virtual void cutRule(); + virtual void pasteRuleAbove(); + virtual void pasteRuleBelow(); - virtual void back(); - virtual void newObject(); - virtual void lockObject(); - virtual void unlockObject(); - virtual void prepareObjectMenu(); - virtual void toolsDiscoveryDruid(); - virtual void closeAuxiliaryPanel(); - virtual void closeEditorPanel(); - virtual void openEditorPanel(); + virtual void back(); + virtual void newObject(); + virtual void lockObject(); + virtual void unlockObject(); + virtual void prepareObjectMenu(); + virtual void toolsDiscoveryDruid(); + virtual void closeAuxiliaryPanel(); + virtual void closeEditorPanel(); + virtual void openEditorPanel(); - virtual void killInstDialog(); + virtual void killInstDialog(); + virtual void checkForUpgrade(const QString&); + public: - Ui::FWBMainWindow_q *m_mainWindow; + Ui::FWBMainWindow_q *m_mainWindow; FWWindow(); ~FWWindow(); diff --git a/src/gui/Help.cpp b/src/gui/Help.cpp index d96ba55f4..d127b310d 100644 --- a/src/gui/Help.cpp +++ b/src/gui/Help.cpp @@ -40,6 +40,8 @@ using namespace std; Help::Help(QWidget *parent, const QString &help_file, const QString &title) : SimpleTextView(parent) { + setAttribute(Qt::WA_DeleteOnClose); + setModal(false); setName(title); resize(500, 600); diff --git a/src/gui/HttpGet.cpp b/src/gui/HttpGet.cpp new file mode 100644 index 000000000..c29b20987 --- /dev/null +++ b/src/gui/HttpGet.cpp @@ -0,0 +1,105 @@ +/* + + Firewall Builder + + Copyright (C) 2008 NetCitadel, LLC + + Author: Vadim Kurland + + $Id$ + + This program is free software which we release under the GNU General Public + License. You may redistribute and/or modify this program under the terms + of that license as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + To get a copy of the GNU General Public License, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#include "../../config.h" +#include "global.h" + +#include +#include +#include + +#include "HttpGet.h" + + +using namespace std; + +HttpGet::HttpGet(QObject *parent) : QObject(parent), strm(&contents) +{ + last_error = ""; + status = true; + connect(&http, SIGNAL(requestFinished(int, bool)), + this, SLOT(httpDone(int, bool))); +} + +bool HttpGet::get(const QUrl &url) +{ + QTextStream err(&last_error, QIODevice::WriteOnly); + + if (strm.isOpen()) + { + contents.clear(); + strm.reset(); + } + + if (!url.isValid()) + { + err << "Error: Invalid URL"; + status = false; + return false; + } + + if (url.scheme() != "http") + { + err << "Error: URL must start with 'http:'"; + status = false; + return false; + } + + if (url.path().isEmpty()) + { + err << "Error: URL has no path"; + status = false; + return false; + } + + http.setHost(url.host(), url.port(80)); + request_id = http.get(url.toString(), &strm); + return true; +} + +void HttpGet::httpDone(int id, bool error) +{ + if (request_id == id) + { + QHttpResponseHeader resp = http.lastResponse(); + QTextStream err(&last_error, QIODevice::WriteOnly); + if (error) + { + err << "Error: " << qPrintable(http.errorString()); + status = false; + } + if (resp.isValid() && resp.statusCode()!=200) + { + err << "Error: " << resp.reasonPhrase(); + status = false; + } + emit done(toString()); + } +} + +void HttpGet::abort() +{ + http.abort(); +} diff --git a/src/gui/HttpGet.h b/src/gui/HttpGet.h new file mode 100644 index 000000000..d8594f6ee --- /dev/null +++ b/src/gui/HttpGet.h @@ -0,0 +1,65 @@ +/* + + Firewall Builder + + Copyright (C) 2008 NetCitadel, LLC + + Author: Vadim Kurland + + $Id$ + + This program is free software which we release under the GNU General Public + License. You may redistribute and/or modify this program under the terms + of that license as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + To get a copy of the GNU General Public License, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + +#ifndef HTTPGET_H +#define HTTPGET_H + +#include +#include +#include +#include + +class QUrl; + +class HttpGet : public QObject +{ + Q_OBJECT + +private: + QHttp http; + QBuffer strm; + bool status; + QString last_error; + QByteArray contents; + int request_id; + +public: + HttpGet(QObject *parent = 0); + + bool get(const QUrl &url); + QString getLastError() { return last_error; } + bool getStatus() { return status; } + QString toString() { return QString(contents); } + void abort(); + +signals: + void done(const QString &res); + +private slots: + void httpDone(int id, bool error); + +}; + +#endif diff --git a/src/gui/PrefsDialog.cpp b/src/gui/PrefsDialog.cpp index c9393b78b..277e851be 100644 --- a/src/gui/PrefsDialog.cpp +++ b/src/gui/PrefsDialog.cpp @@ -27,11 +27,13 @@ #include "../../config.h" #include "global.h" #include "utils.h" +#include "check_update_url.h" #include "PrefsDialog.h" #include "FWBSettings.h" #include "listOfLibraries.h" #include "FWWindow.h" +#include "HttpGet.h" #include #include @@ -49,6 +51,8 @@ #include #include #include +#include + /* #include @@ -80,6 +84,9 @@ void PrefsDialog::setButtonColor(QPushButton *btn,const QString &colorCode) PrefsDialog::~PrefsDialog() { + disconnect(&curent_version_http_getter, SIGNAL(done(const QString&)), + this, SLOT(checkForUpgrade(const QString&))); + delete m_dialog; } @@ -191,6 +198,9 @@ PrefsDialog::PrefsDialog(QWidget *parent) : QDialog(parent) m_dialog->treeFontDescr->setText(getFontDescription(treeFont)); m_dialog->chClipComment->setChecked(st->getClipComment() ); + + m_dialog->checkUpdates->setChecked(st->getCheckUpdates() ); + } QString PrefsDialog::getFontDescription(const QFont &font) @@ -453,6 +463,7 @@ void PrefsDialog::accept() st->setUiFont(uiFont); st->setClipComment(m_dialog->chClipComment->isChecked()); + st->setCheckUpdates(m_dialog->checkUpdates->isChecked()); st->setSSHPath( m_dialog->sshPath->text() ); @@ -467,3 +478,41 @@ void PrefsDialog::accept() mw->updateTreeFont(); QDialog::accept(); } + +void PrefsDialog::checkSwUpdates() +{ + connect(&curent_version_http_getter, SIGNAL(done(const QString&)), + this, SLOT(checkForUpgrade(const QString&))); + curent_version_http_getter.get(QUrl(CHECK_UPDATE_URL)); +} + +void PrefsDialog::checkForUpgrade(const QString& server_response) +{ + disconnect(&curent_version_http_getter, SIGNAL(done(const QString&)), + this, SLOT(checkForUpgrade(const QString&))); + + if (curent_version_http_getter.getStatus()) + { + + if (server_response.trimmed().isEmpty()) + { + QMessageBox::information( + this,"Firewall Builder", + tr("Your version of Firewall Builder is up to date.")); + } else + { + QMessageBox::warning( + this,"Firewall Builder", + tr("A new version of Firewall Builder is available at" + " http://www.fwbuilder.org")); + } + } else + { + QMessageBox::critical( + this,"Firewall Builder", + tr("Error checking for software updates:\n%1"). + arg(curent_version_http_getter.getLastError())); + } +} + + diff --git a/src/gui/PrefsDialog.h b/src/gui/PrefsDialog.h index 35c4e6fc7..8e12bbce1 100644 --- a/src/gui/PrefsDialog.h +++ b/src/gui/PrefsDialog.h @@ -32,6 +32,7 @@ #include "FWBSettings.h" #include "listOfLibraries.h" +#include "HttpGet.h" #include #include @@ -53,6 +54,8 @@ class PrefsDialog : public QDialog std::map colors; Ui::prefsDialog_q *m_dialog; + HttpGet curent_version_http_getter; + QFont rulesFont; QFont treeFont; QFont uiFont; @@ -83,6 +86,8 @@ public slots: virtual void changeShowIcons(); virtual void changeRulesFont(); virtual void changeTreeFont(); + virtual void checkSwUpdates(); + virtual void checkForUpgrade(const QString&); }; #endif // __PREFSDIALOG_H diff --git a/src/gui/check_update_url.h b/src/gui/check_update_url.h new file mode 100644 index 000000000..dfe147b20 --- /dev/null +++ b/src/gui/check_update_url.h @@ -0,0 +1,36 @@ +/* + + Firewall Builder + + Copyright (C) 2008 NetCitadel, LLC + + Author: Vadim Kurland vadim@fwbuilder.org + + $Id$ + + This program is free software which we release under the GNU General Public + License. You may redistribute and/or modify this program under the terms + of that license as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + To get a copy of the GNU General Public License, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +*/ + + +#ifndef CHECK_UPDATE_URL_HH +#define CHECK_UPDATE_URL_HH + +#include "../../VERSION.h" + +#define CHECK_UPDATE_URL "http://www.fwbuilder.org/update_checks/check.cgi?v="VERSION + +#endif + + diff --git a/src/gui/global.h b/src/gui/global.h index 0a06fd9d5..ee4becead 100644 --- a/src/gui/global.h +++ b/src/gui/global.h @@ -26,6 +26,7 @@ #ifndef __GLOBAL_DEFS_ #define __GLOBAL_DEFS_ +#include "../../VERSION.h" #include class QApplication; @@ -59,7 +60,6 @@ extern bool gui_experiment1; //#define TEMPLATE_LIB "syslib100" //#define DELETED_LIB "sysid99" - #ifdef NDEBUG # undef NDEBUG # include diff --git a/src/gui/gui.pro b/src/gui/gui.pro index 0561442f6..e5acac612 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -130,7 +130,9 @@ HEADERS += ../../config.h \ FWBAboutDialog.h \ RuleGroupPanel.h \ RuleRowInfo.h \ - Help.h + Help.h \ + HttpGet.h \ + check_update_url.h SOURCES += ProjectPanel.cpp \ ProjectPanel_file_ops.cpp \ @@ -240,7 +242,8 @@ SOURCES += ProjectPanel.cpp \ AskLibForCopyDialog.cpp \ ObjectListViewItem.cpp \ RuleGroupPanel.cpp \ - Help.cpp + Help.cpp \ + HttpGet.cpp FORMS = FWBMainWindow_q.ui \ customservicedialog_q.ui \ diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 44ff4dd3f..6b9b6edb6 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -706,6 +706,9 @@ int main( int argc, char *argv[] ) app->connect(app, SIGNAL( lastWindowClosed() ), app, SLOT( quit())); + + if (fwbdebug) qDebug("Checking for new version ..."); + // setup single shot timer to call loadEverything() QTimer::singleShot( 0, mw, SLOT(startupLoad()) ); diff --git a/src/gui/prefsdialog_q.ui b/src/gui/prefsdialog_q.ui index bf460a8c4..8743af327 100644 --- a/src/gui/prefsdialog_q.ui +++ b/src/gui/prefsdialog_q.ui @@ -8,8 +8,8 @@ 0 0 - 588 - 358 + 620 + 368 @@ -19,92 +19,10 @@ true - - 4 - - - 4 - - - 4 - - - 4 - - - 6 - - - 6 - - - - - 6 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 20 - 20 - - - - - - - - &OK - - - - - - true - - - true - - - - - - - &Cancel - - - - - - true - - - - - - 6 + 0 @@ -137,7 +55,7 @@ - + @@ -156,7 +74,7 @@ - + Qt::Horizontal @@ -172,23 +90,7 @@ - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 16 - - - - - + Qt::Horizontal @@ -204,14 +106,14 @@ - + Automatically save data in dialogs when switching between objects - + Qt::Horizontal @@ -227,14 +129,14 @@ - + Periodically save data to file every - + 1 @@ -244,7 +146,7 @@ - + minutes @@ -254,14 +156,14 @@ - + Enable object tooltips - + Tooltip delay: @@ -271,14 +173,14 @@ - + 1 - + Qt::Horizontal @@ -294,21 +196,61 @@ - + Show deleted objects - + Clip comments in rules - + + + + + 75 + true + + + + Software Updates: + + + + + + + Check for updates automatically + + + + + + + Check Now + + + + + + + Qt::Horizontal + + + + 91 + 20 + + + + + Qt::Vertical @@ -318,7 +260,7 @@ - 20 + 86 20 @@ -882,6 +824,70 @@ + + + + 6 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &OK + + + + + + true + + + true + + + + + + + &Cancel + + + + + + true + + + + + @@ -1224,5 +1230,21 @@ + + checkUpdatesNow + clicked() + prefsDialog_q + checkSwUpdates() + + + 412 + 263 + + + 309 + 183 + + +