On Wed, Apr 2, 2014 at 10:38 PM, Lubomir I. Ivanov <neolit...@gmail.com>wrote:

>
> >
>
> hello,
> parts of the patch uses spaces instead of tabs for indentation.
>
> lubomir
> --
>
Thanks for the correction, Lubomir. I forgot to reformat the source.

New patch attached.
From d9c248531c970af8afb32edd02f6624ea6965df5 Mon Sep 17 00:00:00 2001
From: "Joseph W. Joshua" <joejo...@gmail.com>
Date: Wed, 2 Apr 2014 22:39:36 +0300
Subject: [PATCH] Add "Check for updates" Feature

This patch adds a check for updates feature.

It connects to http://subsurface.hohndel.org/updatecheck.html to check for any
new versions. It then prompts the user with a download link if an update is
available.

Signed-off-by: Joseph W. Joshua <joejo...@gmail.com>
---
 qt-ui/mainwindow.cpp    |  8 ++++++
 qt-ui/mainwindow.h      |  3 +++
 qt-ui/mainwindow.ui     |  6 +++++
 qt-ui/updatemanager.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++++++++
 qt-ui/updatemanager.h   | 21 ++++++++++++++++
 subsurface.pro          |  6 +++--
 6 files changed, 109 insertions(+), 2 deletions(-)
 create mode 100644 qt-ui/updatemanager.cpp
 create mode 100644 qt-ui/updatemanager.h

diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp
index b632252..ead3283 100644
--- a/qt-ui/mainwindow.cpp
+++ b/qt-ui/mainwindow.cpp
@@ -37,6 +37,7 @@
 #include "diveplanner.h"
 #include "about.h"
 #include "worldmap-save.h"
+#include "updatemanager.h"
 #ifndef NO_PRINTING
 #include "printdialog.h"
 #endif
@@ -84,6 +85,8 @@ MainWindow::MainWindow() : QMainWindow(),
 	ui.divePlanner->settingsChanged();
 	ui.divePlannerWidget->settingsChanged();
 
+	updateManager = new UpdateManager(this);
+
 #ifndef ENABLE_PLANNER
 //	ui.menuLog->removeAction(ui.actionDivePlanner);
 #endif
@@ -575,6 +578,11 @@ void MainWindow::on_actionAboutSubsurface_triggered()
 	dlg.exec();
 }
 
