diff --git a/include/global/dsysinfo.h b/include/global/dsysinfo.h index fe5b35b..482084a 100644 --- a/include/global/dsysinfo.h +++ b/include/global/dsysinfo.h @@ -79,6 +79,7 @@ class LIBDTKCORESHARED_EXPORT DSysInfo UosMilitaryS, // for Server UosDeviceEdition, UosEducation, + UosDefense, UosEditionCount // must at last }; diff --git a/src/dsysinfo.cpp b/src/dsysinfo.cpp index 326015a..4ff6e0a 100644 --- a/src/dsysinfo.cpp +++ b/src/dsysinfo.cpp @@ -93,7 +93,14 @@ class Q_DECL_HIDDEN DSysInfoPrivate struct OSBuild { OSBuild():A(0), B(0), C(0), D(0), xyz(100){ } - uint A, B, C, D, E, xyz; // ABCDE.xyz + + /* ABCDE.xyz模式 + 系统构建号 A B C D E x yz + 值含义 操作系统产品的大版本代号 产品线类型 功能小版本 产品线版本 处理器架构 固定值 补丁小版本 + 值位数 1 1 1 1 1 1 2 + 值范围 ------------------------- 0~9、A~Z --------------------------- 1 00~99,AA~ZZ + */ + uint A, B, C, D, E, xyz; }; MinVersion minVersion; @@ -139,9 +146,12 @@ bool DSysInfoPrivate::splitA_BC_DMode() minVersion.D = minv % 10; } else if (minorVersion.length() > 0) { const QString D = minorVersion.right(1); - if (D.contains(QRegularExpression("[0-9A-Z]"))) { - // 0-9...A-Z - minVersion.D = 10 + static_cast(D.data()->toLatin1() - 'A'); + const QChar ch = D.at(0); + if (ch.isDigit()) { + minVersion.D = static_cast(ch.unicode() - '0'); + } else if (ch >= 'A' && ch <= 'Z') { + // 0-9...A-Z -> 10..35 + minVersion.D = 10 + static_cast(ch.unicode() - 'A'); } else { qWarning() << "invalid minorVersion"; minVersion.D = 0; @@ -266,19 +276,24 @@ bool DSysInfoPrivate::ensureOsVersion() D_ASSET_EXIT(left.size() == 5, "OsBuild version(ls) invalid!"); int idx = 0; - osBuild.A = left.value(idx++, "0").toUInt(&ok); + auto parseDigitOrAZ = [&](const QString &s, bool *outOk) -> uint { + if (s.isEmpty()) { if (outOk) *outOk = false; return 0u; } + const QChar ch = s.at(0); + if (ch.isDigit()) { if (outOk) *outOk = true; return static_cast(ch.unicode() - '0'); } + if (ch >= 'A' && ch <= 'Z') { if (outOk) *outOk = true; return static_cast(ch.toLatin1()); } + if (outOk) *outOk = false; + return 0u; + }; + + osBuild.A = parseDigitOrAZ(left.value(idx++, "0"), &ok); D_ASSET_EXIT(ok, "OsBuild version(A) invalid!"); - osBuild.B = left.value(idx++, "0").toUInt(&ok); + osBuild.B = parseDigitOrAZ(left.value(idx++, "0"), &ok); D_ASSET_EXIT(ok, "OsBuild version(B) invalid!"); - osBuild.C = left.value(idx++, "0").toUInt(&ok); - if (!ok) { - auto c = left.value(idx-1, "0").toLatin1(); - D_ASSET_EXIT(c.size()>0, "OsBuild version(C) invalid!"); - osBuild.C = uint(c.at(0)); - } - osBuild.D = left.value(idx++, "0").toUInt(&ok); + osBuild.C = parseDigitOrAZ(left.value(idx++, "0"), &ok); + D_ASSET_EXIT(ok, "OsBuild version(C) invalid!"); + osBuild.D = parseDigitOrAZ(left.value(idx++, "0"), &ok); D_ASSET_EXIT(ok, "OsBuild version(D) invalid!"); - osBuild.E = left.value(idx++, "0").toUInt(&ok); + osBuild.E = parseDigitOrAZ(left.value(idx++, "0"), &ok); D_ASSET_EXIT(ok, "OsBuild version(E) invalid!"); // xyz @@ -682,10 +697,13 @@ DSysInfo::UosEdition DSysInfo::uosEditionType() case 3: return UosEuler; case 4: - case 9: return UosMilitaryS; case 5: return UosDeviceEdition; + case 9: + return UosEducation; // 服务器 教育版(UT-3-PP-PR-001_操作系统标识与产品版本号规范_20250905) + case 'A': + return UosDefense; // 服务器 国防版 default: break; }