From: Joshua Peisach Date: Mon, 10 Aug 2020 12:34:54 +0000 (-0400) Subject: New upstream version 5.2.2.3 X-Git-Tag: archive/raspbian/5.7.12-2+rpi1^2~71 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ead98c512d116b45517b69e4a17da6a4696767fe;p=dtkcore.git New upstream version 5.2.2.3 --- diff --git a/src/dsysinfo.cpp b/src/dsysinfo.cpp index 030ddb9..a364f4c 100644 --- a/src/dsysinfo.cpp +++ b/src/dsysinfo.cpp @@ -47,6 +47,7 @@ public: #ifdef Q_OS_LINUX void ensureDeepinInfo(); + bool ensureOsVersion(); #endif void ensureReleaseInfo(); void ensureComputerInfo(); @@ -58,6 +59,22 @@ public: QString deepinVersion; QString deepinEdition; QString deepinCopyright; + + QString majorVersion; + QString minorVersion; + struct MinVersion { + MinVersion():A(0), BC(0), D(0){ + } + uint A, BC, D; // A-BC-D + }; + struct OSBuild { + OSBuild():A(0), B(0), C(0), D(0), xyz(100){ + } + uint A, B, C, D, E, xyz; // ABCDE.xyz + }; + + MinVersion minVersion; + OSBuild osBuild; #endif QScopedPointer distributionInfo; @@ -82,7 +99,7 @@ DSysInfoPrivate::DSysInfoPrivate() #ifdef Q_OS_LINUX void DSysInfoPrivate::ensureDeepinInfo() { - if (deepinType >= 0) + if (static_cast(deepinType) >= 0) return; QFile file("/etc/deepin-version"); @@ -158,6 +175,54 @@ void DSysInfoPrivate::ensureDeepinInfo() QSettings distributionInfo(distributionInfoFile, QSettings::IniFormat); // TODO: treat as `.desktop` format instead of `.ini` } +bool DSysInfoPrivate::ensureOsVersion() +{ + if (minVersion.A > 0) + return true; + + DDesktopEntry entry("/etc/os-version"); + majorVersion = entry.stringValue("MajorVersion", "Version"); + minorVersion = entry.stringValue("MinorVersion", "Version"); + Q_ASSERT(minorVersion.length() == 4); + + // A-BC-D + bool ok = false; + uint minv = minorVersion.toUInt(&ok); + if (ok) { + minVersion.D = minv % 10; + } else if (minorVersion.length() > 0) { + // 0-9...A-Z + minVersion.D = 10 + static_cast(minorVersion.right(1).data()->toLatin1() - 'A'); + } + uint minVer = minorVersion.left(3).toUInt(); + minVersion.BC = minVer % 100; + minVer /= 100; + minVersion.A = minVer % 10; + + // ABCDE.xyz + QString osb = entry.stringValue("OsBuild", "Version"); + QStringList osbs = osb.split("."); + Q_ASSERT(osbs.size() == 2 && osbs.value(0).size() == 5); + uint left = osbs.value(0).trimmed().toUInt(&ok); + Q_ASSERT(ok); + if (ok) { + osBuild.E = left % 10; + left /= 10; + osBuild.D = left % 10; + left /= 10; + osBuild.C = left % 10; // default C is 0 + left /= 10; + osBuild.B = left % 10; + left /= 10; + osBuild.A = left % 10; + } + + // xyz + osBuild.xyz = osbs.value(1).trimmed().toUInt(&ok); + + return ok; +} + static QString unquote(const QByteArray &value) { if (value.at(0) == '"' || value.at(0) == '\'') { @@ -290,7 +355,7 @@ void DSysInfoPrivate::ensureReleaseInfo() case 'U': if (productTypeString.compare("ubuntu", Qt::CaseInsensitive) == 0) { productType = DSysInfo::Ubuntu; - } else if (productTypeString.compare("uos", Qt::CaseInsensitive) == 0) { + } else if (productTypeString.compare("uos", Qt::CaseInsensitive) == 0 || productTypeString.compare("UnionTech OS", Qt::CaseInsensitive) == 0) { productType = DSysInfo::Uos; } break; @@ -474,6 +539,161 @@ QString DSysInfo::deepinCopyright() return siGlobal->deepinCopyright; } + +/*! + * \~chinese \brief DSysInfo::osType 系统类型 + * \~chinese \row 显示系统类型【1:桌面】【2:服务器】【3:专用设备】 + * \~chinese \note 根据 osBuild.B 判断 + */ +DSysInfo::UosType DSysInfo::uosType() +{ + siGlobal->ensureOsVersion(); + + UosType ost = UosTypeUnknown; + if ((siGlobal->osBuild.B > UosTypeUnknown && siGlobal->osBuild.B < UosTypeCount)) { + ost = static_cast(siGlobal->osBuild.B); + } + + return ost; +} + +/*! + * \~chinese \brief DSysInfo::osEditionType 版本类型 + * \~chinese \row 显示版本类型 专业版/个人版/社区版... + * \~chinese \note 根据 osBuild.B && osBuild.D + */ +DSysInfo::UosEdition DSysInfo::uosEditionType() +{ + siGlobal->ensureOsVersion(); + UosEdition ospt = UosEditionUnknown; + + if (siGlobal->osBuild.B == UosDesktop) { + ospt = static_cast(siGlobal->osBuild.D); + } else if (siGlobal->osBuild.B == UosServer) { + ospt = static_cast(siGlobal->osBuild.D + UosMilitary); + } else if (siGlobal->osBuild.B == UosDevice){ + ospt = UosProfessional; + } + + return ospt; +} + +/*! + * \~chinese \brief DSysInfo::osArch 架构信息(使用一个字节的二进制位,从低位到高位) + * \~chinese \row 【0x8 sw64】【0x4 mips64】【0x2 arm64】【0x1 amd64】 + */ +DSysInfo::UosArch DSysInfo::uosArch() +{ + siGlobal->ensureOsVersion(); + + return static_cast(siGlobal->osBuild.E); +} + +static QString getUosVersionValue(const QString &key, const QLocale &locale) +{ + DDesktopEntry entry("/etc/os-version"); + QString localKey = QString("%1[%2]").arg(key, locale.name()); + + return entry.stringValue(localKey, "Version", entry.stringValue(key, "Version")); +} + +/*! + * \~chinese \brief DSysInfo::osProductTypeName 版本名称 + * \~chinese \row ProductType[xx] 项对应的值, 如果找不到对应语言的默认使用 ProductType的值(Desktop/Server/Device) + * \~chinese \param locale 当前系统语言 + */ +QString DSysInfo::uosProductTypeName(const QLocale &locale) +{ + return getUosVersionValue("ProductType", locale); +} + +/*! + * \~chinese \brief DSysInfo::osSystemName 版本名称 + * \~chinese \row SystemName[xx] 项对应的值, 如果找不到对应语言的默认使用 SystemName 的值 Uniontech OS + * \~chinese \param locale 当前系统语言 + */ +QString DSysInfo::uosSystemName(const QLocale &locale) +{ + return getUosVersionValue("SystemName", locale); +} + +/*! + * \~chinese \brief DSysInfo::osEditionName 版本名称 + * \~chinese \row EditionName[xx] 项对应的值, 如果找不到对应语言的默认使用 EditionName 的值(Professional/Home/Community...) + * \~chinese \param locale 当前系统语言 + */ +QString DSysInfo::uosEditionName(const QLocale &locale) +{ + return getUosVersionValue("EditionName", locale); +} + +/*! + * \~chinese \brief DSysInfo::spVersion 阶段版本名称 + * \~chinese \row 小版本号 A-BC-D 中 BC, 返回 SP1-SPxx, 如果正式版返回空 + * \~chinese \note minVersion.BC == 00:正式版本 minVersion.BC == 01-99:SP1….SP99 + */ +QString DSysInfo::spVersion() +{ + siGlobal->ensureOsVersion(); + if (siGlobal->minVersion.BC > 0) { + return QString("SP%1").arg(siGlobal->minVersion.BC); + } else { + return QString(); // 00 正式版 + } +} + +/*! + * \~chinese \brief DSysInfo::udpateVersion 更新版本名称 + * \~chinese \row 小版本号 A-BC-D 中 D, 返回 update1… update9, 如果正式版返回空 + * \~chinese \note minVersion.D == 0:正式版本 minVersion.D == 1-9:update1… update9,updateA...updateZ + */ +QString DSysInfo::udpateVersion() +{ + siGlobal->ensureOsVersion(); + if (siGlobal->minVersion.D > 0) { + uint uv = siGlobal->minVersion.D; + if (uv < 10) { + return QString("update%1").arg(uv); + } else { + return QString("update").append(QChar(uv - 10 + 'A')); + } + } else { + return QString(); // 0 正式版 + } +} + +/*! + * \~chinese \brief DSysInfo::majorVersion 主版本号 + * \~chinese \row 主版本号 【20】【23】【25】【26】【29】【30】 + * \~chinese \note 返回 MajorVersion 的值 + */ +QString DSysInfo::majorVersion() +{ + siGlobal->ensureOsVersion(); + return siGlobal->majorVersion; +} + +/*! + * \~chinese \brief DSysInfo::minorVersion 小版本号 + * \~chinese \row 【ABCD】 ·[0-9]{4} + * \~chinese \note 返回 MinorVersion 的值 + */ +QString DSysInfo::minorVersion() +{ + siGlobal->ensureOsVersion(); + return siGlobal->minorVersion; +} + +/*! + * \~chinese \brief DSysInfo::buildVersion 小版本号 + * \~chinese \row 系统镜像批次号,按时间顺序(不可回退)从100-999递增 + * \~chinese \note 返回 osBuild.xyz 的值 + */ +QString DSysInfo::buildVersion() +{ + siGlobal->ensureOsVersion(); + return QString::number(siGlobal->osBuild.xyz); +} #endif QString DSysInfo::deepinDistributionInfoPath() diff --git a/src/dsysinfo.h b/src/dsysinfo.h index 4fd17a1..9c41c49 100644 --- a/src/dsysinfo.h +++ b/src/dsysinfo.h @@ -67,6 +67,38 @@ public: Manufacturer //!< manufacturer of the current distribution or device }; + enum UosType { + UosTypeUnknown, + UosDesktop, + UosServer, + UosDevice, + + UosTypeCount // must at last + }; + + enum UosEdition { + UosEditionUnknown, + UosProfessional, + UosHome, + UosCommunity, + UosMilitary, + UosEnterprise, + UosEnterpriseC, + UosEuler, + UosMilitaryS, // for Server + + UosEditionCount // must at last + }; + + // 注意:此处架构是从OsBuild获取的系统版本的Arch信息,并不是指硬件的Arch信息 + enum UosArch { + UosArchUnknown, + UosAMD64 = 1 << 0, + UosARM64 = 1 << 1, + UosMIPS64 = 1 << 2, + UosSW64 = 1 << 3 + }; + #ifdef Q_OS_LINUX static bool isDeepin(); static bool isDDE(); @@ -75,6 +107,20 @@ public: static QString deepinVersion(); static QString deepinEdition(); static QString deepinCopyright(); + + // uos version interface + static UosType uosType(); + static UosEdition uosEditionType(); + static UosArch uosArch(); + static QString uosProductTypeName(const QLocale &locale = QLocale::system()); + static QString uosSystemName(const QLocale &locale = QLocale::system()); + static QString uosEditionName(const QLocale &locale = QLocale::system()); + + static QString spVersion(); // SP1...SP99 + static QString udpateVersion(); // update1...update9 + static QString majorVersion(); + static QString minorVersion(); + static QString buildVersion(); // xyz #endif Q_DECL_DEPRECATED_X("Use distributionInfoPath() instead") static QString deepinDistributionInfoPath(); diff --git a/src/dtk_translation.prf b/src/dtk_translation.prf index 76a75dc..352c022 100644 --- a/src/dtk_translation.prf +++ b/src/dtk_translation.prf @@ -1,6 +1,6 @@ message ("Process dtk translation") -message ("Add DTK_NO_TRANSLATION=YES to qmake arguments skip this") -message ("Add DTK_STATIC_TRANSLATION=YES to add support static translations") +message ("Add DTK_NO_TRANSLATION=YES to qmake arguments to skip this") +message ("Add DTK_STATIC_TRANSLATION=YES to add support for static translations") # TODO: check lrelease/lupdate exist diff --git a/tests/dutils/dutiltester.cpp b/tests/dutils/dutiltester.cpp index b50ca9a..a5326ab 100644 --- a/tests/dutils/dutiltester.cpp +++ b/tests/dutils/dutiltester.cpp @@ -33,6 +33,7 @@ #include "settings/dsettings.h" #include "settings/dsettingsgroup.h" #include "settings/dsettingsoption.h" +#include "dsysinfo.h" DCORE_USE_NAMESPACE @@ -225,3 +226,18 @@ void TestDUtil::testGroups() qDebug() << settings->group("shortcuts.ternimal"); qDebug() << settings->group("shortcuts.ternimal")->options(); } + +void TestDUtil::testSysInfo() +{ + qDebug() << DSysInfo::uosType() << + DSysInfo::uosEditionType() << + DSysInfo::uosArch() << + DSysInfo::uosProductTypeName() << + DSysInfo::uosSystemName() << + DSysInfo::uosEditionName() << + DSysInfo::spVersion() << + DSysInfo::udpateVersion() << + DSysInfo::majorVersion() << + DSysInfo::minorVersion() << + DSysInfo::buildVersion() ; +} diff --git a/tests/dutils/dutiltester.h b/tests/dutils/dutiltester.h index be9beac..f53ea34 100644 --- a/tests/dutils/dutiltester.h +++ b/tests/dutils/dutiltester.h @@ -35,6 +35,7 @@ private Q_SLOTS: void testDBusSender(); void testGroups(); + void testSysInfo(); }; diff --git a/tools/deepin-os-release/main.cpp b/tools/deepin-os-release/main.cpp index cdd5ec6..e98aa9d 100644 --- a/tools/deepin-os-release/main.cpp +++ b/tools/deepin-os-release/main.cpp @@ -92,15 +92,24 @@ int main(int argc, char *argv[]) printf("Product Type: %s\n", qPrintable(DSysInfo::productTypeString())); printf("Product Version: %s\n", qPrintable(DSysInfo::productVersion())); + printf("Uos Product Name: %s\n", qPrintable(DSysInfo::uosProductTypeName())); + printf("Uos SystemName Name: %s\n", qPrintable(DSysInfo::uosSystemName())); + printf("Uos Product Name: %s\n", qPrintable(DSysInfo::uosEditionName())); + printf("Uos SP Version: %s\n", qPrintable(DSysInfo::spVersion())); + printf("Uos update Version: %s\n", qPrintable(DSysInfo::udpateVersion())); + printf("Uos major Version: %s\n", qPrintable(DSysInfo::majorVersion())); + printf("Uos minor Version: %s\n", qPrintable(DSysInfo::minorVersion())); + printf("Uos build Version: %s\n", qPrintable(DSysInfo::buildVersion())); + if (distributionInfoValid()) { printDistributionOrgInfo(DSysInfo::Distribution); printDistributionOrgInfo(DSysInfo::Distributor); } } else { if (parser.isSet(option_deepin_type)) - printf("%s", qPrintable(DSysInfo::deepinTypeDisplayName(QLocale::c()))); + printf("%s", qPrintable(DSysInfo::uosEditionName(QLocale::c()))); else if (parser.isSet(option_deepin_version)) - printf("%s", qPrintable(DSysInfo::deepinVersion())); + printf("%s", qPrintable(DSysInfo::majorVersion())); else if (parser.isSet(option_deepin_edition)) printf("%s", qPrintable(DSysInfo::deepinEdition())); else if (parser.isSet(option_deepin_copyright)) diff --git a/tools/script/dtk-license.py b/tools/script/dtk-license.py index bc3a071..cf49e81 100644 --- a/tools/script/dtk-license.py +++ b/tools/script/dtk-license.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import fnmatch import os diff --git a/tools/script/dtk-translate.py b/tools/script/dtk-translate.py index 9cb06f8..97bb7e6 100644 --- a/tools/script/dtk-translate.py +++ b/tools/script/dtk-translate.py @@ -1,4 +1,4 @@ -#!env python +#!/usr/bin/env python3 import sys,os,fnmatch from subprocess import call