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);
							 |