67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								// Copyright (c) 2023 Sentry. All Rights Reserved.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "SentryFileUtils.h"
							 | 
						||
| 
								 | 
							
								#include "SentryDefines.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "HAL/FileManager.h"
							 | 
						||
| 
								 | 
							
								#include "GenericPlatform/GenericPlatformOutputDevices.h"
							 | 
						||
| 
								 | 
							
								#include "Misc/Paths.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct FSentrySortFileByDatePredicate
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									bool operator()(const FString& A, const FString& B) const
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										const FDateTime TimestampA = IFileManager::Get().GetTimeStamp(*A);
							 | 
						||
| 
								 | 
							
										const FDateTime TimestampB = IFileManager::Get().GetTimeStamp(*B);
							 | 
						||
| 
								 | 
							
										return TimestampB < TimestampA;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								FString SentryFileUtils::GetGameLogPath()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return IFileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*FGenericPlatformOutputDevices::GetAbsoluteLogFilename());
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								FString SentryFileUtils::GetGameLogBackupPath()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									TArray<FString> GameLogBackupFiles;
							 | 
						||
| 
								 | 
							
									IFileManager::Get().FindFiles(GameLogBackupFiles, *FString::Printf(TEXT("%s*-backup-*.*"), *FPaths::ProjectLogDir()), true, false);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if(GameLogBackupFiles.Num() == 0)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										UE_LOG(LogSentrySdk, Log, TEXT("There are no game log backups available."));
							 | 
						||
| 
								 | 
							
										return FString("");
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for (int i = 0; i < GameLogBackupFiles.Num(); ++i)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										FString GameLogFullPath = IFileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*(FPaths::ProjectLogDir() / GameLogBackupFiles[i]));
							 | 
						||
| 
								 | 
							
										GameLogBackupFiles[i] = GameLogFullPath;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									GameLogBackupFiles.Sort(FSentrySortFileByDatePredicate());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return GameLogBackupFiles[0];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								FString SentryFileUtils::GetGpuDumpPath()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									TArray<FString> GpuDumpFiles;
							 | 
						||
| 
								 | 
							
									IFileManager::Get().FindFiles(GpuDumpFiles, *FString::Printf(TEXT("%s*.nv-gpudmp"), *FPaths::ProjectLogDir()), true, false);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (GpuDumpFiles.Num() == 0)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										UE_LOG(LogSentrySdk, Log, TEXT("There is no GPU dump file available."));
							 | 
						||
| 
								 | 
							
										return FString("");
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (GpuDumpFiles.Num() > 1)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										// By default, engine should handle clean up of GPU dumps  from the previous runs
							 | 
						||
| 
								 | 
							
										UE_LOG(LogSentrySdk, Log, TEXT("There are multiple GPU dump files, can't determine reliably which one to pick."));
							 | 
						||
| 
								 | 
							
										return FString("");
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return IFileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*(FPaths::ProjectLogDir() / GpuDumpFiles[0]));
							 | 
						||
| 
								 | 
							
								}
							 |