// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "ISubmitToolService.h" #include "ISourceControlProvider.h" #include "Memory/SharedBuffer.h" #include "Tasks/Task.h" #include "Misc/Base64.h" struct FAuthTicket { public: FAuthTicket() = default; FAuthTicket(const FString& InUsername, const FString& InPassword) : Username(InUsername), Password(InPassword) {} FAuthTicket(FStringView TicketString) { int32 ChopIndex; if(TicketString.FindChar(':', ChopIndex)) { Username = TicketString.Left(ChopIndex); Password = TicketString.RightChop(ChopIndex + 1); } } virtual ~FAuthTicket() {} virtual FString ToString() const { return TEXT("Basic ") + FBase64::Encode(Username + TEXT(":") + Password); } bool IsValid() const { return !Username.IsEmpty() && !Password.IsEmpty(); } FString Username; private: FString Password; }; struct FUserData { FUserData(const FString& Username, const FString& Name, const FString& Email) : Name(Name), Username(Username), Email(Email) {} FString Name; FString Username; FString Email; bool Contains(const FString& SubString) const { return Name.Contains(SubString, ESearchCase::IgnoreCase) || Username.Contains(SubString, ESearchCase::IgnoreCase) || Email.Contains(SubString, ESearchCase::IgnoreCase); } FString GetDisplayText() { return Name + " - " + Username + " - " + Email; } }; struct FSCCStream { public: FSCCStream(const FString& InName, const FString& InParent, const FString& InType) : Name(InName), Parent(InParent), Type(InType) {} const FString Name; const FString Parent; const FString Type; TArray AdditionalImportPaths; }; template struct FSCCResultRetVal { bool bRequestSucceed; TSharedPtr UserData; }; using FSCCResultNoRet = FSCCResultRetVal; using FSCCRecordSet = TArray>; DECLARE_MULTICAST_DELEGATE_OneParam(FOnUsersGet, TArray>& /*Users*/) DECLARE_MULTICAST_DELEGATE_OneParam(FOnGroupsGet, TArray>& /*Groups*/) DECLARE_MULTICAST_DELEGATE_TwoParams(FOnUsersAndGroupsGet, TArray>& /*Users*/, TArray>& /*Groups*/) template using FOnSCCCommandCompleteRetVal = TDelegate; using FOnSCCCommandCompleteNoRet = FOnSCCCommandCompleteRetVal; class ISTSourceControlService : public ISubmitToolService { public: virtual const TUniquePtr& GetProvider() const = 0; virtual void GetUsers(const FOnUsersGet::FDelegate& Callback) = 0; virtual void GetGroups(const FOnGroupsGet::FDelegate& Callback) = 0; virtual void GetUsersAndGroups(const FOnUsersAndGroupsGet::FDelegate& Callback) = 0; virtual UE::Tasks::TTask DownloadFiles(const FString& InFilepath, TArray& OutFileBuffers) = 0; virtual bool IsAvailable() const = 0; virtual bool Tick(float InDeltaTime) = 0; virtual const TArray>& GetRecentUsers() const = 0; virtual void AddRecentUser(TSharedPtr& User) = 0; virtual const TArray>& GetRecentGroups() const = 0; virtual void AddRecentGroup(TSharedPtr& Group) = 0; virtual TSharedPtr GetUserDataFromCache(const FString& Username) const = 0; virtual const TArray& GetClientStreams() const = 0; virtual const FSCCStream* GetSCCStream(const FString& InStreamName) = 0; virtual const FString GetRootStreamName() = 0; virtual const FString GetCurrentStreamName() = 0; virtual const size_t GetDepotStreamLength(const FString& InDepotName) = 0; virtual const FAuthTicket& GetAuthTicket() = 0; template UE::Tasks::TTask> RunCommand(const FString& InCommand, const TArray& InAdditionalArgs, FOnSCCCommandCompleteRetVal InCompleteCallback, TArray* OutData = nullptr) { return UE::Tasks::Launch(UE_SOURCE_LOCATION, [this, InCommand, InAdditionalArgs, InCompleteCallback, OutData] { FSCCRecordSet ResultValues; FSourceControlResultInfo ResultInfo; bool bResult = RunCommandInternal(InCommand, InAdditionalArgs, ResultValues, ResultInfo, OutData); TSharedPtr UserTypeResult; if (InCompleteCallback.IsBound()) { if constexpr (!std::is_same::value) { UserTypeResult = MakeShared(InCompleteCallback.Execute(bResult, ResultValues, ResultInfo)); } else { InCompleteCallback.Execute(bResult, ResultValues, ResultInfo); } } return FSCCResultRetVal(bResult, MoveTemp(UserTypeResult)); }); }; UE::Tasks::TTask RunCommand(const FString& InCommand, const TArray& InAdditionalArgs, TArray* OutData = nullptr) { return RunCommand(InCommand, InAdditionalArgs, nullptr, OutData); } protected: virtual bool RunCommandInternal(const FString& InCommand, const TArray& InAdditionalArgs, FSCCRecordSet& OutResultValues, FSourceControlResultInfo& OutResultInfo, TArray* OutData = nullptr) = 0; }; Expose_TNameOf(ISTSourceControlService);