128 lines
3.4 KiB
C++
128 lines
3.4 KiB
C++
// Copyright (c) 2022 Sentry. All Rights Reserved.
|
|
|
|
#include "SentryModule.h"
|
|
#include "SentryDefines.h"
|
|
#include "SentrySettings.h"
|
|
|
|
#include "UObject/Package.h"
|
|
#include "UObject/UObjectGlobals.h"
|
|
#include "Interfaces/IPluginManager.h"
|
|
#include "Modules/ModuleManager.h"
|
|
#include "Developer/Settings/Public/ISettingsModule.h"
|
|
#include "Misc/Paths.h"
|
|
|
|
#define LOCTEXT_NAMESPACE "FSentryModule"
|
|
|
|
const FName FSentryModule::ModuleName = "Sentry";
|
|
|
|
const bool FSentryModule::IsMarketplace = false;
|
|
|
|
void FSentryModule::StartupModule()
|
|
{
|
|
// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module
|
|
SentrySettings = NewObject<USentrySettings>(GetTransientPackage(), "SentrySettings", RF_Standalone);
|
|
SentrySettings->AddToRoot();
|
|
|
|
if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings"))
|
|
{
|
|
SettingsModule->RegisterSettings("Project", "Plugins", "Sentry",
|
|
LOCTEXT("RuntimeSettingsName", "Sentry"),
|
|
LOCTEXT("RuntimeSettingsDescription", "Configure Sentry"),
|
|
SentrySettings);
|
|
}
|
|
|
|
#if PLATFORM_MAC
|
|
const FString SentryLibName = TEXT("sentry.dylib");
|
|
const FString BinariesDirPath = GIsEditor ? FPaths::Combine(GetThirdPartyPath(), TEXT("bin")) : GetBinariesPath();
|
|
|
|
FPlatformProcess::PushDllDirectory(*BinariesDirPath);
|
|
mDllHandleSentry = FPlatformProcess::GetDllHandle(*FPaths::Combine(BinariesDirPath, SentryLibName));
|
|
FPlatformProcess::PopDllDirectory(*BinariesDirPath);
|
|
#endif
|
|
}
|
|
|
|
void FSentryModule::ShutdownModule()
|
|
{
|
|
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
|
|
// we call this function before unloading the module.
|
|
|
|
if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings"))
|
|
{
|
|
SettingsModule->UnregisterSettings("Project", "Plugins", "Sentry");
|
|
}
|
|
|
|
if (!GExitPurge)
|
|
{
|
|
// If we're in exit purge, this object has already been destroyed
|
|
SentrySettings->RemoveFromRoot();
|
|
}
|
|
else
|
|
{
|
|
SentrySettings = nullptr;
|
|
}
|
|
|
|
#if PLATFORM_WINDOWS || PLATFORM_MAC || PLATFORM_LINUX
|
|
if (mDllHandleSentry)
|
|
{
|
|
FPlatformProcess::FreeDllHandle(mDllHandleSentry);
|
|
mDllHandleSentry = nullptr;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
FSentryModule& FSentryModule::Get()
|
|
{
|
|
return FModuleManager::LoadModuleChecked<FSentryModule>(ModuleName);
|
|
}
|
|
|
|
bool FSentryModule::IsAvailable()
|
|
{
|
|
return FModuleManager::Get().IsModuleLoaded(ModuleName);
|
|
}
|
|
|
|
void* FSentryModule::GetSentryLibHandle() const
|
|
{
|
|
return mDllHandleSentry;
|
|
}
|
|
|
|
USentrySettings* FSentryModule::GetSettings() const
|
|
{
|
|
return SentrySettings;
|
|
}
|
|
|
|
FString FSentryModule::GetBinariesPath()
|
|
{
|
|
const FString PluginDir = IPluginManager::Get().FindPlugin(TEXT("Sentry"))->GetBaseDir();
|
|
|
|
return FPaths::Combine(PluginDir, TEXT("Binaries"), FPlatformProcess::GetBinariesSubdirectory());
|
|
}
|
|
|
|
FString FSentryModule::GetThirdPartyPath()
|
|
{
|
|
const FString PluginDir = IPluginManager::Get().FindPlugin(TEXT("Sentry"))->GetBaseDir();
|
|
|
|
return FPaths::Combine(PluginDir, TEXT("Source"), TEXT("ThirdParty"), FPlatformProcess::GetBinariesSubdirectory());
|
|
}
|
|
|
|
FString FSentryModule::GetPluginVersion()
|
|
{
|
|
TSharedPtr<IPlugin> plugin = IPluginManager::Get().FindPlugin(TEXT("Sentry"));
|
|
|
|
if(!plugin)
|
|
{
|
|
return FString();
|
|
}
|
|
|
|
return plugin->GetDescriptor().VersionName;
|
|
}
|
|
|
|
bool FSentryModule::IsMarketplaceVersion()
|
|
{
|
|
return IsMarketplace;
|
|
}
|
|
|
|
#undef LOCTEXT_NAMESPACE
|
|
|
|
IMPLEMENT_MODULE(FSentryModule, Sentry)
|
|
|
|
DEFINE_LOG_CATEGORY(LogSentrySdk); |