diff options
Diffstat (limited to 'Ryujinx.Common/SystemInfo')
| -rw-r--r-- | Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs | 17 | ||||
| -rw-r--r-- | Ryujinx.Common/SystemInfo/MacOSSysteminfo.cs | 97 | ||||
| -rw-r--r-- | Ryujinx.Common/SystemInfo/SystemInfo.cs | 46 | ||||
| -rw-r--r-- | Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs | 23 |
4 files changed, 183 insertions, 0 deletions
diff --git a/Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs b/Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs new file mode 100644 index 00000000..bd3ee57a --- /dev/null +++ b/Ryujinx.Common/SystemInfo/LinuxSystemInfo.cs @@ -0,0 +1,17 @@ +using System.IO; +using System.Linq; + +namespace Ryujinx.Common.SystemInfo +{ + internal class LinuxSysteminfo : SystemInfo + { + public override string CpuName { get; } + public override ulong RamSize { get; } + + public LinuxSysteminfo() + { + CpuName = File.ReadAllLines("/proc/cpuinfo").Where(line => line.StartsWith("model name")).ToList()[0].Split(":")[1].Trim(); + RamSize = ulong.Parse(File.ReadAllLines("/proc/meminfo")[0].Split(":")[1].Trim().Split(" ")[0]) * 1024; + } + } +}
\ No newline at end of file diff --git a/Ryujinx.Common/SystemInfo/MacOSSysteminfo.cs b/Ryujinx.Common/SystemInfo/MacOSSysteminfo.cs new file mode 100644 index 00000000..167c96db --- /dev/null +++ b/Ryujinx.Common/SystemInfo/MacOSSysteminfo.cs @@ -0,0 +1,97 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using Ryujinx.Common.Logging; + +namespace Ryujinx.Common.SystemInfo +{ + internal class MacOSSysteminfo : SystemInfo + { + public override string CpuName { get; } + public override ulong RamSize { get; } + + [DllImport("libSystem.dylib", CharSet = CharSet.Ansi, SetLastError = true)] + private static extern int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize, IntPtr newValue, ulong newValueSize); + + private static int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize) + { + if (sysctlbyname(name, oldValue, ref oldSize, IntPtr.Zero, 0) == -1) + { + return Marshal.GetLastWin32Error(); + } + + return 0; + } + + private static int sysctlbyname<T>(string name, ref T oldValue) + { + unsafe + { + ulong oldValueSize = (ulong)Unsafe.SizeOf<T>(); + + return sysctlbyname(name, (IntPtr)Unsafe.AsPointer(ref oldValue), ref oldValueSize); + } + } + + private static int sysctlbyname(string name, out string oldValue) + { + oldValue = default; + + ulong strSize = 0; + + int res = sysctlbyname(name, IntPtr.Zero, ref strSize); + + if (res == 0) + { + byte[] rawData = new byte[strSize]; + + unsafe + { + fixed (byte* rawDataPtr = rawData) + { + res = sysctlbyname(name, (IntPtr)rawDataPtr, ref strSize); + } + + if (res == 0) + { + oldValue = Encoding.ASCII.GetString(rawData); + } + } + } + + return res; + } + + public MacOSSysteminfo() + { + ulong ramSize = 0; + + int res = sysctlbyname("hw.memsize", ref ramSize); + + if (res == 0) + { + RamSize = ramSize; + } + else + { + Logger.PrintError(LogClass.Application, $"Cannot get memory size, sysctlbyname error: {res}"); + + RamSize = 0; + } + + res = sysctlbyname("machdep.cpu.brand_string", out string cpuName); + + if (res == 0) + { + CpuName = cpuName; + } + else + { + Logger.PrintError(LogClass.Application, $"Cannot get CPU name, sysctlbyname error: {res}"); + + CpuName = "Unknown"; + } + } + } +}
\ No newline at end of file diff --git a/Ryujinx.Common/SystemInfo/SystemInfo.cs b/Ryujinx.Common/SystemInfo/SystemInfo.cs new file mode 100644 index 00000000..9ab1419c --- /dev/null +++ b/Ryujinx.Common/SystemInfo/SystemInfo.cs @@ -0,0 +1,46 @@ +using System.Runtime.InteropServices; + +namespace Ryujinx.Common.SystemInfo +{ + public class SystemInfo + { + public virtual string OsDescription => $"{RuntimeInformation.OSDescription} ({RuntimeInformation.OSArchitecture})"; + public virtual string CpuName => "Unknown"; + public virtual ulong RamSize => 0; + + public string RamSizeInMB + { + get + { + if (RamSize == 0) + { + return "Unknown"; + } + + return $"{RamSize / 1024 / 1024} MB"; + } + } + + public static SystemInfo Instance { get; } + + static SystemInfo() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Instance = new WindowsSysteminfo(); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Instance = new LinuxSysteminfo(); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + Instance = new MacOSSysteminfo(); + } + else + { + Instance = new SystemInfo(); + } + } + } +}
\ No newline at end of file diff --git a/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs b/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs new file mode 100644 index 00000000..1d4e61fa --- /dev/null +++ b/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs @@ -0,0 +1,23 @@ +using System.Management; + +namespace Ryujinx.Common.SystemInfo +{ + internal class WindowsSysteminfo : SystemInfo + { + public override string CpuName { get; } + public override ulong RamSize { get; } + + public WindowsSysteminfo() + { + foreach (ManagementBaseObject mObject in new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor").Get()) + { + CpuName = mObject["Name"].ToString(); + } + + foreach (ManagementBaseObject mObject in new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_OperatingSystem").Get()) + { + RamSize = ulong.Parse(mObject["TotalVisibleMemorySize"].ToString()) * 1024; + } + } + } +}
\ No newline at end of file |
