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
