Migrate Environment, SOSLSv2FormatBuilder & KotlinShutdownHandler

This commit is contained in:
JeremyStar™ 2024-12-29 04:15:41 +01:00
parent a5a7b8841c
commit bf992bf6c5
Signed by: JeremyStarTM
GPG key ID: E366BAEF67E4704D
12 changed files with 465 additions and 254 deletions

View file

@ -22,10 +22,10 @@ package de.staropensource.engine.base.implementable.stream
import de.staropensource.engine.base.exception.io.IOAccessException import de.staropensource.engine.base.exception.io.IOAccessException
import de.staropensource.engine.base.implementable.PlatformData import de.staropensource.engine.base.implementable.PlatformData
import de.staropensource.engine.base.platform.StreamPlatform import de.staropensource.engine.base.platform.StreamPlatform
import de.staropensource.engine.base.platform.streamPlatform import de.staropensource.engine.base.platform.platformStreamPlatform
import de.staropensource.engine.base.platform.streamStandardError import de.staropensource.engine.base.platform.platformStreamStandardError
import de.staropensource.engine.base.platform.streamStandardInput import de.staropensource.engine.base.platform.platformStreamStandardInput
import de.staropensource.engine.base.platform.streamStandardOutput import de.staropensource.engine.base.platform.platformStreamStandardOutput
/** /**
* Makes streaming data easy. * Makes streaming data easy.
@ -53,7 +53,7 @@ abstract class Stream(
* @see <a href="https://man.archlinux.org/man/stdin.3">stdin(3)</a> * @see <a href="https://man.archlinux.org/man/stdin.3">stdin(3)</a>
* @since v1-alpha10 * @since v1-alpha10
*/ */
val standardInput: ReadStream = streamStandardInput() val standardInput: ReadStream = platformStreamStandardInput()
/** /**
* Contains the standard output as a [Stream]. * Contains the standard output as a [Stream].
@ -62,7 +62,7 @@ abstract class Stream(
* @see <a href="https://man.archlinux.org/man/stdout.3">stdout(3)</a> * @see <a href="https://man.archlinux.org/man/stdout.3">stdout(3)</a>
* @since v1-alpha10 * @since v1-alpha10
*/ */
val standardOutput: WriteStream = streamStandardOutput() val standardOutput: WriteStream = platformStreamStandardOutput()
/** /**
* Contains the standard error as a [Stream]. * Contains the standard error as a [Stream].
@ -70,13 +70,13 @@ abstract class Stream(
* @see <a href="https://man.archlinux.org/man/stderr.3">stderr(3)</a> * @see <a href="https://man.archlinux.org/man/stderr.3">stderr(3)</a>
* @since v1-alpha10 * @since v1-alpha10
*/ */
val standardError: WriteStream = streamStandardError() val standardError: WriteStream = platformStreamStandardError()
} }
// -----> Properties // -----> Properties
override val platformData: MutableMap<String, Any?> = mutableMapOf() override val platformData: MutableMap<String, Any?> = mutableMapOf()
private val platform: StreamPlatform = streamPlatform(this) private val platform: StreamPlatform = platformStreamPlatform(this)
/** /**
* Indicates whether this stream is closed. * Indicates whether this stream is closed.

View file

@ -20,16 +20,17 @@
package de.staropensource.engine.base.implementation.logging package de.staropensource.engine.base.implementation.logging
import de.staropensource.engine.base.implementable.ShutdownHandler import de.staropensource.engine.base.implementable.ShutdownHandler
import de.staropensource.engine.base.platform.platformTerminate
import kotlin.jvm.JvmStatic import kotlin.jvm.JvmStatic
import kotlin.system.exitProcess
/** /**
* [ShutdownHandler] implementation using * [ShutdownHandler] implementation which
* Kotlin's [exitProcess] method. * simply terminates the application.
* *
* @constructor Initializes this shutdown handler * @constructor Initializes this shutdown handler
* @since v1-alpha10 * @since v1-alpha10
*/ */
@Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
class KotlinShutdownHandler private constructor() : ShutdownHandler { class KotlinShutdownHandler private constructor() : ShutdownHandler {
/** /**
* Companion object of [KotlinShutdownHandler]. * Companion object of [KotlinShutdownHandler].
@ -47,6 +48,6 @@ class KotlinShutdownHandler private constructor() : ShutdownHandler {
} }
override fun exit(exitcode: UByte) { override fun exit(exitcode: UByte) {
exitProcess(exitcode.toInt()) platformTerminate(exitcode)
} }
} }

View file

@ -143,22 +143,22 @@ open class SOSLSv2FormatBuilder(call: Call, channelSettings: ChannelSettings?) :
if (enabledFeatures.contains(Feature.DATE)) if (enabledFeatures.contains(Feature.DATE))
format format
.append("%02d".format(datetime.dayOfMonth)) .append(datetime.dayOfMonth.toString().padStart(2, padChar = '0'))
.append(".") .append(".")
.append("%02d".format(datetime.monthNumber)) .append(datetime.monthNumber.toString().padStart(2, padChar = '0'))
.append(".") .append(".")
.append("%04d".format(datetime.year)) .append(datetime.year.toString().padStart(4, padChar = '0'))
if (enabledFeatures.contains(Feature.DATE) && enabledFeatures.contains(Feature.TIME)) if (enabledFeatures.contains(Feature.DATE) && enabledFeatures.contains(Feature.TIME))
format.append(" ") format.append(" ")
if (enabledFeatures.contains(Feature.TIME)) if (enabledFeatures.contains(Feature.TIME))
format format
.append("%02d".format(datetime.hour)) .append(datetime.hour.toString().padStart(2, padChar = '0'))
.append(":") .append(":")
.append("%02d".format(datetime.minute)) .append(datetime.minute.toString().padStart(2, padChar = '0'))
.append(":") .append(":")
.append("%02d".format(datetime.second)) .append(datetime.second.toString().padStart(2, padChar = '0'))
if (enabledFeatures.contains(Feature.DATE) || enabledFeatures.contains(Feature.TIME)) { if (enabledFeatures.contains(Feature.DATE) || enabledFeatures.contains(Feature.TIME)) {
if (enabledFeatures.contains(Feature.FORMATTING)) if (enabledFeatures.contains(Feature.FORMATTING))

View file

@ -0,0 +1,22 @@
/*
* STAROPENSOURCE ENGINE SOURCE FILE
* Copyright (c) 2024 The StarOpenSource Engine Authors
* Licensed under the GNU General Public License v3.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.staropensource.engine.base.platform
expect fun platformTerminate(exitcode: UByte)

View file

@ -50,7 +50,7 @@ abstract class StreamPlatform(
* @return matching [StreamPlatform] instance * @return matching [StreamPlatform] instance
* @since v1-alpha10 * @since v1-alpha10
*/ */
internal expect fun streamPlatform(stream: Stream): StreamPlatform internal expect fun platformStreamPlatform(stream: Stream): StreamPlatform
/** /**
* Returns a [ReadStream] representing * Returns a [ReadStream] representing
@ -60,7 +60,7 @@ internal expect fun streamPlatform(stream: Stream): StreamPlatform
* @return [ReadStream] instance representing the standard input * @return [ReadStream] instance representing the standard input
* @since v1-alpha10 * @since v1-alpha10
*/ */
internal expect fun streamStandardInput(): ReadStream internal expect fun platformStreamStandardInput(): ReadStream
/** /**
* Returns a [WriteStream] representing * Returns a [WriteStream] representing
@ -70,7 +70,7 @@ internal expect fun streamStandardInput(): ReadStream
* @return [WriteStream] instance representing the standard output * @return [WriteStream] instance representing the standard output
* @since v1-alpha10 * @since v1-alpha10
*/ */
internal expect fun streamStandardOutput(): WriteStream internal expect fun platformStreamStandardOutput(): WriteStream
/** /**
* Returns a [WriteStream] representing * Returns a [WriteStream] representing
@ -80,4 +80,4 @@ internal expect fun streamStandardOutput(): WriteStream
* @return [WriteStream] instance representing the standard error * @return [WriteStream] instance representing the standard error
* @since v1-alpha10 * @since v1-alpha10
*/ */
internal expect fun streamStandardError(): WriteStream internal expect fun platformStreamStandardError(): WriteStream

View file

@ -0,0 +1,35 @@
/*
* STAROPENSOURCE ENGINE SOURCE FILE
* Copyright (c) 2024 The StarOpenSource Engine Authors
* Licensed under the GNU General Public License v3.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.staropensource.engine.base.type.environment
/**
* Represents a graphics card.
*
* @constructor Initializes this class
* @since v1-alpha10
*/
@Suppress("Unused")
class GraphicsCard internal constructor(
val name: String,
val deviceIdentifier: String,
val manufacturer: String,
val version: String,
val videoMemory: ULong,
)

View file

@ -0,0 +1,112 @@
/*
* STAROPENSOURCE ENGINE SOURCE FILE
* Copyright (c) 2024 The StarOpenSource Engine Authors
* Licensed under the GNU General Public License v3.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.staropensource.engine.base.type.environment
import de.staropensource.engine.base.EngineConfiguration
/**
* Represents all operating systems
* detected and supported by the engine.
*
* @since v1-alpha10
*/
enum class OperatingSystem {
/**
* Identifies that the application is running
* under the [Linux](https://kernel.org) kernel
* on some kind of Linux distribution.
*
* @since v1-alpha10
*/
LINUX,
/**
* Identifies that the application is running
* under the [FreeBSD](https://freebsd.org) kernel
* and likely the FreeBSD operating system.
*
* @since v1-alpha10
*/
FREEBSD,
/**
* Identifies that the application is running
* under the [NetBSD](https://netbsd.org) kernel
* and likely the NetBSD operating system.
*
* @since v1-alpha10
*/
NETBSD,
/**
* Identifies that the application is running
* under the [OpenBSD](https://openbsd.org) kernel
* and likely the OpenBSD operating system.
*
* @since v1-alpha10
*/
OPENBSD,
/**
* Identifies that the application is running
* under [Android](https://android.com), and
* by extension the [Linux kernel](https://kernel.org).
*
* @since v1-alpha10
*/
ANDROID,
/**
* Identifies that the application is running
* under [Windows](https://windows.com), and
* by extension the [Windows NT kernel](https://en.wikipedia.org/wiki/Ntoskrnl.exe).
*
* @since v1-alpha10
*/
WINDOWS,
/**
* Identifies that the application is running
* under [macOS](https://apple.com/macos), and
* by extension under the [XNU kernel](https://github.com/apple-oss-distributions/xnu).
*
* @since v1-alpha10
*/
MACOS;
override fun toString(): String = "${if (EngineConfiguration.fullTypePath) "de.staropensource.engine.base.utility." else ""}Environment\$OperatingSystem.${name}"
/**
* Returns the human-friendly name
* of this operating system.
*
* @return human-friendly name
* @since v1-alpha10
*/
fun humanFriendly(): String = when (this) {
LINUX -> "Linux"
FREEBSD -> "FreeBSD"
NETBSD -> "NetBSD"
OPENBSD -> "OpenBSD"
ANDROID -> "Android"
WINDOWS -> "Windows"
MACOS -> "macOS"
}
}

View file

@ -0,0 +1,27 @@
/*
* STAROPENSOURCE ENGINE SOURCE FILE
* Copyright (c) 2024 The StarOpenSource Engine Authors
* Licensed under the GNU General Public License v3.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
* Data types returned by [Environment].
*
* @since v1-alpha10
*/
package de.staropensource.engine.base.type.environment
import de.staropensource.engine.base.utility.Environment

View file

@ -19,14 +19,9 @@
package de.staropensource.engine.base.utility package de.staropensource.engine.base.utility
import de.staropensource.engine.base.Engine.Companion.logger import de.staropensource.engine.base.type.environment.GraphicsCard
import de.staropensource.engine.base.EngineConfiguration import de.staropensource.engine.base.type.environment.OperatingSystem
import de.staropensource.engine.base.utility.Environment.OperatingSystem.*
import kotlinx.datetime.Instant import kotlinx.datetime.Instant
import oshi.PlatformEnum
import oshi.SystemInfo
import oshi.hardware.HardwareAbstractionLayer
import kotlin.jvm.JvmStatic
/** /**
* Provides information about the * Provides information about the
@ -35,38 +30,14 @@ import kotlin.jvm.JvmStatic
* @constructor Initializes this class * @constructor Initializes this class
* @since v1-alpha10 * @since v1-alpha10
*/ */
@Suppress("Unused") @Suppress("Unused", "EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
class Environment private constructor() { expect class Environment private constructor() {
/** /**
* Companion class of [Environment]. * Companion class of [Environment].
* *
* @since v1-alpha10 * @since v1-alpha10
*/ */
companion object { companion object {
// -----> Internal properties
/**
* Contains the [oshi.software.os.OperatingSystem]
* implementation used for accessing
* information about the operating
* system the engine is running on.
*
* @return [oshi.software.os.OperatingSystem] instance
* @since v1-alpha10
*/
private var os: oshi.software.os.OperatingSystem? = null
/**
* Contains the [HardwareAbstractionLayer]
* implementation used for accessing
* hardware information of the system the
* engine is running on.
*
* @return [HardwareAbstractionLayer] instance
* @since v1-alpha10
*/
private var hw: HardwareAbstractionLayer? = null
// -----> Update methods // -----> Update methods
/** /**
* Unsets the environment. * Unsets the environment.
@ -74,10 +45,7 @@ class Environment private constructor() {
* @since v1-alpha10 * @since v1-alpha10
*/ */
@JvmStatic @JvmStatic
internal fun unset() { internal fun unset()
os = null
hw = null
}
/** /**
* Detects and updates the environment. * Detects and updates the environment.
@ -85,11 +53,7 @@ class Environment private constructor() {
* @since v1-alpha10 * @since v1-alpha10
*/ */
@JvmStatic @JvmStatic
internal fun detect() { internal fun detect()
val si: SystemInfo = SystemInfo()
os = si.operatingSystem
hw = si.hardware
}
// -----> Getters // -----> Getters
@ -104,21 +68,8 @@ class Environment private constructor() {
* @return maximum of supported bits * @return maximum of supported bits
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getOperatingSystem(): OperatingSystem? { @JvmStatic
when (SystemInfo.getCurrentPlatform()) { fun getOperatingSystem(): OperatingSystem?
PlatformEnum.LINUX, PlatformEnum.GNU, PlatformEnum.KFREEBSD -> return LINUX
PlatformEnum.FREEBSD -> return FREEBSD
PlatformEnum.NETBSD -> return NETBSD
PlatformEnum.OPENBSD -> return OPENBSD
//PlatformEnum.ANDROID -> Environment.getOperatingSystem() = Environment.OperatingSystem.ANDROID // android is not yet supported by the engine, have to figure that one out sometime
PlatformEnum.WINDOWS, PlatformEnum.WINDOWSCE -> return WINDOWS
PlatformEnum.MACOS -> return MACOS
else -> {
logger.crash("Unsupported operating system '" + SystemInfo.getCurrentPlatform().name + "' reported by OSHI")
return null
}
}
}
/** /**
* Returns the point in time where * Returns the point in time where
@ -128,12 +79,8 @@ class Environment private constructor() {
* @return time of system startup * @return time of system startup
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getTimeOfStartup(): Instant? { @JvmStatic
if (os == null) fun getTimeOfStartup(): Instant?
return null
return Instant.fromEpochSeconds(epochSeconds = os!!.systemBootTime)
}
/** /**
* Returns whether the current process * Returns whether the current process
@ -143,7 +90,8 @@ class Environment private constructor() {
* @return elevated? * @return elevated?
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun isElevated(): Boolean? = os?.isElevated @JvmStatic
fun isElevated(): Boolean?
/** /**
* Returns the amount of bits * Returns the amount of bits
@ -155,7 +103,8 @@ class Environment private constructor() {
* @return maximum of supported bits * @return maximum of supported bits
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getBitness(): Int? = os?.bitness @JvmStatic
fun getBitness(): Int?
// -------> Computer // -------> Computer
/** /**
@ -165,7 +114,8 @@ class Environment private constructor() {
* @return computer manufacturer name * @return computer manufacturer name
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getComputerManufacturer(): String? = hw?.computerSystem?.manufacturer @JvmStatic
fun getComputerManufacturer(): String?
/** /**
* Returns the name of the * Returns the name of the
@ -174,7 +124,8 @@ class Environment private constructor() {
* @return computer model name * @return computer model name
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getComputerModel(): String? = hw?.computerSystem?.model @JvmStatic
fun getComputerModel(): String?
// -------> Firmware (BIOS, UEFI, etc.) // -------> Firmware (BIOS, UEFI, etc.)
/** /**
@ -184,7 +135,8 @@ class Environment private constructor() {
* @return firmware name * @return firmware name
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getFirmwareName(): String? = hw?.computerSystem?.firmware?.name @JvmStatic
fun getFirmwareName(): String?
/** /**
* Returns the description of the firmware (BIOS, * Returns the description of the firmware (BIOS,
@ -193,7 +145,8 @@ class Environment private constructor() {
* @return firmware description * @return firmware description
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getFirmwareDescription(): String? = hw?.computerSystem?.firmware?.description @JvmStatic
fun getFirmwareDescription(): String?
/** /**
* Returns the name of the manufacturer of this * Returns the name of the manufacturer of this
@ -202,7 +155,8 @@ class Environment private constructor() {
* @return firmware manufacturer name * @return firmware manufacturer name
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getFirmwareManufacturer(): String? = hw?.computerSystem?.firmware?.manufacturer @JvmStatic
fun getFirmwareManufacturer(): String?
/** /**
* Returns the version of the firmware (BIOS, * Returns the version of the firmware (BIOS,
@ -211,7 +165,8 @@ class Environment private constructor() {
* @return firmware version * @return firmware version
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getFirmwareVersion(): String? = hw?.computerSystem?.firmware?.version @JvmStatic
fun getFirmwareVersion(): String?
/** /**
* Returns the release date of the firmware (BIOS, * Returns the release date of the firmware (BIOS,
@ -220,7 +175,8 @@ class Environment private constructor() {
* @return firmware release date * @return firmware release date
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getFirmwareReleaseDate(): String? = hw?.computerSystem?.firmware?.releaseDate @JvmStatic
fun getFirmwareReleaseDate(): String?
// -------> Motherboard // -------> Motherboard
/** /**
@ -230,7 +186,8 @@ class Environment private constructor() {
* @return motherboard model name * @return motherboard model name
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getMotherboardModel(): String? = hw?.computerSystem?.baseboard?.model @JvmStatic
fun getMotherboardModel(): String?
/** /**
* Returns the version of this * Returns the version of this
@ -239,7 +196,8 @@ class Environment private constructor() {
* @return motherboard version * @return motherboard version
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getMotherboardVersion(): String? = hw?.computerSystem?.baseboard?.version @JvmStatic
fun getMotherboardVersion(): String?
/** /**
* Returns the serial number of * Returns the serial number of
@ -248,7 +206,8 @@ class Environment private constructor() {
* @return motherboard serial number * @return motherboard serial number
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getMotherboardSerialNumber(): String? = hw?.computerSystem?.baseboard?.serialNumber @JvmStatic
fun getMotherboardSerialNumber(): String?
/** /**
* Returns the name of the manufacturer * Returns the name of the manufacturer
@ -257,7 +216,8 @@ class Environment private constructor() {
* @return motherboard manufacturer name * @return motherboard manufacturer name
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getMotherboardManufacturer(): String? = hw?.computerSystem?.baseboard?.manufacturer @JvmStatic
fun getMotherboardManufacturer(): String?
// -------> Memory // -------> Memory
/** /**
@ -267,7 +227,8 @@ class Environment private constructor() {
* @return amount of physical memory in bytes * @return amount of physical memory in bytes
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getMemoryTotal(): Long? = hw?.memory?.total @JvmStatic
fun getMemoryTotal(): Long?
/** /**
* Returns the amount of available * Returns the amount of available
@ -276,7 +237,8 @@ class Environment private constructor() {
* @return amount of physical memory in bytes * @return amount of physical memory in bytes
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getMemoryAvailable(): Long? = hw?.memory?.available @JvmStatic
fun getMemoryAvailable(): Long?
/** /**
* Returns the amount of available * Returns the amount of available
@ -285,7 +247,8 @@ class Environment private constructor() {
* @return amount of physical memory in bytes * @return amount of physical memory in bytes
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getMemoryUsed(): Long? = hw?.memory?.total?.minus(hw!!.memory!!.available) @JvmStatic
fun getMemoryUsed(): Long?
/** /**
* Returns the size of a * Returns the size of a
@ -294,7 +257,8 @@ class Environment private constructor() {
* @return size of a memory page in bytes * @return size of a memory page in bytes
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getMemoryPageSize(): Long? = hw?.memory?.pageSize @JvmStatic
fun getMemoryPageSize(): ULong?
// -------> CPU // -------> CPU
/** /**
@ -305,7 +269,8 @@ class Environment private constructor() {
* @return maximum clock speed of logical processors in Hz or `-1` if it couldn't be determined * @return maximum clock speed of logical processors in Hz or `-1` if it couldn't be determined
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getCPUMaximumFrequency(): Long? = hw?.processor?.maxFreq @JvmStatic
fun getCPUMaximumFrequency(): Long?
/** /**
* Returns the estimated current clock * Returns the estimated current clock
@ -327,7 +292,8 @@ class Environment private constructor() {
* @return current clock rate of logical processors in Hz or an empty array * @return current clock rate of logical processors in Hz or an empty array
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getCPUCurrentFrequency(): LongArray? = hw?.processor?.currentFreq @JvmStatic
fun getCPUCurrentFrequency(): LongArray?
/** /**
* Returns the current amount of * Returns the current amount of
@ -342,7 +308,8 @@ class Environment private constructor() {
* @return amount of logical processors * @return amount of logical processors
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getCPULogicalCount(): Int? = hw?.processor?.logicalProcessorCount @JvmStatic
fun getCPULogicalCount(): Int?
/** /**
* Returns the amount of physical * Returns the amount of physical
@ -351,7 +318,8 @@ class Environment private constructor() {
* @return amount of physical processors * @return amount of physical processors
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getCPUPhysicalCount(): Int? = hw?.processor?.physicalProcessorCount @JvmStatic
fun getCPUPhysicalCount(): Int?
// -------> CPU // -------> CPU
/** /**
@ -361,149 +329,7 @@ class Environment private constructor() {
* @return array of [GraphicsCard] instances * @return array of [GraphicsCard] instances
* @since v1-alpha10 * @since v1-alpha10
*/ */
fun getGPUs(): Array<GraphicsCard>? = hw?.graphicsCards?.map { graphicsCard -> GraphicsCard(graphicsCard) }?.toTypedArray() @JvmStatic
} fun getGPUs(): Array<GraphicsCard>?
// -----> Data types
/**
* Represents all operating systems
* detected and supported by the engine.
*
* @since v1-alpha10
*/
enum class OperatingSystem {
/**
* Identifies that the application is running
* under the [Linux](https://kernel.org) kernel
* on some kind of Linux distribution.
*
* @since v1-alpha10
*/
LINUX,
/**
* Identifies that the application is running
* under the [FreeBSD](https://freebsd.org) kernel
* and likely the FreeBSD operating system.
*
* @since v1-alpha10
*/
FREEBSD,
/**
* Identifies that the application is running
* under the [NetBSD](https://netbsd.org) kernel
* and likely the NetBSD operating system.
*
* @since v1-alpha10
*/
NETBSD,
/**
* Identifies that the application is running
* under the [OpenBSD](https://openbsd.org) kernel
* and likely the OpenBSD operating system.
*
* @since v1-alpha10
*/
OPENBSD,
/**
* Identifies that the application is running
* under [Android](https://android.com), and
* by extension the [Linux kernel](https://kernel.org).
*
* @since v1-alpha10
*/
ANDROID,
/**
* Identifies that the application is running
* under [Windows](https://windows.com), and
* by extension the [Windows NT kernel](https://en.wikipedia.org/wiki/Ntoskrnl.exe).
*
* @since v1-alpha10
*/
WINDOWS,
/**
* Identifies that the application is running
* under [macOS](https://apple.com/macos), and
* by extension under the [XNU kernel](https://github.com/apple-oss-distributions/xnu).
*
* @since v1-alpha10
*/
MACOS;
override fun toString(): String = "${if (EngineConfiguration.fullTypePath) "de.staropensource.engine.base.utility." else ""}Environment\$OperatingSystem.${name}"
/**
* Returns the human-friendly name
* of this operating system.
*
* @return human-friendly name
* @since v1-alpha10
*/
fun humanFriendly(): String = when (this) {
LINUX -> "Linux"
FREEBSD -> "FreeBSD"
NETBSD -> "NetBSD"
OPENBSD -> "OpenBSD"
ANDROID -> "Android"
WINDOWS -> "Windows"
MACOS -> "macOS"
}
}
/**
* Represents a graphics card.
*
* @constructor Initializes this class
* @since v1-alpha10
*/
class GraphicsCard internal constructor(val graphicsCard: oshi.hardware.GraphicsCard) {
/**
* Returns the name of this graphics card.
*
* @return name
* @since v1-alpha10
*/
fun getName(): String = graphicsCard.name
/**
* Returns the device identifier
* of this graphics card.
*
* @return device identifier
* @since v1-alpha10
*/
fun getDeviceIdentifier(): String = graphicsCard.deviceId
/**
* Returns the name of the manufacturer
* of this graphics card.
*
* @return manufacturer name
* @since v1-alpha10
*/
fun getManufacturer(): String = graphicsCard.vendor
/**
* Returns the version of
* this graphics card.
*
* @return version
* @since v1-alpha10
*/
fun getVersion(): String = graphicsCard.versionInfo
/**
* Returns the amount of VRAM provided
* by this graphics card in bytes.
*
* @return amount of total VRAM
* @since v1-alpha10
*/
fun getVideoMemory(): Long = graphicsCard.vRam
} }
} }

View file

@ -0,0 +1,22 @@
/*
* STAROPENSOURCE ENGINE SOURCE FILE
* Copyright (c) 2024 The StarOpenSource Engine Authors
* Licensed under the GNU General Public License v3.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.staropensource.engine.base.platform
actual fun platformTerminate(exitcode: UByte) = Runtime.getRuntime().exit(exitcode.toInt())

View file

@ -53,16 +53,16 @@ class StreamPlatformImpl(stream: Stream) : StreamPlatform(stream) {
// -----> Actual methods // -----> Actual methods
actual fun streamPlatform(stream: Stream): StreamPlatform = stream.platformData.getOrPut("platform") { StreamPlatformImpl(stream) } as StreamPlatform actual fun platformStreamPlatform(stream: Stream): StreamPlatform = stream.platformData.getOrPut("platform") { StreamPlatformImpl(stream) } as StreamPlatform
actual fun streamStandardInput(): ReadStream = object : JavaReadStream(System.`in`) { actual fun platformStreamStandardInput(): ReadStream = object : JavaReadStream(System.`in`) {
override fun close() = Unit override fun close() = Unit
override fun closeStream() = Unit override fun closeStream() = Unit
} }
actual fun streamStandardOutput(): WriteStream = object : JavaWriteStream(System.out) { actual fun platformStreamStandardOutput(): WriteStream = object : JavaWriteStream(System.out) {
override fun close() = Unit override fun close() = Unit
override fun closeStream() = Unit override fun closeStream() = Unit
} }
actual fun streamStandardError(): WriteStream = object : JavaWriteStream(System.err) { actual fun platformStreamStandardError(): WriteStream = object : JavaWriteStream(System.err) {
override fun close() = Unit override fun close() = Unit
override fun closeStream() = Unit override fun closeStream() = Unit
} }

View file

@ -0,0 +1,166 @@
/*
* STAROPENSOURCE ENGINE SOURCE FILE
* Copyright (c) 2024 The StarOpenSource Engine Authors
* Licensed under the GNU General Public License v3.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.staropensource.engine.base.utility
import de.staropensource.engine.base.Engine.Companion.logger
import de.staropensource.engine.base.type.environment.GraphicsCard
import de.staropensource.engine.base.type.environment.OperatingSystem
import kotlinx.datetime.Instant
import oshi.PlatformEnum
import oshi.SystemInfo
import oshi.hardware.HardwareAbstractionLayer
@Suppress("Unused", "EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING")
actual class Environment private actual constructor() {
actual companion object {
// -----> Internal properties
/**
* Contains the [oshi.software.os.OperatingSystem]
* implementation used for accessing
* information about the operating
* system the engine is running on.
*
* @return [oshi.software.os.OperatingSystem] instance
* @since v1-alpha10
*/
private var os: oshi.software.os.OperatingSystem? = null
/**
* Contains the [HardwareAbstractionLayer]
* implementation used for accessing
* hardware information of the system the
* engine is running on.
*
* @return [HardwareAbstractionLayer] instance
* @since v1-alpha10
*/
private var hw: HardwareAbstractionLayer? = null
@JvmStatic
actual fun unset() {
os = null
hw = null
}
@JvmStatic
actual fun detect() {
val si: SystemInfo = SystemInfo()
os = si.operatingSystem
hw = si.hardware
}
@JvmStatic
actual fun getOperatingSystem(): OperatingSystem? {
when (SystemInfo.getCurrentPlatform()) {
PlatformEnum.LINUX, PlatformEnum.GNU, PlatformEnum.KFREEBSD -> return OperatingSystem.LINUX
PlatformEnum.FREEBSD -> return OperatingSystem.FREEBSD
PlatformEnum.NETBSD -> return OperatingSystem.NETBSD
PlatformEnum.OPENBSD -> return OperatingSystem.OPENBSD
//PlatformEnum.ANDROID -> return OperatingSystem.ANDROID // android is not yet supported by the engine, have to figure that one out sometime
PlatformEnum.WINDOWS, PlatformEnum.WINDOWSCE -> return OperatingSystem.WINDOWS
PlatformEnum.MACOS -> return OperatingSystem.MACOS
else -> {
logger.crash("Unsupported operating system '" + SystemInfo.getCurrentPlatform().name + "' reported by OSHI")
return null
}
}
}
@JvmStatic
actual fun getTimeOfStartup(): Instant? {
if (os == null)
return null
return Instant.fromEpochSeconds(epochSeconds = os!!.systemBootTime)
}
@JvmStatic
actual fun isElevated(): Boolean? = os?.isElevated
@JvmStatic
actual fun getBitness(): Int? = os?.bitness
@JvmStatic
actual fun getComputerManufacturer(): String? = hw?.computerSystem?.manufacturer
@JvmStatic
actual fun getComputerModel(): String? = hw?.computerSystem?.model
@JvmStatic
actual fun getFirmwareName(): String? = hw?.computerSystem?.firmware?.name
@JvmStatic
actual fun getFirmwareDescription(): String? = hw?.computerSystem?.firmware?.description
@JvmStatic
actual fun getFirmwareManufacturer(): String? = hw?.computerSystem?.firmware?.manufacturer
@JvmStatic
actual fun getFirmwareVersion(): String? = hw?.computerSystem?.firmware?.version
@JvmStatic
actual fun getFirmwareReleaseDate(): String? = hw?.computerSystem?.firmware?.releaseDate
@JvmStatic
actual fun getMotherboardModel(): String? = hw?.computerSystem?.baseboard?.model
@JvmStatic
actual fun getMotherboardVersion(): String? = hw?.computerSystem?.baseboard?.version
@JvmStatic
actual fun getMotherboardSerialNumber(): String? = hw?.computerSystem?.baseboard?.serialNumber
@JvmStatic
actual fun getMotherboardManufacturer(): String? = hw?.computerSystem?.baseboard?.manufacturer
@JvmStatic
actual fun getMemoryTotal(): Long? = hw?.memory?.total
@JvmStatic
actual fun getMemoryAvailable(): Long? = hw?.memory?.available
@JvmStatic
actual fun getMemoryUsed(): Long? = hw?.memory?.total?.minus(hw!!.memory!!.available)
@JvmStatic
actual fun getMemoryPageSize(): ULong? = hw?.memory?.pageSize?.toULong()
@JvmStatic
actual fun getCPUMaximumFrequency(): Long? = hw?.processor?.maxFreq
@JvmStatic
actual fun getCPUCurrentFrequency(): LongArray? = hw?.processor?.currentFreq
@JvmStatic
actual fun getCPULogicalCount(): Int? = hw?.processor?.logicalProcessorCount
@JvmStatic
actual fun getCPUPhysicalCount(): Int? = hw?.processor?.physicalProcessorCount
@JvmStatic
actual fun getGPUs(): Array<GraphicsCard>? = hw?.graphicsCards?.map { graphicsCard -> GraphicsCard(
graphicsCard.name,
graphicsCard.deviceId,
graphicsCard.vendor,
graphicsCard.versionInfo,
graphicsCard.vRam.toULong(),
) }?.toTypedArray()
}
}