The attached patch is my attempt at OS name/version detection. I have not
yet tested
it on windows, nor added the Mac part. Just wanted some comments on the
same.

Thanks.
From 6f878477b12e418c93c40d38460ce26dae0ef57e Mon Sep 17 00:00:00 2001
From: "Joseph W. Joshua" <[email protected]>
Date: Thu, 10 Apr 2014 19:06:29 +0300
Subject: [PATCH 15/15] [RFC] OS Name and version detection.

This is some little code for the os detection. It currently just outputs
the os name and version.

Signed-off-by: Joseph W. Joshua <[email protected]>
---
 qt-ui/detectosversion.cpp | 143 ++++++++++++++++++++++++++++++++++++++++++++++
 qt-ui/detectosversion.h   |  30 ++++++++++
 qt-ui/updatemanager.cpp   |   5 +-
 subsurface.pro            |   7 ++-
 4 files changed, 181 insertions(+), 4 deletions(-)
 create mode 100644 qt-ui/detectosversion.cpp
 create mode 100644 qt-ui/detectosversion.h

diff --git a/qt-ui/detectosversion.cpp b/qt-ui/detectosversion.cpp
new file mode 100644
index 0000000..c205e44
--- /dev/null
+++ b/qt-ui/detectosversion.cpp
@@ -0,0 +1,143 @@
+#include "detectosversion.h"
+#include <QFile>
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdarg.h>
+#ifdef Q_OS_UNIX
+#include <sys/utsname.h>
+#endif
+#include "qplatformdefs.h"
+#include <QDebug>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdarg.h>
+#if !defined(Q_OS_WINCE)
+#include <errno.h>
+#if defined(Q_CC_MSVC)
+#include <crtdbg.h>
+#endif
+#endif
+
+DetectOsVersion::DetectOsVersion(QObject *parent) :
+	QObject(parent)
+{
+}
+
+OsDetails DetectOsVersion::getOsDetails()
+{
+	OsDetails os_details;
+
+#ifdef Q_OS_UNIX
+	//We are on unix
+	os_details.osType = "Linux";
+	struct utsname u;
+	if (uname((&u)) != -1) {
+		os_details.osName = u.sysname;
+	} else {
+		os_details.osName = "Detection failed";
+	}
+
+	int fd = QT_OPEN("/etc/os-release", O_RDONLY);
+	if (fd == 1)
+		return os_details;
+
+	QT_STATBUF sbuf;
+	if (QT_FSTAT(fd, &sbuf) == -1) {
+		QT_CLOSE(fd);
+		return os_details;
+	}
+
+	QByteArray buffer(sbuf.st_size, Qt::Uninitialized);
+	buffer.resize(QT_READ(fd, buffer.data(), sbuf.st_size));
+	QT_CLOSE(fd);
+
+	const char *ptr = buffer.constData();
+	const char *end = buffer.constEnd();
+	const char *eol;
+
+	for (; ptr != end; ptr = eol + 1) {
+		static const char idString[] = "NAME=";
+		static const char prettyNameString[] = "PRETTY_NAME=";
+		static const char versionIdString[] = "VERSION=";
+
+		eol = static_cast<const char *>(memchr(ptr, '\n', end - ptr));
+		if (!eol)
+			eol = end - 1;
+
+		int cmp = strncmp(ptr, idString, strlen(idString));
+		if (cmp < 0)
+			continue;
+		if (cmp == 0) {
+			ptr += strlen(idString);
+			QByteArray id = unquote(ptr, eol);
+			os_details.osName = id;
+		}
+
+		cmp = strncmp(ptr, prettyNameString, strlen(prettyNameString));
+		if (cmp < 0)
+			continue;
+		if (cmp == 0) {
+			ptr += strlen(prettyNameString);
+			os_details.otherDetails = unquote(ptr, eol);
+			continue;
+		}
+
+		cmp = strncmp(ptr, versionIdString, strlen(versionIdString));
+		if (cmp < 0)
+			continue;
+		if (cmp == 0) {
+			ptr += strlen(versionIdString);
+			QByteArray id = unquote(ptr, eol);
+			os_details.versionString = id;
+
+		}
+	}
+
+#endif
+
+#ifdef Q_OS_WIN
+	os_details.osType = "Windows";
+	os_details.versionString = "";
+	switch (int(QSysInfo::WindowsVersion)) {
+	case WV_NT:
+		os_details.versionString = "NT";
+	case WV_2000:
+		os_details.versionString = "2000";;
+	case WV_XP:
+		os_details.versionString = "XP";
+	case WV_2003:
+		os_details.versionString = "2003";
+	case WV_VISTA:
+		os_details.versionString = "Vista";
+	case WV_WINDOWS7:
+		os_details.versionString = "7";
+	case WV_WINDOWS8:
+		ros_details.versionString = "8";
+	case WV_WINDOWS8_1:
+		os_details.versionString = "8.1";
+	case WV_CE:
+		os_details.versionString = "CE";
+	case WV_CENET:
+		os_details.versionString = "CENET";
+	case WV_CE_5:
+		os_details.versionString = "CE5";
+	case WV_CE_6:
+		os_details.versionString = "CE6";
+	}
+	os_details.osName = "Windows " + os_details.versionString;
+#endif
+
+	return os_details;
+}
+
+QByteArray DetectOsVersion::unquote(const char *begin, const char *end)
+{
+	if (*begin == '"') {
+		Q_ASSERT(end[-1] == '"');
+		return QByteArray(begin + 1, end - begin - 2);
+	}
+
+	return QByteArray(begin, end - begin);
+}
diff --git a/qt-ui/detectosversion.h b/qt-ui/detectosversion.h
new file mode 100644
index 0000000..b1e56c1
--- /dev/null
+++ b/qt-ui/detectosversion.h
@@ -0,0 +1,30 @@
+#ifndef DETECTOSVERSION_H
+#define DETECTOSVERSION_H
+
+#include <QObject>
+
+
+struct OsDetails{
+	QString osType;
+	QString osName;
+	QString versionString;
+	QString architecture;
+	QString otherDetails;
+};
+
+class DetectOsVersion : public QObject
+{
+	Q_OBJECT
+public:
+	explicit DetectOsVersion(QObject *parent = 0);
+	static OsDetails getOsDetails();
+signals:
+
+public slots:
+
+private:
+	static QByteArray unquote(const char *begin, const char *end);
+
+};
+
+#endif // DETECTOSVERSION_H
diff --git a/qt-ui/updatemanager.cpp b/qt-ui/updatemanager.cpp
index bcf5808..2f4b709 100644
--- a/qt-ui/updatemanager.cpp
+++ b/qt-ui/updatemanager.cpp
@@ -3,7 +3,7 @@
 #include <QMessageBox>
 #include "subsurfacewebservices.h"
 #include "ssrf-version.h"
