// Fill out your copyright notice in the Description page of Project Settings.
|
|
#include "FileDownloader.h"
|
|
#include "BeatSaberEditor.h"
|
|
#include "PlatformFilemanager.h"
|
|
#include "GenericPlatform/GenericPlatformFile.h"
|
|
#include "Paths.h"
|
|
UFileDownloader::UFileDownloader():
|
|
FileUrl(TEXT(""))
|
|
, FileSavePath(TEXT(""))
|
|
{
|
|
}
|
|
|
|
UFileDownloader::~UFileDownloader()
|
|
{
|
|
}
|
|
|
|
UFileDownloader* UFileDownloader::MakeDownloader()
|
|
{
|
|
UFileDownloader* Downloader = NewObject<UFileDownloader>();
|
|
return Downloader;
|
|
}
|
|
|
|
UFileDownloader* UFileDownloader::DownloadFile(const FString& Url, FString SavePath)
|
|
{
|
|
FileUrl = Url;
|
|
FileSavePath = SavePath;
|
|
|
|
TSharedRef< IHttpRequest > HttpRequest = FHttpModule::Get().CreateRequest();
|
|
HttpRequest->SetVerb("GET");
|
|
HttpRequest->SetURL(Url);
|
|
HttpRequest->OnProcessRequestComplete().BindUObject(this, &UFileDownloader::OnReady);
|
|
HttpRequest->OnRequestProgress().BindUObject(this, &UFileDownloader::OnProgress_Internal);
|
|
|
|
// Execute the request
|
|
HttpRequest->ProcessRequest();
|
|
AddToRoot();
|
|
|
|
return this;
|
|
}
|
|
|
|
void UFileDownloader::OnReady(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
|
|
{
|
|
RemoveFromRoot();
|
|
Request->OnProcessRequestComplete().Unbind();
|
|
|
|
if (Response.IsValid() && EHttpResponseCodes::IsOk(Response->GetResponseCode()))
|
|
{
|
|
// SAVE FILE
|
|
IPlatformFile & PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
|
|
|
|
// create save directory if not existent
|
|
FString Path, Filename, Extension;
|
|
FPaths::Split(FileSavePath, Path, Filename, Extension);
|
|
if (!PlatformFile.DirectoryExists(*Path))
|
|
{
|
|
|
|
if(!PlatformFile.CreateDirectoryTree(*Path))
|
|
{
|
|
OnResult.Broadcast(EDownloadResult::DirectoryCreationFailed);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// open/create the file
|
|
IFileHandle* FileHandle = PlatformFile.OpenWrite(*FileSavePath);
|
|
if (FileHandle)
|
|
{
|
|
// write the file
|
|
FileHandle->Write(Response->GetContent().GetData(), Response->GetContentLength());
|
|
// Close the file
|
|
delete FileHandle;
|
|
|
|
OnResult.Broadcast(EDownloadResult::Success);
|
|
}
|
|
else
|
|
{
|
|
OnResult.Broadcast(EDownloadResult::SaveFailed);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
OnResult.Broadcast(EDownloadResult::DownloadFailed);
|
|
}
|
|
}
|
|
|
|
void UFileDownloader::OnProgress_Internal(FHttpRequestPtr Request, int32 BytesSent, int32 BytesReceived)
|
|
{
|
|
int32 FullSize = Request->GetContentLength();
|
|
OnProgress.Broadcast(BytesSent, BytesReceived, FullSize);
|
|
}
|