Revamp: Transition HarmonyLink to C++ with DLL support
This transformative commit marks the evolution of HarmonyLink from a Rust-based server-side application to a C++ implemented, C-compatible dynamic link library (DLL). We've restructured the codebase to streamline integration into games, eliminating the need for a server setup by end-users. Key Changes: - Introduced .gitattributes and .gitmodules to manage new dependencies and collaborations. - Replaced the GitHub workflow files with CMake configurations to support the new C++ build system. - Introduced a comprehensive set of header and implementation files defining the core functionality, platform-specific utilities, and cross-platform compatibility layers. - Removed all Rust-specific files (Cargo.toml, Cargo.lock, etc.) and references to ensure a clean transition to the C++ environment. - Implemented new testing mechanisms within HarmonyLinkTest to ensure robustness and reliability of the DLL. - Excised previous server-side components and models to focus on the DLL's direct integration into consumer applications. This update is a direct response to community feedback, showcasing our commitment to adaptability and innovation. HarmonyLink 2.0 is now more accessible, efficient, and tailored for diverse gaming environments, providing developers with an unparalleled level of hardware-software harmony. Please refer to the updated README for more details on the new structure and how to integrate HarmonyLink 2.0 into your projects.
This commit is contained in:
parent
d13fc728df
commit
6bf68eb298
60 changed files with 1629 additions and 2389 deletions
122
HarmonyLinkLib/src/Platform/IPlatformUtilities.cpp
Normal file
122
HarmonyLinkLib/src/Platform/IPlatformUtilities.cpp
Normal file
|
@ -0,0 +1,122 @@
|
|||
#include "IPlatformUtilities.h"
|
||||
|
||||
#include <set>
|
||||
|
||||
#include "WineUtilities.h"
|
||||
#if BUILD_WINDOWS
|
||||
#include "Windows/WindowsUtilities.h"
|
||||
#elif BUILD_LINUX
|
||||
#include "Unix/Linux/LinuxUtilities.h"
|
||||
#elif BUILD_MAC
|
||||
#include "Unix/Mac/MacUtilities.h"
|
||||
#elif BUILD_UNIX
|
||||
#include "Unix/Mac/MacUtilities.h"
|
||||
#endif
|
||||
|
||||
namespace HarmonyLinkLib
|
||||
{
|
||||
static std::shared_ptr<IPlatformUtilities> INSTANCE = nullptr;
|
||||
|
||||
std::shared_ptr<IPlatformUtilities>& IPlatformUtilities::GetInstance()
|
||||
{
|
||||
if (!INSTANCE)
|
||||
{
|
||||
#if BUILD_WINDOWS
|
||||
INSTANCE = std::make_shared<WindowsUtilities>();
|
||||
#elif BUILD_LINUX
|
||||
INSTANCE = std::make_shared<LinuxUtilities>();
|
||||
#elif BUILD_MAC
|
||||
INSTANCE = std::make_shared<MacUtilities>();
|
||||
#elif BUILD_UNIX
|
||||
INSTANCE = std::make_shared<UnixUtilities>();
|
||||
// ... other platform checks
|
||||
#else
|
||||
std::wcout << "Platform is not supported.\n"
|
||||
#endif
|
||||
}
|
||||
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
bool IPlatformUtilities::is_running_under_wine()
|
||||
{
|
||||
return WineUtilities::is_wine_present();
|
||||
}
|
||||
|
||||
bool IPlatformUtilities::is_linux()
|
||||
{
|
||||
#ifdef BUILD_LINUX
|
||||
return true;
|
||||
#else
|
||||
return is_running_under_wine();
|
||||
#endif
|
||||
}
|
||||
|
||||
std::shared_ptr<FDevice> IPlatformUtilities::get_device()
|
||||
{
|
||||
FDevice new_device;
|
||||
|
||||
if (is_linux())
|
||||
{
|
||||
new_device.platform = EPlatform::LINUX;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_device.platform = EPlatform::WINDOWS;
|
||||
}
|
||||
|
||||
const std::shared_ptr<FBattery> battery_status = get_battery_status();
|
||||
|
||||
if (battery_status && !battery_status->has_battery)
|
||||
{
|
||||
new_device.device = EDevice::DESKTOP;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_device.device = EDevice::LAPTOP;
|
||||
}
|
||||
|
||||
if (is_steam_deck(new_device)) {
|
||||
new_device.device = EDevice::STEAM_DECK;
|
||||
}
|
||||
return std::make_shared<FDevice>(new_device);
|
||||
}
|
||||
|
||||
// Helper function to check if the device is a Steam Deck
|
||||
bool IPlatformUtilities::is_steam_deck(const FDevice& device) {
|
||||
|
||||
// Check if the device is already identified as a Steam Deck
|
||||
if (device.device == EDevice::STEAM_DECK) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check for Steam Deck by OS version
|
||||
if (const std::shared_ptr<FOSVerInfo> version = get_os_version()) {
|
||||
if (version->variant_id == "steamdeck" && version->name == "SteamOS") {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
wprintf(L"OS version information not available.\n");
|
||||
}
|
||||
|
||||
// Set of known Steam Deck CPU model names
|
||||
const std::set<std::string> steam_deck_models = {"amd custom apu 0405" /*, other models... */};
|
||||
|
||||
// Check for Steam Deck by CPU model name
|
||||
if (const std::shared_ptr<FCPUInfo> cpu_info = get_cpu_info()) {
|
||||
const FString cpu_model_lower = FString::to_lower(cpu_info->Model_Name);
|
||||
for (const auto& model : steam_deck_models) {
|
||||
if (cpu_model_lower == model) {
|
||||
wprintf(L"Steam Deck detected by CPU model name.\n");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
wprintf(L"CPU information not available.\n");
|
||||
}
|
||||
|
||||
wprintf(L"Device is not a Steam Deck.\n");
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue