// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "Http.h" #include "FileDownloader.generated.h" /** * Possible results from a download request. */ UENUM(BlueprintType, Category = "HTTP") enum class EDownloadResult : uint8 { Success, DownloadFailed, SaveFailed, DirectoryCreationFailed }; DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnResult, const EDownloadResult, Result); DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnProgress, const int32, BytesSent, const int32, BytesReceived, const int32, ContentLength); /** * Download a file from a URL and save it locally. */ UCLASS(BlueprintType, Category = "HTTP") class MEDIOCREMAPPER_API UFileDownloader : public UObject { GENERATED_BODY() public: /** * Bind to know when the download is complete (even if it fails). */ UPROPERTY(BlueprintAssignable, Category = "HTTP") FOnResult OnResult; /** * Bind to know when the download is complete (even if it fails). */ UPROPERTY(BlueprintAssignable, Category = "HTTP") FOnProgress OnProgress; /** * The URL used to start this download. */ UPROPERTY(BlueprintReadOnly, Category = "HTTP") FString FileUrl; /** * The path set to save the downloaded file. */ UPROPERTY(BlueprintReadOnly, Category = "HTTP") FString FileSavePath; UFileDownloader(); ~UFileDownloader(); /** * Instantiates a FileDownloader object, starts downloading and saves it when done. * * @return The FileDownloader object. Bind to it's OnResult event to know when it's done downloading. */ UFUNCTION(BlueprintCallable, Meta = (DisplayName = "Create Downloader"), Category = "HTTP") static UFileDownloader* MakeDownloader(); /** * Starts downloading a file and saves it when done. Bind to the OnResult * event to know when the download is done (preferrably, before calling this function). * * @param Url The file Url to be downloaded. * @param SavePath The absolute path and file name to save the downloaded file. * @return Returns itself. */ UFUNCTION(BlueprintCallable, Category = "HTTP") UFileDownloader* DownloadFile(const FString& Url, FString SavePath); private: void OnReady(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful); void OnProgress_Internal(FHttpRequestPtr Request, int32 BytesSent, int32 BytesReceived); };