// Copyright (c) Meta Platforms, Inc. and affiliates. #pragma once #include "OculusXRAsyncRequestSystem.h" #include "OculusXRAsyncRequest.h" #include "OculusXRColocationSession.h" #include "OculusXRColocationTypes.h" #include "OculusXRColocationUtil.h" DECLARE_DELEGATE_OneParam(FOculusXRColocationSessionFoundDelegate, const FOculusXRColocationSession&); namespace OculusXRColocation { struct FAsyncResultColocationDiscoverySuccess { bool operator()(EColocationResult Val) { return OculusXRColocation::IsResultSuccess(Val); } }; template using FAsyncColocationRequest = OculusXR::FAsyncRequest; // Discover nearby sessions struct OCULUSXRCOLOCATION_API FDiscoverSessionsRequest : FAsyncColocationRequest> { public: FDiscoverSessionsRequest(); ~FDiscoverSessionsRequest(); void BindOnSessionFound(const FOculusXRColocationSessionFoundDelegate& OnSessionFound); void OnSessionFound(FOculusXRColocationSession&& Session); const TArray& GetFoundSessions() const { return FoundSessions; } protected: virtual void OnInitRequest() override; private: static void OnStartComplete(FOculusXRUInt64 RequestId, EColocationResult Result); static void OnResultAvailable(FOculusXRUInt64 RequestId, FOculusXRUUID Uuid, const TArray& Metadata); static void OnDiscoveryComplete(FOculusXRUInt64 RequestId, EColocationResult Result); FDelegateHandle OnStartCompleteHandle; FDelegateHandle OnSessionFoundHandle; FDelegateHandle OnStopCompleteHandle; FDelegateHandle OnDiscoveryCompleteHandle; FOculusXRColocationSessionFoundDelegate OnFoundSessionCallback; TArray FoundSessions; }; // Start advertisement, creates a session internally struct OCULUSXRCOLOCATION_API FStartSessionAdvertisementRequest : FAsyncColocationRequest { public: FStartSessionAdvertisementRequest(const TArray& SessionData); ~FStartSessionAdvertisementRequest(); const TArray& GetData() const { return Data; } protected: virtual void OnInitRequest() override; private: static void OnStartComplete(FOculusXRUInt64 RequestId, FOculusXRUUID Uuid, EColocationResult Result); FDelegateHandle OnStartCompleteHandle; TArray Data; }; // Stop advertisement, stops advertising and destroys the internal session struct OCULUSXRCOLOCATION_API FStopSessionAdvertisementRequest : FAsyncColocationRequest { public: FStopSessionAdvertisementRequest(); ~FStopSessionAdvertisementRequest(); protected: virtual void OnInitRequest() override; private: static void OnStopComplete(FOculusXRUInt64 RequestId, EColocationResult Result); FDelegateHandle OnStopCompleteHandle; FDelegateHandle OnCompleteHandle; }; } // namespace OculusXRColocation