// 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; }; 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*/) DECLARE_DELEGATE_ThreeParams(FOnSCCCommandComplete, bool /*bSuccess*/, const FSCCRecordSet& /*InResultValues*/, const FSourceControlResultInfo& /*InResultsInfo*/) 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 UE::Tasks::TTask RunCommand(const FString& InCommand, const TArray& InAdditionalArgs, FOnSCCCommandComplete InCompleteCallback = nullptr, TArray* OutData = nullptr) = 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; }; Expose_TNameOf(ISTSourceControlService);