136 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			136 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								// Copyright (c) 2023 Sentry. All Rights Reserved.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#include "SentrySymToolsDownloader.h"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#include "Runtime/Launch/Resources/Version.h"
							 | 
						|||
| 
								 | 
							
								#include "HttpModule.h"
							 | 
						|||
| 
								 | 
							
								#include "Interfaces/IHttpRequest.h"
							 | 
						|||
| 
								 | 
							
								#include "Interfaces/IHttpResponse.h"
							 | 
						|||
| 
								 | 
							
								#include "Interfaces/IPluginManager.h"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#include "GenericPlatform/GenericPlatformFile.h"
							 | 
						|||
| 
								 | 
							
								#include "Misc/FileHelper.h"
							 | 
						|||
| 
								 | 
							
								#include "Misc/Paths.h"
							 | 
						|||
| 
								 | 
							
								#include "Misc/EngineVersionComparison.h"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#if UE_VERSION_OLDER_THAN(5, 0, 0)
							 | 
						|||
| 
								 | 
							
								#include "HAL/PlatformFilemanager.h"
							 | 
						|||
| 
								 | 
							
								#else
							 | 
						|||
| 
								 | 
							
								#include "HAL/PlatformFileManager.h"
							 | 
						|||
| 
								 | 
							
								#endif
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#if PLATFORM_WINDOWS
							 | 
						|||
| 
								 | 
							
								const FString FSentrySymToolsDownloader::SentryCliExecName = TEXT("sentry-cli-Windows-x86_64.exe");
							 | 
						|||
| 
								 | 
							
								const FString FSentrySymToolsDownloader::SentrySymUploadScriptName = TEXT("upload-debug-symbols-win.bat");
							 | 
						|||
| 
								 | 
							
								#elif PLATFORM_MAC
							 | 
						|||
| 
								 | 
							
								const FString FSentrySymToolsDownloader::SentryCliExecName = TEXT("sentry-cli-Darwin-universal");
							 | 
						|||
| 
								 | 
							
								const FString FSentrySymToolsDownloader::SentrySymUploadScriptName = TEXT("upload-debug-symbols.sh");
							 | 
						|||
| 
								 | 
							
								#elif PLATFORM_LINUX
							 | 
						|||
| 
								 | 
							
								const FString FSentrySymToolsDownloader::SentryCliExecName = TEXT("sentry-cli-Linux-x86_64");
							 | 
						|||
| 
								 | 
							
								const FString FSentrySymToolsDownloader::SentrySymUploadScriptName = TEXT("upload-debug-symbols.sh");
							 | 
						|||
| 
								 | 
							
								#endif
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								void FSentrySymToolsDownloader::Download(const TFunction<void(bool)>& OnCompleted)
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									SentryCliDownloadRequest = FHttpModule::Get().CreateRequest();
							 | 
						|||
| 
								 | 
							
									SentryScriptDownloadRequest = FHttpModule::Get().CreateRequest();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									const FString SentryCliExecPath = GetSentryCliPath();
							 | 
						|||
| 
								 | 
							
									const FString CliDownloadUrl = FString::Printf(TEXT("https://github.com/getsentry/sentry-cli/releases/download/%s/%s"), *GetSentryCliVersion(), *SentryCliExecName);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									const FString SymUploadScriptPath = GetSymUploadScriptPath();
							 | 
						|||
| 
								 | 
							
									const FString SymUploadScriptDownloadUrl = FString::Printf(TEXT("https://raw.githubusercontent.com/getsentry/sentry-unreal/main/plugin-dev/Scripts/%s"), *SentrySymUploadScriptName);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									Download(SentryCliDownloadRequest, CliDownloadUrl, SentryCliExecPath, OnCompleted);
							 | 
						|||
| 
								 | 
							
									Download(SentryScriptDownloadRequest, SymUploadScriptDownloadUrl, SymUploadScriptPath, OnCompleted);
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								ESentrySymToolsStatus FSentrySymToolsDownloader::GetStatus()
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									if((SentryCliDownloadRequest.IsValid() && SentryCliDownloadRequest->GetStatus() == EHttpRequestStatus::Processing)
							 | 
						|||
| 
								 | 
							
										|| (SentryScriptDownloadRequest.IsValid() && SentryScriptDownloadRequest->GetStatus() == EHttpRequestStatus::Processing))
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										return ESentrySymToolsStatus::Downloading;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									if(FPaths::FileExists(GetSentryCliPath()) && FPaths::FileExists(GetSymUploadScriptPath()))
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										return ESentrySymToolsStatus::Configured;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									return ESentrySymToolsStatus::Missing;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								void FSentrySymToolsDownloader::Download(TSharedPtr<IHttpRequest, ESPMode::ThreadSafe>& Request, const FString& Url, const FString& SavePath, const TFunction<void(bool)>& OnCompleted)
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									Request->OnProcessRequestComplete().BindLambda([this, SavePath, OnCompleted](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bSuccess)
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										if (!bSuccess || !Response.IsValid())
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											OnCompleted(false);
							 | 
						|||
| 
								 | 
							
											return;
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										FString DirPath, Filename, Extension;
							 | 
						|||
| 
								 | 
							
										FPaths::Split(SavePath, DirPath, Filename, Extension);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										if (!PlatformFile.DirectoryExists(*DirPath))
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (!PlatformFile.CreateDirectoryTree(*DirPath))
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												OnCompleted(false);
							 | 
						|||
| 
								 | 
							
												return;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										if(PlatformFile.FileExists(*SavePath))
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if (!PlatformFile.DeleteFile(*SavePath))
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												OnCompleted(false);
							 | 
						|||
| 
								 | 
							
												return;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										FFileHelper::SaveArrayToFile(Response->GetContent(), *SavePath);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										if(GetStatus() == ESentrySymToolsStatus::Configured)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											OnCompleted(true);
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									});
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									Request->SetURL(Url);
							 | 
						|||
| 
								 | 
							
									Request->SetVerb(TEXT("GET"));
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									Request->ProcessRequest();
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								FString FSentrySymToolsDownloader::GetSentryCliPath() const
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									const FString PluginDir = IPluginManager::Get().FindPlugin(TEXT("Sentry"))->GetBaseDir();
							 | 
						|||
| 
								 | 
							
									return FPaths::Combine(PluginDir, TEXT("Source"), TEXT("ThirdParty"), TEXT("CLI"), SentryCliExecName);
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								FString FSentrySymToolsDownloader::GetSentryCliVersion() const
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									const FString PluginDir = IPluginManager::Get().FindPlugin(TEXT("Sentry"))->GetBaseDir();
							 | 
						|||
| 
								 | 
							
									const FString SentryCliPropertiesPath = FPaths::Combine(PluginDir, TEXT("sentry-cli.properties"));
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									TArray<FString> CliPropertiesContents;
							 | 
						|||
| 
								 | 
							
									FFileHelper::LoadFileToStringArray(CliPropertiesContents, *SentryCliPropertiesPath);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									FString SentryCliVersion;
							 | 
						|||
| 
								 | 
							
									FParse::Value(*CliPropertiesContents[0], TEXT("version="), SentryCliVersion);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									return SentryCliVersion;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								FString FSentrySymToolsDownloader::GetSymUploadScriptPath() const
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
									const FString PluginDir = IPluginManager::Get().FindPlugin(TEXT("Sentry"))->GetBaseDir();
							 | 
						|||
| 
								 | 
							
									return FPaths::Combine(PluginDir, TEXT("Scripts"), SentrySymUploadScriptName);
							 | 
						|||
| 
								 | 
							
								}
							 |