-
+#include "detectosversion.h"
 UpdateManager::UpdateManager(QObject *parent) :
 	QObject(parent)
 {
@@ -14,7 +14,8 @@ UpdateManager::UpdateManager(QObject *parent) :
 void UpdateManager::checkForUpdates()
 {
 	QString os;
-
+	OsDetails os_details =  DetectOsVersion::getOsDetails();
+	qDebug() << os_details.osName << os_details.versionString << os_details.otherDetails;
 #if defined(Q_OS_WIN)
 	os = "win";
 #elif defined(Q_OS_MAC)
diff --git a/subsurface.pro b/subsurface.pro
index 6d13c1d..ccc3482 100644
--- a/subsurface.pro
+++ b/subsurface.pro
@@ -77,7 +77,8 @@ HEADERS = \
 	qt-ui/profile/diveeventitem.h \
 	qt-ui/profile/divetooltipitem.h \
 	qt-ui/profile/ruleritem.h \
-	qt-ui/updatemanager.h
+	qt-ui/updatemanager.h \
+	qt-ui/detectosversion.h
 
 android: HEADERS -= \
 	qt-ui/usermanual.h \
@@ -150,7 +151,9 @@ SOURCES =  \
 	qt-ui/profile/diveeventitem.cpp \
 	qt-ui/profile/divetooltipitem.cpp \
 	qt-ui/profile/ruleritem.cpp \
-	qt-ui/updatemanager.cpp
+	qt-ui/updatemanager.cpp \
+	qt-ui/detectosversion.cpp
+
 
 android: SOURCES += android.cpp
 else: linux*: SOURCES += linux.c
-- 
1.8.3.2

_______________________________________________
subsurface mailing list
[email protected]
http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to