// Copyright (c) Meta Platforms, Inc. and affiliates. #pragma once #include "OculusXRAsyncRequestBase.h" #include "OculusXRAsyncRequestSystem.h" #include "IOculusXRAsyncRequestModule.h" namespace OculusXR { // Templated event type that is derived from to create new requests types template > struct FAsyncRequest : public FAsyncRequestBase { public: typedef TValueType FResultValueType; typedef FAsyncResult FResultType; DECLARE_DELEGATE_OneParam(FCompleteDelegate, const FResultType&); FAsyncRequest() : RequestResult(FResultType::FromEmpty()) , bIsComplete(false) , bHasStarted(false) { SetEventId(FAsyncRequestSystem::GenerateEventId()); } virtual ~FAsyncRequest() {} // Call this to start the request void Execute() { // Validate we aren't starting the request more than once check(!bHasStarted); bHasStarted = true; // Start the async work OnInitRequest(); // Check initial result if (!TResultSuccess()(InitialResultStatus)) { // Request failed so fire complete now and remove it from the request system // Once it goes out of scope in the calling code the shared ptr will be destroyed FAsyncRequestSystem::CompleteRequest(GetEventId(), FResultType::FromError(InitialResultStatus)); return; } FAsyncRequestSystem::SetRequestId(GetEventId(), GetRequestId()); } // Bind a callback to the completion of the event void BindOnComplete(const FCompleteDelegate& Function) { OnComplete = Function; } bool IsComplete() const { return bIsComplete; } const FResultType& GetResult() const { // Result type isn't valid unless we have completed check(bIsComplete); return RequestResult; } protected: friend class FAsyncRequestSystem; void RequestCompleted(const FResultType& InResult) { bIsComplete = true; RequestResult = InResult; OnComplete.ExecuteIfBound(InResult); OnCompleteRequest(InResult); } // Called by the derived request to specify the result code that came from starting the async work. void SetInitialResult(TResultEnum ResultStatus) { InitialResultStatus = ResultStatus; } // Overload to do request initialization, call OVRP functions, etc.. virtual void OnInitRequest() {} // Overload this request to clean up any remaining data if needed virtual void OnCompleteRequest(const FResultType& Result) {} private: FCompleteDelegate OnComplete; TResultEnum InitialResultStatus; FResultType RequestResult; bool bIsComplete; bool bHasStarted; }; } // namespace OculusXR