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