File indexing completed on 2024-06-16 04:15:42

0001 /* This file is part of the KDE project
0002 SPDX-FileCopyrightText: 1999 David Faure <faure@kde.org>
0003 SPDX-FileCopyrightText: 2014 Alex Richardson <arichardson.kde@gmail.com>
0004 
0005 SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 #ifndef SYSTEMINFORMATION_P_H
0008 #define SYSTEMINFORMATION_P_H
0009 
0010 #include <QString>
0011 
0012 namespace SystemInformation {
0013     QString userName();
0014     QString operatingSystemVersion();
0015 }
0016 
0017 #if !defined(Q_OS_WIN)
0018 #include <pwd.h>
0019 #include <unistd.h>
0020 #include <sys/utsname.h>
0021 inline QString SystemInformation::userName()
0022 {
0023     struct passwd *p = getpwuid(getuid());
0024     return QString::fromLatin1(p->pw_name);
0025 }
0026 
0027 inline QString SystemInformation::operatingSystemVersion()
0028 {
0029     struct utsname unameBuf;
0030     uname(&unameBuf);
0031     return QString::fromUtf8(unameBuf.sysname) +
0032         QStringLiteral(" (") + QString::fromUtf8(unameBuf.machine) + QLatin1String(") ") +
0033         QStringLiteral("release ") + QString::fromUtf8(unameBuf.release);
0034 }
0035 #else
0036 #include <QSysInfo>
0037 #include <qt_windows.h>
0038 #define SECURITY_WIN32
0039 #include <security.h>
0040 //#include <secext.h> // GetUserNameEx
0041 
0042 inline QString SystemInformation::userName()
0043 {
0044     WCHAR nameBuffer[256];
0045     DWORD bufsize = 256;
0046     if (!GetUserNameExW(NameDisplay, nameBuffer, &bufsize)) {
0047         return QStringLiteral("Unknown User"); //should never happen (translate?)
0048     }
0049     return QString::fromWCharArray(nameBuffer);
0050 }
0051 
0052 static inline QString windowsVersionString() {
0053     QString productVersion = QSysInfo::productVersion();
0054     if (productVersion == "unknown") return QStringLiteral("Unknown Windows");
0055     return "Windows " + productVersion;
0056 }
0057 
0058 inline QString SystemInformation::operatingSystemVersion()
0059 {
0060     SYSTEM_INFO info;
0061     GetNativeSystemInfo(&info);
0062     QString arch;
0063     switch (info.wProcessorArchitecture) {
0064     case PROCESSOR_ARCHITECTURE_AMD64:
0065     case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
0066         arch = QStringLiteral(" (x86_64)");
0067         break;
0068     case PROCESSOR_ARCHITECTURE_INTEL:
0069         arch = QStringLiteral(" (x86)");
0070         break;
0071     case PROCESSOR_ARCHITECTURE_ARM:
0072         arch = QStringLiteral(" (ARM)");
0073         break;
0074     case PROCESSOR_ARCHITECTURE_ARM64:
0075         arch = QStringLiteral(" (ARM64)");
0076         break;
0077     default:
0078         arch = QStringLiteral(" (unknown architecture)");
0079     }
0080     QString winVer;
0081     //TODO: handle Service packs?
0082     return windowsVersionString() + arch;
0083 }
0084 
0085 #endif
0086 
0087 #endif // SYSTEMINFORMATION_P_H