October3d55/M/RuntimeAdd95a179eaf4V8/Source/RuntimeArchiver/Private/AsyncTasks/RuntimeArchiverArchiveAsync...

101 lines
3.0 KiB
C++

// Georgy Treshchev 2024.
#include "AsyncTasks/RuntimeArchiverArchiveAsyncTask.h"
URuntimeArchiverArchiveAsyncTask* URuntimeArchiverArchiveAsyncTask::ArchiveDirectory(TSubclassOf<URuntimeArchiverBase> ArchiverClass, FString ArchivePath, FString DirectoryPath, bool bAddParentDirectory, ERuntimeArchiverCompressionLevel CompressionLevel)
{
URuntimeArchiverArchiveAsyncTask* ArchiveTask = NewObject<URuntimeArchiverArchiveAsyncTask>();
ArchiveTask->Archiver = URuntimeArchiverBase::CreateRuntimeArchiver(ArchiveTask, ArchiverClass);
ArchiveTask->Archiver->SetInternalFlags(EInternalObjectFlags::Async);
{
ArchiveTask->OperationType = EOperationType::Directory;
ArchiveTask->DirectoryInfo = {MoveTemp(ArchivePath), MoveTemp(DirectoryPath), bAddParentDirectory, CompressionLevel};
}
return ArchiveTask;
}
URuntimeArchiverArchiveAsyncTask* URuntimeArchiverArchiveAsyncTask::ArchiveFiles(TSubclassOf<URuntimeArchiverBase> ArchiverClass, FString ArchivePath, TArray<FString> FilePaths, ERuntimeArchiverCompressionLevel CompressionLevel)
{
URuntimeArchiverArchiveAsyncTask* ArchiveTask = NewObject<URuntimeArchiverArchiveAsyncTask>();
ArchiveTask->Archiver = URuntimeArchiverBase::CreateRuntimeArchiver(ArchiveTask, ArchiverClass);
ArchiveTask->Archiver->SetInternalFlags(EInternalObjectFlags::Async);
{
ArchiveTask->OperationType = EOperationType::Files;
ArchiveTask->FilesInfo = {MoveTemp(ArchivePath), MoveTemp(FilePaths), CompressionLevel};
}
return ArchiveTask;
}
void URuntimeArchiverArchiveAsyncTask::Activate()
{
Super::Activate();
switch (OperationType)
{
case EOperationType::Directory:
{
StartDirectory();
break;
}
case EOperationType::Files:
{
StartFiles();
break;
}
}
}
void URuntimeArchiverArchiveAsyncTask::StartDirectory()
{
if (!Archiver->CreateArchiveInStorage(DirectoryInfo.ArchivePath))
{
OnResult_Callback(false);
return;
}
OperationResult.BindDynamic(this, &URuntimeArchiverArchiveAsyncTask::OnResult_Callback);
Archiver->AddEntriesFromStorage_Directory(OperationResult, MoveTemp(DirectoryInfo.DirectoryPath), DirectoryInfo.bAddParentDirectory, DirectoryInfo.CompressionLevel);
}
void URuntimeArchiverArchiveAsyncTask::StartFiles()
{
if (!Archiver->CreateArchiveInStorage(FilesInfo.ArchivePath))
{
OnResult_Callback(false);
return;
}
OperationResult.BindDynamic(this, &URuntimeArchiverArchiveAsyncTask::OnResult_Callback);
OperationProgress.BindDynamic(this, &URuntimeArchiverArchiveAsyncTask::OnProgress_Callback);
Archiver->AddEntriesFromStorage(OperationResult, OperationProgress, MoveTemp(FilesInfo.FilePaths), FilesInfo.CompressionLevel);
}
void URuntimeArchiverArchiveAsyncTask::OnResult_Callback(bool bSuccess)
{
OperationResult.Clear();
if (!bSuccess || !Archiver->CloseArchive())
{
OnFail.Broadcast(0);
return;
}
OnSuccess.Broadcast(100);
SetReadyToDestroy();
Archiver->ClearInternalFlags(EInternalObjectFlags::Async);
}
void URuntimeArchiverArchiveAsyncTask::OnProgress_Callback(int32 Percentage)
{
OnProgress.Broadcast(Percentage);
}