diff --git a/Handbook/src/appendix/changelog.md b/Handbook/src/appendix/changelog.md index 6e02306b..0b09124c 100644 --- a/Handbook/src/appendix/changelog.md +++ b/Handbook/src/appendix/changelog.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `FSGConnectJNI::Initialize()` and `FSGCoreJNI::Initialize()` return codes to Android logs for detailed debugging purposes through `adb logcat`. - Introduced the `Meta XR` plugin compatibility. - Introduced the `ViveOpenXR` plugin compatibility. +- Added the `FSGPluginUtils` utility class for other plugins or modules availability detection such as `Meta XR` and `ViveOpenXR`. ### Fixed diff --git a/Source/SenseGloveUtils/Private/SGUtils/SGPluginUtils.cpp b/Source/SenseGloveUtils/Private/SGUtils/SGPluginUtils.cpp new file mode 100644 index 00000000..895d6859 --- /dev/null +++ b/Source/SenseGloveUtils/Private/SGUtils/SGPluginUtils.cpp @@ -0,0 +1,54 @@ +/** + * @file + * + * @author Mamadou Babaei + * + * @section LICENSE + * + * (The MIT License) + * + * Copyright (c) 2020 - 2025 SenseGlove + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @section DESCRIPTION + * + * + */ + + +#include "SGUtils/SGPluginUtils.h" + +#include "Interfaces/IPluginManager.h" +#include "Modules/ModuleManager.h" + +bool FSGPluginUtils::IsPluginEnabled(const FString& PluginName) +{ + TSharedPtr Plugin{IPluginManager::Get().FindPlugin(*PluginName)}; + if (Plugin.IsValid()) + { + return Plugin->IsEnabled(); + } + return false; +} + +bool FSGPluginUtils::IsModuleLoaded(const FString& ModuleName) +{ + return FModuleManager::Get().IsModuleLoaded(FName{*ModuleName}); +} \ No newline at end of file diff --git a/Source/SenseGloveUtils/Public/SGUtils/SGPluginUtils.h b/Source/SenseGloveUtils/Public/SGUtils/SGPluginUtils.h new file mode 100644 index 00000000..ab329919 --- /dev/null +++ b/Source/SenseGloveUtils/Public/SGUtils/SGPluginUtils.h @@ -0,0 +1,82 @@ +/** + * @file + * + * @author Mamadou Babaei + * + * @section LICENSE + * + * (The MIT License) + * + * Copyright (c) 2020 - 2025 SenseGlove + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED To THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ToRT OR OTHERWISE, ARISING From, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * @section DESCRIPTION + * + * + */ + + +#pragma once + +class SENSEGLOVEUTILS_API FSGPluginUtils final +{ +public: + static bool IsPluginEnabled(const FString& PluginName); + static bool IsModuleLoaded(const FString& ModuleName); + + static FORCENOINLINE bool IsPluginAvailable(const FString& PluginName, const FString& ModuleName) + { + return IsPluginEnabled(*PluginName) && IsModuleLoaded(ModuleName); + } + + FORCENOINLINE static bool IsMetaXRPluginEnabled() + { + return IsPluginEnabled(TEXT("OculusXR")); + } + + FORCENOINLINE static bool IsMetaXRPluginLoaded() + { + return IsModuleLoaded(TEXT("OculusXRHMD")); + } + + FORCENOINLINE static bool IsMetaXRPluginAvailable() + { + return IsMetaXRPluginEnabled() && IsMetaXRPluginLoaded(); + } + + FORCENOINLINE static bool IsViveOpenXRPluginEnabled() + { + return IsPluginEnabled(TEXT("ViveOpenXR")); + } + + FORCENOINLINE static bool IsViveOpenXRPluginLoaded() + { + return IsModuleLoaded(TEXT("ViveOpenXRCommon")); + } + + FORCENOINLINE static bool IsViveOpenXRPluginAvailable() + { + return IsViveOpenXRPluginEnabled() && IsViveOpenXRPluginLoaded(); + } + +public: + FSGPluginUtils() = delete; + virtual ~FSGPluginUtils() = delete; +}; \ No newline at end of file diff --git a/Source/SenseGloveUtils/SenseGloveUtils.Build.cs b/Source/SenseGloveUtils/SenseGloveUtils.Build.cs index 6803308b..a29b0b08 100644 --- a/Source/SenseGloveUtils/SenseGloveUtils.Build.cs +++ b/Source/SenseGloveUtils/SenseGloveUtils.Build.cs @@ -48,6 +48,7 @@ public class SenseGloveUtils : ModuleRules "Core", "CoreUObject", "Engine", + "Projects", } );