+void MainWindow::on_action_Check_for_Updates_triggered()
+{
+	updateManager->checkForUpdates();
+}
+
 void MainWindow::on_actionUserManual_triggered()
 {
 #ifndef NO_USERMANUAL
diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h
index a0c5be3..f47ade8 100644
--- a/qt-ui/mainwindow.h
+++ b/qt-ui/mainwindow.h
@@ -28,6 +28,7 @@ class MainTab;
 class ProfileGraphicsView;
 class QWebView;
 class QSettings;
+class UpdateManager;
 
 enum MainWindowTitleFormat {
 	MWTF_DEFAULT,
@@ -121,6 +122,7 @@ slots:
 	void on_actionAboutSubsurface_triggered();
 	void on_actionUserManual_triggered();
 	void on_actionDivePlanner_triggered();
+	void on_action_Check_for_Updates_triggered();
 
 	void current_dive_changed(int divenr);
 	void initialUiSetup();
@@ -171,6 +173,7 @@ private:
 	QString lastUsedDir();
 	void updateLastUsedDir(const QString &s);
 	bool filesAsArguments;
+	UpdateManager *updateManager;
 };
 
 MainWindow *mainWindow();
diff --git a/qt-ui/mainwindow.ui b/qt-ui/mainwindow.ui
index 2bf2496..1eadec7 100644
--- a/qt-ui/mainwindow.ui
+++ b/qt-ui/mainwindow.ui
@@ -601,6 +601,7 @@
      <string>&amp;Help</string>
     </property>
     <addaction name="actionAboutSubsurface"/>
+    <addaction name="action_Check_for_Updates"/>
     <addaction name="actionUserManual"/>
    </widget>
    <widget class="QMenu" name="menuImport">
@@ -910,6 +911,11 @@
     <bool>false</bool>
    </property>
   </action>
+  <action name="action_Check_for_Updates">
+   <property name="text">
+    <string>&amp;Check for Updates</string>
+   </property>
+  </action>
  </widget>
  <customwidgets>
   <customwidget>
diff --git a/qt-ui/updatemanager.cpp b/qt-ui/updatemanager.cpp
new file mode 100644
index 0000000..e721f91
--- /dev/null
+++ b/qt-ui/updatemanager.cpp
@@ -0,0 +1,67 @@
+#include "updatemanager.h"
+#include <QtNetwork>
+#include <QMessageBox>
+#include "subsurfacewebservices.h"
+#include "ssrf-version.h"
+
+UpdateManager::UpdateManager(QObject *parent) :
+	QObject(parent)
+{
+	manager = SubsurfaceWebServices::manager();
+	connect (manager, SIGNAL(finished(QNetworkReply*)), SLOT(requestReceived(QNetworkReply*)));
+}
+
+void UpdateManager::checkForUpdates()
+{
+	QString os;
+
+#if defined(Q_OS_WIN)
+	os = "win";
+#elif defined(Q_OS_MAC)
+	os = "osx";
+#else
+	os = "unknown";
+#endif
+
+	QString version = VERSION_STRING;
+	QString url = QString("http://subsurface.hohndel.org/updatecheck.html?os=%1&ver=%2";).arg(os, version);
+	manager->get(QNetworkRequest(QUrl(url)));
+}
+
+void UpdateManager::requestReceived(QNetworkReply *reply)
+{
+	QMessageBox msgbox;
+	QString msgTitle = tr("Check for updates.");
+	QString msgText = tr("<h3>Subsurface was unable to check for updates.</h3>");
+
+
+	if (reply->error() != QNetworkReply::NoError) {
+		//Network Error
+		msgText = msgText + tr("<br/><b>The following error occurred:</b><br/>") + reply->errorString()
+				+ tr("<br/><br/><b>Please check your internet connection.</b>");
+	} else {
+		//No network error
+		QString response(reply->readAll());
+		QString responseBody = response.split("\"").at(1);
+
+		msgbox.setIcon(QMessageBox::Information);
+
+		if (responseBody == "OK") {
+			msgText = tr("You are using the latest version of subsurface.");
+		} else if (responseBody.startsWith("http")) {
+			msgText = tr("A new version of subsurface is available.<br/>Click on:<br/><a href=\"%1\">%1</a><br/> to download it.")
+					.arg(responseBody);
+		} else if (responseBody.startsWith("Latest version")) {
+			msgText = tr("<b>A new version of subsurface is available.</b><br/><br/>%1")
+					.arg(responseBody);
+		} else {
+			msgText = tr("There was an error while trying to check for updates.<br/><br/>%1").arg(responseBody);
+			msgbox.setIcon(QMessageBox::Warning);
+		}
+	}
+
+	msgbox.setWindowTitle(msgTitle);
+	msgbox.setText(msgText);
+	msgbox.setTextFormat(Qt::RichText);
+	msgbox.exec();
+}
diff --git a/qt-ui/updatemanager.h b/qt-ui/updatemanager.h
new file mode 100644
index 0000000..18b47cf
--- /dev/null
+++ b/qt-ui/updatemanager.h
@@ -0,0 +1,21 @@
+#ifndef UPDATEMANAGER_H
+#define UPDATEMANAGER_H
+
+#include <QObject>
+
+class QNetworkAccessManager;
+class QNetworkReply;
+
+class UpdateManager : public QObject
+{
+	Q_OBJECT
+public:
+	explicit UpdateManager(QObject *parent = 0);
+	void checkForUpdates();
+private:
+	QNetworkAccessManager *manager;
+public slots:
+	void requestReceived(QNetworkReply* reply);
+};
+
+#endif // UPDATEMANAGER_H
diff --git a/subsurface.pro b/subsurface.pro
index 3944da0..6d13c1d 100644
--- a/subsurface.pro
+++ b/subsurface.pro
@@ -76,7 +76,8 @@ HEADERS = \
 	qt-ui/profile/diveprofileitem.h \
 	qt-ui/profile/diveeventitem.h \
 	qt-ui/profile/divetooltipitem.h \
-	qt-ui/profile/ruleritem.h
+	qt-ui/profile/ruleritem.h \
+	qt-ui/updatemanager.h
 
 android: HEADERS -= \
 	qt-ui/usermanual.h \
@@ -148,7 +149,8 @@ SOURCES =  \
 	qt-ui/profile/diveprofileitem.cpp \
 	qt-ui/profile/diveeventitem.cpp \
 	qt-ui/profile/divetooltipitem.cpp \
-	qt-ui/profile/ruleritem.cpp
+	qt-ui/profile/ruleritem.cpp \
+	qt-ui/updatemanager.cpp
 
 android: SOURCES += android.cpp
 else: linux*: SOURCES += linux.c
-- 
1.9.1

_______________________________________________
subsurface mailing list
subsurface@hohndel.org
http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to